按主题对序言包进行排序,同时考虑强制加载顺序

按主题对序言包进行排序,同时考虑强制加载顺序

在文档的序言(或自定义“序言”包)中,有时需要考虑某些包的强制加载顺序。大多数包必须在包之前加载hyperref,某些包(例如glossariesellipsis)必须在包之后加载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>

相关内容