我希望创建一个我经常使用的命令“库”,比如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
定义或重新定义命令。