Ich habe ein wichtiges Makro \textmacro
, das nur im Textmodus aufgerufen werden kann. Ich hätte gerne ein Makro, \mathmacro
bei dem die Eingabe des Befehls
Some text $a^b\mathmacro c^d$ more text
wird automatisch transformiert und wie folgt ausgewertet:
Some text $a^b c^d$\textmacro more text
Das heißt, die Makroposition wird bis kurz hinter das Ende des Mathematikmodus „verschoben“, an dem \textmacro
aufgerufen wird. Gibt es eine interne LaTeX-Technologie, die dies ermöglichen würde? Ich brauche dies, damit es in $...$
- equation
und align
-Umgebungen funktioniert.
Bearbeiten: Der \textmacro
Befehl fügt eine Notiz mit in den Rand ein \marginpar
. Es gibt keinen vergleichbaren Befehl, der sowohl im Textmodus als auch im Mathematikmodus auf die gleiche Weise funktioniert; insbesondere \marginnote
stapelt er Kommentare nicht vertikal.
Bearbeiten: nur um die Dinge ein bisschen schwieriger/realistischer zu machen: (1) Die \textmacro
Befehle stehen manchmal innerhalb von \ensuremath
Befehlen, daher $a^b \ensuremath{x \mathmacro y}$
sollte zB zu erweitert werden $a^b \ensuremath{x y}$\textmacro
. (2) Im Allgemeinen wird es \mathmacro
innerhalb der Mathematikumgebung mehrere Aufrufe von geben, und sie müssen alle ans Ende geschoben werden. (3) Bei Verwendung im Textmodus \mathmacro
sollte es sich einfach wie verhalten \textmacro
. (4) Nimmt im Allgemeinen \mathmacro
ein Argument an.
Antwort1
Ich habe Werners Kommentar für das $...$
Formular verwendet, aber Formulare hinzugefügt, die für equation
und funktionieren align
.
BEARBEITET, um den Anforderungen des OP gerecht zu werden:
1) Argumente für \mathmacro
;
2) mehrere Aufrufe \mathmacro
in einer einzigen Umgebung;
3) funktioniert, wenn es in \ensuremath
ein Argument eingebettet ist.
ÜBERARBEITETE LÖSUNG (kann mehrere \mathmacro
Anrufe verarbeiten)
Um bei diesem Ansatz mehrere Aufrufe zu ermöglichen, erstelle ich \mathmacro
eine durch Semikolon getrennte Liste der Argumente (das ;
„daher“ in Ihren s ist nicht zulässig, Sie können das Trennzeichen jedoch manuell ändern) . \marginpar
\mathmacro
Dann rufe ich nach Abschluss der Umgebung eine Routine auf, um diese Liste zu analysieren, und gebe für jedes Argument in der Liste einen \textmacro
Aufruf von aus \marginpar
. Dabei musste ich eine Eigenart von behandeln, align
die einen doppelten Durchlauf bewirkt, was ursprünglich zu doppelten Aufrufen von führte \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}
URSPRÜNGLICHE LÖSUNG (erlaubt nur einen \mathmacro
Anruf pro Umgebung)
\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}