如何避免与包中的宏名冲突?

如何避免与包中的宏名冲突?

这是这个问题对 CTAN 的贡献,但它适用于编写自己的包供私人使用的情况。简而言之,问题是:

有没有办法避免定义宏时的名称冲突?

更详细地说,我知道会\newcommand检查这一点,但我发现我需要灵活性\def。此外,我倾向于定义很多内部的然后,这些命令会以各种方式在用户实际使用的命令中使用,我怀疑许多其他命令也会这样做。检查每个包并检查每个命令是否“干净”要困难得多,尤其是因为许多命令将通过构造来定义\csname。另一方面,由于大多数命令都是内部命令,我很乐意为每个命令添加一个唯一的前缀,以避免这种冲突。例如,目前我的所有内部命令都是带前缀的\my@和外部的\my(除了一个专门为论文编写的包,它分别获得\hopf@\hopf)。

因此,扩展我上面的问题:

  1. CTAN 上是否有约定以避免名称冲突?
  2. 有没有一种自动的方法可以避免加载包时发生冲突?

(我应该承认,我非常怀疑第二个问题是否有一个肯定的答案,因为很多包都依赖于能够重新定义其他包定义的宏;不过,程序员似乎能够应对这个问题,所以我确实想知道 TeXperts 是否也可以。)

答案1

正如您所说,不可能检查所有内容。当人们需要权力时,一种工作方式\def是首先使用\newcommand

\newcommand\wibble{}
\def\wibble#1stuff#2{%
...

或者,您也可以使用它\@ifundefined来进行测试。

对于内部宏,通常的方法是选择一个你希望别人不会使用的前缀。如果你只是使用你选择的包名称,这种方法往往效果最好,当然你可以在 CTAN 上检查:

\def\mypkg@internal@one{%
...

对于用户宏,有些人使用类似的方法,特别是当宏很少使用时:类似于\MyPkgMacroNameOne。当然,这可能相当尴尬,因为名称会变得很长。

带着我的 LaTeX3 '帽子',我想指出,我们正在尝试为 LaTeX3 提出一个更灵活、更可靠的方案。我不能说我们目前有一个明确的答案,所以欢迎提出建议!

相关内容