如果我重新定义 \citep,则 \citep[prefix][postfix]{citation} 不起作用

如果我重新定义 \citep,则 \citep[prefix][postfix]{citation} 不起作用

我已经改进了 \citep,以便超链接的颜色变成“青色”:

\let\oldcitep=\citep 
\def\citep#1{\hypersetup{citecolor=Teal}\oldcitep{#1}} %changes colour of citep link to Teal.

注意:我这样做是因为我想让 \citep 与 \citet 颜色不同。

总体而言,该系统运行良好:

\citep{Author2000}

变成:

(作者,2000 年)

正如预期的那样,颜色变成了青色。


但是如果我尝试使用前缀,它不起作用:

\citep[see:][]{Author2000}

变成

)参见:][]作者2000

所有文字保持黑色。

为什么会发生这种情况?有人能帮我解决这个问题吗?

干杯。

答案1

如果您想简化重新定义语法,也可以使用xpatch包,它负责处理较低级别的实现细节。包定义了(除其他外)一个命令\xpretocmd,它有四个参数:您要更改的命令(此处:)\citep、您要放在前面的代码(此处:)\hypersetup{citecolor=Teal}、重新定义成功时需要执行的代码(此处:无)以及重新定义失败时需要执行的代码(此处:同样无)。

请注意,与其他答案不同,颜色变化是全局的,因此它也会影响\citet。 解决此问题的一个简单方法是重新定义\citet

梅威瑟:

\documentclass{article}
\usepackage{natbib}
\usepackage[svgnames]{xcolor}
\usepackage[colorlinks]{hyperref}
\usepackage{xpatch}
\xpretocmd{\citep}{\hypersetup{citecolor=Teal}}{}{}
\xpretocmd{\citet}{\hypersetup{citecolor=Magenta}}{}{}
\begin{document}
Some text \citet{regular} and in parentheses \citep{regular}

and with prefix, \citep[see:][]{regular}
\bibliographystyle{apalike}
\bibliography{sample}
\end{document}

结果: 在此处输入图片描述

答案2

您可以使用#{参数抓取所有内容,直到第一个{,然后将其传递给\oldcitep。您还需要一组额外的括号来仅包含对该引用的颜色更改:

\let\oldcitep=\citep
\def\citep#1#{\INNERcitep{#1}}
\def\INNERcitep#1#2{{\hypersetup{citecolor=Teal}\oldcitep#1{#2}}}

在此处输入图片描述

梅威瑟:

\documentclass{article}
\usepackage{natbib}
\usepackage[svgnames]{xcolor}
\usepackage[colorlinks]{hyperref}

\let\oldcitep=\citep
\def\citep#1#{\INNERcitep{#1}}
\def\INNERcitep#1#2{{\hypersetup{citecolor=Teal}\oldcitep#1{#2}}}

\begin{document}

\citet{article-full}

\citep{article-full}

\citep[][]{article-full}

\citep[see:][]{article-full}

\citet{article-full}

\bibliographystyle{apalike}
\bibliography{xampl}

\end{document}

相关内容