![为新命令赋予两个具有相同行为的不同名称](https://linux22.com/image/401130/%E4%B8%BA%E6%96%B0%E5%91%BD%E4%BB%A4%E8%B5%8B%E4%BA%88%E4%B8%A4%E4%B8%AA%E5%85%B7%E6%9C%89%E7%9B%B8%E5%90%8C%E8%A1%8C%E4%B8%BA%E7%9A%84%E4%B8%8D%E5%90%8C%E5%90%8D%E7%A7%B0.png)
我有时会忘记我为新命令使用了什么名称(“是\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
。