很抱歉,这可能是一个当前存在的问题,并且答案众所周知,但我无法通过 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}
您会发现,您还可以为方程式添加个人标签,以便引用它,而无需知道方程式编号。