我经常在数学模式中应用下标环境来将例如材料分配给材料属性,,,$\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}
当一个字符被赋予\mathcode
32768("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}