Tengo una macro importante \textmacro
que sólo se puede invocar en modo texto. Me gustaría una macro \mathmacro
tal 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 \textmacro
se llama. ¿Existe alguna tecnología interna de LaTeX que permita esto? Necesitaría esto para funcionar en $...$
entornos y equation
.align
Editar: el \textmacro
comando 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, \marginnote
no apila los comentarios verticalmente.
Editar: sólo para hacer las cosas un poco más difíciles/realistas: (1) los \textmacro
comandos a veces estarán dentro de \ensuremath
los 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 \mathmacro
dentro del entorno matemático y todas deben llevarse hasta el final. (3) Cuando se usa en modo texto, \mathmacro
debería comportarse como \textmacro
. (4) En general \mathmacro
aceptará un argumento.
Respuesta1
Utilicé el comentario de Werner para el $...$
formulario, pero agregué formularios que funcionan para equation
y align
.
EDITADO para manejar los requisitos del OP:
1) argumentos para \mathmacro
;
2) múltiples llamadas \mathmacro
en un solo entorno;
3) funciona cuando está incluido dentro \ensuremath
del argumento.
SOLUCIÓN REVISADA (puede manejar múltiples \mathmacro
llamadas)
En este enfoque, para permitir múltiples llamadas, utilizo \mathmacro
para crear una lista separada por punto y coma (no permite el ;
por lo tanto en su \marginpar
s, pero puede cambiar manualmente el separador) de los \mathmacro
argumentos.
Luego, una vez completado el entorno, invoco una rutina para analizar esa lista y emito una \textmacro
llamada \marginpar
para cada argumento de la lista. En el camino, tuve que manejar una peculiaridad align
que 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}
SOLUCIÓN ORIGINAL (permite sólo una \mathmacro
llamada 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}