\cleardoublepage 之后 \hypersetup 无法正常工作

\cleardoublepage 之后 \hypersetup 无法正常工作

在我的 MWE 中,\hypersetup 在 \cleardoublepage 之后被调用。但是 \hypersetup 在 \cleardoublepage 之后不能正常工作,即文档属性中没有 PDF 元数据。

\documentclass{book}

\usepackage{hyperref}
\usepackage{blindtext}

\begin{document}

\blindtext

\cleardoublepage

\blindtext

\hypersetup{pdftitle={test}}

\end{document}

答案1

hyperref 调用命令来设置第一页之后的元数据。因此,下一页上的每个 \hypersetup 都会被忽略。您可以使用基元设置标题,但随后您需要确保内容是有效的 pdf。并且您最好从 hyperref 命令中删除元数据,以避免信息字典中有两个标题:

\documentclass{book}

\usepackage[]{hyperref}
\usepackage{blindtext}
\usepackage{xpatch}
\makeatletter
\xpatchcmd\PDF@FinishDoc{/Title(\@pdftitle)}{}{}{\fail}%
\makeatletter
\begin{document}

\blindtext

\cleardoublepage

\blindtext

\pdfinfo{/Title (test)}

\end{document}

但总的来说,我认为最好稍后更改强制您设置数据的任何内容。

答案2

使用机制的一个例子aux

\documentclass{article}
\usepackage{hyperref}

% usage of pdftitle in preamle is overwritten
\hypersetup{pdftitle={preamble}}

\makeatletter
\newcommand\setPdfTitle[1]{%
  \protected@write\@auxout{}{%
    \string\ifx\string\@onlypreamble\string\@notprerr
    \string\else
      \string\AtBeginDocument{\string\def\string\@pdftitle{#1}}%
    \string\fi
  }%
}
\makeatother

\begin{document}
a \newpage

\setPdfTitle{set title very late}

b
\end{document}

另一个示例是将执行延迟\PDF@FinishDoc到文档结束,可以在以下位置找到github 评论

这两个例子都与引擎无关。

相关内容