\pdfstringdefDisableCommands com comandos com e sem estrela

\pdfstringdefDisableCommands com comandos com e sem estrela

O seguinte 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}

compila perfeitamente, exceto se \section{\foo{bar}}não estiver comentado, sendo a mensagem de erro nesse caso:

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

Existe uma maneira de usar \pdfstringdefDisableCommandscomandos com e sem estrela?

Responder1

Você deve redefinir o comando usando a mesma assinatura do comando original. Como s mé uma assinatura válida para um comando expansível, você pode simplesmente redefinir 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}

Observe que no seu exemplo, o comando \foocontém apenas macros expansíveis, portanto, pode funcionar em um contexto somente de expansão; portanto, se você defini-lo usando \NewExpandableDocumentCommanddiretamente, não precisa redefinir for 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}

informação relacionada