我正在使用 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 不同,它以某种方式满足了删除括号的条件命令中的条件。也许其他人可以解释一下;我不懂这些语言。如果有人有更优雅的解决方案可以实现相同的结果,请告诉我。