如何在括号引用中包含两个日期而不在参考文献中包含两个日期?

如何在括号引用中包含两个日期而不在参考文献中包含两个日期?

我正在使用 Springer 的svjour3.cls 和 spbasic.bst 文件。我修改了 .bst 文件以符合我在其中发表文章的特定 Springer 期刊的引用样式(APA 样式的变体)。以下是输出 PDF 中的示例:

在此处输入图片描述

如您所见,我只想在作者姓名后面包含一个日期(“2004”);另一个日期(“1988”)在括号中提及。

为了实现此结果,.bib 条目如下所示:

@incollection{Lewis1988,
    author = {David Lewis}, 
    pages = {77--103},
    editor = {Peter Ludlow and Yujin Nagasawa and Daniel Stoljar},
    booktitle = {There's Something About Mary: Essays on Phenomenal Consciousness and Frank Jackson's Knowledge Argument},
    year = {2004}, 
    origdate = {1988},
    title = {What Experience Teaches},
    publisher = {Cambridge, MA: MIT Press},
    note = {(Reprinted from ``What experience teaches," 1988, \textit{Proceedings of the Russellian Society}, \textit{13}, pp. 29--57)}
}

但是,如果我使用命令 \citep[see, eg,][]{Lewis2004} 在我的 tex 文件中引用此条目,它只会显示较新的日期:

在此处输入图片描述

我希望它看起来像这样:“例如,参见 Lewis 1988/2004。”

我发现实现此结果的唯一方法是在 .bib 条目的“年份”字段中包含第二个日期:

year = {1988/2004}

但如果我这样做,它会在参考条目中包含年份,而我不想这样:

在此处输入图片描述

我如何才能达到预期的结果?我怀疑应该有一个涉及 .bib 条目的“origdate”元素的解决方案。我遇到过涉及 \DeclareFieldFormat 命令的解决方案,但我无法让它们在我的 TeX 文件中工作,也许是因为我使用的是 natbib。

有任何想法吗?

答案1

natbib可以为这些情况定义一个引用别名。由于您使用的是修改后的.bst文件,因此在此示例中我仅使用了样式apalike,但解决方案也应该适用于您修改后的样式。

基本解决方案的一个缺点是括号被硬编码到引用中,因此如果你使用,citepalias你将得到(刘易斯(1988/2004))这可能不是您想要的。

我们可以通过使用条件使括号变得上下文相关来解决这个问题。

由于natbib没有为别名引用提供相应的 alt 命令,如果我们想要一个\citealpalias命令,我们需要提供一个,这就是你所想的。我设置上下文相关括号的方式是通过设置命令的条件\citetalias。因此,如果我们创建一个新\citepalias命令,它将使用别名的“无括号”版本。

\documentclass{article}
\begin{filecontents}{\jobname.bib}
@incollection{Lewis1988,
    author = {David Lewis}, 
    pages = {77--103},
    editor = {Peter Ludlow and Yujin Nagasawa and Daniel Stoljar},
    booktitle = {There's Something About Mary: Essays on Phenomenal Consciousness and Frank Jackson's Knowledge Argument},
    year = {2004}, 
    origdate = {1988},
    title = {What Experience Teaches},
    publisher = {Cambridge, MA: MIT Press},
    note = {(Reprinted from ``What experience teaches," 1988, \textit{Proceedings of the Russellian Society}, \textit{13}, pp. 29--57)}
}
\end{filecontents}
\usepackage{natbib}
\bibliographystyle{apalike}
\newif\ifcitep\citeptrue
\newcommand*\altlparen{\ifcitep\else(\fi}
\newcommand*\altrparen{\ifcitep\else)\fi\global\citeptrue}
\usepackage{etoolbox}
\pretocmd{\citetalias}{\citepfalse}{}{}
\makeatletter
\DeclareRobustCommand\citealpalias{\begingroup
   \NAT@swatrue\let\NAT@ctype\thr@@\NAT@parfalse\NAT@citetp}
\makeatother
\defcitealias{Lewis1988}{Lewis \altlparen 1988/2004\altrparen}

\begin{document}
\citetalias{Lewis1988}
\citepalias{Lewis1988}
\citealpalias{Lewis1988}
\bibliography{\jobname}
\end{document}

代码输出

答案2

我认为@AlanMunn 帮助我解决了所有问题,尽管我不太清楚为什么。

@AlanMunn 的建议奏效了。但是,还有一个问题:有时我需要在括号外引用作者和年份,就像使用 \citealt 命令一样。

我不知道如何创建一个条件命令来执行此操作,但我突然想到,如果我可以在 natbib.sty 文件中定义一个与 \citetalias 命令完全相同但名称不同的新命令,那么我就可以修改条件命令命令删除通常使用 \citetalias 命令实现的括号。

因此我打开了 natbib.sty 文件并向下滚动到第 746-747 行:

\DeclareRobustCommand\citetalias{\begingroup
\NAT@swafalse\let\NAT@ctype\thr@@\NAT@parfalse\NAT@citetp}

此后我立即添加了以下内容:

\DeclareRobustCommand\citetaliasnew{\begingroup
\NAT@swafalse\let\NAT@ctype\thr@@\NAT@parfalse\NAT@citetp}

如果我将 \citetaliasnew 与 @AlanMunn 的条件命令一起使用,它会执行与 \citealt 相同的操作。但我不太清楚为什么,因为我假设我需要创建一个对 \citetaliasnew 进行操作的新条件命令来产生该结果!

我猜想发生了以下情况:由于 \citetaliasnew 与 \citetalias 和 \citepalias 不同,它以某种方式满足了删除括号的条件命令中的条件。也许其他人可以解释一下;我不懂这些语言。如果有人有更优雅的解决方案可以实现相同的结果,请告诉我。

相关内容