在大多数情况下,我想使用下划线作为通常的字符,因此我在全局中这样做:
\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令牌可以归类为字符标记(例如_
8或A
11)以及控制符号/序列标记(例如\,
或\relax
)。TeX 在第一次“看到”字符时立即将其转换为标记,然后该标记将被冻结并且无法更改为其他内容。
就您而言,这方面的实际含义如下:
\catcode`\_=11
\def\mf#1{\catcode`_=8 _{#1}\catcode`_=11}
第一行将 a 设为_
catcode 11 标记,然后第二行进行定义,并将 的定义\mf
最终全部_
改为 catcode 11,然后只需排版 a即可。要创建下标,则需要8。_11{#1}
_
_
有几种方法可以做到这一点,但最简单的方法是使用\sb
LaTeX 内核中定义为:
\let\sb=_
所以这样\sb
做确切地作为_
8。您还可以将\let\mf=\sb
其用作\mf
别名。