Plain TeX 中 \\ 的行为

Plain TeX 中 \\ 的行为

根据\show,预定义的控制序列\\应该扩展为其不带后缀“pt”的参数:

This is TeX, Version 3.1415926 (TeX Live 2012/Debian)
**\show\\
> \\=macro:
#1pt->#1.
<*> \show\

但是,使用它却失败了:

*\message{\\5pt}
! Argument of \\ has an extra }.
<inserted text> 
                \par 
<to be read again> 

当定义具有与 相同定义的宏时\\,一切都按预期工作:

*\def\mymacro #1pt{#1}

\show\mymacro
> \mymacro=macro:
#1pt->#1.

*\message{\mymacro5pt}
5

这该如何解释呢?

答案1

没有\show显示的是,p和的tcatcode 预计为 12 ( ),因为在定义other时为它们分配了该 catcode 。因此,您的 定义并不相同,因为这里的字母确实是字母(catcode )。为什么 Knuth 用如此奇怪的 catcode 定义分隔宏?因为这样,在读取 dimen 寄存器时可用于剥离,tex 输出 catcode 的所有字符(空格除外)。例如:。 \\\mymacro11\\ptother\expandafter\\\the\fontdimen2\font

Knuth 在 TeXbook 第 375 页中解释了这个肮脏的伎俩,其中还明确指出这\\只是一个辅助命令,正如@egreg 所评论的,不应该依赖它。

LaTeX2e 中 的等效项\\具有 (稍微) 更明显的名称:\rem@pt;还有方便的\strip@pt,其定义为\expandafter\rem@pt\the,因此您可以简单地说从 中\strip@pt\@tempdima去除。而 LaTeX3 以不同的语法提供了内部函数。pt\@tempdima\__dim_strip_pt:n{<dimension expression>}

相关内容