Mehrspaltiger Fehler bei Verwendung innerhalb eines neuen Befehls mit \@ifstar

Mehrspaltiger Fehler bei Verwendung innerhalb eines neuen Befehls mit \@ifstar

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 \omitFehler.

etextoolsbietet vollständig erweiterbare Konditionierungsbefehle, um \multicolumnals „erstes Element in der Zelle“ betrachtet zu werden. Dies ist in Ihrem Beispiel derzeit nicht der Fall, da \@ifstarnicht vollständig erweiterbar ist, während \FE@ifstares eine Fvollständig Eerweiterbare Version ist:

Bildbeschreibung hier eingeben

\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

\multicolumnmuss das erste Element in einer Tabellenzelle sein und ein Befehl mit einer auf die übliche Weise definierten Sternvariante wird \multicolumnnach 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 \NewDocumentCommandOptionalInTabularMakro 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.

Ausgabe


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}

verwandte Informationen