Misplaced \omit. \multispan with \newcommand

I'm trying to build my own cookbook-style, which has an ingredient makro. Sometimes the ingredients should be separated and have a headline, so I tried with an optional argument. A minimum example looks like this:

\documentclass{scrartcl}
\newcommand{\ingredient}[3][]{
#1 #2 & #3 \\
}
\begin{document}
\begin{tabular}{r|l}
\ingredient[test3]{test4}{test5}
\ingredient{test6}{test7}
\end{tabular}
\end{document}


What's wrong with this code? I get the following error message:

! Misplaced \omit.
\multispan -&gt;\omit
\@multispan


Tabular material is really picky about what is allowed to go "before" a line. In particular, it has to be fully expandable.

Hence, even the assignment which \ingredient needs to do to check for its optional argument is enough to start the line, and then \multicolumn is no longer allowed to appear.

The easiest way to remedy this is to make the first argument of \ingredient mandatory:

\documentclass{scrartcl}
\newcommand{\ingredient}[3]{
#1 #2 & #3 \\
}
\begin{document}
\begin{tabular}{r|l}
\ingredient{test3}{test4}{test5}
\ingredient{}{test6}{test7}
\end{tabular}
\end{document}

• Thank you for a working example, but as this "headline" is really seldomly used it would be much more convenient to have it as an optional parameter. Is there no way to make it work as an optional parameter? Ideally I could also get rid of the "\multicolum{2}{1}{VARIABLE} \\"-stuff. – causa prima Aug 31 '12 at 21:34
• Nope. You could make two commands, one with two and one with three arguments. – Stephan Lehmke Aug 31 '12 at 21:36
• Thank you. I found a solution by adding a new command just like you proposed. – causa prima Aug 31 '12 at 21:48

You can retain your original syntax and have a single macro with an optional parameter if you use \DeclareExpandableDocumentCommand from the the xparse package.

Code:

\documentclass{scrartcl}
\usepackage{xparse}

\DeclareExpandableDocumentCommand{\ingredient}{O{} m m}{%
#1 #2 & #3 \\%
}%

\begin{document}
\begin{tabular}{r|l}