标题中 texorpdfstring 的顺序

标题中 texorpdfstring 的顺序

我不确定内部标题的顺序是否重要,或者s/ s\texorpdfstring的某些部分是否会干扰我的 MWE:newcommandNewDocumentCommand

% !TeX program = lualatex
\documentclass{scrreprt}

\usepackage{lipsum}
\usepackage{xparse}

\usepackage[hidelinks,%
colorlinks=false, %
linktoc=all,%
plainpages=false,%
pdfpagelabels=true%
]{hyperref}

\usepackage[acronym]{glossaries-extra}

\setabbreviationstyle[acronym]{long-short} % Stil des Abkürzungen im Text

\newacronym{ac:test}{TEST}{Only an acronym for testing purposes}

\NewDocumentCommand{\GT}{m m}{
    \S\,#1~#2%
}

\NewDocumentCommand{\TESTGLS}{s m}{%TEST
    \IfBooleanTF{#1}{%
        \GT{#2}{%
            \texorpdfstring{\glsfmtshort{ac:test}}{TEST}%
        }%
    }{%
        \GT{#2}{%
            \glsxtrshort{ac:test}%
        }%
    }%
}

\newcommand{\TEST}[1]{
    \texorpdfstring{\S~#1~\glsfmtshort{ac:test}}{\S~#1~TEST}}

\begin{document}
    
\chapter{Different Tests}

\gls{ac:test}: \lipsum[1]

\section{\texorpdfstring{\S~1~\glsfmtshort{ac:test}}{\S~1~TEST}}

\gls{ac:test}: \lipsum[2]

\section{\TEST{2}}

\gls{ac:test}: \lipsum[3]

\section{\TESTGLS{3}}

\gls{ac:test}: \lipsum[4]

\section{\TESTGLS*{4}}

\gls{ac:test}: \lipsum[5]

\end{document}

在前两个部分标题中一切都很好,但在最后两个部分(包含我自己的命令)中,我在两种情况下都收到了警告Token not allowed in a PDF string (Unicode):(hyperref) removing '\TESTGLS'。不幸的是,查看日志文件并没有为我提供任何进一步的信息。

答案1

用 定义的命令\NewDocumentCommand是受保护的,在 内不会更改\xdef。在写入书签时,hyperref 会将其丢弃或使用 存储的定义进行处理\pdfstringdefDisableCommands,但它不会查找里面这样的定义等等\texorpdfstring都是没用的。

如果你希望它产生一些效果,外部定义必须是可扩展的:

\documentclass{article}
\usepackage{hyperref}

\NewExpandableDocumentCommand\TEST{sm}
 {\texorpdfstring
   {\IfBooleanTF{#1}{\TESTtext*{#2}}{\TESTtext{#2}}}
   {\TESTbookmarks{#2}}}

\NewDocumentCommand\TESTtext{sm}
 {something complicated \IfBooleanT{#1}{with star and }#2}

\newcommand\TESTbookmarks[1]{simple #1} 

\begin{document}
\section{a heading with \TEST*{text}}

\end{document}

相关内容