Как глобально поместить нижние индексы в математическом режиме в прямом шрифте с помощью 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}

Связанный контент