renewcommand 引用一个或两个参数

renewcommand 引用一个或两个参数

我需要 renewcommand \cite。我使用了以下命令:

\let\citeOld\cite
\renewcommand{\cite}[1]{{\mbox{\citeOld{#1}}}}

并且对于 这样的引用可以正常工作\cite{Taylor}。问题是,如果我有 这样的引用,\cite[eq. (1)]{Taylor}我会收到错误。如果我使用:

\let\citeOld\cite
\renewcommand{\cite}[2][]{\mbox{\citeOld[#1]{#2}}}

我没有遇到错误,但是[13, ]在使用时输出类似内容\cite{Taylor},带有不需要的,

是否有可能重新引用命令,使其适用于这两种情况?

答案1

问题在于它\cite有一个特殊的定义;它是一个“健壮”的命令,但这只是次要的方面。在前两个步骤中没有检查任何参数之后,它的定义是

\@ifnextchar[{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}

这就是主要问题;您不能简单地这样做\let\citeOld\cite,而需要修改的行为\@citex,即负责吸收参数的宏。

简单的方法

\makeatletter
\let\@citexOld\@citex
\def\@citex[#1]#2{\mbox{\@citexOld[#1]{#2}}}
\makeatother

xparse

\usepackage{letltxmacro,xparse}
\LetLtxMacro\citeOld\cite
\RenewDocumentCommand{\cite}{om}
 {\IfNoValueTF{#1}{\mbox{\citeOld{#2}}}{\mbox{\citeOld[#1]{#2}}}

regexpatch

\usepackage{regexpatch}
\makeatletter
\regexpatchcmd{\@citex}
  { \A \c{leavevmode} (.*) }
  { \c{mbox} \cB\{ \1 \cE\} }
  {}{}
\makeatother

这会改变with\leavevmode的替换文本中的首字母,并在末尾添加匹配项。\@citex\mbox{}

natbib请注意,如果您加载该包以及可能用于修改引用命令的其他包,所有这些都会出错。

相关内容