我需要 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
请注意,如果您加载该包以及可能用于修改引用命令的其他包,所有这些都会出错。