Странное поведение от \@ifnextchar,

Странное поведение от \@ifnextchar,

Когда я компилирую MWE ниже, первое \@ifnextchar,всегда оценивается как false, что явно неверно в последнем случае. Однако второе (в пределах \punctuationcheck) работает просто отлично. Почему одно и то же условие оценивается как False, а затем как True?

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

Что получается при компиляции:

т.е. я не увидел запятую, я увидел скобку) тест

т.е. я не увидел запятую, я увидел квадратную скобку] тест

т.е. я не увидел запятую, я увидел точку. тест

т.е. я не увидел запятую, я вижу запятую, тест

решение1

Синтаксис \@ifnextchar:

\@ifnextchar<test-token>{<true>}{<false>}<token>

Если <test-token>то же самое, что и <token>, то <true>код вставляется, в противном случае <false>вставляется и входной поток станет либо

<true><token>

или

<false><token>

Обратите внимание, что <token>на этом этапе не удаляется. Правильный способ использования этого — иметь \@ifnextchar<test-token>{<true>}{<false>}в качестве завершающей части кода макроса, так что это <token>будет то, что следует за макросом.

В вашем коде, напротив, <token>уже указано и это так \punctuationcheck, поэтому TeX всегда использует этот <false>код.

Решение:

\newcommand{\ie}{%
  \textit{i.e.}%
  \@ifnextchar,%
    {I saw a comma}%
    {I didn't see a comma,\punctuationcheck}%
}

Связанный контент