Seltsames Verhalten von \@ifnextchar,

Seltsames Verhalten von \@ifnextchar,

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 \@ifnextcharist

\@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}%
}

verwandte Informationen