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