我在使“&”符号显示在结构如下的 PDF 文档目录中时遇到了麻烦:
\documentclass{article}
\usepackage{hyperref}
\ExplSyntaxOn
\prop_const_from_keyval:Nn \c_mwe_test_prop {
A = { Simple~and~Problem~Free },
B = { Complex~\&~Bugged },
}
\NewExpandableDocumentCommand{\gettest}{m}{\prop_item:Nn \c_mwe_test_prop {#1}}
\ExplSyntaxOff
\NewExpandableDocumentCommand{\ampersand}{}{\&}
\begin{document}
\section{Experiment \& Test}
Works fine.
\section{Experiment \ampersand{} Test}
Works fine.
\section{\gettest{A}}
Works fine, too.
\section{\gettest{B}}
Works fine in the document, but not in PDF bookmarks.
\end{document}
文档有四个部分。前两个部分只是演示了hyperref
通常可以很好地处理\&
a 中的a \section
,即使它隐藏在宏后面。第三和第四个部分显示了从expl3
属性列表中检索的部分标题。这两个部分在文档本身中都可以正常工作,但 PDF 书签中的 & 符号丢失了:
Token not allowed in a PDF string (Unicode):
(hyperref) removing `\&'.
感觉这里的扩展顺序有点问题。值得注意的是,尝试替换属性列表赋值中的\&
with会产生以下警告:\texorpdfstring{\&}{and}
Token not allowed in a PDF string (Unicode):
(hyperref) removing `\texorpdfstring'.
我怎样才能hyperref
正确地写出“&”符号(同时仍然从属性列表中获取章节标题)?
答案1
问题与这里:\prop_item:Nn
返回包装中的项目\unexpanded
(因此可以安全地使用,例如,\tl_set:Nx \l_tmpa_tl { \prop_item:Nn \l_tmpa_prop { my-item } }
不会爆炸),但hyperref
依赖于重新定义\&
以在该上下文中扩展为 PDF 字符串(并且\unexpanded
不允许这样做)。
您可以在宏中添加\use:e
( ),以便它删除之前有机会看到它的内容:\expanded
\unexpanded
hyperref
\documentclass{article}
\usepackage{hyperref}
\ExplSyntaxOn
\prop_const_from_keyval:Nn \c_mwe_test_prop {
A = { Simple~and~Problem~Free },
B = { Complex~\&~Bugged },
}
\NewExpandableDocumentCommand{\gettest}{m}
{ \use:e { \prop_item:Nn \c_mwe_test_prop {#1} } }
\ExplSyntaxOff
\NewExpandableDocumentCommand{\ampersand}{}{\&}
\begin{document}
\section{Experiment \& Test}
Works fine.
\section{Experiment \ampersand{} Test}
Works fine.
\section{\gettest{A}}
Works fine, too.
\section{\gettest{B}}
Works fine in the document, but not in PDF bookmarks.
\end{document}