我喜欢给我的命令起与其含义相对应的名字,而不是它们产生的符号。例如,我想用符号\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
它可以救命。