natbib
我正在准备提交一份稿件给一家期刊,该期刊使用与类似的引用格式authoryear
,但当有三位作者以及两位作者时,要求文内引用完整的作者列表。
有没有可以自动帮我完成此操作的包或命令? 命令\citet*
和\citep*
fromnatbib
很棒,但它们不会自动识别作者人数为三人或更少的情况。此外,当我在括号中引用多个来源(在同一个引文中)时,情况会变得非常棘手,其中一些来源有三名作者,而另一些来源有更多作者。
答案1
由于您要向期刊提交论文,而期刊对论文的参考书目(以及论文的许多其他方面,毫无疑问!)有特定的格式要求,因此您应该要求(如果您还没有这样做)提供符合期刊要求的 BibTeX 参考书目样式 (.bst) 文件。幸运的话,这个 .bst 文件将兼容natbib
和还应实施期刊的内部风格(即,对于作者不超过三位的文章,请引用所有作者的姓名)。
如果你没那么幸运,有三种可能。首先,如果 .bst 文件是不是兼容natbib
,你显然运气不好。(不过幸运的是,natbib
它非常强大,可以与绝大多数 .bst 文件兼容。)其次,如果 .bst 文件是兼容natbib
但不包含名为的函数format.lab.names
,那么您也运气不佳。这基本上就是 natbib 手册中的声明的意思:“如果 .bst 文件支持此功能,则加星号的 [引用命令] 版本只能列出完整作者。”(当然,这样的 .bst 文件还必须提供一些调用该format.lab.names
函数的函数……)
第三,如果.bst文件做包含这样的功能,但没有实现期刊的内部风格,也就是说,如果一篇文章的\cite[pt]*
宏输出Adams et~al.
恰好有三位作者(第一位作者的姓氏是“亚当斯”……),那么不是运气不好。您需要做的就是用format.lab.names
符合期刊内部风格的函数替换现有函数。现有format.lab.names
函数应该(或多或少...)看起来像:
FUNCTION {format.lab.names}
{ 's :=
"" 't :=
s #1 "{vv~}{ll}" format.name$
s num.names$ duplicate$
#2 >
{ pop$
" " * bbl.etal *
}
{ #2 <
'skip$
{ s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
{
" " * bbl.etal *
}
{ bbl.and space.word * s #2 "{vv~}{ll}" format.name$
* }
if$
}
if$
}
if$
}
您应该用以下代码替换此代码:
FUNCTION {format.lab.names}
{'s :=
"" 't :=
#1 'nameptr :=
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr
"{vv~}{ll}" format.name$
't :=
nameptr #1 >
{
nameptr #2 =
numnames #3 > and
{ "others" 't :=
#1 'namesleft := }
'skip$
if$
namesleft #1 >
{ ", " * t * }
{
s nameptr "{ll}" format.name$ duplicate$ "others" =
{ 't := }
{ pop$ }
if$
t "others" =
{
" " * bbl.etal *
}
{
numnames #2 >
{ "," * }
'skip$
if$
bbl.and
space.word * t *
}
if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
}
完成替换后,以新名称保存 .bst 文件,并调整\bibliographystyle
命令以指向新文件。
如果您收到有关 BibTeX 关于不存在bbl.and
and/orbbl.etal
函数的投诉,只需将以下代码添加到新的 .bst 文件中(在文件顶部附近的某个位置,在定义 bibtex 函数的部分开始之后不久):
FUNCTION {bbl.and}
{ "and"}
FUNCTION {bbl.etal}
{ "et~al." }