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

相关内容