UTF-8 字符的大小写更改会破坏 PDF 元数据中的字符

UTF-8 字符的大小写更改会破坏 PDF 元数据中的字符

我使用一个可扩展宏来更改存储在另一个宏中的文本的大小写。结果用于文档的多个部分和 PDF 元数据中。在这里我遇到了一个有趣的问题——在文档正文中,原始字符和更改后的字符(包括 UTF-8)都正确呈现,而在 PDF 元数据中,只有非 UTF-8 处理的字符才会按预期呈现(而未处理的 UTF-8 字符则正确显示)。

梅威瑟:

\documentclass{article}

\usepackage[unicode]{hyperref}

\usepackage{expl3}
\ExplSyntaxOn
\cs_set_eq:NN \MakeExpandableLowercase \text_lowercase:n
\ExplSyntaxOff

\hypersetup{%
    pdftitle={AbcÆæ}, % Works.
    pdfauthor={\MakeExpandableLowercase{AbcÆæ}}, % Does not work!
}

\begin{document}

\noindent AbcÆæ.\\ % Works.
\MakeExpandableLowercase{AbcÆæ}. % Also works.

\end{document}

结果如下(使用Adobe Reader DC查看PDF元数据):

  • AbcÆæ在文档中文本呈现为“AbcÆæ”,
  • AbcÆæ在 PDF 元数据中呈现为“AbcÆæ”,
  • \MakeExpandableLowercase{AbcÆæ}在文档中文本呈现为“abcææ”,
  • \MakeExpandableLowercase{AbcÆæ}在 PDF 中元数据呈现为“abcææ”(应为“abcææ”)。

是否可以修复最后一点,即能够以可扩展的方式更改 UTF-8 文本的大小写并在 PDF 元数据中使用结果?

答案1

原因是虽然\text_lower:n是可扩展的,但它返回的结果被包装在 中\unexpanded。这意味着æ不会扩展为 LICR 命令,而是保留æ在文本中。需要第二步edef。您可以通过手动执行两个步骤\edef然后查看结果来看到这一点:

% first edef:
\edef\testI   {\MakeExpandableLowercase{AbcÆæ}}
\show\testI   % gives abcææ.
% second edef:
\edef\testII  {\testI}
\show\testII  % gives abc\OT1\ae \OT1\ae
% for comparision:
\edef\testIII {AbcÆæ}
\show\testIII % abc\OT1\ae \OT1\ae 

hyperref 仅处理一步展开的内容。使用以下命令可获得类似的输出

     pdfauthor={\unexpanded{æ}}

解决这个问题的一种方法是将两个扩展两次,例如\expanded

\documentclass{article}

\usepackage[unicode]{hyperref}

\usepackage{expl3}
\ExplSyntaxOn
\cs_set_eq:NN \MakeExpandableLowercase \text_lowercase:n
\cs_new:Npn \MakeTwiceExpandableLowercase #1 { \expanded {\text_lowercase:n {#1}}}
\ExplSyntaxOff

\hypersetup{%
    pdftitle={AbcÆæ}, % Works.
    pdfauthor={\MakeTwiceExpandableLowercase{AbcÆæ}}, %
}

\begin{document}

\noindent AbcÆæ.\\ % Works.
\MakeExpandableLowercase{AbcÆæ}. % Also works.

\end{document}

相关内容