解决构建库时的软件包合谋问题

解决构建库时的软件包合谋问题

我希望创建一个我经常使用的命令“库”,比如lib.tex,这样每次我想使用它们时,我都可以写作\input{lib}并继续生活。然而,当我的库依赖于第三方软件包(如\usepackage{expl3}\usepackage{tabto}等)时,问题就出现了。我担心,在某些时候,如果我包含我的库,文档将无法编译,因为这些\usepackage{}语句会发生冲突,例如\input{lib}\usepackage{X},其中 X 已经包含在 中lib.tex。在 C 中,我们有标题保护,LaTeX 是否可以提供任何东西来模仿这种行为或用某些内部机制来弥补它?我能做些什么,让我可以无忧无虑地\usepackage{}使用lib.tex

答案1

\@ifpackageloaded

\documentclass{article}
% \usepackage{color}
\makeatletter
\@ifpackageloaded{color}{\AtBeginDocument{%
{\color{red}Package color already used}\end{document}}}%
{\usepackage{color}}
\makeatother
\begin{document}
Some \color{blue} blue color 
\end{document}

您还可以使用 测试软件包的选项 \@ifpackagewith,使用 测试软件包的日期\@ifpackagelater。请参阅测试包(或包选项)是否已加载

编辑:

为了避免命令冲突,您可以使用\@ifundefined

\documentclass{article}
\makeatletter
\def\foo{default foo} 
\@ifundefined{foo}{\def\foo{my foo}}{\relax}
\makeatother 
\begin{document}
\foo
\end{document}

但正如评论中所说,\def这是一个有风险的命令。最好使用 \newcommand\renewcommand定义或重新定义命令。

相关内容