选择宏名称以避免命名空间冲突

选择宏名称以避免命名空间冲突

我希望以最不可能与其他宏的名称冲突的方式选择宏的名称(包括未包含在文档中的包中的宏)。因此,简单地通过调用命令来编译文档并确定是否抛出错误并不是一个理想的解决方案,因为宏名称实际上可能用于未包含在编译文档中的非常常见的包中。我认为理想的解决方案是使用 LaTeX 宏搜索引擎来搜索某个数据库或档案库(例如 CTAN)中的所有包。然后我可以检查所需的名称是否存在潜在冲突。另一个有用的解决方案是编译某个档案库或档案子集中的包中的所有宏的表格。这样的列表可能需要某种形式的管理,但它也可以自动生成。最后的想法是可以将搜索限制在计算机上已安装的包中。

答案1

恐怕这是不可能的。宏可以用许多不同的方式定义(或者更一般地说,可以给控制序列赋予含义)。

就在昨天,在与社区的另一位成员讨论时,我们遇到了\gla某个包定义的宏。.sty文件中有行,例如

\let\gla=...
\def\gla{...}
\newcommand{\gla}{...}
\DeclareRobustCommand{\gla}

或其变体。实际上控制序列\gla 没有出现整个包中只有一次。哦,天哪!那么这个命令是如何定义的呢?

该包想要定义一堆类似的宏:,,\gla也许还有其他宏,它们的定义应该遵循相同的方案,比如说\glb\glc

\let\gla\glw@gla
\let\glb\glw@glb

等等,其中内部宏已经定义。因此,开发人员不必一遍又一遍地重复这些定义,而是编写

\def\glw@assign@level#1{%
   \edef\temp{\noexpand\let
      \expandafter\noexpand\csname gl#1\endcsname
      \expandafter\noexpand\csname glw@gl#1\endcsname}%
   \temp
}

然后他们打电话给其中一个

\glw@assign@level{a}
\glw@assign@level{b}
...

在其他宏中,这样\gla定义仅有的在需要它的环境中。更确切地说,直接调用最后的命令,而是有一些包含

\glw@assign@level{#1}

并且该参数#1将在运行时被替换。

结论是,除非所有软件包编写者都向其提交其软件包定义的所有宏的列表,否则不可能构建一个包含所有已定义宏的庞大数据库。这几乎是不可能的:一些软件包提供了根据某种方案生成宏的命令,但实际生成的宏可能取决于用户的选择。

那么用户可以做什么呢?定义宏以具有有意义的名称;避免使用“简写”(几个月后就不可能记住了);使用前缀;最后,希望得到最好的结果。:)

根据我的经验,我的一些个人宏与某些包的新版本或新加载的包发生冲突的情况只有极少数,而且这些宏的名称都没有按照我自己的建议进行选择。:)

相关内容