为新命令赋予两个具有相同行为的不同名称

为新命令赋予两个具有相同行为的不同名称

我有时会忘记我为新命令使用了什么名称(“是\innerproduct\dotproduct\dp\ip?”),我希望为同一个命令赋予多个名称,并使其实现完全相同,而无需重复代码,这样对未来我来说会更好。我该怎么做?

答案1

通过\let一个命令指定另一个命令的含义在执行时\let在执行分配有。

例如如果你有

\newcommand\foo{This is foo.}
\let\bar=\foo
\renewcommand\foo{This isn't foo any more.}

\bar则会产生This is foo.,而\foo会产生This isn't foo any more.

请注意,在这种情况下 LaTeX 存在一些缺陷:

按照\newcommand该过程定义的可选参数的 LaTeX 命令实际上是由用户级命令形成的“机制”,该命令检查可选参数是否存在,然后调用内部命令,从而传递默认值或(如果存在)可选参数。

如果您有(带有可选参数):

\newcommand\foo[1][default]{This is foo with optional argument: #1.}
\let\bar=\foo
\renewcommand\foo[1][default]{%
   This isn't foo any more but still has an optional argument: #1.%
}

,然后陷阱突然关闭: \bar[my non-default]将产生This isn't foo any more but still has an optional argument: my non-default.

原因:

您有一个\newcommand用于创建带有可选参数的宏的 。因此, \foo定义为检查是否存在可选参数,然后调用其名称源自短语 的内部参数\foo

-assignment\let分配了\bar的含义\foo,即,\bar还定义为检查是否存在可选参数,然后调用名称源自短语 的内部参数\foo

除该命令之外\foo,内部命令也由-assignment 重新定义\renewcommand\foo...,因此\bar将调用该重新定义的变体。

与定义的命令存在类似的问题,因为\DeclareRobustCommand这些命令检查令牌的当前定义\protect,并根据该定义调用另一个内部宏。

因此,包letltxmacro你可能会感兴趣


在“吹毛求疵模式”下,人们可以问“相同的行为/相同的实现”是什么意思:

假设一个宏应该打印它自己的名字。

这可能看起来像

\newcommand\foo{My name is \texttt{\string\foo}}

假设您希望一个宏\bar也能打印其自身名称。从某种意义上讲, 的行为\bar与 的行为相同\foo

但这无法通过 来实现,\let\bar=\foo因为 那么\bar肯定不会打印自己的名字,而是会打印“我的名字是\foo”,而\foo不是 的名字\bar

相关内容