数式モードを終了するときに実行するコマンドを指定します

数式モードを終了するときに実行するコマンドを指定します

\textmacroテキストモードでのみ呼び出せる重要なマクロがあります。\mathmacroコマンドを発行するマクロが欲しいです。

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

自動的に変換され、次のように評価されます。

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

つまり、マクロの位置は数式モードの終了直後に「移動」され、その時点でが呼び出されます。これを可能にする内部 LaTeX テクノロジはありますか? 、および環境\textmacroで動作させるにはこれが必要です。$...$equationalign

編集:\textmacroコマンドは、 を使用して余白にメモを配置します\marginpar。テキスト モードと数式モードの両方で同じように動作する同等のコマンドはありません。特に、\marginnoteコメントを垂直に積み重ねることはありません。

編集: 物事を少し難しく/より現実的にするために: (1) コマンドはコマンド\textmacroの中にあることがあるため、たとえばは に展開されます。(2) 一般に、数式環境内では が複数回呼び出され、それらはすべて最後にプッシュされる必要があります。(3) テキストモードで使用する場合、のように動作します。(4) 一般に は引数を取ります。\ensuremath$a^b \ensuremath{x \mathmacro y}$$a^b \ensuremath{x y}$\textmacro\mathmacro\mathmacro\textmacro\mathmacro

答え1

フォームには Werner のコメントを使用しましたが、および$...$で機能するフォームを追加しました。equationalign

OP の要件に対応するために編集しました:

1) への議論\mathmacro;

\mathmacro2)単一環境内での複数の呼び出し。

3)\ensuremath引数内に埋め込まれた場合に機能します。

修正されたソリューション(複数の\mathmacro通話を処理可能)

このアプローチでは、複数の呼び出しを可能にするために、\mathmacro引数のセミコロンで区切られたリストを構築するために使用します (;したがって、s 内の は許可されません\marginparが、区切り文字は手動で変更できます) \mathmacro

次に、環境の完了時に、そのリストを解析するルーチンを呼び出して、リスト内の各引数に対して の\textmacro呼び出しを発行します。その過程で、 の奇妙な動作によって二重パスが発生し、元々 の呼び出しが二重に行われていた\marginparことに対処する必要がありました。align\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}

ここに画像の説明を入力してください

オリジナルソリューション(\mathmacro環境ごとに 1 つの呼び出しのみを許可)

\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}

ここに画像の説明を入力してください

関連情報