Liefern Sie Befehle, die beim Verlassen des Mathematikmodus ausgeführt werden sollen

Liefern Sie Befehle, die beim Verlassen des Mathematikmodus ausgeführt werden sollen

Ich habe ein wichtiges Makro \textmacro, das nur im Textmodus aufgerufen werden kann. Ich hätte gerne ein Makro, \mathmacrobei 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 \textmacroaufgerufen wird. Gibt es eine interne LaTeX-Technologie, die dies ermöglichen würde? Ich brauche dies, damit es in $...$- equationund align-Umgebungen funktioniert.

Bearbeiten: Der \textmacroBefehl 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 \marginnotestapelt er Kommentare nicht vertikal.

Bearbeiten: nur um die Dinge ein bisschen schwieriger/realistischer zu machen: (1) Die \textmacroBefehle stehen manchmal innerhalb von \ensuremathBefehlen, daher $a^b \ensuremath{x \mathmacro y}$sollte zB zu erweitert werden $a^b \ensuremath{x y}$\textmacro. (2) Im Allgemeinen wird es \mathmacroinnerhalb der Mathematikumgebung mehrere Aufrufe von geben, und sie müssen alle ans Ende geschoben werden. (3) Bei Verwendung im Textmodus \mathmacrosollte es sich einfach wie verhalten \textmacro. (4) Nimmt im Allgemeinen \mathmacroein Argument an.

Antwort1

Ich habe Werners Kommentar für das $...$Formular verwendet, aber Formulare hinzugefügt, die für equationund funktionieren align.

BEARBEITET, um den Anforderungen des OP gerecht zu werden:

1) Argumente für \mathmacro;

2) mehrere Aufrufe \mathmacroin einer einzigen Umgebung;

3) funktioniert, wenn es in \ensuremathein Argument eingebettet ist.

ÜBERARBEITETE LÖSUNG (kann mehrere \mathmacroAnrufe verarbeiten)

Um bei diesem Ansatz mehrere Aufrufe zu ermöglichen, erstelle ich \mathmacroeine 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 \textmacroAufruf von aus \marginpar. Dabei musste ich eine Eigenart von behandeln, aligndie 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}

Bildbeschreibung hier eingeben

URSPRÜNGLICHE LÖSUNG (erlaubt nur einen \mathmacroAnruf 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}

Bildbeschreibung hier eingeben

verwandte Informationen