我有类似的东西:
\subsection{FooBar-$\mu$Something}
我收到警告:
Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding): (hyperref) removing `\mu' on input line 267.
发生了什么事?为什么我不能在小节标题中使用希腊字母?有什么建议的解决办法吗?
答案1
从您的源代码中创建一个 pdf 文件。
嵌入字体以显示文档的文本。
但有些东西与这些字体无关。
例如,书签内的超链接就是这种情况。
书签不属于构成文档的页面。
它们是额外的东西,它们的存在是为了使浏览文档更加容易。
与书签相关的文本使用来自程序/平台的字体显示用于显示pdf 文件。
构成与书签相关的文本的字符必须以程序/平台能够识别的编码进行编码用于显示pdf 文件如何理解以及程序/平台的字符用于显示pdf文件可以显示。
目前我知道的这样的编码有两种:PdfDocEncoding 和 Unicode(UTF-16 Big Endian)。
这两种编码确实通过字节序列来表示单个字符。
依次属于一起的字符序列称为字符串。
那些 (La)TeX在创作过程中pdf 文件必须包含在以 PdfDocEncoding 或 Unicode 编码的 pdf 文件中,以便程序/平台用于显示有问题的 pdf 文件可以正确处理/显示它们,例如,显示带有超链接的书签,在 TeX 术语中称为 pdf 字符串。
因此,您需要确保 (La)TeX 以这两种编码之一的纯文本形式提供 pdf 字符串(例如,进入书签的文本,因此将由用于显示 pdf 文件的程序/平台进行处理)。
当您使用 (La)TeX 创建 pdf 文件时,您输入的 .tex 输入文件的编码很可能不是 PdfDocEncoding,而且除 LuaTeX 和 XeTeX 之外的其他 TeX 引擎也没有内置对某些 Unicode 编码的 .tex 输入文件的支持。常见的输入编码有 latin 1 和 ansinew 等。
因此 hyperref-package 确实提供了宏\texorpdfstring
。
此宏接受两个参数。在普通的 TeX 处理情况下,它会原封不动地传递第一个参数中包含的标记。在需要以 PdfDocEncoding 或 UTF-16-Big-Endian-Encoding 传递字符串的情况下,为了使用于显示 pdf 文件的程序/平台能够正确处理/处理/显示它,将传递第二个参数中包含的标记。但这还不是全部:\texorpdfstring
还确保第二个参数中包含的内容得到正确的重新编码。这种重新编码是必要的,因为 .tex 输入文件的编码不一定是 PdfDocEncoding 或 UTF-16-Big-Endian。\texorpdfstring
还提供了处理事物的其他方法:例如,在编译时用于创建 pdf 文件的 .tex 输入文件,有一个 LaTeX 编译器,它遵循以下指令$
:$$
用于切换到数学模式和离开数学模式。但是在展示时pdf 文件,没有 LaTeX 编译器。有用于显示 pdf 文件的程序/平台。此程序不关心在编译 .tex 输入文件和创建 pdf 文件时为 LaTeX 编译器设计的指令。因此,此程序不会理解类似 的指令。因此,$\mu$
在 的第二个参数中,\texorpdfstring
您可以省略 LaTeX 编译器可以理解但用于显示 pdf 文件的程序/平台无法理解的所有内容。
在 pdf 字符串中,因此在第二个参数中,\texorpdfstring
您可以使用反斜杠加上三位数字(必要时带前导零)来转义字节,以八进制表示法表示所讨论字节的值。
如果字节的转义八进制表示表示 UTF-16-Big-Endian 字符的高字节,则在它的第二个参数中,\texorpdfstring
习惯上在该 3 个八进制数字序列前加上数字“9”。
之所以这样做,是因为“9”不是八进制数字。
在第二个参数中,UFT-16-Big-Endian 字符的高字节八进制表示的另一个习惯\texorpdfstring
是:如果高字节的八进制表示有两个前导零,则可以这样做,而不是这样\900⟨single octal digit⟩
做\8⟨single octal digit⟩
。
加载 hyperref 包时,pdf 字符串通常需要在 PdfDocEncoding 中进行编码。
在 PdfDocEncoding 中(参见http://www.verypdf.com/document/pdf-format-reference/pg_1001.htm), 有一个 Micro-Sign 被分配给代码点数 181(dec) = 265(oct)。
unicode=true
当您向 hyprref 包提供选项时,pdf 字符串需要以 Unicode(UTF-16 Big Endian)进行编码。
在 Unicode 中(参见 https://dev.w3.org/html5/html-author/charref),有 μ,其被分配给码点号 956(dec)。
为了找到该代码点数的 UTF-16-Big-Endian 表示形式的字节,让我们以 256 为基数写入该代码点数:
956 (十进制) = 3 (十进制) * (256 (十进制) 1 (十进制) ) + 188 (十进制) * (256 (十进制) 0 (十进制) )
因此,在 UTF-16(Big Endian)中,μ 由两个字节编码,其中高位字节的值为 3(dec),低位字节的值为 188(dec)。
让我们用 3 位八进制表示法来表示每个字节的值:
高字节的值 = 3(十进制) = 003(八进制)
低字节的值 = 188(十进制) = 274(八进制)
通过八进制序列转义 pdf 字符串字符编码的功能很好,因为它提供了一种以 PDFDocEncodng 或 UTF-16 Big-Endian 格式写入 pdf 字符串字符的方法,而不要求以相同的编码写入 .tex 输入文件。
即使在 ASCII 中,数字 0..9 和反斜杠也是可用的......
加载时超链接-package 不带选项unicode
,您可以在 pdf 字符串中使用 PDFDocEncoding,并以此通过八进制表示法的字节表示形式转义 .tex 输入文件编码中不包含的字符:
\documentclass{article}
\usepackage{hyperref}
\begin{document}
\tableofcontents
\section{\texorpdfstring{$\mu$}{\265} Something}
\end{document}
加载时超链接-package 使用选项unicode
,您可以在 pdf 字符串中使用 unicode 编码,并在此通过八进制表示法的字节表示形式转义 .tex 输入文件编码中不包含的字符:
\documentclass{article}
\usepackage[unicode]{hyperref}
\begin{document}
\tableofcontents
\section{\texorpdfstring{$\mu$}{\9003\274} Something}
\end{document}