수학 모드를 떠날 때 실행될 명령 제공

수학 모드를 떠날 때 실행될 명령 제공

\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내부에 있을 수 있으므로 로 확장해야 합니다 . (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환경당 하나의 호출만 허용)

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

여기에 이미지 설명을 입력하세요

관련 정보