У меня есть много математических макросов, которые уже имеют верхний и/или нижний индекс по определению, т.е. что-то вроде
\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
если вы хотите выполнить какое-то действие с отсутствующим под/надстрочным индексом).