\catcode 的范围是什么?

\catcode 的范围是什么?

在大多数情况下,我想使用下划线作为通常的字符,因此我在全局中这样做:

\catcode`\_=11

通常,我在中文环境中工作,该代码~不是那么有用,因此我用它来替换代码 8 _

\catcode`\~=8

它在中文解决方法中运行完美,包括 tikz、reference 等等。


但是当我编写英文文档时,有时我想保留代码13:

\catcode`\~=13

为了将下划线用作简单的可打印字符并同时使用下标,我为下标定义了一个新命令:

\def\mf#1{\catcode`_=8 _{#1}\catcode`_=11}

我希望的是$a\mf{b}$可以在“a”后打印一个下标“b”。但它在“a”和“b”之间打印了一个视觉下划线“_”,就像a_b

命令中发生了什么\mf{b}?是关于顺序还是范围?以及如何实施\mf

另外,当我使用包时\usepackage{underscore},引用下划线处会出错\ref{_}。所以我尝试用原始命令来实现它。

谢谢。

答案1

回答标题中的问题,根据记录,的范围\catcode是当前的 TeX 组,与大多数作业一样(除非前面有\global)。

但这里的问题不是范围,而是标记化的时间。当 TeX 处理一行输入时,它会将看到的每个字符(或序列)转换为令牌。 A令牌可以归类为字符标记(例如_8A11)以及控制符号/序列标记(例如\,\relax)。TeX 在第一次“看到”字符时立即将其转换为标记,然后该标记将被冻结并且无法更改为其他内容。

就您而言,这方面的实际含义如下:

\catcode`\_=11
\def\mf#1{\catcode`_=8 _{#1}\catcode`_=11}

第一行将 a 设为_catcode 11 标记,然后第二行进行定义,并将 的定义\mf最终全部_改为 catcode 11,然后只需排版 a即可。要创建下标,则需要8_11{#1}__

有几种方法可以做到这一点,但最简单的方法是使用\sbLaTeX 内核中定义为:

\let\sb=_

所以这样\sb确切地作为_8。您还可以将\let\mf=\sb其用作\mf别名。

相关内容