根据顺序更改书目作者格式

根据顺序更改书目作者格式

我的号码布已经接近所需格式,但我需要第一的名称为“姓氏,名字”并且随后的姓名应为“firstname lastname”。目前所有姓名均为“lastname, firstname”。

当前围兜的样子如下:

[1] Van Noorden, Richard, Maher, Brendan, and Nuzzo, Regina. The top 100 papers. Nature, 514(7524):550, 2014. ISSN 0028-0836.

期望的结果是:

[1] Van Noorden, Richard, Brendan Maher, and Regina Nuzzo. The top 100 papers. Nature, 514(7524):550, 2014. ISSN 0028-0836.

我目前在与 bib 相关的序言中使用以下命令:

\usepackage{cite}
\usepackage[square,numbers,sort&compress]{natbib}
\bibliographystyle{unsrtnat_lastfirst}

unsrtnat 样式的修改版本在哪里unsrtnat_lastfirst。我对其进行了修改,将姓氏放在第一位,但我不知道如何更改后续作者的格式。format.names 函数如下:

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

我发现相关问题相关,但无法正确修改我的 .bst 以匹配。我想继续使用我的序言(由于格式的其他要求),但我相信我应该能够修改此 .bst 以获得所需的效果(在帮助下)。

提前致谢。如果需要,很乐意编辑更多信息。

答案1

我不太了解这些东西,但我找到了一个很好的参考这里,这让事情变得简单多了(点赞这个答案)。显然,该语言几乎就像基于堆栈的汇编语言,因此很多东西必须与我们可能习惯的相反来阅读。为了解释,我将首先将原文翻译format.names成 Python;如果您比较两者,希望对应关系清晰,但恕我直言,Python 的可读性要高得多:

def format_names(s):
    nameptr = 1
    numnames = len(s)
    namesleft = numnames
    while namesleft > 0:
        t = builtin_format_name('{ff~}{vv~}{ll}{, jj}', nameptr, s)
        if nameptr > 1:
            if namesleft > 1:
                result += ', '
                result += t
            else:
                if numnames > 2:
                    result += ','
                else:
                    pass
                if t == 'others':
                    result += ' et~al.'
                else:
                    result += ' and '
                    result += t
        else:
            result = t
        nameptr = nameptr + 1
        namesleft = namesleft - 1
    return result

根据我上面链接的参考资料,BibTeX 将名称分为四个部分:“first”、“von”、“last”和“jr.”,这解释了格式代码ffvvlljj。所以我同意你重写格式字符串。现在如果我们想修补 Python,我们会做一些事情,例如移动此行:

t = builtin_format_name('{ff~}{vv~}{ll}{, jj}', nameptr, s)

进入外部条件的“then”分支,并将“else”分支替换为:

result = builtin_format_name('{vv~}{ll}{, jj}{, ff}', nameptr, s)

如果我这样做并翻译回 BST 语言,我会得到以下实现:

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 :=
          namesleft #1 >
            { ", " * t * }
            { numnames #2 >
                { "," * }
                'skip$
              if$
              t "others" =
                { " et~al." * }
                { " and " * t * }
              if$
            }
          if$
        }
        { s nameptr "{vv~}{ll}{, jj}{, ff}" format.name$ }
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
}

看起来效果不错。看看这是否能解决你的问题。

相关内容