![如何从不同的包调用两个同样定义的命令](https://linux22.com/image/359737/%E5%A6%82%E4%BD%95%E4%BB%8E%E4%B8%8D%E5%90%8C%E7%9A%84%E5%8C%85%E8%B0%83%E7%94%A8%E4%B8%A4%E4%B8%AA%E5%90%8C%E6%A0%B7%E5%AE%9A%E4%B9%89%E7%9A%84%E5%91%BD%E4%BB%A4.png)
假设我们在不同的包中有两个同名的命令,例如
inenglish.sty
\newcommand\house{This is a house.}
inspanish.sty
\newcommand\house{Esto es una casa.}
这个宏能以不同于调用文档的方式调用,包括包名吗?
如果这不可能,那么如何将这两个命令分开分组?我想到的唯一方法是
\newcommand\houseinenglish{This is a house.}
\newcommand\houseinspanish{Esto es una casa.}
答案1
没有命名空间在 (La)TeX 中,就像在大多数编程语言中一样。以下宏定义将覆盖先前的宏定义(使用 TeX 定义宏时\def
)或导致错误(使用 LaTeX 定义宏时\newcommand
)。
不过你可以复制定义使用 将一个宏转换为另一个宏\let\somenewmacro\someexistingmacro
。生成的宏独立于另一个宏,并且不会在之后使用它,就像使用 时的情况一样\newcommand{\somenewcommand}{\someexistingmacro}
。
为了在再次使用现有宏定义时不会引起错误,\newcommand
您可以简单地将其含义更改为,\relax
以便\newcommand
认为它不存在(因为“已存在”检查在\relax
未定义的宏之间没有区别)。
基本上尝试:
\usepackage{inenglish}
\let\houseinenglish\house
\let\house\relax % to 'undefine' it so that \newcommand\house works again
\usepackage{inspanish}
\let\houseinspanish\house % or just use \house
请注意,如果您有大量宏,这会很麻烦。此外,如果宏使用其他内部宏(在两个包中也具有相同的名称),您就会遇到麻烦。