如何重复使用命令名称?

如何重复使用命令名称?

我喜欢给我的命令起与其含义相对应的名字,而不是它们产生的符号。例如,我想用符号\amalg来表示二元余积,\coprod用符号来表示由任意集合索引的余积,但我想分别称它们为\coprod\bigcoprod。如果我尝试写

\newcommand{\bigcoprod}{\coprod}
\renewcommand{\coprod}{\amalg}

那么第一行就解释\coprod为已经被第二行重新定义,并且效果是\bigcoprod\coprod产生相同的符号\amalg

我怎样才能赋予 一个新含义\coprod,但同时保留其原始含义,以便将其重命名为\bigcoprod

答案1

这是一个众所周知的“先有鸡还是先有蛋”的问题。如果你

\newcommand{\bigcoprod}{\coprod}
\renewcommand{\coprod}{\amalg}

那么调用\coprod将会成功,而调用\bigcoprod将再次产生结果\amalg。事实上,用 定义的宏\newcommand只是被替换文本替换:

\bigcoprod -> \coprod -> \amalg

\amalg最后,不是宏,而是打印某个数学符号的指令。

你需要的是“冻结”的含义\coprod

\let\bigcoprod\coprod

就是你要找的:现在的含义与含义\bigcoprod相同\coprod眼下 \let执行。如果 later\coprod被赋予了新的含义,\bigcoprod则不会改变。因此正确的处理方式是

\newcommand{\bigcoprod}{}
\let\bigcoprod\coprod
\renewcommand{\coprod}{\amalg}

第一行是针对先前加载的某个包定义 的可能性采取的安全措施\bigcoprod。如果发生这种情况,您将在执行临时命令时知道\newcommand。第二行将立即将 的含义更改\bigcoprod为所需的含义。事实上,\let 没有检查命令是否已经有意义。\let\box\square如果不采取预防措施测试是否\box已定义,则类似的事情将是灾难性的(它是 TeX 的一个非常重要的内部命令,一定不能被重新定义。


\let但是,如果要“冻结”的命令具有特殊定义,即它是通过\DeclareRobustCommand或其变体引入到 LaTeX 中的,或者它是通过\newcommand可选参数定义的,则使用 会存在一些风险。

letltxmacro包可以提供帮助,\LetLtxMacro只要对要“冻结”的命令有丝毫怀疑,就应该使用它的宏。语法完全相同:

\usepackage{letltxmacro}
\newcommand{\bigcoprod}{}
\LetLtxMacro\bigcoprod\coprod
\renewcommand{\coprod}{\amalg}

在这种特殊情况下,该包并不是真正需要的:“简单”的数学符号总是可以用来处理\let。在其他情况下,\LetLtxMacro它可以救命。

相关内容