Как можно использовать \newrobustcmd
и в заголовках разделов с включенным? MWE ниже показывает, что, хотя отрисованный PDF выглядит правильно, закладки не отображают содержимое макроса.NewDocumentCommand
hyperref
\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}
Файл MWE.out
выглядит следующим образом.
\BOOKMARK [1][-]{section.1}{Hello world}{}% 1
\BOOKMARK [1][-]{section.2}{Hello }{}% 2
\BOOKMARK [1][-]{section.3}{Hello }{}% 3
решение1
С помощью \newcommand
вы определяете расширяемый макрос ( \def
), а с помощью \newrobustcmd
и \NewDocumentCommand
вы определяете защищенный движком макрос ( \protected\def
). Содержимое закладок расширяется, пока создаются строки закладок, но защищенные макросы не могут расширяться, поэтому токены \testB
и \testC
в вашем MWE оказываются такими же, как в закладках. hyperref
не знает, что с ними делать, поэтому отбрасывает их.
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.
Так что если вам действительно нужны защищенные макросы, у вас есть два варианта:
- использовать
\section{Hello \texorpdfstring{\testB}{world}}
в документе или добавить более простые расширяемые определения в преамбуле после загрузки
hyperref
, которые будут использоваться в закладках\pdfstringdefDisableCommands{% \def\testB{world}% \def\testC{world}% }