![So verwenden Sie \newrobustcmd und \NewDocumentCommand mit Hyperref in Abschnittstiteln](https://rvso.com/image/353010/So%20verwenden%20Sie%20%5Cnewrobustcmd%20und%20%5CNewDocumentCommand%20mit%20Hyperref%20in%20Abschnittstiteln.png)
Wie können \newrobustcmd
und NewDocumentCommand
werden sie in Abschnittstiteln mit hyperref
aktiviertem verwendet? Das folgende MWE zeigt, dass das gerenderte PDF zwar korrekt aussieht, die Lesezeichen jedoch den Makroinhalt nicht anzeigen.
\documentclass[11pt]{article}
\usepackage{hyperref}
\usepackage{xparse}
\usepackage{etoolbox}
\newcommand{\testA}[0]{world}
\newrobustcmd{\testB}[0]{world}
\NewDocumentCommand{\testC}{}{world}
\begin{document}
\section{Hello \testA}
\section{Hello \testB}
\section{Hello \testC}
\end{document}
Die MWE.out
Datei sieht wie folgt aus.
\BOOKMARK [1][-]{section.1}{Hello world}{}% 1
\BOOKMARK [1][-]{section.2}{Hello }{}% 2
\BOOKMARK [1][-]{section.3}{Hello }{}% 3
Antwort1
Mit \newcommand
definieren Sie ein erweiterbares Makro ( \def
), während Sie mit \newrobustcmd
und \NewDocumentCommand
ein Engine-geschütztes Makro ( \protected\def
) definieren. Der Inhalt von Lesezeichen wird erweitert, während die Lesezeichenzeichenfolgen erstellt werden, aber geschützte Makros können nicht erweitert werden, sodass die Token \testB
und \testC
in Ihrem MWE so enden, wie sie in den Lesezeichen sind. hyperref
weiß nicht, was es damit tun soll, also verwirft es sie.
Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref) removing `\testB' on input line 13.
Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref) removing `\testC' on input line 14.
Wenn Sie also wirklich geschützte Makros benötigen, haben Sie zwei Möglichkeiten:
- Verwendung
\section{Hello \texorpdfstring{\testB}{world}}
im Dokument oder Füge nach dem Laden einfachere erweiterbare Definitionen in der Präambel hinzu
hyperref
, die in den Lesezeichen verwendet werden\pdfstringdefDisableCommands{% \def\testB{world}% \def\testC{world}% }