Lecture Note.tex:1898: Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):(hyperref) removing \hbox' on input line 1898. Lecture Note.tex:1898: Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):(hyperref) removing\z@' on input line 1898. Lecture Note.tex:1898: Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):(hyperref) removing
\hss' 位于输入行 1898。`
这个错误信息是什么意思?它不会造成严重错误,但会在 latex 上发出警告。
答案1
每条消息都表明“Lecture Note.tex”的代码行 1898 包含一些代码,这些代码经过 TeX 引擎/LaTeX 编译器的扩展和处理后,在预期 PDF 字符串的位置发现了一个不适合 PDF 字符串的标记。每条消息还告诉您,有问题的标记已从有问题的 PDF 字符串中删除。
PDF 字符串是一个字符串/字符序列,在显示 .pdf 文件(先前通过 TeX 引擎/LaTeX 编译器创建)时,PDF 查看程序会“理解”/解释/处理/呈现该字符串/字符序列。
PDF 标准假设 PDF 字符串(“文本字符串类型”的字符串)既可以用名为 PDFDocEncoding 的编码进行编码,也可以用 Unicode(UTF-16BE = UTF-16 Big Endian)进行编码。
hyperref 包自动将 PDF 字符串从 TeX 引擎的内部字符编码转换为 PDFDocEncoding 或 UTF-16BE。
警告中的短语“PDFDocEncoding”表示(由于未使用 hyperref 的包选项unicode
),hyperref 包当前设置为使用 PDFDocEncoding 对 PDF 字符串进行编码。(如果使用选项 加载 hyperref unicode
,则 PDF 字符串将使用 UTF-16BE 进行编码。)
TeX 代码将构成 .pdf 文件中书签的文本短语,在扩展后应产生一系列字符标记,这些字符标记
- 可以从 TeX 引擎的内部字符编码转换为为 PDF 字符串选择的编码。
- 形成一些可以被 PDF 查看程序(例如 Adobe Acrobat)理解/解释/处理/呈现的内容,用于在显示相关 .pdf 文件的窗口的单独区域中显示书签短语。
如果在 TeX 引擎/LaTeX 编译器运行并处理 .tex 源代码以生成 .pdf 文件的阶段,构成此类书签的文本短语的一组标记包含例如不可扩展的原始标记,\hbox
那么这是一个问题,因为
- 一方面,TeX 控制序列标记
\hbox
不是可以从 TeX 引擎的内部字符编码转换为为 PDF 字符串选择的编码的字符。 - 另一方面,按
\hbox
字面意思理解并转换文字序列会将字符序列\
,h
, ,作为 PDF 字符串的一部分,而在查看 .pdf 文件时,人们不希望看到字母序列 ,b
, ,作为书签文本短语的一部分(之所以会这样,是因为 PDF 查看程序与 LaTeX 编译器不同,不将序列, , ,作为控制序列,而是将其作为“转义”以下字符的指令,从而显示以及序列, , )。o
x
h
b
o
x
\
h
b
o
x
\
h
b
o
x
在创建 .pdf 文件时使用 hyperref 时,书签将自动创建(在其他内容之下)。因此,书签的文本短语是从诸如\chapter
或 之类的分段命令的参数中获取的\section
。如果这些参数(扩展后)包含(非字符)标记,而这些标记从 TeX 引擎的内部字符编码转换为 PDF 字符串所选的编码会导致问题,并且当这些标记出现在书签的文本短语中时,PDF 查看程序无法“理解”/解释/处理/呈现这些标记,但会(错误地)按字面显示这些标记,那么您将收到类似于您遇到的警告消息。
这就是为什么 hyperref 包带来了 -mechanism \texorpdfstring
:
hyperref 的宏处理两个参数:\texorpdfstring{⟨TeX string⟩}{⟨PDF string⟩}
第一个参数表示一组标记,用于仅需要由 TeX 引擎/LaTeX 编译器“理解”/解释/处理内容的情况。
第二个参数表示一组标记,用于将内容转换为为 PDF 字符串选择的编码 (PDFDocEncoding/UTF-16BE) 的情况,因为内容(在创建 .pdf 文件后)需要由 PDF 查看程序“理解”/解释/处理/呈现。
因此你可以做类似的事情:
\documentclass{article}
\usepackage{hyperref}
\begin{document}
\tableofcontents
\section{%
A section about
\protect\texorpdfstring{\hbox{\protect\texttt{typewriter}}}{typewriter}
%\hbox{\protect\texttt{typewriter}} %<-This way you get a warning which
% informs about the removal of the token \hbox
% from the PDF-string which LaTeX/hyperref is about
% to create/prepare for the bookmark because with
% the phrase "\hbox{...}"
% - for one thing the token \hbox is not a
% character which can be converted to the encoding
% chosen for PDF-strings
% - for another thing having the phrase "hbox"
% literally in the text of the bookmark seems
% undesired.
% "\texttt" would cause similar problems but the
% author of hyperref already took that into account
% and "\texttt" is removed silently by hyperref
% while examining things that are to be transformed
% into PDF-strings.)
font%
}%
Some text.
\end{document}
PDF 查看程序可能会显示编译上述示例得到的 .pdf 文件,如下所示:
由于 的\texorpdfstring
第一个参数,短语“打字机”将被放入 中\hbox
,并将以打字机字体写入文档文本中。
由于 的\texorpdfstring
第二个参数,书签中只有普通短语“打字机”,没有诸如\hbox
或之类的控制序列\texttt
,这些控制序列无法被处理书签短语以显示书签的 PDF 查看程序“理解”(因此将按字面显示)。
有关 PDF 字符串的更多信息\texorpdfstring
(以及不适合 PDF 字符串的警告)可以在这里找到hyperref 包手册的第 4.1.2 节“替换宏”以及hyperref 包注释源代码第 6 节 处理 Pdf 字符串。