
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 \ingredient
muss getan werden, um zu prüfen, ob sein optionales Argument ausreicht, um die Zeile zu beginnen, und danach \multicolumn
nicht mehr erscheinen darf.
Die einfachste Möglichkeit, dies zu beheben, besteht darin, das erste Argument \ingredient
obligatorisch 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 \DeclareExpandableDocumentCommand
aus demxparse
Paket.
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“ noalign
implementieren. Im folgenden Code definiere ich eine Funktion \NewDocumentCommandOptionalInTabular
, die ähnlich wie die von funktioniert, \NewDocumentCommand
auß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.