
Следующий 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}
компилируется отлично, за исключением случая, когда \section{\foo{bar}}
не прокомментирован; в этом случае сообщение об ошибке будет следующим:
! Use of \foo doesn't match its definition.
<argument> ...rline {\csname thesection\endcsname }\fi \foo {
bar}
Есть ли способ использовать \pdfstringdefDisableCommands
как отмеченные, так и не отмеченные звездочкой команды?
решение1
Вам нужно переопределить команду, используя ту же сигнатуру, что и у исходной команды. Поскольку s m
это допустимая сигнатура для расширяемой команды, вы можете просто переопределить ее, используя \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}
Обратите внимание, что в вашем примере команда \foo
содержит только расширяемые макросы, поэтому она может работать в контексте только расширения, поэтому, если вы определяете ее \NewExpandableDocumentCommand
напрямую, вам не нужно переопределять 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}