一个文档中有两个相互冲突的包 — — 可行吗?

一个文档中有两个相互冲突的包 — — 可行吗?

我有两个包想要在同一个文档中使用。具体来说,musixtextengwarscript

但是它们确实存在冲突。两个包使用一些相同的命令,但显然用于完全不同的事情。有没有办法在同一个文档中加载两个包,但只临时或间歇地加载其中一个?

答案1

(基本上就是我评论里的内容,但希望这里能更清楚一点。)

tengwarscript我发现在和musixtex中都定义的唯一命令是\Tten。在tengwarscript它的定义中\newcommand,它会检查它是否已经定义(如果是,则会抛出错误)。在\musixtex它的定义中,它会通过\let(不检查)进行定义,具体来说。此外,在中\let\Tten=\ttie没有其他明确的使用。所以我会保留的定义。对于版本,您可以使用它本身,或者定义另一个与它等同的命令,比如。由于明确检查是否已经定义但没有定义,因此加载它们的正确顺序是第一和第二。以下是执行此操作的一种方法:\Ttenmusixtextengwarscript\Ttenmusixtex\ttie\mTtentengwarscript\Ttenmusixtextengwarscriptmusixtex

\documentclass{article}
\usepackage{tengwarscript}
\let\tengwarTten=\Tten
\usepackage{musixtex}
\let\mTten=\Tten
\let\Tten=\tengwarTten
\begin{document}
\end{document}

(哦,我想看最终文件……)

正如 Marc van Leeuwen 在评论中指出的那样,由于\Tten不需要musixtex保存(因为它已经作为 存在\ttie),因此冲突的最短解决方案是:

\documentclass{article}
\usepackage{musixtex}
\let\Tten=\undefined % \relax will do here as well
\usepackage{tengwarscript}
\begin{document}
\end{document}

(假设没有人定义过\undefined。如果某个白痴这样做了,那么\relax就会这样做。但是,我怀疑任何人都可以重新定义\undefined\relax而不破坏一些严重的东西,所以我认为两者都很安全,最\relax安全。)

答案2

正如 Andrew 所提到的,当两个包定义相同的符号名称时,防止符号名称冲突的一般程序是加载第一个包,重命名冲突的符号,然后加载第二个包。\savesymbol来自的命令保存符号包可用于\savesymbol{XXX}将符号从重命名\XXX\origXXX

\documentclass{article}
\usepackage{savesym}
\usepackage{musixtex}
\savesymbol{Tten}
\usepackage{tengwarscript}

\begin{document}
...
\end{document}

相关内容