将一个命令别名为另一个命令的正确方法是什么?
\newcommand*{\keyword}{\emph}
或者:
\newcommand*{\keyword}[1]{\emph{#1}}
除了第二种更明确之外,还有其他真正的区别吗?
答案1
差异将出现在别名命令采用可选参数。
\newcommand*\keyword{\othercommand}
将能够处理任何可能的可选参数。但是
\newcommand*\keyword[1]{\othercommand{#1}}
只能处理\othercommand
没有可选参数的调用情况。
在 的情况下\emph
,这不是问题,因为那里没有可选参数。因此两种方法都可以正常工作。
当你只是严格混叠,我个人的意见是使用第一个
\newcommand*\keyword{\othercommand}
在我需要做的不仅仅是设置别名的情况下,我会使用
\newcommand*\keyword[1]{\othercommand{#1}}
仅举个例子,
\newcommand*\keyword[1]{`\emph{#1}'}
(虽然其他人很可能会反对,认为引号是不必要的,但\emph
我只是想说明“不仅仅是别名”的含义。)
出租
由于这已经在评论中出现,所以我会提到一些有关\let
ting 命令的事情。
有时你想改变 LaTeX 宏的默认行为。例如,假设有一个宏定义为
\newcommand*\somecommand[1]{\emph{#1}}
但你希望它有不同的表现。那么你可以简单地将其重写如下:
\renewcommand*\somecommand[1]{\textbf{#1}}
但你可能会遇到一种情况,你真的希望保留原始定义。在这种情况下,在更新命令,你可以做类似的事情
\let\oldsomecommand\somecommand
\renewcommand*\somecommand[1]{\textbf{#1}}
现在\somecommand
将按照您的意愿行事,但是您也可以\oldsomecommand
使用命令来执行旧的行为。
简而言之,通过将 写成\newcommand\keyword{\emph}
,\keyword
将扩展为\emph
。通过将 写成\let\keyword\emph
,\keyword
将扩展为 ,不是\emph
,而是 的定义\emph
。
然而,\let
并不总是能够捕捉到命令的全部力量祝福/诅咒带有可选参数。本网站上有许多关于如何处理此类情况的帖子,因此我在此仅向您指出其中几篇:
- 看\let 和 \def 之间有什么区别?了解其基本要点。
- 看何时使用 \LetLtxMacro?
\let
了解有关解决选项问题的详细说明。 - 另请参阅“闭”(平方)根符号(尽管最初的问题实际上与 ting 无关
\let
。)