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は 16 進数で、奇妙な動作をしない\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}

関連情報