在文档的序言(或自定义“序言”包)中,有时需要考虑某些包的强制加载顺序。大多数包必须在包之前加载hyperref
,某些包(例如glossaries
,ellipsis
)必须在包之后加载hyperref
,然后是cleveref
包“基本上[...]必须加载最后的“(手册第 2 节)。一份(小)文件可以解释这一切,如下所示
\documentclass{report}
\usepackage{varioref}% Must be loaded before hyperref
\usepackage{hyperref}
\usepackage{ellipsis}% Must be loaded after hyperref
\usepackage{cleveref}% Must be loaded after any packages that modify
% LaTeX's referencing system
\begin{document}
\chapter{foo}\label{chap:foo}
Some text~\dots\ and some more.
\chapter{bar}
See \vref{chap:foo}.
\end{document}
不过,我更喜欢按主题排序的序言,例如
\documentclass{report}
% Special characters and symbols
\usepackage{ellipsis}
% Cross-referencing
\usepackage{varioref}
\usepackage{cleveref}
% Hyperlinks
\usepackage{hyperref}
\begin{document}
[...]
(我没有将上面的代码片段整理为完整的 MWE,因为这会导致未解析的引用。)
我知道按强制加载顺序排序对于中小型序言来说没什么大不了的,但在某些时候(比如 20 个以上的包),它会变得令人困惑。是否可以按主题对序言包进行排序,但仍考虑强制加载顺序?
答案1
一个简单的解决方案是利用包(KOMA-Script 包中的支持包)\AfterPackage{<package>}{<code>}
提供的钩子:scrlfile
\documentclass{article}
...
% programming tools
\usepackage{scrlfile}
...
% glossaries and indices
\AfterPackage*{hyperref}{%
\usepackage{glossaries}%
}
\usepackage{makeidx}
...
% hypertext, bookmarks and PDF info
\usepackage{hyperref}
...
请注意,<code>
只有<package>
最终加载后才会执行。的星型变体\AfterPackage
与非星型变体的不同之处在于,如果已加载,<code>
则会立即执行。<package>