Defina a macro que verifica antecipadamente o super e/ou subscrito, os "absorve" e move seu argumento

Defina a macro que verifica antecipadamente o super e/ou subscrito, os "absorve" e move seu argumento

Eu tenho muitas macros matemáticas que já possuem um super e/ou subscrito por definição, ou seja, algo como

\newcommand*{\mymathsym}{x^{\text{foo}}_{\text{bar}}}

No corpo do texto, esses símbolos frequentemente precisam de um sup-/subscrito extra. Isso significa que o autor deve se lembrar de colocar o símbolo principal em um par de chaves {}, caso contrário ocorrerá um erro duplo sup-/subscrito.

\begin{equation}
  {\mymathsym}^{\text{extra}}
\end{equation}

O sobrescrito extra torna-se um sobrescrito secundário e é definido um pouco mais alto e menor: sobrescrito extra Isso tem duas desvantagens: a) No campo especial de aplicação, ambos os sobrescritos estão no mesmo nível de hierarquia do ponto de vista conceitual. Em outras palavras, ambos os sobrescritos deveriam ser impressos como uma lista "foo, extra" e a ordem oposta "extra, foo" seria igualmente boa. b) Se o sup- e o subscrito primários forem muito desequilibrados em comprimento, o sobrescrito secundário será colocado bem distante, por exemplo

\newcommand*{\mymathsymlong}{x^{\text{foo}}_{\text{very long foobar}}}

e

\begin{equation}
{\mymathsymlong}^{\text{extra}}
\end{equation}

rendimentos distantes sobrescritos

Como solução alternativa, atualmente uso a seguinte definição que recebe um argumento opcional e anexa o argumento ao sobrescrito interno:

\newcommand*{\mymathsymext}[1][]{x^{\text{foo}\if!#1!\else, #1\fi}_{\text{very long foobar}}}

(Observação: eu sei que a condição \if!#1!não é a maneira correta de testar um argumento vazio, porque ela falha se o argumento se expandir para a !. Mas acho que você entendeu o que a macro faz.)

É usado como

\begin{equation}
\mymathsymext \qquad\text{vs.}\qquad \mymathsymext[\text{extra}]
\end{equation}

e rendimentos insira a descrição da imagem aqui No entanto, isto tem duas desvantagens principais: a) \newcommandsuporta apenas um único argumento opcional. Portanto, preciso decidir, em tempo de design, se um sobrescrito adicional ou um subscrito adicional poderá ser necessário. Não posso apoiar ambos. b) O usuário deve se lembrar de uma sintaxe incomum para colocar sup-/subscritos adicionais.

Pergunta:

Como definir uma macro \mymathsymsuperque

  • varre adiante, se for seguido por um caractere supscrito ^<tok> e/ou caractere subscrito _<tok> cada um seguido por um token adicional <tok>
  • "absorve-os", e
  • move <tok> para o final de seu sup-/subscrito interno separado por uma vírgula?

MWE completo:

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}

\newcommand*{\mymathsym}{x^{\text{foo}}_{\text{bar}}}

\newcommand*{\mymathsymlong}{x^{\text{foo}}_{\text{very long foobar}}}

\newcommand*{\mymathsymext}[1][]{x^{\text{foo}\if!#1!\else, #1\fi}_{\text{very long foobar}}}

\begin{document}

Here, the author must know that \verb#\mymathsym# has already a super- and subscript and must remember to put the main symbol into a pair of \{\}-braces, otherwise a double sup-/subscript error occurs.
The extra superscript becomes a secondary superscript and it set slightly higher and smaller:
\begin{equation}
{\mymathsym}^{\text{extra}}
\end{equation}

If the primary sup- and subscript are very unbalanced in their length, the secondary subscript is set very far apart:
\begin{equation}
{\mymathsymlong}^{\text{extra}}
\end{equation}

This extended macro takes an optional argument and ``absorbs'' the extra superscript into the primary superscript:
\begin{equation}
\mymathsymext \qquad\text{vs.}\qquad \mymathsymext[\text{extra}]
\end{equation}
Still, the author must remember this ``unusual'' syntax and it only supports either an extra super- or subscript, bot not both.

\paragraph{Question:}
How does one define a macro \verb#\mymathsymsuper# that
\begin{itemize}
  \item scans ahead if it followed by a superscript character $\verb!^!\langle \mathit{token}_\text{sup}\rangle$ and/or subscript character $\verb!_!\langle \mathit{token}_\text{sub}\rangle$ each followed by an    additional token $\mathit{token}_\text{sup}$ and $\mathit{token}_\text{sub}$ resp.
  \item ``absorbs them'', and
  \item moves $\mathit{token}_\text{sup}$ and/or $\mathit{token}_\text{sub}$ to end of its internal sup-/subscript separated by a comma?
\end{itemize}

\end{document}

Responder1

É muito fácil com xparse:

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}

\NewDocumentCommand{\mymathsym}{e{^_}}{%
  x^{\mathrm{foo}\IfValueT{#1}{,#1}}_{\mathrm{bar}\IfValueT{#2}{,#2}}%
}

\begin{document}

\begin{gather}
\mymathsym \\
\mymathsym^{\mathrm{extrasup}} \\
\mymathsym_{\mathrm{extrasub}} \\
\mymathsym^{\mathrm{extrasup}}_{\mathrm{extrasub}} \\
\mymathsym_{\mathrm{extrasub}}^{\mathrm{extrasup}}   
\end{gather}

\end{document}

insira a descrição da imagem aqui

Com e{^_}a macro procura ^ou _(em qualquer ordem) e atribui #1ao sobrescrito, #2ao subscrito. Você pode testar a presença com \IfValueT(ou \IfValueTFse quiser realizar alguma ação com um sub/sobrescrito ausente).

informação relacionada