\pdfstringdefDisableCommands con comandos destacados y no destacados

\pdfstringdefDisableCommands con comandos destacados y no destacados

El siguiente MCE:

\documentclass{article}
\usepackage{hyperref}
\ExplSyntaxOn
\NewDocumentCommand { \foo } { s m } {
  \IfBooleanTF {#1}{
    Foo~ #2
  }{
    #2
  }
}
\pdfstringdefDisableCommands{
  \def\foo*#1{Foo~ #1}
  % \def\foo#1{#1}
}
\ExplSyntaxOff
\begin{document}
\section{\foo*{bar}}
% \section{\foo{bar}}
\end{document}

se compila a las mil maravillas, excepto si \section{\foo{bar}}no está comentado, siendo el mensaje de error en tal caso:

! Use of \foo doesn't match its definition.
<argument> ...rline {\csname thesection\endcsname }\fi \foo {
                                                  bar}

¿Existe alguna forma de utilizarlo \pdfstringdefDisableCommandscon comandos destacados y no destacados?

Respuesta1

Tienes que redefinir el comando usando la misma firma que el comando original. Dado que s mes una firma válida para un comando expandible, puede redefinirla usando \RenewExpandableDocumentCommand:

\documentclass{article}
\usepackage{hyperref}
\ExplSyntaxOn
\NewDocumentCommand { \foo } { s m } {
  \IfBooleanTF {#1}{
    Foo~ #2
  }{
    #2
  }
}
\pdfstringdefDisableCommands{
  \RenewExpandableDocumentCommand \foo { s m }
    { Foo~ #2 }
}
\ExplSyntaxOff
\begin{document}
\section{\foo*{bar}}
\section{\foo{bar}}
\end{document}

Tenga en cuenta que en su ejemplo, el comando \foocontiene solo macros expandibles, por lo que puede funcionar en un contexto de solo expansión, por lo que si lo define usando \NewExpandableDocumentCommanddirectamente, no necesita redefinirlo para hyperref:

\documentclass{article}
\usepackage{hyperref}
\ExplSyntaxOn
\NewExpandableDocumentCommand { \foo } { s m } {
  \IfBooleanTF {#1}{
    Foo~ #2
  }{
    #2
  }
}
\ExplSyntaxOff
\begin{document}
\section{\foo*{bar}}
\section{\foo{bar}}
\end{document}

información relacionada