文内引用:列出三位(或更少)作者的文章的所有作者?

文内引用:列出三位(或更少)作者的文章的所有作者?

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.andand/orbbl.etal函数的投诉,只需将以下代码添加到新的 .bst 文件中(在文件顶部附近的某个位置,在定义 bibtex 函数的部分开始之后不久):

FUNCTION {bbl.and}
{ "and"}
FUNCTION {bbl.etal}
{ "et~al." }

相关内容