如果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}$
这也不起作用,所以我们不能指望它现在起作用。hyperref
silence
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 \@gobblefour
pdfstringdef
\@latex@error
\GenericError
\mathbb
\@latex@error
通过做
\pdfstringdefDisableCommands{\let\@latex@error\@gobbletwo}
一个办法可以解决这个问题。