继第 6 章之后TeXbook,我分析了文件中的错误,这些错误story.tex
包含\errorcontextlines=0
在开头,以及错误的控制序列:\centerline{\bf A SHORT \ERROR STORY}
。正如预期的那样,在运行时tex story.tex
,我收到以下错误:
! Undefined control sequence.
<argument> \bf A SHORT \ERROR
STORY
...
l.4 \centerline{\bf A SHORT \ERROR STORY}
但是然后,与结尾双重危险部分中所建议的类似,我在?
提示后输入以下内容:
? I\errorcontextlines=100 \oops
(带有空格,正如书中所建议的那样)
这给出了预期的后续提示:! Undefined control sequence. <insert> \errorcontextlines=10 \oops <argument> \bf A SHORT \ERROR STORY \centerline #1->\line {\hss #1 \hss } l.4 \centerline{\bf A SHORT \ERROR STORY}
? I\errorcontextlines=100\oops
(没有空格)
这会出现意外的提示:! Undefined control sequence. <insert> \errorcontextlines=10\oops ... l.4 \centerline{\bf A SHORT \ERROR STORY}
(\oops
是未定义的控制序列。)
问题:这似乎表明 TeX 关心上面的空格,但这似乎是错误的!这是怎么回事?
答案1
当 TeX 扫描数字时,数字后的空格会终止扫描,因此\errorcontextlines=10<space>
是“完整”指令,而 是\errorcontextlines=10
“不完整”指令,因为它后面的内容可能会改变结果。下一个标记也可能是另一个数字,完全改变 中存储的值\errorcontextlines
,因此 TeX 会继续扩展以寻找更多数字或终止扫描的内容。
通过比较这两个的结果(不一定是提示?
),你可以更清楚地看到事情发生的顺序:
% \test shows the value of \errorcontextlines and shows the following token
\def\test{\showthe\errorcontextlines \show}
\afterassignment\test
\errorcontextlines=10 \oops 0x
\bye
这表明:
This is TeX, Version 3.141592653 (TeX Live 2023) (preloaded format=tex)
(./test.tex
> 10.
\test ->\showthe \errorcontextlines
\show
l.5 \errorcontextlines=10
\oops 0x
?
> \oops=undefined.
l.5 \errorcontextlines=10 \oops
0x
?
[1] )
Output written on test.dvi (1 page, 208 bytes).
Transcript written on test.log.
和这个:
% \test shows the value of \errorcontextlines and shows the following token
\def\test{\showthe\errorcontextlines \show}
\afterassignment\test
\errorcontextlines=10\oops 0x
\bye
这表明:
This is TeX, Version 3.141592653 (TeX Live 2023) (preloaded format=tex)
(./test.tex
! Undefined control sequence.
l.5 \errorcontextlines=10\oops
0x
?
> 100.
\test ->\showthe \errorcontextlines
\show
<to be read again>
x
l.5 \errorcontextlines=10\oops 0x
?
> the letter x.
<recently read> x
l.5 \errorcontextlines=10\oops 0x
?
)
No pages of output.
Transcript written on test.log.
在第一个例子中,\errorcontextlines
被赋值为 10,然后\text
被执行(因为\afterassignment
)并显示以下标记是\oops
。然后0x
被排版为dvi
。
在第二个例子中,TeX 仍在扫描整数,当它看到 时\oops
,它会抱怨\oops
未定义(然后忽略它)并继续扫描整数。 看到0
并将其添加到整数,然后看到x
,这不是一个有效的数字,因此它停止扫描。 \errorcontextlines
被分配为 100,然后\text
显示以下标记是x
。 什么都没有排版。