本论坛中有很多与“软件包冲突”相关的问题,但这些问题都与特定软件包有关(为什么?)。例如,我在我的文档中使用了 50 多个软件包。即使我非常勤奋并跟踪哪个软件包使用特定选项加载其他软件包的内部依赖关系,我仍然会遇到“三角关系”,在这种情况下,无法以“正确”的顺序加载软件包。因此,我需要问:
有没有解决“包裹冲突”问题的通用方法?
编辑:我正在写一份出版物,需要表格、图形、算法、不同的颜色、标题、副标题、数学符号、物理单位等等。最后我有大约 30 个包(50 个是根据行号计算的,但后来我意识到实际包数要少一些)。
答案1
最通用的解决方案是
\PassOptionsToPackage[option,more=options]{package}
在第一次加载包之前。这可以确保它已加载所需的所有选项,即使它是从另一个包间接加载的。
在另一个包使用错误的选项加载它之前手动加载包也很有用。除了极少数例外(例如fontenc
),第一次加载包时会确定要加载哪些选项。有一次,作为最后的手段,我甚至需要\RequirePackage
在加载之前这样做\documentclass
,但\PassOptionsToPackage
在这种情况下通常要好得多。
许多选项(例如语言)可以传递给\documentclass
,然后它会将它们传递给它加载的每个其他包,从而防止任何选项冲突。
许多软件包允许您在加载后使用命令更改其选项。对于一个软件包来说,加载另一个没有明确选项的软件包,然后将所需的选项传递给它可能会更安全。还有一些软件包会将选项传递给它们加载的软件包,例如 howmathtools
将接受 的选项amsmath
。
这些方法并非适用于所有情况。软件包可能会加载具有互斥选项的另一个软件包,或者软件包 A 可能需要在软件包 B 之前加载,但在软件包 C 之后加载,而软件包 C 必须在软件包 B 之后加载。
答案2
我猜你的意思是选项冲突。某些包加载了 xcolor 包,选项是 svgnames,后来又加载了 x11names 包,例如
不,总体而言,没有办法解决这些问题。
软件包冲突很少发生,因为软件包维护者会尽量避免这种情况。只有 53 个问题带有标签选项 -clash。
如果你要加载 50 多个包,你最好找出你真正需要的包。听起来像一个臃肿的模板……
答案3
显然不存在通用的解决方案。
如果你加载了内部使用
\RequirePackage[final]{foo}
并且你使用另一个包 B,它使用
\RequirePackage[draft]{foo}
然后您将收到选项冲突错误,并且没有自动解决该错误的方法。您需要决定是否要使用final
或draft
如果您决定使用,那么如果它需要该模式,final
那么您可能根本不需要使用包 B。draft
请注意,无论您是否遇到选项冲突错误,此要求都是加载多个包所固有的。
如果情况稍有不同,A
\RequirePackage{foo}
并且 B 确实
\RequirePackage[final]{foo}
然后,如果您先加载 A,然后加载 B,就会出现选项冲突,这可以通过更改包顺序并先加载 B,然后加载 A 来“解决”,因为 latex 代码天真地假设忽略使用第一次加载时使用的选项子集的包加载请求是可以的。但是更改顺序可以避免错误,但现在意味着包 A“意外地”使用带有选项的 foo 包,final
该选项可能会或可能不会起作用,具体取决于代码的具体情况。
如果你加载了 50 个包(真的吗?),那么你需要对任何交互负责,选项冲突错误只是在捕获一些可能的问题时提供的小帮助。请注意,它被设计为帮助不是一个需要解决的问题。不实施检查会更容易。