Определить макрос, который сканирует вперед на наличие надстрочных и/или подстрочных индексов, «поглощает» их и перемещает их аргумент

Определить макрос, который сканирует вперед на наличие надстрочных и/или подстрочных индексов, «поглощает» их и перемещает их аргумент

У меня есть много математических макросов, которые уже имеют верхний и/или нижний индекс по определению, т.е. что-то вроде

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

В тексте текста эти символы часто нуждаются в дополнительном индексе. Это означает, что автор должен помнить о необходимости поместить основной символ в пару {}-скобок, в противном случае возникнет двойная ошибка индекса.

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

Дополнительный верхний индекс становится вторичным верхним индексом и устанавливается немного выше и меньше: дополнительный верхний индекс Это имеет два недостатка: a) В специальной области применения оба верхних индекса находятся на одном уровне иерархии с концептуальной точки зрения. Другими словами, оба верхних индекса должны быть фактически напечатаны как список "foo, extra", и противоположный порядок "extra, foo" был бы одинаково хорош. b) Если первичный sup- и subscript очень несбалансированны по длине, вторичный верхний индекс устанавливается далеко друг от друга, например

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

и

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

урожайность далеко друг от друга верхний индекс

В качестве обходного пути я в настоящее время использую следующее определение, которое принимает необязательный аргумент и добавляет аргумент к внутреннему верхнему индексу:

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

(Примечание: я знаю, что это условие \if!#1!не является правильным способом проверки пустого аргумента, поскольку оно не выполняется, если аргумент расширяется до !. Но я думаю, вы поняли, что делает макрос.)

Он используется как

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

и yields введите описание изображения здесь Однако у этого есть два основных недостатка: a) \newcommandподдерживает только один необязательный аргумент. Поэтому мне нужно решить во время проектирования, может ли в конечном итоге понадобиться дополнительный надстрочный или подстрочный индекс. Я не могу поддерживать оба варианта. b) Пользователь должен помнить необычный синтаксис для размещения дополнительных надстрочных/подстрочных индексов.

Вопрос:

Как определить макрос \mymathsymsuper, который

  • сканирует вперед, если за ним следует символ верхнего индекса ^<tok> и/или символ нижнего индекса _<tok>, за каждым из которых следует дополнительный токен <tok>
  • «поглощает их», и
  • перемещает <tok> в конец его внутреннего индекса, разделенного запятой?

Полная МВЭ:

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

решение1

Это проще простого 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}

введите описание изображения здесь

С e{^_}макросом ищет вперед ^или _(в любом порядке) и присваивает #1надстрочный индекс, #2подстрочный индекс. Вы можете проверить наличие с помощью \IfValueT(или \IfValueTFесли вы хотите выполнить какое-то действие с отсутствующим под/надстрочным индексом).

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