以下 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}