我的问题(或者说,严格地说,我有两个问题)是由本周新闻通讯中列出的一个问题的答案引发的,该答案表明加载该{hyperref}
包是没有意义的,因为它已经被文档类或另一个包(我忘了是哪个)加载了。所以:
问题 1:有没有一种简单的方法可以确定哪些包被类和其他包加载了?我知道“阅读文档!”是显而易见的答案,但让我们面对现实吧,一些包文档长达 100 页以上。
问题2:如果我无意中加载了一个已经加载的包,这有关系吗?
答案1
您可以检查日志文件以查看包是否已加载,或者\listfiles
在序言中使用它来获取已加载的所有包的格式化列表。grep packagename `kpsewich classname.cls`
如果您足够熟练,您还可以检查类的源代码(例如在 Linux 和朋友下)。您可以使用以下方法检查序言中已加载的包\@ifpackageloaded{<name>}{<yes>}{<no>
。请参阅测试包是否已加载了解更多信息。
一般来说,LaTeX 不会介意你请求加载已经加载的包。第二个请求会被跳过。否则,很难使用两个都需要特定第三个包的包。但是,如果同一个包被请求两次或更多次,不同的选择您将收到一个错误,因为该包无法再次加载。
我认为明确请求所有使用的包是一种非常好的做法。当然,如果您现在确定某个包是由另一个包加载的,那么您可以避免手动加载,从而节省时间和源代码空间。
答案2
A\listfiles
将插入编译中使用的所有文件,日志文件通常与 TeX.tex 同名;即 TeX.log。此命令将仅列出通过documentclass
和等命令添加的包usepackage
,而不是\input{}
。
据我所知,许多包会忽略任何先前加载的文件或包,例如hyperref
,如果您pdftex
在中使用选项,documentclass
它将忽略放置在中的该选项hypersetup
。
答案3
如果包由\usepackage
或加载\RequirePackage
,则不会再次加载。如果在第二次调用时使用第一次调用时未使用的选项加载,则会出现错误:
Options clash for ...
The package ... has already been loaded
with options: ....
如果选项兼容,则第二个选项\RequirePackage
将被忽略。
答案4
如果要获取已加载软件包的列表(而不是所有已加载的文件),可以使用\ltsgetpackagenames
我在 的开发版本中找到的以下命令ltxtools.sty
。将其结果与 的结果进行比较\listfiles
。
\makeatletter
\documentclass{article}
\usepackage{catoptions}
% hyperref loads many packages; so let us use it as an example:
\usepackage{hyperref}
\robust@def*\ltsgetpackagenames{%
\let\ltsgetpackagenames\relax
\AtBeginDocument{%
\begingroup
\def\LTS@tempb{%
\def\\{ }\@tempcnta\z@pt
\def\LTS@tempa{}%
\def\siso@do####1{%
\advance\@tempcnta\@ne
\ifnum\@tempcnta>20\relax
\typeout{\LTS@tempa\ifcsnullTF\reserved@f{}{[\reserved@f]}}%
\loopbreak
\else
\edef\LTS@tempa{\LTS@tempa####1}%
\fi
}%
\expandafter\siso@@loop\expandafter{\filename@base
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\}%
}%
\typeout{^^J *** Package List ***}%
\def\csv@do##1{%
\filename@parse{##1}%
\ifxFT\filename@ext\@pkgextension{}{%
\ifcsndefTF{\filename@base}{%
\edef\reserved@e{\expandafter\meaning
\csname\filename@base\endcsname}%
\xifinsetTF{\detokenize{macro:}}\reserved@e{%
\edef\reserved@f{\expandafter\strip@prefix\reserved@e}%
}{%
\let\reserved@f\reserved@e
}%
}{%
\def\reserved@f{}%
}%
\LTS@tempb
}%
}%
\csv@@loop*[,]\@filelist
\typeout{ **************^^J}%
\endgroup
}%
}
\@onlypreamble{\ltsgetpackagenames}
% Example:
\ltsgetpackagenames
\listfiles
\makeatother
\begin{document}
xx
\end{document}