\pdfstringdefDisableCommands с отмеченными и не отмеченными звездочкой командами

\pdfstringdefDisableCommands с отмеченными и не отмеченными звездочкой командами

Следующий 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}

Связанный контент