我_
在文本模式下经常使用字符,因此我更改了下划线类别:\catcode\_=12
,但这也适用于数学模式,现在我无法在数学模式下使用下划线制作下标。有没有办法让 latex 在文本模式下将下划线解释为下划线字符,在数学模式下将其解释为下标?
答案1
你可以让_
数学变得活跃:
\AtBeginDocument{
\catcode`_=12
\begingroup\lccode`~=`_
\lowercase{\endgroup\let~}\sb
\mathcode`_="8000
}
梅威瑟:
\documentclass{article}
\usepackage[T1]{fontenc}
\AtBeginDocument{
\catcode`_=12
\begingroup\lccode`~=`_
\lowercase{\endgroup\let~}\sb
\mathcode`_="8000
}
\begin{document}
a_b $a_b$
\end{document}
答案2
\catcode`\_=\active
\def_{\relax\ifmmode\sb \else \_\fi}
答案3
值得一提的是,在 ConTeXt 中,特殊字符_
不需要^
在文本模式下转义,并且可以在数学模式下正常工作。
ConTeXt 表和数学对齐宏不用作&
对齐标记,因此&
在文本模式下也不需要转义。
答案4
下划线_
是已经默认情况下,数学处于活动状态:不需要明确将其数学代码设置为"8000
。因此可以这样做:
\documentclass{article}
\usepackage[T1]{fontenc}
\AtBeginDocument{%
\begingroup\lccode`~=`_%
\lowercase{\endgroup\let~}_%
\catcode`_=12
}
\begin{document}
a_b
$a_b$
\end{document}
也许最好这样做JLDiaz 的回答而不是使其成为 catcode 12
,使其成为 catcode ,并更改其活动定义以便仅在文本模式下13
执行。\_
\textunderscore
然而,这会导致标签出现问题;除非通过 Babel 服务进行激活,因为 babel 修补了各种内容以允许在标签中使用简写。
3.8
但是使用 Babel (我不知道3.9
)时,使用简写在数学上也是有效的,这是很危险的,因为\normal@char<char>
被定义为 catcode12
版本(如果在向 babel 声明为简写时它已经是 catcode 12
),但在数学模式下,使用数学活动字符会造成无限循环。
因此,\catcode
“_ 12”避免了这些潜在的困难。