我使用一个可扩展宏来更改存储在另一个宏中的文本的大小写。结果用于文档的多个部分和 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}