
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 \pdfstringdefDisableCommands
comandos 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 \foo
contém apenas macros expansíveis, portanto, pode funcionar em um contexto somente de expansão; portanto, se você defini-lo usando \NewExpandableDocumentCommand
diretamente, 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}