延迟加载依赖包?

延迟加载依赖包?

众所周知,scrhack应该尽可能晚地加载该包以避免一些错误。请参阅这里对于这样的问题。

但是,在编写文档类或包时,我希望需要包(而不一定需要冲突的包)。

举个例子来说明我的问题:

% MyTheme.cls
\NeedsTeXFormat{LaTeX2e}[1996/12/01]
\newcommand{\classname}{MastersDoctoralThesis}
\ProvidesClass{\classname}[2020/08/24 v1.7 LaTeXTemplates.com]
\providecommand{\baseclass}{book}
\LoadClass{\baseclass}
\RequirePackage{scrhack}
% main.tex
\documentclass{MyTheme}
\usepackage{listings}
\usepackage[outputdir=build]{minted}

\begin{document}
Test
\end{document}

这将导致以下错误:

scrhack Error: extension `lol' already in use.

如果我在 MyTheme.cls 中删除,或者在之前\RequirePackage{scrhack}添加,问题就会解决。但是,我更喜欢保持对显式的依赖,并且不想创建不必要的依赖。\RequirePackage{minted}\RequirePackage{scrhack}scrhack

...但如何做?是否有可能以某种方式请求一个包\RequirePackage,但延迟加载它?

答案1

我发现使用\AtBeginDocument{\usepackage{packagename}}会延迟所需包的加载。一些评论指出了更合适的钩子。

以下文档类也需要该scrhack包,但不会导致OP中指出的问题。

% MyTheme.cls
\NeedsTeXFormat{LaTeX2e}[1996/12/01]
\newcommand{\classname}{MastersDoctoralThesis}
\ProvidesClass{\classname}[2020/08/24 v1.7 LaTeXTemplates.com]
\providecommand{\baseclass}{book}
\LoadClass{\baseclass}

% Deferred loading of package scrhack
% Alternative 1:
\AddToHook{begindocument/before}{\usepackage{scrhack}}

% Alternative 2: Uses package etoolbox
\usepackage{etoolbox}
\AtEndPreamble{\usepackage{biblatex}}

% Alternative 3: Load package at begin{document}, which might be 
% too late for some packages (as has been noted by Ulrike Fischer)
\AtBeginDocument{\usepackage{scrhack}}

相关内容