提供離開數學模式時要執行的命令

提供離開數學模式時要執行的命令

我有一個重要的宏\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

我使用了維爾納對表單的評論$...$,但添加了適用於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}

在此輸入影像描述

相關內容