我认为重新定义宏。我正在创建两个函数来帮助存储和恢复这些重新定义的宏。
因此我尝试使用以下方法:
\documentclass{article}
\usepackage{letltxmacro}
\makeatletter
\newcommand{\storecommand}[1]
{%
\LetLtxMacro{\\env@#1}{\\#1}%
}
\newcommand{\restorecommand}[1]
{%
\LetLtxMacro{\\#1}{\\env@#1}%
}
\makeatother
% Example usage
\begin{document}
\noindent
\makeatletter
Expected:\\
\newcommand{\foo}{bar}%
\foo\\
\LetLtxMacro{\env@foo}{\foo}%
\renewcommand{\foo}{baz}%
\foo\\
\LetLtxMacro{\foo}{\env@foo}%
\foo\\
\makeatother
\noindent
Actual:\\
\renewcommand{\foo}{bar}%
\foo\\
\storecommand{foo}%
\renewcommand{\foo}{baz}%
\foo\\
\restorecommand{foo}%
\foo
\end{document}
Expected:
bar
baz
bar
Actual:
bar
nv@foo=efoobaze oo=fenv@foobaz
我希望它知道我何时调用它来扩展#1
并将整个内容作为命令。但是它没有。
我怎样才能storecommand
按照自己想要的方式去工作?
为了防止出现 XY 问题:
我正在尝试创建一个在结束时恢复到先前状态的环境。清除所有已发出的命令。
答案1
\documentclass{article}
\usepackage{letltxmacro}
\makeatletter
\newcommand{\storecommand}[1]
{%
\expandafter\LetLtxMacro\csname env@#1\expandafter\endcsname\csname #1\endcsname
}
\newcommand{\restorecommand}[1]
{%
\expandafter\LetLtxMacro\csname #1\expandafter\endcsname\csname env@#1\endcsname
}
\makeatother
% Example usage
\begin{document}
\noindent
\makeatletter
Expected:\\
\newcommand{\foo}{bar}%
\foo\\
\LetLtxMacro{\env@foo}{\foo}%
\renewcommand{\foo}{baz}%
\foo\\
\LetLtxMacro{\foo}{\env@foo}%
\foo
\makeatother
\bigskip
\noindent
Actual:\\
\renewcommand{\foo}{bar}%
\foo\\
\storecommand{foo}%
\renewcommand{\foo}{baz}%
\foo\\
\restorecommand{foo}%
\foo
\bigskip
\noindent
Using a group:\\
\renewcommand{\foo}{bar}%
\foo\\
\begin{empty}
\renewcommand{\foo}{baz}%
\foo\\
\end{empty}
\foo
\end{document}
如果确实使用\LetLtxMacro
(并且不清楚这里是否需要),则需要向每个参数传递一个 csname 标记,\LetLtxMacro{\\foo}{..}
第一个参数是命令,\\
后跟文本foo
,因此是 4 个标记而不是 1 个。