重新定义命令之前重新标记命令

重新定义命令之前重新标记命令

我想重命名几个命令,以便这些命令与我想要使用它们时想到的单词相匹配。

我希望拥有\iso默认的状态(顶部\cong带有 a 的等号:≅),并且我希望拥有默认的状态(3 条平行线:≡)。\sim\cong\equiv

目前,我的序言如下:

\newcommand{\iso}{\cong}
\renewcommand{\cong}{\equiv}

这不起作用。它更改\cong为“≡”,但也使\isoprint 变为“≡”。我觉得这很令人困惑,因为我的理解是 TeX 从上到下读取命令,所以我假设它会在覆盖 的定义之前分配\iso给。\cong\cong

有没有简单的方法可以实现这一点?

(PS:我不确定什么标签适合这个。如果应该用不同的方法分类,请告诉我。)

答案1

解决这个问题的方法是加载letltxmacro包并执行以下操作:

\LetLtxMacro\iso\cong
\LetLtxMacro\cong\equiv

稍微解释一下:你的推理“TeX 从上到下读取命令”是正确的。执行 后\newcommand{\iso}{\cong},命令将按预期\iso生成一个,但不会如何你期望它这样做。经过\newcommand上述操作(我\cong暂时忽略重新定义),每次 TeX 看到控制序列时,\iso它都会知道\iso应该扩大至 \congIE,\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

?

相关内容