我經常在數學模式下應用下標環境來將材料分配給材料屬性、、$\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}