
Когда я компилирую 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}%
}