根据\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
和的t
catcode 预计为 12 ( ),因为在定义other
时为它们分配了该 catcode 。因此,您的 定义并不相同,因为这里的字母确实是字母(catcode )。为什么 Knuth 用如此奇怪的 catcode 定义分隔宏?因为这样,在读取 dimen 寄存器时可用于剥离,tex 输出 catcode 的所有字符(空格除外)。例如:。 \\
\mymacro
11
\\
pt
other
\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>}