如何使用 amsmath 在直立字体的数学模式中全局放置下标?

如何使用 amsmath 在直立字体的数学模式中全局放置下标?

我经常在数学模式中应用下标环境来将例如材料分配给材料属性,,,$\eta_{oil}$等等$\lambda_{air}$。虽然不是很数学,但嘿,我是一名工程师;-)

我正在应用 amsmath 包,因此这会将下标设置为斜体,就像大多数其他字母一样。我不想这样。当然,有很多方法可以本地更改它($\eta_{\mathrm{oil}}$感觉最合适),但这很麻烦。

那么有没有一种巧妙的 TeXy 方法来解决这个问题? 可能应用类似\DeclareMathSomething{}{}{}{}?

我想全局执行此操作,因为我 99% 的使用$_{}$与变量无关。在极少数情况下,下标是一个变量,我仍然可以使用$_{\mathnormal{}}$...

我感谢所有的建议。

答案1

我会为此使用不同的字符。在这里,我使用!直立下标(并在数学模式中将\exclam其定义为本身)。!

\documentclass{article}
\usepackage{amsmath}

\begingroup\lccode`~=`!
\lowercase{\endgroup\def~}#1{_{\mathrm{#1}}}
\mathchardef\exclam=\mathcode`!
\AtBeginDocument{\mathcode`!=\string"8000 }

\begin{document}
$a_{x}+b!{eff}=n\exclam$
\end{document}

在此处输入图片描述

当一个字符被赋予\mathcode32768("8000这是它的十六进制数,\string是防止发生奇怪事情的预防措施babel)时,它会产生奇怪的行为。它在文本模式下表现正常,但在数学模式下发现它就像一个宏,更确切地说,像一个活动字符。

必须存在主动角色的定义!;诀窍

\begingroup\lccode`~=`!
\lowercase{\endgroup\def~}#1{_{\mathrm{#1}}}

是相同的

{\catcode`!=\active \gdef!#1{_{\mathrm{#1}}}

但我更愿意\gdef尽可能避免这种情况。因此,当 TeX!在数学模式中找到一个参数并将其转换为 时,它就会查找该参数并将其转换为_{\mathrm{<argument>}},这正是您想要的。

最后,\mathchardef\exclam=\mathcode`!定义生成的结果与我们未重新定义时数学模式中\exclam生成的结果相同。!


如果您不打算在下标中仅使用 ASCII 字母,那么您应该更改\mathrm\textnormal,这样也允许使用重音字母(并保留空格)。

答案2

我通常使用如下方法:

\newcommand{\mstr}[1]   {\ensuremath{\mathit{#1}}}
\newcommand{\subs}[2]   {#1\mstr{_#2}}

当然,你可以改为\mathit\mathrm然后像下面这样使用它

\subs{x}{y}

相关内容