正确使用 `RequirePackage` 并避免选项冲突

正确使用 `RequirePackage` 并避免选项冲突

我正在开发一个需要 hyperref 才能工作的小型 LaTeX 库,但我面临 2 个问题:

  1. 我认为 hyperref 通常应该在最后加载。但是,如果我将一个放入\RequirePackage{hyperref}库中,它会在开头加载吗?如果用户也在\usepackage{hyperref}末尾添加,这会解决问题吗,还是会因为hyperref之前已经加载而被忽略?

  2. 当用户向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,否则一切将无法正常工作。

相关内容