在 newcommand 中使用参数命令本身,而不是其参数

在 newcommand 中使用参数命令本身,而不是其参数

我想实现一个宏,它使用第一个参数中传递的命令作为命令本身,而不是通过评估它传递的内容。类似于:

\newcommand{\foo}{bar}
% definition
\newcommand{\mycmd}[1]{
    \dosomethingwith{???}% I want \foo here, not 'bar'
}
\mycmd{\foo}

答案1

使用以下初步代码

\newcommand{\foo}{bar}
% definition
\newcommand{\mycmd}[1]{%
    \dosomethingwith{#1}%
}

电话

\mycmd{\foo}

将使 TeX用\mycmd以下方式替换其参数\foo

\dosomethingwith{\foo}

\foo仍将尝试扩展。TeX 将执行的操作是扩展\dosomethingwith,这可能意味着寻找一个参数,但同样\foo仍将不是得到扩大。

因此,您在评论中概述的测试用例是

\newcommand{\foo}{bar}
% definition
\newcommand{\mycmd}[1]{%
    \renewcommand{#1}{BAR}%
}

并尝试

\mycmd{\foo}

会做确切地所尊重的,也就是改变的含义\foo

示例文档

\documentclass{article}

\begin{document} % we want to use `\meaning` for showing the meaning of commands

\newcommand{\foo}{bar}

\texttt{\meaning\foo}

\newcommand{\mycmd}[1]{%
    \renewcommand{#1}{BAR}%
}
\mycmd{\foo}
\texttt{\meaning\foo}

\end{document}

在此处输入图片描述

答案2

\expandafter\renewcommand{#1 

扩展{不可扩展的,你想要

\expandafter\renewcommand\expandafter{#1

要不就

\expandafter\renewcommand#1

相关内容