\def\\ 与 \def\mksp 相比有何特殊之处?

\def\\ 与 \def\mksp 相比有何特殊之处?

在以下定义中,\\捕获空间标记但\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定义为的是},正如您得到的那样。编译器还会说组尚未关闭。

相关内容