hyperref:章节标题中的特殊字符,从 expl3 属性列表中检索

hyperref:章节标题中的特殊字符,从 expl3 属性列表中检索

我在使“&”符号显示在结构如下的 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\unexpandedhyperref

\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}

相关内容