\pdfoutline,德语尖锐 s 字符

\pdfoutline,德语尖锐 s 字符

我使用以下代码在 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使用的算法。结果存储在宏中。hyperrefpdfencoding=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.defpuenc.defpsdextra.def)。

问题答案

  • 您很幸运,中的字符äöüÄÖÜ完全可以使用。第一个包inputenc将它们映射到 LICR(LaTeX 内部字符表示),在本例中为:\"a\"o,...

    T1然后,它们通过包的编码映射fontenc到字符,这些字符的插槽与 PDFDocEncoding 中的插槽意外匹配。正如您所看到的ß,这不适用于任何字符。PDFDocEncoding 既不是 Latin1 也不是 T1。

  • 当然,如果您想在低层次上实现所有内容,您需要详细检查 PDF 文件结构。

  • PDFDocEncoding 记录在PDF 规范, “附件 D:字符集和编码”。

  • 书签只能以 PDFDocEncoding 或 Unicode 编码为带 BOM 的 UTF-16BE。LaTeX 字体编码无关紧要。

相关内容