更改 .bst 文件中的 BibTeX“format.names”函数,以强制对超过 3 位作者的条目使用“et al.”引用

更改 .bst 文件中的 BibTeX“format.names”函数,以强制对超过 3 位作者的条目使用“et al.”引用

我正在使用natbib软件包来列出参考文献。我一直在努力使用 BibTeX。我正在为《金融杂志》撰稿,他们希望论文正文中的 3 篇以上引文采用“et al.”格式。但该杂志的文件规定,.bst无论多少作者都不会使用 natbib\citet\citep(或任何其他引用方法)将作者列表截断为“Jones et al. (2009)”(例如);所有作者都会被列出。

我找到了一个解决方案不同的.bst(不是《金融杂志》的.bst)。但该杂志的.bst功能format.names与此完全不同,我无法编辑它,以至于每篇拥有 3 位以上作者的论文都会在论文正文中被截断为“et al.”

请帮忙。以下是 Journal 函数的代码format.names(来源:http://www.ivo-welch.info/computers/bstfiles/):

 FUNCTION {format.names}
{ 's :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
{ namesleft #0 > }
{ nameptr #1 >
    { s nameptr "{ff }{vv~}{ll}{, jj}" format.name$ 't := }
    { s nameptr "{vv~}{ll}{, jj}{, ff}" format.name$ 't := }
  if$
  nameptr #1 >
    {
      namesleft #1 >
        { ", " * t * }
        {
          ", " *
          t "others" =
            { " et~al." * }
%                { " {\small and} " * t * }
            { " and " * t * }   
%%%KCB: added \small  %%KD removed small
          if$
        }
      if$
    }
    't
  if$
  nameptr #1 + 'nameptr :=
  namesleft #1 - 'namesleft :=
}
  while$
}

答案1

链接样式是为使用 LaTeX 内核的\cite而不是 的“标准” BibTeX 生成的natbib。因此,您应该考虑.bst使用custom-bib或者考虑改用biblatex

答案2

好吧,我遇到了同样的问题,因为我想在 beamer 演示文稿中使用更短的引用(即使《金融杂志》仅在三位以上作者后缩写)。

需要更改的不是 .bst 文件中的“format.names”函数,而是“format.lab.names”函数。这是正确的函数。(我认为这仍然很重要,因为这个函数似乎也控制着其他 .bst 文件中的 et al. 阈值。)

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 >
        {
        % Change here numnames from #3 to #2 if et al. should come up 
        % for any reference with more than 2 authors
          nameptr #2 =
          numnames #2 > and
            { "others" 't :=
              #1 'namesleft := }
            'skip$
          if$
          namesleft #1 >
            { ", " * t * }
            {
              s nameptr "{ll}" format.name$ duplicate$ "others" =
                { 't := }
                { pop$ }
              if$
              t "others" =
                { " et~al." * }
                {
                  numnames #2 >
                    { "," * }
                    'skip$
                  if$
                  bbl.and
                  space.word * t *
                }
              if$
            }
          if$
        }
        't
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
}

相关内容