如何使用 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}

相關內容