低级,手动

低级,手动

在编译 LaTeX 文档时,有几种设置 PDF 元数据的方法。最流行的两种方法可以说是通过pdfinfo

\pdfinfo{
   /Author (Erwin Schrödinger)
}

hyperref

\usepackage[pdftex,
  pdfauthor={Erwin Schrödinger},
]{hyperref}

然而,使用这两种方法,上面的例子都会产生莫吉巴克在 PDF 输出中:

证据截图

$ pdfinfo main.pdf
Title:          
Subject:        
Keywords:       
Author:         Erwin Schrödinger
[...]

添加\usepackage[utf8]{inputenc}没有什么区别。

如何解决这个问题?

答案1

包裹hyperref

hyperref编码正确,但应设置选项 hyperref已加载。否则 LaTeX 会以困难的方式扩展选项,并且hyperref只会看到扩展的垃圾。

\usepackage{hyperref}
\hypersetup{
  pdfauthor={Erwin Schrödinger},
}

扩展示例:

\documentclass{article}
\usepackage[utf8]{inputenc}% utf8, for example
\usepackage[
  pdfencoding=auto,% or unicode
  psdextra,
]{hyperref}
\hypersetup{
  pdfauthor={Erwin Schrödinger},
}
\begin{document}
  \null
\end{document}

PDF 文件中的元数据字符串采用 PDFDocEncoding 或 UTF-16BE 编码,并带有 BOM。以下hyperref选项可启用元数据和书签的 Unicode 全部功能:

\usepackage[
  pdfencoding=auto,% or unicode
  psdextra,
]{hyperref}

pdfencoding=auto比 更灵活unicode。如果字符串符合 PDFDocEncoding(8 位编码),则使用此编码,否则使用 Unicode。

低级,手动

使用和不使用 pdfTeX 指定元数据的低级版本hyperref如下所示:

\pdfinfo{/Author(Erwin Schr\string\366dinger)}

Unicode 变体:

\begingroup
  \escapechar=`\\
  \edef\.{\string\000}%
  \pdfinfo{/Author(\string\376\string\377% BOM
    \.E\.r\.w\.i\.n\. \.S\.c\.h\.r\.\string\366\.d\.i\.n\.g\.e\.r)}%
\endgroup

或十六进制字符串:\pdfinfo{/Author}

PDF 规范说明了可以使用哪种编码,PDFDocEncoding 在附件 D“字符集和编码”中列出为完整表格。

低级,但具有自动编码转换功能

如果您想从 UTF-8(或其他输入编码)转换,那么包stringenc可以帮助(LaTeX 和纯 TeX 格式):纯 TeX 示例:

% UTF-8 encoded source file
\input stringenc.sty\relax

\def\MyAuthor{Erwin Schrödinger}
\edef\BOM{\string\376\string\377}
\StringEncodingConvert{\PdfAuthor}{\MyAuthor}{utf8}{utf16be}
\StringEncodingSuccessFailure{}{%
  \errmessage{Conversion from utf8 to utf16be failed for author string}%
}
\pdfinfo{/Author(\BOM\pdfescapestring{\PdfAuthor})}%
\null
\bye

一个更详细的例子,重新实现pdfencoding=auto

% UTF-8 encoded source file
\input stringenc.sty\relax

\def\GeneratePdfString#1#2{%
  \StringEncodingConvertTest{#1}{#2}{utf8}{pdfdoc}{%
    % Success: \PdfAuthor with PDFDocEncoding
    % Make full PDF string inclusive brackets
    \edef#1{(\pdfescapestring{#1})}%
  }{%
    \StringEncodingConvert{#1}{#2}{utf8}{utf16be}%
    \StringEncodingSuccessFailure{%
      % Success: \PdfAuthor with UTF-16BE
    }{%
      \errmessage{Conversion from utf8 to utf16be failed for author string}%
    }%
    % Make full PDF string with BOM for case UTF-16BE
    \edef#1{(\BOM\pdfescapestring{#1})}%
  }%
}
\edef\BOM{\string\376\string\377}%

% Usage
\def\MyAuthor{Erwin Schrödinger}
\GeneratePdfString\PdfAuthor{\MyAuthor}
\GeneratePdfString\PdfTitle{Unicode string example ☺}

\pdfinfo{%
  /Author\PdfAuthor
  /Title\PdfTitle
}%
\null
\bye

输入不需要以 UTF-8 编码,包stringenc支持更多编码。

相关内容