如何识别和防止新包装中的冲突?

如何识别和防止新包装中的冲突?

如果我编写了一个新包foo,我该如何识别所有foo可能与之冲突的包?当然,我可以针对一些主要包进行测试,但有这么多包在做很多截然不同的事情……


编辑

好的。如果您编写了一个新包,您会采取哪些步骤来尽量减少与其他包发生冲突的可能性?

答案1

在软件包冲突方面,一个突出的问题是命令重复。例如,考虑

\documentclass{article}

\usepackage{txfonts}
\usepackage{amsmath}

\begin{document}

Lorem ipsum \ldots

\end{document}

tabular而且,如果您编写一个可以涵盖整个文档的包(比如数学或符号相关的包),而不是提供更专业的东西(比如说新的构造),那么您可能会更频繁地遇到问题。

您可以采取以下步骤来尽量减少与其他包发生冲突的可能性:

  • 用一个命名空间为您的命令。也就是说,不要使用命令\something,而是使用(例如)\Awesome@something为您的Awesome包。使用此方法的包的示例包括xkeyvalalgorithm2e

    历史上,使用@命令足以将内容标识为“内部”,但最好通过命名空间标识符。

  • 创建您的命名空间使用接口宏的命令。也就是说,不是\newcommand{\<cmd>}在样式文件中使用,而是定义(例如)\awesome@newcommand{<cmd>}创建。如果您认为它不是那么棒\Awesome@<cmd>,它将允许您稍后轻松改变主意。Awesome

    您还可以考虑编写\nameuse{<cmd>}等效代码来使用您的命名空间命令。

  • 另一个较新的发展是使用 CamelCase 命名约定来定义命令,甚至在用户界面级别也是如此。


如果你知道一些与你的不兼容的软件包foo,请使用包加载条件

答案2

这是对沃纳的回答。虽然冲突的宏定义可能是首先要考虑的问题,但它并不是唯一的问题。

考虑你的包如何与其他包协作也很重要。为了避免宏定义冲突,关键是尽可能隔离宏。在考虑你的包如何与其他包协作时,事情会稍微复杂一些。

  • 不需要加载对于您的软件包的功能不必要的软件包。

  • 不要加载含有不需要的选项的包。

  • 如果您的包严重依赖于其他包,请考虑将无法识别的选项传递给其他包是否有意义。

  • 避免加载依赖引擎的软件包。如果无法避免,请有条件地加载它们,除非您的软件包需要特定的引擎。

  • 不要强迫用户使用特定语言,除非这些语言对于您的软件包的核心功能至关重要(例如,您的软件包设计为排版外蒙古语)。

  • 不要将字体配置强加给用户,除非这些配置对于您的软件包的核心功能至关重要(例如,您的软件包是一个字体支持包或只能与一组专业字体一起使用)。

  • 如果另一个包可以增强您的功能,但不是必需的,请使用以下方法之一。

    • 建议用户加载文档中的其他包或发出推荐它的控制台/日志警告(如果适用)。

    • 提供一个包选项来启用/禁用加载其他包。

    • 如果其他软件包提供了钩子,则使用其他软件包提供的钩子来执行代码(例如microtype)。此代码通常应推迟执行(请参阅下一点)。

    • 推迟依赖于该包的代码,直到所有包都加载完毕,然后仅在其他包都加载完毕后执行该代码。

上述某些情况不适用于包装仅供个人使用的情况,但很多情况确实适用。

相关内容