当我编译下面的 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}%
}