Tenho uma macro importante \textmacro
que só pode ser invocada em modo texto. Eu gostaria de uma macro \mathmacro
que 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 equation
e align
ambientes.
Editar: o \textmacro
comando 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, \marginnote
não empilha comentários verticalmente.
Editar: apenas para tornar as coisas um pouco mais difíceis/mais realistas: (1) os \textmacro
comandos às vezes estarão dentro de \ensuremath
comandos, 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 \mathmacro
dentro do ambiente matemático e todas elas deverão ser levadas até o fim. (3) Quando usado em modo texto, \mathmacro
deve se comportar apenas como \textmacro
. (4) Em geral \mathmacro
aceitará um argumento.
Responder1
Usei o comentário de Werner para o $...$
formulário, mas adicionei formulários que funcionam para equation
e align
.
EDITADO para atender aos requisitos do OP:
1) argumentos para \mathmacro
;
2) múltiplas chamadas \mathmacro
em um único ambiente;
3) funciona quando incorporado ao \ensuremath
argumento.
SOLUÇÃO REVISADA (pode lidar com múltiplas \mathmacro
chamadas)
Nesta abordagem, para permitir múltiplas chamadas, eu uso \mathmacro
para construir uma lista separada por ponto e vírgula (não permite o ;
portanto em seus \marginpar
s, mas você pode alterar manualmente o separador) dos \mathmacro
argumentos.
Então, após a conclusão do ambiente, chamo uma rotina para analisar essa lista e emito uma \textmacro
chamada \marginpar
para cada argumento da lista. Ao longo do caminho, tive que lidar com uma peculiaridade align
que 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}
SOLUÇÃO ORIGINAL (permite apenas uma \mathmacro
chamada 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}