我的号码布已经接近所需格式,但我需要第一的名称为“姓氏,名字”并且随后的姓名应为“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.”,这解释了格式代码ff
、vv
、ll
和jj
。所以我同意你重写格式字符串。现在如果我们想修补 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$
}
看起来效果不错。看看这是否能解决你的问题。