所有包加载冲突是否都是由于相同的控制序列名称冲突而导致的?

所有包加载冲突是否都是由于相同的控制序列名称冲突而导致的?

我刚刚遇到了由于 cs 名称相同而导致的加载顺序冲突,并意识到这是我过去见过的类似问题的根源。想想看,我无法想象还会有什么其他冲突,所以这说明我知道的很多。无论如何,现在我正在编写一两个包,我需要理解这一点。

-------------- 阅读答案后 ------------------

嗯,我觉得我的问题已经得到了充分的回答,我非常满意。不幸的是,全部的答案都让我有了现在的理解和满足感,我觉得只选一个作为“正确”答案是不公平的。所以,在我找到解决这个难题的方法之前,我想象征性地检查一下所有的答案,并感谢所有花时间回答我的人。

谢谢。

答案1

最常见的问题,正如您正确指出的那样,是宏名重复。您可以使用命令(如\@ifundefinedifdefinable和其他类似命令)轻松检查。该问题类似于使用进行常规编程时遇到的问题globals。通常全局变量很糟糕,而在 TeX 编程中它们被广泛使用。

您可以通过宏来缓解问题namespacing。例如,您可以@bev@pagewidth舒适地使用,因为不太可能有人在其他宏中使用过它!这使您的宏名称变得相当长,这会让具有 Java 背景的人感到高兴,但具有“C”背景的人会非常不高兴。

LaTeX3 提供了各种方法、规则和规定来定义命名空间和创建命令。它的语法与 TeX 的语法一样独特,虽然一开始有点令人生厌,但实际上你可以在一个周末内上手。团队付出了巨大的努力,使它能够立即使用,从而为你节省了大量的工作时间。

如果您有override任何现有命令,请先将它们保存在变量中,然后在包代码末尾将它们恢复回来。

对尺寸、胶水、计数器等的任何更改最好在本地定义。

最后要关注的是键值对的使用,keyval如果您再次使用它,则需要小心分配名称。还要决定要与哪些包进行交互,以避免冲突。

答案2

试图控制 Tex 事件的程序包\shipout可能会以令人讨厌的方式发生冲突。Latex 实际上没有有序的方法来解决这些冲突,因此程序包编写者需要相互合作。

例如:{hyperref}由于这个原因,与软件包发生了许多冲突,请参阅http://tug.org/pipermail/texhax/2010-June/015250.html

这些例子不是命名冲突,因为改变名称选择无法解决它们。你需要改变你正在做的事情。

我还没有看到实现的一些可能导致软件包冲突的其他方法:

  1. 原则上,乱用 catcode 可能会导致冲突。您可能会认为,像{inputenc}这样的软件包使用 catcode 做棘手的事情会存在风险,但我不知道有任何这样的软件包。
  2. 通过命令运行 Postscript/PDF 代码的软件包\special,如 PGF 那样。这里存在很多冲突空间,但我不知道实际中是否存在任何软件包冲突。

答案3

一个常见的问题是辅助宏的重新定义:例如,hyperref 重新定义计数器机制的内部结构以使超链接起作用,而在 \usepackage{hyperref} 之前定义的所有计数器都不会受益,但我不知道这是否属于“冲突”,因为它通常不会导致编译失败,只是结果不符合预期。

相关内容