\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直接使用它来定义,则无需重新定义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}

相关内容