众所周知,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}}