我想重命名几个命令,以便这些命令与我想要使用它们时想到的单词相匹配。
我希望拥有\iso
默认的状态(顶部\cong
带有 a 的等号:≅),并且我希望拥有默认的状态(3 条平行线:≡)。\sim
\cong
\equiv
目前,我的序言如下:
\newcommand{\iso}{\cong}
\renewcommand{\cong}{\equiv}
这不起作用。它更改\cong
为“≡”,但也使\iso
print 变为“≡”。我觉得这很令人困惑,因为我的理解是 TeX 从上到下读取命令,所以我假设它会在覆盖 的定义之前分配\iso
给。\cong
\cong
有没有简单的方法可以实现这一点?
(PS:我不确定什么标签适合这个。如果应该用不同的方法分类,请告诉我。)
答案1
解决这个问题的方法是加载letltxmacro
包并执行以下操作:
\LetLtxMacro\iso\cong
\LetLtxMacro\cong\equiv
稍微解释一下:你的推理“TeX 从上到下读取命令”是正确的。执行 后\newcommand{\iso}{\cong}
,命令将按预期\iso
生成一个,但不会≅
如何你期望它这样做。经过\newcommand
上述操作(我\cong
暂时忽略重新定义),每次 TeX 看到控制序列时,\iso
它都会知道\iso
应该扩大至 \cong
,IE,当\iso
发现时被取代\cong
替换完成后,TeX 会看到\cong
,这将(暂时)生成≅
。到目前为止一切顺利。
但是现在你需要\renewcommand{\cong}{\equiv}
。和之前一样,这告诉 TeX 每次找到控制序列 时\cong
,它都应该扩展为(或:替换为 )\equiv
。如果你\cong
现在使用 ,你会得到≡
你想要的符号。但是如果你使用\iso
,TeX 会将其扩展为\cong
,然后再次扩展为\equiv
,仍然会打印≡
。一旦 TeX 扩展了控制序列,它就不会记得它是什么了。这意味着无论你使用\iso
并将其扩展为\cong
还是直接使用\cong
,对于 TeX 来说都是相同的。
当然,你的意思\iso
是等于 \cong
然后\cong
等于 \equiv
。执行此操作的 TeX 操作是\let
,而不是\def
(\def
是 中的底层原语\(re)newcommand
)。
执行 之后\let\iso\cong
,TeX 发现\iso
它不会扩展为\cong
,而是扩展为\cong
执行操作时的状态\let
。(非常,非常) 大致来说,\let\iso\cong
其效果与 相同。因此,即使您使用或更改\newcommand\iso{<meaning of \cong>}
的含义也没关系,因为已经拥有了它的副本,因此它是安全的。\cong
\let
\def
\iso
但有一个问题:各种 LaTeX 命令都是“健壮的”。这意味着 的含义是\cong
(\protect\cong⎵
没错,它是命令\cong⎵
,名称后面带有空格;您无法轻松访问它)(还有其他保护机制,例如\protect\\cong
,\\
命令名称中带有 ,但寓意是一样的)。
所以即使你这样做了\let\cong\equiv
,其内部的含义\cong⎵
仍不会改变,事情很快就会偏离轨道。
因此,使用 LaTeX 时同样的警告也\def
适用于\let
:不要使用它,除非你非常确定自己在做什么,并且准备好面对任何误用的后果 :-)
如果您不确定,请使用该letltxmacro
包,它为您提供了更安全的版本,\let
可以处理健壮的宏,并在它们健壮时执行正确的操作。请注意以下操作的区别\let\iso\cong
:
> \iso=macro:
->\protect \cong .
l.4 \show\iso
?
并使用\LetLtxMacro\iso\cong
:
> \iso=macro:
->\protect \iso .
l.4 \show\iso
?