当\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`也是一样。