如果我编写了一个新包foo
,我该如何识别所有foo
可能与之冲突的包?当然,我可以针对一些主要包进行测试,但有这么多包在做很多截然不同的事情……
编辑
好的。如果您编写了一个新包,您会采取哪些步骤来尽量减少与其他包发生冲突的可能性?
答案1
在软件包冲突方面,一个突出的问题是命令重复。例如,考虑
\documentclass{article}
\usepackage{txfonts}
\usepackage{amsmath}
\begin{document}
Lorem ipsum \ldots
\end{document}
tabular
而且,如果您编写一个可以涵盖整个文档的包(比如数学或符号相关的包),而不是提供更专业的东西(比如说新的构造),那么您可能会更频繁地遇到问题。
您可以采取以下步骤来尽量减少与其他包发生冲突的可能性:
用一个命名空间为您的命令。也就是说,不要使用命令
\something
,而是使用(例如)\Awesome@something
为您的Awesome
包。使用此方法的包的示例包括xkeyval
和algorithm2e
。历史上,使用
@
命令足以将内容标识为“内部”,但最好通过命名空间标识符。创建您的命名空间使用接口宏的命令。也就是说,不是
\newcommand{\<cmd>}
在样式文件中使用,而是定义(例如)\awesome@newcommand{<cmd>}
创建。如果您认为它不是那么棒\Awesome@<cmd>
,它将允许您稍后轻松改变主意。Awesome
您还可以考虑编写
\nameuse{<cmd>}
等效代码来使用您的命名空间命令。另一个较新的发展是使用 CamelCase 命名约定来定义命令,甚至在用户界面级别也是如此。
如果你知道一些与你的不兼容的软件包foo
,请使用包加载条件。
答案2
这是对沃纳的回答。虽然冲突的宏定义可能是首先要考虑的问题,但它并不是唯一的问题。
考虑你的包如何与其他包协作也很重要。为了避免宏定义冲突,关键是尽可能隔离宏。在考虑你的包如何与其他包协作时,事情会稍微复杂一些。
不需要加载对于您的软件包的功能不必要的软件包。
不要加载含有不需要的选项的包。
如果您的包严重依赖于其他包,请考虑将无法识别的选项传递给其他包是否有意义。
避免加载依赖引擎的软件包。如果无法避免,请有条件地加载它们,除非您的软件包需要特定的引擎。
不要强迫用户使用特定语言,除非这些语言对于您的软件包的核心功能至关重要(例如,您的软件包设计为排版外蒙古语)。
不要将字体配置强加给用户,除非这些配置对于您的软件包的核心功能至关重要(例如,您的软件包是一个字体支持包或只能与一组专业字体一起使用)。
如果另一个包可以增强您的功能,但不是必需的,请使用以下方法之一。
建议用户加载文档中的其他包或发出推荐它的控制台/日志警告(如果适用)。
提供一个包选项来启用/禁用加载其他包。
如果其他软件包提供了钩子,则使用其他软件包提供的钩子来执行代码(例如
microtype
)。此代码通常应推迟执行(请参阅下一点)。推迟依赖于该包的代码,直到所有包都加载完毕,然后仅在其他包都加载完毕后执行该代码。
上述某些情况不适用于包装仅供个人使用的情况,但很多情况确实适用。