Como colocar subscritos globalmente no modo matemático em fonte vertical usando amsmath?

Como colocar subscritos globalmente no modo matemático em fonte vertical usando amsmath?

Costumo aplicar o ambiente subscrito no modo matemático para atribuir, por exemplo, materiais às propriedades dos materiais, $\eta_{oil}$, $\lambda_{air}$, etc. Não é muito matemático, mas ei, sou engenheiro ;-)

Estou aplicando o pacote amsmath, então isso coloca o subscrito em itálico como a maioria das outras letras. Eu não quero isso. É claro que existem inúmeras maneiras de alterar isso localmente ( $\eta_{\mathrm{oil}}$parece mais apropriado), mas isso é complicado.

Então, existe uma maneira TeXy legal e inteligente de resolver isso? Possivelmente aplicando algo parecido \DeclareMathSomething{}{}{}{}?

Eu gostaria de fazer isso globalmente, já que 99% do meu uso $_{}$não está relacionado a variáveis. E nas poucas situações em que o subscrito é uma variável, eu ainda poderia usar $_{\mathnormal{}}$...

Agradeço todas as sugestões.

Responder1

Eu usaria um personagem diferente para isso. Aqui eu uso !para subscritos verticais (e defino \exclamse você precisa !no modo matemático como ele mesmo.

\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}

insira a descrição da imagem aqui

Quando um caractere recebe \mathcode32768 ( "8000é o hexadecimal e \stringé uma precaução contra babelfazer coisas estranhas), ele tem um comportamento peculiar. Ele funciona normalmente no modo texto, mas quando encontrado no modo matemático torna-se como uma macro, mais precisamente como um caractere ativo.

Uma definição de !caráter ativo deve estar presente; o truque

\begingroup\lccode`~=`!
\lowercase{\endgroup\def~}#1{_{\mathrm{#1}}}

é o mesmo que

{\catcode`!=\active \gdef!#1{_{\mathrm{#1}}}

mas prefiro evitar \gdefsempre que possível. Então, quando o TeX encontra !no modo matemático, ele procura um argumento e o transforma em _{\mathrm{<argument>}}, que é exatamente o que você procura.

Finalmente, \mathchardef\exclam=\mathcode`!define \exclampara produzir o mesmo que seria produzido !no modo matemático se não o tivéssemos redefinido.


Se você não planeja usar apenas letras ASCII em seus subscritos, então você deve mudar \mathrmpara \textnormal, para que letras acentuadas também sejam permitidas (e os espaços sejam respeitados).

Responder2

Eu costumo usar algo como o seguinte:

\newcommand{\mstr}[1]   {\ensuremath{\mathit{#1}}}
\newcommand{\subs}[2]   {#1\mstr{_#2}}

Claro, você poderia, por exemplo, mudar \mathitpara \mathrm. Então use como

\subs{x}{y}

informação relacionada