5

I have a command to make a formatted header entry in a table. Most table header entries span 1 column, but others span multiple columns, so I defined the command as follows with an optional width argument. However, this does not compile. It gives a Misplaced \omit error.

\documentclass{article}
\newcommand{\hform}[2][1]{\multicolumn{#1}{|c|}{\textbf{#2}}}
\begin{document}
\begin{tabular}{|c|c|}
  \hline
  \hform[2]{Title}\\\hline
  \hform{Col 1} & \hform{Col 2} \\\hline
  blah & blah\\
  blah & blah\\
  \hline
\end{tabular}
\end{document}

Error message:

! Misplaced \omit.
\multispan ->\omit 
                   \@multispan 
l.13   \hform[2]{Title}
                       \\\hline
? 

When I delete the optional argument and make it mandatory however, it does compile.

\documentclass{article}
\newcommand{\hform}[2]{\multicolumn{#1}{|c|}{\textbf{#2}}}
\begin{document}
\begin{tabular}{|c|c|}
  \hline
  \hform{2}{Title}\\\hline
  \hform{1}{Col 1} & \hform{1}{Col 2} \\\hline
  blah & blah\\
  blah & blah\\
  \hline
\end{tabular}
\end{document}

Why is this? What am I doing wrong? On my machine this is a (fairly) minimal working example to produce this problem.

2
7

Only commands defined by expansion can come before the \omit and \span primitives that trigger the column spanning. If any non-expandable token is seen then the cell is started as normal. LaTeX uses some non-expandable constructs while testing for [.

So you need to make the argument non-optional, or you could use the xparse package an its \DeclareExpandableDocumentCommand which uses a more complicated, but expandable test for optional arguments.

\documentclass{article}
\usepackage{xparse}
\DeclareExpandableDocumentCommand{\hform}{O{1}m}{\multicolumn{#1}{|c|}{\textbf{#2}}}
\begin{document}
\begin{tabular}{|c|c|}
  \hline
  \hform[2]{Title}\\\hline
  \hform{Col 1} & \hform{Col 2} \\\hline
  blah & blah\\
  blah & blah\\
  \hline
\end{tabular}
\end{document}
2
  • @jgon I updated with an example, but note that while this answers the question about optional arguments, the specific definition here is incorrect as it uses |c| in all columns not just the first, so will lead to double width rules with a | to the right of one column touching a | to the left of the next. Nov 7 '15 at 17:11
  • Right good point, I'll be careful of that, thanks!
    – jgon
    Nov 7 '15 at 17:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.