活动空格字符无定义?

活动空格字符无定义?

在下面的代码中,为什么空格字符不会像点字符那样产生“未定义的控制序列”错误:

\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.

相关内容