我有兴趣定义一个宏来弃用其他宏。我们正在开发的系统经过了大量重构,并且被不止几个人使用,因此我们希望能够在将命令从宏文件中完全删除之前将其标记为已弃用。具体来说,我想概括
\let\fooDeprecated\foo
\renewcommand{\foo}{\warn{Deprecated command used}\fooDeprecated}
或者,就此而言,任何其他可以作为简单的 LaTeX 代理宏的东西(在设计模式意义上的“代理”一词)。不幸的是,我似乎无法弄清楚在哪里可以\expandafter
实现这个功能。也就是说,
\newcommand{\deprecate}[1]{%
\let\csname #1Deprecated\endcsname\csname #1\endcsname%
\renewcommand{\csname #1\endcsname}{\warn{Deprecated command used}\csname #1Deprecated\endcsname}%
}
显然不起作用。有没有更好的方法?如果没有,我该如何扩展这些东西?
谢谢!
答案1
该包针对原始对象及其兄弟对象amsmath
执行您想要的操作。\over
定义两个辅助命令:
\DeclareRobustCommand{\deprecate}[2]{%
% #1 is the deprecated command
% #2 is the new command to use
% Issue a message at first usage
\PackageWarning{zach}{%
Deprecated command \@backslashchar#1;\MessageBreak
\protect#2\space should be used instead\MessageBreak
}
% globally redefine "\#1" to "\deprecate@#1"
\global\expandafter\let\csname#1\expandafter\endcsname
\csname deprecated@#1\endcsname
% issue the old command
\csname#1\endcsname
}
\newcommand{\@deprecate}[2]{%
\expandafter\let\csname deprecated@#1\expandafter\endcsname\csname#1\endcsname
\@namedef{#1}{\deprecate{#1}{#2}}%
}
然后,您可以列出已弃用的命令以及新命令:
\@deprecate{foo}{\newfoo}
(请注意,在第一个参数中应该“按名称”使用弃用的命令)。
在文档中,第一次使用\foo
将在终端和日志文件中输入
Package zach Warning: Deprecated command \foo;
(zach) \newfoo should be used instead
(zach) on input line 28.
后续使用将不会再产生消息。