我有以下不起作用的代码,我试图用设置键然后回调原始标准命令\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
命令,它就会起作用。所以,这两者之间存在一些奇怪的交互pgfkeys
,xparse
并且如何\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
。