我试图理解\p@
plain.tex 的含义:
\newdimen\p@ \p@=1pt % this saves macro space and time
当我试图弄清楚的时候,我偶然发现了奇怪的行为。
考虑一下:
\newdimen\mydimen
\catcode`@=11
\mydimen=10\p@
\showthe\mydimen
结果是10.0pt
现在在开头添加\nonstopmode
和\showthe\nointerlineskip
,使其变成:
\nonstopmode
\showthe\nointerlineskip
\newdimen\mydimen
\catcode`@=11
\mydimen=10\p@
\showthe\mydimen
结果是0.0pt
以下是第二个示例的附加日志\tracingcommands=1
。
{vertical mode: \nonstopmode}
{\showthe}
> -1000.0pt.
\nointerlineskip ->\prevdepth
-1000\p@
l.4 \showthe\nointerlineskip
{the character -}
{horizontal mode: the character -}
{\dimen11}
! Missing number, treated as zero.
<to be read again>
\global
\alloc@ #1#2#3#4#5->\global
\advance \count 1#1by\@ne \ch@ck #1#4#2\allocati...
l.5 \newdimen\mydimen
A number should have been here; I inserted `0'.
(If you can't figure out why I needed to see a number,
look up `weird error' in the index to The TeXbook.)
! Illegal unit of measure (pt inserted).
<to be read again>
\global
\alloc@ #1#2#3#4#5->\global
\advance \count 1#1by\@ne \ch@ck #1#4#2\allocati...
l.5 \newdimen\mydimen
Dimensions can be in units of em, ex, in, pt, pc,
cm, mm, dd, cc, bp, or sp; but yours is a new one!
I'll assume that you meant to say pt, for printer's points.
To recover gracefully from this error, it's best to
delete the erroneous units; e.g., type `2' to delete
two letters. (See Chapter 27 of The TeXbook.)
{\global}
{\count21}
{\global}
{\immediate}
\mydimen=\dimen16
{\catcode}
{\dimen16}
{\showthe}
> 0.0pt.
l.8 \showthe\mydimen
{\par}
{vertical mode: \par}
)
! Emergency stop.
问题是:1)如何\p@
工作;2)为什么 \mydimen 的值是0.0pt
第二种情况;3)如何解释日志。
答案1
实际上,没有奇怪的错误。原语\showthe
扩展标记以找到适合显示的内容,规则与 相同\the
。
由于在 TeX 处于垂直模式时\nointerlineskip
扩展为\prevdepth -1000\p@
并且\prevdepth
在之后是合法的,因此显示的是 ,即,因为 TeX 位于垂直列表的开始处。\the
\prevdepth
-1000pt
然后-1000
打印并\p@
期望一个维度,因为它是一个维度寄存器。因此,下一个标记被扩展,即,\newdimen
并且未找到长度。错误:Missing number, treated as zero
。TeX 尝试通过插入来恢复0
,然后缺少一个单元,TeX 添加pt
,再次进行错误恢复。然后\newdimen
执行。现在\p@
保存值0pt
,因此\mydimen=1000\p@
导致设置\mydimen
为零。
Plain TeX 具有
\newdimen\p@ \p@=1pt % this saves macro space and time
结果\p@
是\dimen11
(但这并不重要)。当寄存器出现在赋值的“右侧”时(例如\dimen0=\p@
,但=
是可选的),寄存器的值用于赋值;当它“单独”出现时,TeX 认为它必须对它执行赋值,情况就是这样。如果您输入the value of \dimen0\ is
并希望打印 的当前值,那么您会得到完全相同的错误\dimen0
。因此,虽然\dimen0=10\p@
是正确的赋值,但-1000\p@\newdimen
会导致错误。
由于\p@
是维度寄存器,当它出现在赋值语句的“右侧”时,它会接受前面的因子,即乘法。的默认值为\p@
1pt(如上所示),因此\dimen0=3.4\p@
与 相同\dimen0=3.4pt
;它只是需要的标记较少,并且可能会因更改 的值而被滥用\p@
(例如\p@=1bp
)。
如果您想显示类似的宏\nointerlineskip
,您需要\show
,而不是\showthe
。
警告:同时\showthe
扩展下一个标记,直到找到不可扩展的标记,\show
绝不扩展并显示下一个标记的含义。