如果 hyperref 的 pdftitle 选项包含黑板粗体数学字母,则 silent 包会导致错误

如果 hyperref 的 pdftitle 选项包含黑板粗体数学字母,则 silent 包会导致错误

如果hyperref'spdftitle选项包含黑板粗体数学字母,则silence包会导致错误(编译后会默默停止(./test.out),并且需要Ctrl+ ):C

!中断。\sl@StoreMessage ...oveGobbletwo #1\sl@Terminator \@gobbletwo \sl@Terminator... l.11 \hypersetup{pdftitle=$\mathbb{A}$

MCE 指出问题所在:

\documentclass{article}
\usepackage{silence}
\usepackage{amsfonts}
\usepackage{hyperref}
\begin{document}
\hypersetup{pdftitle=$\mathbb{Z}$}
\end{document}

您知道为什么以及如何使所有这些兼容吗?

答案1

silence您看到的行为是由于、hyperref和之间一系列不幸的不良相互作用造成的\mathbb

首先,让我们知道这\mathbb是不可扩展的,所以

\documentclass{article}
\usepackage{amsfonts}
\begin{document}
\edef\tempa{$\mathbb{Z}$}
\end{document}

抛出错误。如果您添加\usepackage{silence}或甚至\usepackage[safe]{silence},它会因上述代码而阻塞(我认为不应该,但是......)。但是您正在使用\edef具有不可扩展命令的原语,因此结果确实很低级,我认为这超出了包的范围silence来应对这种情况。

是的,但是pdftitle与有什么关系\edef

pdftitle最终用于\pdfstringdef将 TeX 命令转换为有效的 pdf 字符串并发出类似警告

Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref)                removing `math shift' on input line 5.

当发现无效令牌时。某个地方\pdfstringdef会做一些类似的事情

\xdef\@pdftitle{#1}

#1在哪里,我们已经看到即使没有或$\mathbb{Z}$这也不起作用,所以我们不能指望它现在起作用。hyperrefsilence

hyperref然而,它足够聪明,可以将不可扩展的东西变成可扩展的东西\xdef,所以如果你这样做

\documentclass{article}
\usepackage{amsfonts}
\usepackage{hyperref}
\begin{document}
\hypersetup{pdftitle=$\mathbb{Z}$}
\end{document}

您将获得一个带有标题Z和两个警告的 pdf:

Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref)                removing `math shift' on input line 5.

Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref)                removing `math shift' on input line 5.

因为$它们也是无法扩展的。

但是,如果您尝试添加silence,它会像以前一样阻塞,从而导致您发现的行为。

如果您想保留此设置,则可以silence使用之前的safe选项或问题进行加载。您可以稍后致电以恢复正常。\SafeMode\hypersetup\BoldMode

但是,这将导致 pdf 标题mathbb allowed only in math modeZ和三个额外警告与上面的类似。\mathbb不能在文本模式下使用,并且 pdf 标题本质上是文本。

实际答案

但是,您无需借助数学模式即可获得 pdf 标题。据我们当地的 pdf 专家称只要你加载hyperref正确的选项,你就可以直接使用:

\documentclass{article}
\usepackage{amsfonts}
\usepackage[
  pdfencoding=auto,% or unicode
  psdextra,
]{hyperref}
\begin{document}
\hypersetup{pdftitle=ℤ}
\end{document}

或者,用一种不为人知的方式

\documentclass{article}
\usepackage{amsfonts}
\usepackage{hyperref}
\begin{document}
\hypersetup{pdftitle={\376\377\041\044}}
\end{document}

有或没有错误混淆silence包。

答案2

这来自于\mathbb 著名内部的扩展\pdfstringdef

以下对我有用。

\documentclass{article}
\usepackage{silence}
\usepackage{amsfonts}
\usepackage{hyperref}
\makeatletter
\pdfstringdefDisableCommands{\let\@latex@error\@gobbletwo}
\makeatother
\begin{document}

\hypersetup{pdftitle=$\mathbb{Z}$}
\end{document}

解释是,对于,它hyperref确实起作用。但是 silent 包重新定义了,它最初使用这个。现在它没有,因此 的扩展(由于不在数学模式下,这会导致 的执行)会造成严重破坏。\let \GenericError \@gobblefourpdfstringdef\@latex@error\GenericError\mathbb\@latex@error

通过做

\pdfstringdefDisableCommands{\let\@latex@error\@gobbletwo}

一个办法可以解决这个问题。

相关内容