如何将自定义命令传递给 LetLtxMacro?

如何将自定义命令传递给 LetLtxMacro?

我认为重新定义宏。我正在创建两个函数来帮助存储和恢复这些重新定义的宏。

因此我尝试使用以下方法:

\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 个。

相关内容