在下面的代码中,为什么空格字符不会像点字符那样产生“未定义的控制序列”错误:
\catcode` =\active
\catcode`.=\active
a b
a.b
\bye
答案1
来自plain.tex
,第 524 至 525 行:
\def\obeyspaces{\catcode`\ \active}
{\obeyspaces\global\let =\space}
因此,活动空间在 Plain TeX 中有一个定义;这是为什么呢?如果某个空间最终出现在有效\write
时的标记列表\obeyspaces
中,它将被存储(作为活动字符)以便稍后进行扩展,当可能(或者几乎肯定)声明不再有效时。如果活动空间的定义仅在本地给出,则这样的标记会导致\write
“未定义控制序列”的错误。
还有另一个原因(诚然更模糊):如果你这样做\catcode`\ =12
,声明
\mathcode`\ ="8000 % \space
第 86 行将生效;数学模式下的空格将被视为活动字符;但扩展是普通的空格标记,因此它仍然会被忽略。
ASCII EOL(^^M
)有类似的处理:第 521 至 523 行是
{\catcode`\^^M=\active % these lines must end with %
\gdef\obeylines{\catcode`\^^M\active \let^^M\par}%
\global\let^^M\par} % this is in case ^^M appears in a \write
答案2
您已将字符设为活动状态,但未提供任何定义。因此,您依赖的是“周围”的任何东西。活动空间确实有定义,但活动空间.
没有,因此您会收到错误。您可以\show
这样做:
\catcode`\ =\active
\catcode`\.=\active
\show %
\show.