
Wenn ich das folgende MWE kompiliere, wird das erste \@ifnextchar,
immer als „false“ ausgewertet, was im letzten Fall eindeutig falsch ist. Das zweite (innerhalb \punctuationcheck
) funktioniert jedoch einwandfrei. Warum wird dieselbe Bedingung als „False“ und dann als „True“ ausgewertet?
\documentclass{article}
\makeatletter
\newcommand{\punctuationcheck}{%
\@ifnextchar){I see a parens\relax}{%
\@ifnextchar]{I see a square bracket\relax}{%
\@ifnextchar.{I see a period\relax}{%
\@ifnextchar,{I see a comma\relax}{I didn' t see anything\ }}}}%
}
\newcommand{\ie}{\textit{i.e.}\@ifnextchar,{I saw a comma\relax}{I didn't see a comma,}\punctuationcheck}
\makeatother
\begin{document}
\ie) test
\ie] test
\ie. test
\ie, test
\end{document}
Was dabei herauskommt, wenn ich es kompiliere:
d. h. ich habe kein Komma gesehen, ich sehe eine Klammer) Test
ieIch habe kein Komma gesehen, ich sehe eine eckige Klammer] Test
d. h. ich habe kein Komma gesehen, ich sehe einen Punkt. Test
ieIch habe kein Komma gesehen,Ich sehe ein Komma, Test
Antwort1
Die Syntax von \@ifnextchar
ist
\@ifnextchar<test-token>{<true>}{<false>}<token>
Wenn <test-token>
identisch ist mit <token>
, wird der <true>
Code eingefügt, andernfalls <false>
wird eingefügt und der Eingabestrom wird entweder
<true><token>
oder
<false><token>
Beachten Sie, dass dies <token>
zu diesem Zeitpunkt nicht entfernt wird. Die korrekte Verwendung besteht darin, es \@ifnextchar<test-token>{<true>}{<false>}
als letzten Teil des Makrocodes zu verwenden, sodass dies <token>
das ist, was auf das Makro folgt.
In Ihrem Code ist stattdessen <token>
bereits angegeben und es ist so \punctuationcheck
, sodass TeX den Code immer zu Recht verwendet <false>
.
Lösung:
\newcommand{\ie}{%
\textit{i.e.}%
\@ifnextchar,%
{I saw a comma}%
{I didn't see a comma,\punctuationcheck}%
}