![Cómo utilizar \newrobustcmd y \NewDocumentCommand con hyperref en los títulos de las secciones](https://rvso.com/image/353010/C%C3%B3mo%20utilizar%20%5Cnewrobustcmd%20y%20%5CNewDocumentCommand%20con%20hyperref%20en%20los%20t%C3%ADtulos%20de%20las%20secciones.png)
¿Cómo se puede \newrobustcmd
utilizar NewDocumentCommand
en títulos de sección con hyperref
habilitado? El MWE a continuación muestra que, si bien el PDF renderizado parece correcto, los marcadores no muestran el contenido de la macro.
\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}
El MWE.out
archivo tiene el siguiente aspecto.
\BOOKMARK [1][-]{section.1}{Hello world}{}% 1
\BOOKMARK [1][-]{section.2}{Hello }{}% 2
\BOOKMARK [1][-]{section.3}{Hello }{}% 3
Respuesta1
Con \newcommand
define una macro expandible ( \def
) mientras que con \newrobustcmd
y \NewDocumentCommand
define una macro protegida por motor ( \protected\def
). El contenido de los marcadores se expande mientras se crean las cadenas de marcadores, pero las macros protegidas no se pueden expandir, por lo que los tokens \testB
y \testC
en su MWE terminan como están en los marcadores. hyperref
no sabe qué hacer con ellos por lo que los descarta.
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.
Entonces, si realmente necesitas macros protegidas, tienes dos opciones:
- utilizar
\section{Hello \texorpdfstring{\testB}{world}}
en el documento o agregue definiciones expandibles más simples en el preámbulo después de la carga
hyperref
que se usarán en los marcadores\pdfstringdefDisableCommands{% \def\testB{world}% \def\testC{world}% }