\ignorespaces 与 \relax

\ignorespaces 与 \relax

在 TeXbook 中,有一个名为的宏\ignorespaces

\ignorespaces ⟨optional spaces⟩。TeX 读取(并扩展)标记,直到遇到非 ⟨space 标记⟩ 的标记为止不执行任何操作。

还有另外一个宏,\relaxTeX 对其不做任何操作。

\ignorespaces既然看起来\relax可以实现\ignorespaces的功能,那么这是否是多余的?请参见以下示例:

a\ignorespaces b\ignorespaces
    c\ignorespaces   \hskip1em d

a\relax b\relax
    c\relax   \hskip1em d

效果是一样的。

答案1

原语\ignorespaces吞噬以下空间标记(显式或隐式)并执行宏扩展。它不会忽略粘合规范,因此将\hskip1em保留。

你的例子具有误导性,因为

a\ignorespaces b

没有可以忽略的空格。

a\relax b

尝试

a\ignorespaces\space b

a\relax\space b

你会看到差异。

在此处输入图片描述

答案2

\ignorespaces不是宏,而是不可扩展的原语(如\relax

\relax执行时不执行任何操作,\ignorespaces导致以下空格代币被忽略。

\relax您的示例没有显示出差异,因为空格后没有空格标记特点在输入中用于终止命令名称,然后被丢弃而不被标记。

在此处输入图片描述


a\relax\space b

a\ignorespaces\space b

\uppercase{x\relax} y

\uppercase{x\ignorespaces} y

\bye

答案3

它们的定义不同:

\documentclass{article}
 
 \begin{document}
 
 \newcommand\testa[1]{test #1\ignorespaces} \testa{a} b 
 
 \newcommand\testb[1]{test #1\relax} \testb{a} b 
 \end{document}

在此处输入图片描述

相关内容