在编译 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
支持更多编码。