什么时候允许使用下划线,什么时候不允许使用下划线?

什么时候允许使用下划线,什么时候不允许使用下划线?

我曾经认为下划线('_')的行为如下:

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`\_=11then_是一个字母,你可以在任何地方使用它,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或者可以放心使用\citewhere 。1。这是因为 here用作形成内部命令的字符,该命令用于生成所需的对象(标签、参考或引文)。__

什么是\_

该命令\_定义为打印下划线。虽然这似乎不是什么大问题,但由于历史原因,还是存在一些复杂因素:字体不需要在位置 95(下划线的 ASCII 十进制代码)处有下划线,因此仅仅告诉 TeX“请在当前字体中排版位置 95 处的字符”并不是一组好的指令,无法真正在打印输出中获得下划线。

无论如何,当您想在标签中添加下划线时,您不想打印它,而只是将其用作标记。2所以这里\_是不可能的。


脚注

1\label{LAB_BY}如果将未仔细编写的宏设置_为活动字符,则使用 的文档可能会中断。一个突出的例子是syntax包。

2参见作为标签的有效名称有哪些?标签中的“合法”字符是什么。

相关内容