\endlinechar 的字符代码小于 1 时的 Catcode

\endlinechar 的字符代码小于 1 时的 Catcode

\endlinechar小于1时,我们如何访问它的catcode?下面给出如下所示的错误:

! Bad character code (-1).
l.34 ...ndlinechar\string=\the\catcode\endlinechar
                                                  \relax%
? x

\endlinechar=\m@ne
\edef\restorecatcodes{%
  \let\noexpand\restorecatcodes\relax%
  \endlinechar\string=\the\endlinechar\relax%
  \catcode\the\endlinechar\string=\the\catcode\the\endlinechar\relax%
  \catcode\string`\noexpand`\string=\the\catcode\string``\relax%
  \catcode\string`\noexpand=\string=\the\catcode\string`=\relax%
}%

编辑

我曾见过 Michael Downes 的方法(在进程代码包)。 它看起来如下:

\begingroup%
\let\e\endlinechar\edef\p{\the\e}\e13\edef\n{\the\catcode\e}%
\xdef\restorecatcodes{%
  \let\noexpand\restorecatcodes\relax%
  \endlinechar=\p\relax\catcode\number\e=\n\relax%
  \catcode\string`\noexpand`\string=\the\catcode\string``\relax%
  \catcode\string`\noexpand=\string=\the\catcode\string`=\relax%
}%
\endgroup%

我认为他的假设是改变 charcode 不会影响 catcode。

答案1

在 TeX 中,字符代码必须介于 0 和 255 之间才能成为有效字符(因为 TeX 处理 8 位编码)。设置\endlinechar为 -1 表示不插入结束符(有点支持 hack,因为 Don 认为这会很有用)。由于 -1 不是有效字符代码,因此没有\catcode与之关联的代码,这就是为什么如果您尝试访问它,就会出现此错误。

更新以匹配相关编辑

在 TeX 中,有 256 个不同的字符标记,用字符代码 0 到 255 表示。每个字符都有一个\catcode与字符代码绑定的标记。以下三行

\catcode 98=13
\catcode `b=13     % only possible if the char (here "b") has not a special catcode like comment etc
\catcode `\b=13    % always safe

都在做同样的事情,也就是说,它们将字符 98 的 catcode (即 ascii“b”)设置为 13(活动)。

包含\endlinechar一个数字,表示要附加在行尾的字符代码(如果该数字介于 0 和 255 之间)。此行尾字符的 catcode 是它指向的字符标记的 catcode。因此,如果您这样做

\endlinechar=98

然后在每行末尾添加一个“b”,其 catcode 为“b”当前的值。换句话说,如果您临时更改\endlinechar,则不会修改原始字符的 catcode。唯一发生的事情是,在行尾附加了一个不同的字符(如果为 -1,则不附加任何字符)。因此,要恢复到旧情况,您只需重置\endlinechar为以前的数字。

答案2

只需检查是否\endlinechar可以有 catcode:

\edef\restorecatcodes{%
  \let\noexpand\restorecatcodes\relax%
  \endlinechar\string=\the\endlinechar\relax%
  \ifnum\endlinechar>-1 \ifnum\endlinechar<256%
    \catcode\the\endlinechar\string=\the\catcode\the\endlinechar\relax%
  \fi\fi
  \catcode\string`\noexpand`\string=\the\catcode\string``\relax%
  \catcode\string`\noexpand=\string=\the\catcode\string`=\relax%
}%

\endlinechar=-1

\restorecatcodes
\showthe\catcode\endlinechar

答案是

> 5.
l.16 \showthe\catcode\endlinechar

这表明 endlinechar 已恢复到之前的状态。如果我们说

\catcode`\^^M=\active

\edef\restorecatcodes{%
  \let\noexpand\restorecatcodes\relax%
  \endlinechar\string=\the\endlinechar\relax%
  \ifnum\endlinechar>-1 \ifnum\endlinechar<256%
    \catcode\the\endlinechar\string=\the\catcode\the\endlinechar\relax%
  \fi\fi
  \catcode\string`\noexpand`\string=\the\catcode\string``\relax%
  \catcode\string`\noexpand=\string=\the\catcode\string`=\relax%
}%

\endlinechar=-1

\restorecatcodes
\showthe\catcode\endlinechar

答案是

> 13.
l.16     \showthe\catcode\endlinechar

所以我们看到endlinechar恢复到了之前的状态(字符代码和类别代码)。

\catcode如果我们说\^^M=5 instead of\endlinechar=-1`也是一样。

相关内容