# Optional argument breaks command with multicolumn

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.

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}

• @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