行内引用时,应使用 Smith (2010a, 2010b) 代替 Smith (2010a, b)

行内引用时,应使用 Smith (2010a, 2010b) 代替 Smith (2010a, b)

我正在使用 natbib 包进行写作。

例如,Smith 有 2 篇论文,均发表于 2010 年。我在 .bib 文件中将它们标记为 Sm1 和 sm2。现在,当我使用 \citet{Sm1,Sm2} 引用这些论文时,它会产生 Smith (2010a, b)。但我希望将其改为 Smith (2010a, 2010b)。有人能帮我吗?

答案1

我会打补丁\NAT@citex来避免检查年份,这样你就不需要提前知道年份了。这样在每种情况下都可以正常工作。

\begin{filecontents*}{\jobname.bib}
@article{sma,
 author={Smith, J.},
 title={A},
 journal={B},
 year={2014},
}
@article{smb,
 author={Smith, J.},
 title={C},
 journal={D},
 year={2014},
}
\end{filecontents*}
\documentclass{article}
\usepackage[authoryear,round]{natbib}
\usepackage{xpatch}

% patch \NAT@citex to always use the year
\makeatletter
\xpatchcmd{\NAT@citex}
  {\ifx\NAT@last@yr\NAT@year}
  {\iffalse}
  {}{}
\xpatchcmd{\NAT@citex}
  {\ifx\NAT@last@yr\NAT@year}
  {\iffalse}
  {}{}
\makeatother

\begin{document}
\citep{sma,smb}

\citet{sma,smb}

\bibliographystyle{plainnat}
\bibliography{\jobname}
\end{document}

像往常一样,filecontents*环境只是为了使示例自成一体。

在此处输入图片描述

解释。该\NAT@citex命令是该过程的主要部分;它在两个地方执行

\ifx\NAT@last@yr\NAT@year
  <something if the current citation has the same year as the preceding one>
\else
  <otherwise>
\fi

通过补丁我们将条件(第一行)改为\iffalse,因此永远不会遵循“真实”分支。

答案2

假设两个条目的键是sm1sm2,你可以通过编写来实现你的目标

\citeauthor{sm1} (\citeyear{sm1}, \citeyear{sm2})

备注:该natbib包具有选项sortcompresssort&compress,但它们似乎主要针对数字样式的引文标注。对于作者年份样式的引文标注,该包似乎不提供诸如nosort或 之类的选项nocompress——因此需要上面提供的繁琐代码。

相关内容