无法在 xparse 和 pgfkeys 的水平模式下使用“宏参数字符 #”错误

无法在 xparse 和 pgfkeys 的水平模式下使用“宏参数字符 #”错误

我有以下不起作用的代码,我试图用设置键然后回调原始标准命令\title的命令替换标准命令。pgf

\documentclass{article}

\usepackage{pgfkeys}
\usepackage{xparse}

\makeatletter
\pgfkeys{
  /mykeys/title/.append code = {\@oldtitle{#1}}
}
\let\@oldtitle\title
\makeatother

\RenewDocumentCommand\title{m}{\pgfkeys{/mykeys/title = {#1}}}

%\renewcommand\title[1]{\pgfkeys{/mykeys/title = {#1}}} % This works


\title{Hello}

\begin{document}
  Not working
\end{document}

我收到一个错误,没有任何其他信息:

! LaTeX Error: Missing \begin{document}.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...                                              
                                                  
l.18 \title{Hello}

如果我注释该\RenewDocumentCommand行并将其替换为注释的行,它就会起作用。如果我保留该\title命令,它就会起作用。所以,这两者之间存在一些奇怪的交互pgfkeysxparse并且如何\title定义?

这是怎么回事?我的理想目标是让它与这条xparse线一起工作,因为我xparse在代码中的其他地方都使用它。

答案1

\title是一个强大的宏,因此使用\let复制它将不起作用。具体来说,使用xparse它会中断,因为宏\title␣在 xparse 内部重新定义,并且当您使用时它会失败\@oldtitle(有一个解释这里)。

使用\NewCommandCopy而不是\let

\documentclass{article}

\usepackage{pgfkeys}
\usepackage{xparse}

\makeatletter
\pgfkeys{
  /mykeys/title/.append code = {\@oldtitle{#1}}
}
\NewCommandCopy\@oldtitle\title
\makeatother

\RenewDocumentCommand\title{m}{\pgfkeys{/mykeys/title = {#1}}}

% \renewcommand\title[1]{\pgfkeys{/mykeys/title = {#1}}} % This works

\title{Hello}

\begin{document}
  Not working
\end{document}

\NewCommandCopy从 LaTeX 2020-10-01 开始可用。在旧版本中,你可以使用\LetLtxMacro(来自letltxmacro软件包):

\documentclass{article}

\usepackage{pgfkeys}
\usepackage{xparse}
\usepackage{letltxmacro}

\makeatletter
\pgfkeys{
  /mykeys/title/.append code = {\@oldtitle{#1}}
}
\LetLtxMacro\@oldtitle\title
\makeatother

\RenewDocumentCommand\title{m}{\pgfkeys{/mykeys/title = {#1}}}

% \renewcommand\title[1]{\pgfkeys{/mykeys/title = {#1}}} % This works

\title{Hello}

\begin{document}
  Not working
\end{document}

\LetLtxMacro当然,您也可以在较新的版本中使用,但\NewCommandCopy涵盖了比更多的强大命令\LetLtxMacro

相关内容