我正在开发一个需要 hyperref 才能工作的小型 LaTeX 库,但我面临 2 个问题:
我认为 hyperref 通常应该在最后加载。但是,如果我将一个放入
\RequirePackage{hyperref}
库中,它会在开头加载吗?如果用户也在\usepackage{hyperref}
末尾添加,这会解决问题吗,还是会因为hyperref
之前已经加载而被忽略?当用户向
hyperref
包中添加选项时,它会中断并出现错误:错误:LaTeX 错误:包 hyperref 的选项冲突。
那么,正确的表达方式是什么:“我的包需要超链接”,但仍然允许用户覆盖超链接选项/确保它最后加载?
谢谢!
梅威瑟:
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}[overwrite]{mypackage.sty}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mypackage}[2020/07/13 A dummy package]
\RequirePackage{hyperref}
\end{filecontents}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[francais]{babel}
\usepackage{mypackage}
\usepackage[colorlinks]{hyperref}
\begin{document}
Hello
\end{document}
答案1
仅当第二个选项\usepackage
不为空且与第一个选项列表不同时,才会发生选项冲突错误,因此您可以hyperref
在前言的最后推迟加载(例如,通过使用etoolbox
's \AtEndPreamble
)并在没有选项的情况下加载它。在这种情况下,如果用户不加载hyperref
,您的包会在前言的末尾加载。如果用户做使用选项加载hyperref
,那么您的\RequirePackage{hyperref}
行不会引发错误,因为没有请求任何选项。您可以使用以下方式将选项传递给 hyperref \PassOptionsToPackage{hidelinks}{hyperref}
:
\documentclass{article}
\begin{filecontents}[overwrite]{mypackage.sty}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mypackage}[2020/07/13 A dummy package]
\RequirePackage{etoolbox}
% Any option your package wants:
% \PassOptionsToPackage{hidelinks}{hyperref}
\AtEndPreamble{%
\RequirePackage{hyperref}}%
\end{filecontents}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[francais]{babel}
\usepackage{mypackage}
\usepackage[colorlinks]{hyperref}
\begin{document}
Hello
\end{document}
但这样会有问题,例如,cleveref
或其他必须在之后加载的包hyperref
:用户将必须hyperref
在加载之前明确加载cleveref
,否则一切将无法正常工作。