\showthe 之后出现奇怪的错误

\showthe 之后出现奇怪的错误

我试图理解\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 绝不扩展并显示下一个标记的含义。

相关内容