我不确定内部标题的顺序是否重要,或者s/ s\texorpdfstring
的某些部分是否会干扰我的 MWE:newcommand
NewDocumentCommand
% !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}