Proporcionar comandos que se ejecutarán al salir del modo matemático.

Proporcionar comandos que se ejecutarán al salir del modo matemático.

Tengo una macro importante \textmacroque sólo se puede invocar en modo texto. Me gustaría una macro \mathmacrotal que emita el comando

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

se transforma automáticamente y se evalúa de la siguiente manera:

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

Es decir, la posición de la macro se "mueve" justo después del final del modo matemático, momento en el que \textmacrose llama. ¿Existe alguna tecnología interna de LaTeX que permita esto? Necesitaría esto para funcionar en $...$entornos y equation.align

Editar: el \textmacrocomando pone una nota al margen usando \marginpar. No existe un comando comparable que funcione de la misma manera tanto en modo texto como en modo matemático; en particular, \marginnoteno apila los comentarios verticalmente.

Editar: sólo para hacer las cosas un poco más difíciles/realistas: (1) los \textmacrocomandos a veces estarán dentro de \ensuremathlos comandos, por lo que, por ejemplo, $a^b \ensuremath{x \mathmacro y}$deberían expandirse a $a^b \ensuremath{x y}$\textmacro. (2) En general, habrá múltiples invocaciones \mathmacrodentro del entorno matemático y todas deben llevarse hasta el final. (3) Cuando se usa en modo texto, \mathmacrodebería comportarse como \textmacro. (4) En general \mathmacroaceptará un argumento.

Respuesta1

Utilicé el comentario de Werner para el $...$formulario, pero agregué formularios que funcionan para equationy align.

EDITADO para manejar los requisitos del OP:

1) argumentos para \mathmacro;

2) múltiples llamadas \mathmacroen un solo entorno;

3) funciona cuando está incluido dentro \ensuremathdel argumento.

SOLUCIÓN REVISADA (puede manejar múltiples \mathmacrollamadas)

En este enfoque, para permitir múltiples llamadas, utilizo \mathmacropara crear una lista separada por punto y coma (no permite el ;por lo tanto en su \marginpars, pero puede cambiar manualmente el separador) de los \mathmacroargumentos.

Luego, una vez completado el entorno, invoco una rutina para analizar esa lista y emito una \textmacrollamada \marginparpara cada argumento de la lista. En el camino, tuve que manejar una peculiaridad alignque hacía un pase doble, lo que originalmente resultaba en llamadas duplicadas a \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}

ingrese la descripción de la imagen aquí

SOLUCIÓN ORIGINAL (permite sólo una \mathmacrollamada 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}

ingrese la descripción de la imagen aquí

información relacionada