当您多次加载一个包时,会发生什么情况,比如通过\usepackage{<package>}
或\RequirePackage{<package>}
。
例如:
\documentclass{book}
\usepackage{geometry}
\usepackage{geometry}
\begin{document}
test
\end{document}
LaTeX 会忽略 的双重加载吗geometry
?或者会产生一些问题和影响吗?
答案1
不,LaTeX 不会geometry
再次加载。
包中的前几行是
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{geometry}[2010/09/12 v5.6 Page Geometry]
他们的目的也不仅仅是为了宣布这一方案。
每次 LaTeX 加载一个包时,比如说foo.sty
,它会执行一项重要的任务:
\@namedef{[email protected]}{...}
其中...
代表可选参数的内容\ProvidesPackage
(如果存在);否则为空。但重要的是
\[email protected]
已定义(无法直接访问该宏)。此外,它将传递给包的选项存储在另一个宏中
\[email protected]
这些宏的目的是什么?什么时候
\usepackage[<options>]{foo}
找到后,LaTeX 首先检查是否已定义。如果没有,则使用给定的选项加载。如果已定义,则 LaTeX\[email protected]
foo
没有加载foo
并简单地检查现在给出的选项列表是否是它在中找到的选项列表的子集。如果是,LaTeX 不执行任何操作;否则会引发错误\[email protected]
! LaTeX Error: Option clash for package foo.
所以向用户警告该问题。
这仅有的允许多次加载的软件包是fontenc
。当然,软件包可以使用与 相同的技巧fontenc
,但强烈不建议这样做,而且据我所知,没有软件包会尝试这种不正当的行为。
一些预期由类调用的包通常具有“setup”命令,以便可以更改类可能已进行的设置,而不必加载具有不同选项的包,这是不可能的。示例包括caption
和geometry
。
有些类允许将选项传递给它们加载的包。例如,
\documentclass[xcolor={svgnames}]{beamer}
以便将svgnames
选项传递给xcolor
。当不支持此功能时,总是有可能在 之前说\documentclass
,
\PassOptionsToPackage{<options>}{<package>}
<package>
我们需要将 传递给的包在哪里<options>
,并由类加载。