Fornece comandos a serem executados ao sair do modo matemático

Fornece comandos a serem executados ao sair do modo matemático

Tenho uma macro importante \textmacroque só pode ser invocada em modo texto. Eu gostaria de uma macro \mathmacroque emitisse o comando

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

é automaticamente transformado e avaliado da seguinte forma:

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

Ou seja, a posição da macro é 'movida' logo após o final do modo matemático, momento em que \textmacroé chamado. Existe alguma tecnologia interna do LaTeX que permita isso? Eu precisaria disso para funcionar em $...$ambientes equatione alignambientes.

Editar: o \textmacrocomando coloca uma nota na margem usando \marginpar. Não existe nenhum comando comparável que opere da mesma maneira tanto no modo de texto quanto no modo matemático; em particular, \marginnotenão empilha comentários verticalmente.

Editar: apenas para tornar as coisas um pouco mais difíceis/mais realistas: (1) os \textmacrocomandos às vezes estarão dentro de \ensuremathcomandos, então, por exemplo, $a^b \ensuremath{x \mathmacro y}$devem ser expandidos para $a^b \ensuremath{x y}$\textmacro. (2) Em geral, haverá múltiplas invocações \mathmacrodentro do ambiente matemático e todas elas deverão ser levadas até o fim. (3) Quando usado em modo texto, \mathmacrodeve se comportar apenas como \textmacro. (4) Em geral \mathmacroaceitará um argumento.

Responder1

Usei o comentário de Werner para o $...$formulário, mas adicionei formulários que funcionam para equatione align.

EDITADO para atender aos requisitos do OP:

1) argumentos para \mathmacro;

2) múltiplas chamadas \mathmacroem um único ambiente;

3) funciona quando incorporado ao \ensuremathargumento.

SOLUÇÃO REVISADA (pode lidar com múltiplas \mathmacrochamadas)

Nesta abordagem, para permitir múltiplas chamadas, eu uso \mathmacropara construir uma lista separada por ponto e vírgula (não permite o ;portanto em seus \marginpars, mas você pode alterar manualmente o separador) dos \mathmacroargumentos.

Então, após a conclusão do ambiente, chamo uma rotina para analisar essa lista e emito uma \textmacrochamada \marginparpara cada argumento da lista. Ao longo do caminho, tive que lidar com uma peculiaridade alignque faz uma passagem dupla, resultando originalmente em chamadas duplicadas para \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}

insira a descrição da imagem aqui

SOLUÇÃO ORIGINAL (permite apenas uma \mathmacrochamada por ambiente)

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

insira a descrição da imagem aqui

informação relacionada