Поставьте команды, которые будут выполнены после выхода из математического режима

Поставьте команды, которые будут выполнены после выхода из математического режима

У меня есть важный макрос \textmacro, который может быть вызван только в текстовом режиме. Я хотел бы макрос, \mathmacroкоторый выдает команду

Some text $a^b\mathmacro c^d$ more text

автоматически преобразуется и оценивается следующим образом:

Some text $a^b c^d$\textmacro more text

То есть, позиция макроса «перемещается» сразу после окончания математического режима, в котором \textmacroвызывается точка. Есть ли какая-либо внутренняя технология LaTeX, которая бы это позволяла? Мне нужно, чтобы это работало в средах $...$, equationи .align

Редактировать: \textmacroкоманда помещает заметку на поля с помощью \marginpar. Не существует сопоставимой команды, которая работала бы одинаково в текстовом и математическом режимах; в частности, \marginnoteне размещает комментарии вертикально.

Редактировать: просто чтобы сделать вещи немного сложнее/более реалистичными: (1) \textmacroкоманды иногда будут находиться внутри \ensuremathкоманд, поэтому, например, $a^b \ensuremath{x \mathmacro y}$должен расширяться до $a^b \ensuremath{x y}$\textmacro. (2) В общем случае будет несколько вызовов \mathmacroвнутри математической среды, и все они должны быть помещены в конец. (3) При использовании в текстовом режиме \mathmacroдолжен вести себя как \textmacro. (4) В общем случае \mathmacroбудет принимать аргумент.

решение1

Я использовал комментарий Вернера для $...$формы, но добавил формы, которые работают для equationи align.

ОТРЕДАКТИРОВАНО для соответствия требованиям ОП:

1) аргументы в пользу \mathmacro;

2) множественные вызовы \mathmacroв одной среде;

3) работает, когда встроен в \ensuremathаргумент.

ПЕРЕСМОТРЕННОЕ РЕШЕНИЕ (может обрабатывать несколько \mathmacroвызовов)

В этом подходе, чтобы разрешить множественные вызовы, я использую \mathmacroдля создания списка аргументов, разделенных точкой с запятой (запрещается, ;следовательно, в вашем \marginpars, но вы можете вручную изменить разделитель) \mathmacro.

Затем, после завершения среды, я вызываю процедуру для разбора этого списка и выдаю вызов \textmacroдля \marginparкаждого аргумента в списке. По пути мне пришлось обрабатывать причуду, alignкоторая делает двойной проход, изначально приводя к двойным вызовам \mathmacro.

\documentclass[11pt]{article}
\usepackage{amsmath}
\newcommand\textmacro[1]{\marginpar{\textbf{\sffamily #1}}}
% FIX FOR $...$ PER WERNER'S USAGE
\def\mathmacro#1#2${#2$\textmacro{#1}}
\makeatletter
% FIX FOR EQUATION
\let\svequation\equation
\let\svendequation\endequation
\def\eqfinishmacro{\expandafter\eqfinishhelpA\eqfinishdata\relax;\relax}
\def\eqfinishhelpA#1;#2\relax{%
  \ifx\relax#1\else\textmacro{#1}\if\relax#2\relax\else\eqfinishhelpA#2\relax\fi\fi%
  \@gobble}
\def\eqfinishdata{}
\newcommand\equationmacro[1]{%
  \xdef\eqfinishdata{\eqfinishdata#1;}}
\def\equation{\let\mathmacro\equationmacro\svequation}
\def\endequation{\svendequation\eqfinishmacro\gdef\eqfinishdata{}}
% FIX FOR ALIGN
\let\svalign\align
\let\svendalign\endalign
\def\alfinishmacro{\expandafter\alfinishhelpA\alfinishdata\relax;\relax}
\def\alfinishhelpA#1;#2\relax{%
  \ifx\relax#1\else\textmacro{#1}\if\relax#2\relax\else\alfinishhelpA#2\relax\fi\fi%
  \@gobble}
\def\alfinishdata{}
\newcommand\alignmacro[1]{%
  \xdef\alfinishdata{\alfinishdata#1;}}
\def\align{\let\mathmacro\alignmacro\svalign\def\alfinishdata{}}
\def\endalign{\svendalign\alfinishmacro\gdef\alfinishdata{}}
\makeatother
\begin{document}
Some text $a^b\mathmacro{MP} c^d$ more text\par
Some more text without a macro $a^b c^d$ more text\par
An equation using mathmacro
\begin{equation}
  a^b\mathmacro{EQ XYZ} c^d
\end{equation}%
to see if it works.\par
An equation using mathmacro
\begin{equation}
  a^b\mathmacro{EQ ARG.} c^d\mathmacro{2nd eq test}
\end{equation}%
to see if it works.\par
Here we have an equation without the mathmacro
\begin{equation}
  a^b =c^d
\end{equation}
but some following text.\par
Align with the mathmacro
\begin{align}
  a^b \mathmacro{AL ARG.} &= c^d &x &= y\mathmacro{2nd test}\\
  A^B \mathmacro{3rd test} &= C^D & X &= y
\end{align}%
to also see if it works.\par
Here we us align without the mathmacro
\begin{align}
  a^b &= c^d
\end{align}
but some following text.\par
Some text $a^b\mathmacro{ABC} c^d$ more text to see if original definition active.
\end{document}

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

ОРИГИНАЛЬНОЕ РЕШЕНИЕ (допускает только один \mathmacroвызов на среду)

\documentclass[11pt]{article}
\usepackage{amsmath}
\newcommand{\textmacro}[1][ABC]{\marginpar{\textbf{\sffamily #1}}}
% FIX FOR $...$ PER WERNER'S USAGE
\def\mathmacro#1#2${#2$\textmacro[#1]}
% FIX FOR EQUATION
\let\svequation\equation
\let\svendequation\endequation
\def\eqfinishmacro{}
\newcommand\equationmacro[1]{\gdef\eqfinishmacro{\textmacro[#1]}}
\def\equation{\let\mathmacro\equationmacro\svequation}
\def\endequation{\svendequation\eqfinishmacro\gdef\eqfinishmacro{}}
% FIX FOR ALIGN
\let\svalign\align
\let\svendalign\endalign
\def\alfinishmacro{}
\newcommand\alignmacro[1]{\gdef\alfinishmacro{\textmacro[#1]}}
\def\align{\let\mathmacro\alignmacro\svalign}
\def\endalign{\svendalign\alfinishmacro\gdef\alfinishmacro{}}
\begin{document}
Some text $a^b\mathmacro{MP} c^d$ more text\par
Some more text without a macro $a^b c^d$ more text\par
An equation using mathmacro
\begin{equation}
  a^b\mathmacro{EQ ARG.} c^d%\mathmacro
\end{equation}
to see if it works.\par
Here we have an equation without the mathmacro
\begin{equation}
  a^b =c^d
\end{equation}
Align with the mathmacro
\begin{align}
  a^b \mathmacro{AL ARG.} &= c^d
\end{align}
to also see if it works.\par
Here we us align without the mathmacro.
\begin{align}
  a^b &= c^d
\end{align}
Some text $a^b\mathmacro{ABC} c^d$ more text to see if original definition active.
\end{document}

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

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