提供退出数学模式时要执行的命令

提供退出数学模式时要执行的命令

我有一个重要的宏\textmacro,只能在文本模式下调用。我想要一个宏,\mathmacro这样发出命令

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

自动转换并评估如下:

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

也就是说,宏位置被“移动”到数学模式结束后,此时\textmacro被调用。是否有任何内部 LaTeX 技术可以实现这一点?我需要它在$...$equationalign环境中工作。

编辑:该\textmacro命令使用 在页边空白处添加注释\marginpar。没有可比较的命令可以在文本模式和数学模式下以相同的方式操作;特别是,\marginnote不会垂直堆叠注释。

编辑:只是为了让事情变得更难/更现实一些:(1)命令\textmacro有时会在\ensuremath命令内部,因此例如$a^b \ensuremath{x \mathmacro y}$应该扩展为$a^b \ensuremath{x y}$\textmacro。(2)一般来说,\mathmacro数学环境中会有多次调用,并且它们都必须被推到最后。(3)在文本模式下使用时,\mathmacro应该表现得像\textmacro。(4)通常\mathmacro会接受一个参数。

答案1

我使用了 Werner 对表格的注释$...$,但添加了适用于equation和的表格align

已编辑以满足 OP 的要求:

1)的论点\mathmacro

\mathmacro2)在单一环境中多次调用;

3) 嵌入\ensuremath参数时有效。

修订的解决方案(可以处理多个\mathmacro呼叫)

在这种方法中,为了允许多个调用,我使用\mathmacro分号分隔的列表(不允许;\marginpars 中使用因此,但您可以手动更改分隔符)来包含参数\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原始解决方案(每个环境只允许一次调用)

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

在此处输入图片描述

相关内容