So verwenden Sie \newrobustcmd und \NewDocumentCommand mit Hyperref in Abschnittstiteln

So verwenden Sie \newrobustcmd und \NewDocumentCommand mit Hyperref in Abschnittstiteln

Wie können \newrobustcmdund NewDocumentCommandwerden sie in Abschnittstiteln mit hyperrefaktiviertem 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}

resultierendes PDF

Die MWE.outDatei 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 \newcommanddefinieren Sie ein erweiterbares Makro ( \def), während Sie mit \newrobustcmdund \NewDocumentCommandein 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 \testBund \testCin Ihrem MWE so enden, wie sie in den Lesezeichen sind. hyperrefweiß 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{wor‌​ld}%
    }
    

verwandte Informationen