![Como usar \newrobustcmd e \NewDocumentCommand com hyperref nos títulos das seções](https://rvso.com/image/353010/Como%20usar%20%5Cnewrobustcmd%20e%20%5CNewDocumentCommand%20com%20hyperref%20nos%20t%C3%ADtulos%20das%20se%C3%A7%C3%B5es.png)
Como pode \newrobustcmd
e NewDocumentCommand
ser usado em títulos de seção hyperref
habilitados? O MWE abaixo mostra que, embora o PDF renderizado pareça correto, os marcadores não mostram o conteúdo da 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}
O MWE.out
arquivo tem a seguinte aparência.
\BOOKMARK [1][-]{section.1}{Hello world}{}% 1
\BOOKMARK [1][-]{section.2}{Hello }{}% 2
\BOOKMARK [1][-]{section.3}{Hello }{}% 3
Responder1
Com \newcommand
você define uma macro expansível ( \def
) enquanto com \newrobustcmd
e \NewDocumentCommand
você define uma macro protegida pelo mecanismo ( \protected\def
). O conteúdo dos marcadores é expandido enquanto as strings de marcadores estão sendo construídas, mas as macros protegidas não podem ser expandidas, então os tokens \testB
e \testC
no seu MWE acabam como estão nos marcadores. hyperref
não sabe o que fazer com eles, então os 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.
Portanto, se você realmente precisa de macros protegidas, você tem duas opções:
- usar
\section{Hello \texorpdfstring{\testB}{world}}
no documento ou adicione definições expansíveis mais simples no preâmbulo após o carregamento,
hyperref
que serão usadas nos marcadores\pdfstringdefDisableCommands{% \def\testB{world}% \def\testC{world}% }