使用 \BeforePackage 在 hyperref 之前加载包不起作用

使用 \BeforePackage 在 hyperref 之前加载包不起作用

我正在使用lipics包含 的文档类hyperref。我想加载float应该在 之前加载的包hyperref,而不更改文档类。如建议的那样此评论,我正在尝试使用KOMA-Script所谓的scrlfile参见第 199 页文档),如下所示

\documentclass{lipics}
\usepackage{scrlfile}
\BeforePackage{hyperref}{
  \usepackage{float}
}
...

但它从未加载该包。

我做错了什么?

答案1

这里的问题是你需要调用\BeforePackage{}和相关命令包实际上被加载了,这样钩子才能工作。这就是 Marco 的建议试图做的。

不幸的是,您无法使用加载附加包,\BeforePackage{}因为当lipics最终请求时hyperref,加载float将调用\ProvidesPackage{float}声明并且 LaTeX 认为提供了错误的包。

我发现最好使用\AfterPackage\AfterClass。为什么不在使用的documentclassfloat之后立即加载包呢?articlelipics

\RequirePackage{scrlfile}
\AfterClass{article}{
  \RequirePackage{float}
}

\documentclass[english]{lipics}
\begin{document}
Hi
\end{document}

如果你真的想\BeforePackage{}工作,你可以使用以下技巧

\BeforePackage{hyperref}{
  \let\oldProvidesPackage\ProvidesPackage   % Save original definition
  \def\ProvidesPackage#1[#2]{               % Redefine (simply)        
    \oldProvidesPackage#1[#2]               % Call original \ProvidesPackage
    \let\ProvidesPackage\oldProvidesPackage % restore original definitions
    \let\oldProvidesPackage\relax

    \RequirePackage{float}                  % Now load float
  }
}

这暂时重新定义\ProvidesPackage为首先调用原始版本(它将告诉 LaTeX 正在按预期提供),然后在恢复旧定义后hyperref加载。float

相关内容