我曾经认为下划线('_')的行为如下:
IF ('_') {
BUFFER NEXT ITEM
MAKE THE NEXT ITEM A SUBSCRIPT
SEND SUBSCRIPT TO OUT STREAM
}
ELSE IF ('\_')
SEND UNDERSCORE CHARACTER TO OUT STREAM
我错了。
%% Use underscore for subscript while not in math mode
%% ERROR!
%X_5
% Use underscore in math mode to make a subscript
% No error
$ X_{subscript} $
% Escape Sequence (backslash) tells LaTeX we want underscore char
% instead of '_' means 'make a subscript'
% No error
X \_ \_ \_ Oh look! underscore characters.
% underscore in the label name
% No error
\begin{equation}
x = y \label{LAB_BY}
\end{equation}
%% Do not want subscript functionality of '_'
%% Use backslash to put an underscore into the label name
%% put a space after '_' so that after escape reads only '_' and not '_BY'
%% ERROR
%\begin{equation}
% x = y \label{LAB\_ BY}
%\end{equation}
%% Do not want subscript functionality of '_'
%% Use backslash to put an underscore into the label name
%% fail to put a space char after '\_'
%% ERROR
%\begin{equation}
% x = y \label{LAB\_BY}
%\end{equation}
什么时候允许使用下划线,什么时候不允许使用下划线?
如果您不在数学模式中,'_' 表示什么?
答案1
TeX 中的任何字符都没有被分配特殊行为,一切都取决于当前的 catcode 机制。
如果\catcode95=11
(通常写成\catcode`\_=11
then_
是一个字母,你可以在任何地方使用它,x
所以
\catcode`\_=11
a_b \def\one_two_three{four} \one_two_three
一切都很好,并且会排版a_b four
。
但通常_
具有 catcode 8,这意味着如果在数学模式下遇到它,它具有下标含义,并且如果字符标记在文本模式下直接排版,则会出现错误。
然而,令牌的其他用途,它只是一个字符令牌,例如
\newcommand\foo{a___jd_ \_ }
是合法的,并且定义\foo
为该标记序列(如果使用则可能会产生错误,但不一定,这取决于上下文)。
类似地,在\write
或\csname
(LaTeX 的宏使用的两个构造\label
)中,任何非活动的合法标记都只充当其自身,因此\csname one_two_three\endcsname
构造名称与上面使用 catcode 更改访问的控制序列one_two_three
相同的控制序列。\one_two_three
请注意,这\_
只是带有名称的控制序列,_
它不会强制产生下划线。默认情况下,它在 latex 中会产生下划线,但就像\\
不产生反斜杠一样,您可以定义\_
它来执行任何操作:
\def\_{zzzzz} \_
zzzzz
例如会产生。
\_
不是由 TeX 预定义的,laTeX 将其定义为宏:
\DeclareRobustCommand{\_}{%
\ifmmode\nfss@text{\textunderscore}\else\textunderscore\fi}
答案2
我将处理标准 LaTeX 设置。
什么是_
?
该字符_
很特殊;如果在数学模式中找到它,则表示需要下标,并且基本上会将后面的标记或括号组转换为下标。_{1}
即使下标只是一个字符,也建议使用。
如果_
在数学模式之外发现,并且 TeX 正在排版,则会引发错误。另一方面,TeX 并非一直在排版。在某些情况下,它会吸收标记,以不同于打印某些内容的方式处理它们。
例如,在将论证读入 时就是这种情况\label
,\ref
或者可以放心使用\cite
where 。1。这是因为 here用作形成内部命令的字符,该命令用于生成所需的对象(标签、参考或引文)。_
_
什么是\_
?
该命令\_
定义为打印下划线。虽然这似乎不是什么大问题,但由于历史原因,还是存在一些复杂因素:字体不需要在位置 95(下划线的 ASCII 十进制代码)处有下划线,因此仅仅告诉 TeX“请在当前字体中排版位置 95 处的字符”并不是一组好的指令,无法真正在打印输出中获得下划线。
无论如何,当您想在标签中添加下划线时,您不想打印它,而只是将其用作标记。2所以这里\_
是不可能的。
脚注
1\label{LAB_BY}
如果将未仔细编写的宏设置_
为活动字符,则使用 的文档可能会中断。一个突出的例子是syntax
包。
2参见作为标签的有效名称有哪些?标签中的“合法”字符是什么。