将当前命令内容传递给宏

将当前命令内容传递给宏

很抱歉,这可能是一个当前存在的问题,并且答案众所周知,但我无法通过 Google 找到它。

我正在尝试构建一个逐步添加内容的宏;每一步我都需要将命令的当前内容传递给宏。我尝试了很多次,\edef\expandafter \global都没有成功。我的宏总是使用调用宏时当前的命令内容,而不是创建宏时当前的命令内容。

这个问题源于我之前的问题 课堂笔记中的练习,无预定位置(后续)这个问题还没有答案。不过,下面我重现了一个更简单的代码,以使这个问题自圆其说。

\documentclass{article}

\makeatletter
\let\@mymacro\@empty%
\newcommand\myEquation[1]{%
  \begin{equation}%
    \label{eq:\theequation}%
    #1%
  \end{equation}%
  \edef\EquationLabel{eq:\theequation}%
  \g@addto@macro\@mymacro{%
  \item There is an equation with number \ref{\EquationLabel}.
  }%
}%

\newcommand\refequations{%
  \subsection*{Check equations}%
  \begin{itemize}%
    \@mymacro%
  \end{itemize}%
}

\begin{document}

\section*{Two equations}
\myEquation{1+1=2}
\myEquation{2+2=4}

\refequations

\end{document}

答案1

一种方法是使用辅助宏,这样您可以轻松地跳转以\expandafter使用宏的扩展而不是宏本身。

\documentclass{article}

\makeatletter
\let\@mymacro\@empty%
\newcommand\myEquation[1]{%
  \begin{equation}%
    \label{eq:\theequation}%
    #1%
  \end{equation}%
  \edef\EquationLabel{eq:\theequation}%
  \expandafter\addref\expandafter{\EquationLabel}%
}%

\def\addref#1{%
 \g@addto@macro\@mymacro{%
  \item There is an equation with number \ref{#1}.
  }}

\newcommand\refequations{%
  \subsection*{Check equations}%
  \begin{itemize}%
    \@mymacro%
  \end{itemize}%
}

\begin{document}

\section*{Two equations}
\myEquation{1+1=2}
\myEquation{2+2=4}

\refequations

\end{document}

答案2

使用 LaTeX3 功能可以更轻松地控制哪些内容可以扩展,哪些不可以扩展。

\documentclass{article}
\usepackage{lipsum}
\usepackage{xparse}

\ExplSyntaxOn
\tl_new:N \g_gherardo_items_tl

\NewDocumentCommand\myEquation{ o m }
 {
  \begin{equation}
    % the optional value is for an explicit label
    \IfValueT{#1}{\label{#1}}
    \label{eq:\theequation}
    #2
  \end{equation}
  \gherardo_add_eqn:
 }
\cs_new_protected:Npn \gherardo_add_eqn:
 {
  % everything is fully expanded
  \tl_gput_right:Nx \g_gherardo_items_tl
   {
    % but not what's inside \exp_not:n
    \exp_not:n { \item There~is~an~equation~with~number~\ref }
     {eq:\theequation}.
   }
 }

\NewDocumentCommand\refequations{ }
 {
  \subsection*{Check~equations}
  \begin{itemize}
    \g_gherardo_items_tl
  \end{itemize}
 }
\ExplSyntaxOff

\begin{document}

\section*{Two equations}
\lipsum*[2]
\myEquation{1+1=2}
\lipsum*[3]
\myEquation[mylabel]{2+2=4}

Here's the reference~\ref{mylabel}.

\refequations

\end{document}

您会发现,您还可以为方程式添加个人标签,以便引用它,而无需知道方程式编号。

在此处输入图片描述

相关内容