Falsch platziertes \omit. \multispan mit \newcommand, definiert mit optionalem Argument

Falsch platziertes \omit. \multispan mit \newcommand, definiert mit optionalem Argument

Ich versuche gerade, meinen eigenen Kochbuchstil zu erstellen, der ein Zutatenmakro hat. Manchmal sollten die Zutaten getrennt sein und eine Überschrift haben, also habe ich es mit einem optionalen Argument versucht. Ein Minimalbeispiel sieht so aus:

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

Was ist falsch an diesem Code? Ich erhalte folgende Fehlermeldung:

! Misplaced \omit.
\multispan ->\omit 
                   \@multispan 
l.7 ...[\multicolumn{2}{l}{Head} \\]{test1}{test2}

Antwort1

Tabellarisches Material istWirklichwählerisch, was „vor“ einer Zeile stehen darf. Insbesondere muss es vollständig erweiterbar sein.

Daher ist sogar dieAbtretungDies \ingredientmuss getan werden, um zu prüfen, ob sein optionales Argument ausreicht, um die Zeile zu beginnen, und danach \multicolumnnicht mehr erscheinen darf.

Die einfachste Möglichkeit, dies zu beheben, besteht darin, das erste Argument \ingredientobligatorisch zu machen:

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

Antwort2

Dudürfenbehalten Sie Ihre ursprüngliche Syntax bei und verwenden Sie ein einzelnes Makro mit einem optionalen Parameter, wenn Sie \DeclareExpandableDocumentCommandaus demxparsePaket.

Code:

\documentclass{scrartcl}
\usepackage{xparse}

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

\begin{document}
    \begin{tabular}{r|l}        
        \ingredient[\multicolumn{2}{l}{Head} \\]{test1}{test2}
        \ingredient[test3]{test4}{test5}
        \ingredient{test6}{test7}
    \end{tabular}
\end{document}

Antwort3

Sie können die Funktionalität „kreativ“ noalignimplementieren. Im folgenden Code definiere ich eine Funktion \NewDocumentCommandOptionalInTabular, die ähnlich wie die von funktioniert, \NewDocumentCommandaußer dass SiedürfenVerwenden Sie optionale Argumente (oder Sternchen) nach Wunsch.

\documentclass{scrartcl}

% ======== copy paste this part ========
\ExplSyntaxOn
\cs_new_protected:Npn \NewDocumentCommandOptionalInTabular #1 #2 #3 {
  \NewDocumentCommandOptionalInTabular_aux:xnnn {\exp_not:c{\cs_to_str:N #1-aux}} #1 {#2} {#3}
}

\cs_new_protected:Npn \NewDocumentCommandOptionalInTabular_aux:nnnn #1 #2 #3 #4 {
  \cs_new:Npn #2 { \noalign \bgroup #1 }
  \NewDocumentCommand #1 {#3} { \egroup #4 }
}
\cs_generate_variant:Nn \NewDocumentCommandOptionalInTabular_aux:nnnn {x}
\ExplSyntaxOff
% ======== end ========


% then you can just use \NewDocumentCommandOptionalInTabular to replace \NewDocumentCommand
\NewDocumentCommandOptionalInTabular \ingredient {O{} m m}{
    #1 #2 & #3 \\
}

\begin{document}
    \begin{tabular}{r|l}        
        \ingredient[\multicolumn{2}{l}{Head} \\]{test1}{test2}
        \ingredient[test3]{test4}{test5}
        \ingredient{test6}{test7}
    \end{tabular}
\end{document}

Inspiriert vonegregs Antwort.

verwandte Informationen