
Der folgende 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}
wird wie am Schnürchen kompiliert, außer wenn es \section{\foo{bar}}
unkommentiert ist. In diesem Fall lautet die Fehlermeldung:
! Use of \foo doesn't match its definition.
<argument> ...rline {\csname thesection\endcsname }\fi \foo {
bar}
Gibt es eine Möglichkeit, \pdfstringdefDisableCommands
sowohl mit Sternchen markierte als auch nicht mit Sternchen markierte Befehle zu verwenden?
Antwort1
Sie müssen den Befehl mit derselben Signatur wie den ursprünglichen Befehl neu definieren. Da es s m
sich um eine gültige Signatur für einen erweiterbaren Befehl handelt, können Sie ihn einfach mit folgendem neu definieren \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}
Beachten Sie, dass der Befehl in Ihrem Beispiel \foo
nur erweiterbare Makros enthält und daher in einem Nur-Erweiterungskontext funktionieren kann. Wenn Sie ihn also \NewExpandableDocumentCommand
direkt mithilfe von definieren, müssen Sie for nicht neu definieren 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}