在以下定义中,\\
捕获空间标记但\mksp
没有。
\documentclass{article}
\begin{document}
{\def\\{\global\let\sp= } \\ }
{\def\mksp{\global\let\spx= } \mksp }
\show\sp
\show\spx
\end{document}
运行时,输出表明\sp
是一个空格标记,\spx
但是}
。
> \sp=blank space .
l.5 \show\sp
?
> \spx=end-group character }.
l.6 \show\spx
为什么这很\\
特别?Knuth 在 TeXbook 的哪里讨论过这个问题?
答案1
不同之处\\
在于控制符号,而是\mksp
一个控制字。
在第二个示例中,后面的空格\mksp
不会经过标记化过程,标记化过程甚至在扩展之前:标记化规则的结果是,控制字后面的空格在标记化过程中被丢弃,这与多个空格缩减为一个或行首的空格被丢弃相同。相反,控制符号后面的空格不是忽略。因此,在标记化之后,TeX 看到(我将用 • 表示在标记化过程中幸存的空格标记)
{\def\\{\global\let\sp=•}•\\•}
定义之后,右括号后的空格将被忽略,因为它在垂直模式下可见;然后\\
被扩展,并且 TeX 会面对
\global\let\sp=••}
规则忽略了后面的空格=
,但第二个空格保留。此后,右括号便开始发挥作用。
在第二种情况下,TeX 呈现的是
{\def\mksp{\global\let\spx=•}•\mksp}
在执行 之后,它变为{
的定义和扩展\mksp
,
\global\let\spx=•}
再次,规则忽略了空间,因此\spx
定义为的是}
,正如您得到的那样。编译器还会说组尚未关闭。