Ich bin neu im Schreiben von Paketen und stoße auf einen Fehler, den ich nicht lösen kann. Ich wäre für jede Hilfe dankbar, die Sie mir geben können. Ich schreibe einige Makros, die in einer tabellarischen Umgebung verwendet werden sollen:
\newcommand{\topics}{\@ifstar{\topicsStar}{\topicsNoStar}}
\newcommand{\topicsNoStar}[1]{\multicolumn{2}{|p{2in}|}{test}}
\newcommand{\topicsStar}{&&}
Wenn ich anrufe
\topicsNoStar{stuff}
die Ausgabe ist korrekt.
Wenn ich anrufe
\topics{stuff}
Ich erhalte die Fehlermeldung:!Misplaced \omit. \multispan ->\omit \@multispan
Was mich verwirrt, ist der Unterschied zwischen den beiden Aufrufen – meiner Meinung nach sollten sie dasselbe tun, aber die Ausgabe ist nicht dieselbe.
Nun habe ich vor, in der endgültigen Version 's in die obigen Befehle aufzunehmen @
, aber zum Debuggen wollte ich sie außerhalb der Stildatei aufrufen können. Außerdem wird das Argument für NoStar nicht verwendet; es wird in die Mehrfachspalte eingefügt, sobald dies richtig funktioniert.
Antwort1
Diese Lösung basiert auf der von Heiko in! Falsch platzierter \omit
Fehler.
etextools
bietet vollständig erweiterbare Konditionierungsbefehle, um \multicolumn
als „erstes Element in der Zelle“ betrachtet zu werden. Dies ist in Ihrem Beispiel derzeit nicht der Fall, da \@ifstar
nicht vollständig erweiterbar ist, während \FE@ifstar
es eine F
vollständig E
erweiterbare Version ist:
\documentclass{article}
\usepackage{etextools}% http://ctan.org/pkg/etextools
\makeatletter
\newcommand{\topics}[1]{%
\FE@ifstar{#1}
{test & test}% starred
{\multicolumn{2}{|p{2in}|}{#1}\@gobble}}% non-starred
\makeatother
\begin{document}
\begin{tabular}{|p{1in}p{1in}|}
\topics{stuff} \\
\topics* \\
\topics{some more stuff} \\
\topics* \\
\topics*
\end{tabular}
\end{document}
Antwort2
\multicolumn
muss das erste Element in einer Tabellenzelle sein und ein Befehl mit einer auf die übliche Weise definierten Sternvariante wird \multicolumn
nach einem nicht erweiterbaren Token versteckt. Ohne Pakete können Sie folgendermaßen vorgehen:
\documentclass{article}
\newcommand{\topics}[1]{%
\if*\detokenize{#1}%
&%
\else
\multicolumn{2}{|p{2in}|}{#1}%
\fi
}
\begin{document}
\begin{tabular}{|p{1in}p{1in}|}
\topics{stuff} \\
\topics* \\
\topics{some more stuff} \\
\topics* \\
\topics*
\end{tabular}
\end{document}
Antwort3
Dies ist eine Alternative, bei der ich mein \NewDocumentCommandOptionalInTabular
Makro ineine andere Antwort.
\documentclass{article}
% ======== 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 ========
\NewDocumentCommandOptionalInTabular \topics {s} {\IfBooleanTF{#1}{\topicsStar}{\topicsNoStar}}
\newcommand{\topicsNoStar}[1]{\multicolumn{2}{|p{2in}|}{#1}}
\newcommand{\topicsStar}{test & test}
\begin{document}
\begin{tabular}{|p{1in}p{1in}|}
\topics{stuff} \\
\topics* \\
\topics{some more stuff} \\
\topics* \\
\topics*
\end{tabular}
\end{document}
Die Ausgabe entspricht Ihren Erwartungen.
Ein Beispiel, bei dem der erweiterbare Sterntest das Kerning im folgenden Zeichen unterbricht:
%! TEX program = pdflatex
\documentclass{article}
\usepackage{etextools}% http://ctan.org/pkg/etextools
\makeatletter
\newcommand{\test}[1]{%
\FE@ifstar{#1}
{123}
{456}}
\makeatother
\begin{document}
\test VA % ← see the space between V and A here is much larger than that of...
VA % the space between V and A in this line.
\end{document}