hyperref 带有 implied=false 给出警告

hyperref 带有 implied=false 给出警告

当我使用时收到以下警告beamer

软件包 hyperref 警告:选项“pdftitle”已被使用

我可以根据类使用以下 MWE 重新创建该article问题

\documentclass{article}
\usepackage[implicit=false]{hyperref}
\AtBeginDocument{\hypersetup{pdftitle=mytitle}}
\begin{document}
Hello world
\end{document}

由于我无法理解(也不想了解)的原因,beamer需要hyperref使用 加载implicit=false\AtBeginDocument{\hypersetup{pdftitle=mytitle}}发生在我编写的包中。 鉴于我需要使用 加载,hyperref并且implicit=false需要pdftitle在加载后设置hyperref,有没有办法避免此警告(不使用包silence)? 是的,我知道这只是一个警告,并不重要。

可能有帮助,但也可能产生误导的是

\documentclass{article}
\AtBeginDocument{\hypersetup{pdftitle=mytitle}}
\AtBeginDocument{\hypersetup{pdftitle=mytitle}}
\usepackage[implicit=false]{hyperref}
\begin{document}
Hello world
\end{document}

pdftitle尽管给出了两次,但没有给出警告。

答案1

option 的设置pdftitle在 中使用\PDF@FinishDoc。通常它在输出第一页时调用,但使用 option 时则implicit通过 完成\AtBeginDocument

因此,您可以使用\AtBeginDocument hyperref已加载,或者包etoolbox有助于钩住\AtEndPreamble

\documentclass{article}
\usepackage[implicit=false]{hyperref}
\usepackage{etoolbox}
\AtEndPreamble{\hypersetup{pdftitle=mytitle}}
\begin{document}
Hello world
\end{document}

答案2

再深入挖掘一下,我想我有一个答案。问题是implicit导致\PDF@FinishDoc比平时更早运行。的默认行为是禁用设置\PDF@FinishDoc的能力,而是导致它产生警告。一个简单的解决方法是使用而不是。我猜这有一些缺点,但我不知道它们是什么。另一种可能性是重新定义以便它稍后运行。我犹豫着是否让它稍后运行,因为我猜有理由让它使用更早运行。也可能可以防止被禁用,或者重新启用,设置它,然后再次禁用它。\hypersetuppdftitle\pdfinfo{/Title (mytitle)}\hypersetup{pdftitle=mytitle}\PDF@FinishDocimplicitpdftitlepdftitle

答案3

我意识到这是一个老问题,但我想补充一点,使用新的lthooks可以覆盖beamer将“隐式”设置改为“OFF”:

\AddToHook{ package/before/hyperref }
{
    \PassOptionsToPackage{ implicit = true }{ hyperref }
}

这将添加implicit=true到传递给 的选项的末尾hyperref。这不会给我的使用带来任何问题beamer,但由于缺乏文件我不完全确定这是什么真的做。

相关内容