我使用以下代码在 pdf 文档中制作书签:
\pdfdest num 1 fit
\pdfoutline goto num 1 count 0 {äöüÄÖÜß}
äöüÄÖÜß
... more text ...
文本打印正常。pdf 书签显示变音字符,但不显示“ß”(s 升号)字符。对于“ß”,它显示:“T1ss”。对于上面的书签,显示“äöüÄÖÜT1ss”。
的文档\pdfoutline
包含以下句子:“请注意,这仅限于 PDF 文档编码向量中的字符。”由于“ß”在文档中打印正常,我假设它一定在“PDF 文档编码向量”中(并且 6 个变音符号字符被打印出来并完美地插入到书签中)。我需要查看 PDF 文件结构吗?我应该在哪里查找“PDF 文档编码向量”?然后,我如何确保那里是否包含某些内容?
我在 Windows7 32 位操作系统上同时使用 MikTeX 2.3 和 MikTeX 2.9。结果相同。T1 编码在这里已经使用了 15 年以上,但有趣的是,直到上周一位同事才首次报告了这个问题。
一般文件大纲:
\pdfoutput=1
\documentclass[german]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{times}
\begin{document}
\pdfdest num 1 fit%
\pdfoutline goto num 1 count 0 {1 äöüÄÖÜß}
1 äöüÄÖÜß - etc. etc.
\eject
filler
\eject
\pdfdest num 2 fit%
\pdfoutline goto num 2 count 0 {2 äöüÄÖÜ{\ss}} % same result
2 äöüÄÖÜß - etc. etc.
\eject
filler
\end{document}
答案1
PDF 书签可以用 PDFDocEncoding 进行编码(参见PDF 规范) 或使用字节顺序标记 (BOM) 编码 UTF-16BE。
包hyperref
(/ bookmark
) 处理编码问题并支持书签标题内的许多 LaTeX 命令。
如果您想重新发明轮子,那么包stringenc
可以提供帮助。并且应该对某些字符进行转义以获得有效的 PDF 字符串。
以下示例提供了一个宏\OutlineTitleToPDFString
,该宏采用带有包的当前输入编码的纯文本字符串。首先,它尝试将字符串转换为 PDFDocEncoding。如果有不适合的字符,则使用 UTF16-BE。顺便说一句,这基本上是选项inputenc
使用的算法。结果存储在宏中。hyperref
pdfencoding=auto
\OutlineTitleResult
\documentclass[ngerman]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{times}
\usepackage{stringenc}
\newcommand*{\OutlineTitleToPDFString}[1]{%
\StringEncodingConvertTest{% try PDFDocEncoding first
\OutlineTitleString % macro that stores the result
}{%
\detokenize{#1}% bookmark title in #1, plainly given (not inside macro)
}{%
\inputencodingname % encode from
}{%
pdfdoc% encode to
}{% success
}{% does not fit in PDFDocEncoding, try Unicode
\StringEncodingConvert{%
\OutlineTitleString % macro that stores the result
}{%
\detokenize{#1}% bookmark title
}{%
\inputencodingname % encode from
}{%
utf16be% UTF-16BE
}{%
\edef\OutlineTitleString{\OutlineBOM\OutlineTitleString}%
}{%
\errmessage{Converting bookmark title failed!}%
}%
}%
\xdef\OutlineTitleResult{%
% escape characters to get valid PDF string
\pdfescapestring{\OutlineTitleString}%
}%
}
\begingroup
\catcode255=12 %
\catcode254=12 %
\xdef\OutlineBOM{^^fe^^ff}%
\endgroup
\begin{document}
\pdfdest num 1 fit%
\OutlineTitleToPDFString{1 äöüÄÖÜß}%
\pdfoutline goto num 1 count 0 {\OutlineTitleResult}%
1 äöüÄÖÜß - etc. etc.
\end{document}
PDF 书签根本不支持 TeX 标记。它可以在一定程度上得到支持,请查看hyperref
(\pdfstringdef
约 6000 行代码,包括pd1enc.def
、puenc.def
、psdextra.def
)。
问题答案
您很幸运,中的字符
äöüÄÖÜ
完全可以使用。第一个包inputenc
将它们映射到 LICR(LaTeX 内部字符表示),在本例中为:\"a
,\"o
,...T1
然后,它们通过包的编码映射fontenc
到字符,这些字符的插槽与 PDFDocEncoding 中的插槽意外匹配。正如您所看到的ß
,这不适用于任何字符。PDFDocEncoding 既不是 Latin1 也不是 T1。当然,如果您想在低层次上实现所有内容,您需要详细检查 PDF 文件结构。
PDFDocEncoding 记录在PDF 规范, “附件 D:字符集和编码”。
书签只能以 PDFDocEncoding 或 Unicode 编码为带 BOM 的 UTF-16BE。LaTeX 字体编码无关紧要。