latex hyperref 包警告

latex hyperref 包警告

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 文件中书签的文本短语,在扩展后应产生一系列字符标记,这些字符标记

  1. 可以从 TeX 引擎的内部字符编码转换为为 PDF 字符串选择的编码。
  2. 形成一些可以被 PDF 查看程序(例如 Adob​​e Acrobat)理解/解释/处理/呈现的内容,用于在显示相关 .pdf 文件的窗口的单独区域中显示书签短语。

如果在 TeX 引擎/LaTeX 编译器运行并处理 .tex 源代码以生成 .pdf 文件的阶段,构成此类书签的文本短语的一组标记包含例如不可扩展的原始标记,\hbox那么这是一个问题,因为

  • 一方面,TeX 控制序列标记\hbox不是可以从 TeX 引擎的内部字符编码转换为为 PDF 字符串选择的编码的字符。
  • 另一方面,按\hbox字面意思理解并转换文字序列会将字符序列\, h, ,作为 PDF 字符串的一部分,而在查看 .pdf 文件时,人们不希望看到字母序列 , b, ,作为书签文本短语的一部分(之所以会这样,是因为 PDF 查看程序与 LaTeX 编译器不同,不将序列, , ,作为控制序列,而是将其作为“转义”以下字符的指令,从而显示以及序列, , )。oxhbox\hbox\hbox

在创建 .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 字符串

相关内容