为什么在纯 TeX 中处理错误时空格很重要?

为什么在纯 TeX 中处理错误时空格很重要?

继第 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}

但是然后,与结尾双重危险部分中所建议的类似,我在?提示后输入以下内容:

  1. ? 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}
    
  2. ? 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。 什么都没有排版。

相关内容