大多数人可能都知道,多种可接受的作者姓名书写方式。但是,当我.bib
从 Zotero(有时会导出姓氏、名字,有时会导出名字)或 JabRef(会以您第一次输入的方式导出字段)等软件或互联网导出条目时,我会以多种不同的方式获取作者姓名。虽然这些来源很少以不正确或不可用的方式提供这些姓名,但我希望规范化我的.bib
文件,以便我可以Ctrl + F
轻松输入作者姓名,如果姓名缩写则填写姓名等等。
.bibtoolrsc
我正在尝试使用 BibTool,我已经用它来清理、格式化和排序我的文件。我在我的文件中尝试了以下规则:
new.format.type = {17="%f%v%l%j"}
new.format.type = {17="%0f%0v%0l%0j"}
new.format.type = {17="%0f %0v %0l %0j"}
但是当我运行bibtool
命令时,除了这些规则之外,我的所有其他规则都有效(当然,我已经分别尝试过它们)。
以下是我想要的示例。我想要的是这样的:
author = {Brown, Noam and Sandholm, Tuomas}
变成这样:
author = {Noam Brown and Tuomas Sandholm}
有人知道如何实现吗?我更希望使用 BibTool 来做所有事情,但如果有人推荐其他命令,那也是可以接受的。
编辑:这是我的内容我的.bibtoolrsc
文件。
答案1
这是我使用 Python 脚本的尝试bibtexparser
(注意,它将替换 .bib 文件!如果您不想这样,请修改脚本):
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, sys
import re
import bibtexparser
from bibtexparser.bwriter import BibTexWriter
from bibtexparser.bibdatabase import BibDatabase
from bibtexparser.customization import convert_to_unicode
from bibtexparser.bparser import BibTexParser
import inspect, pprint
# kill stdout terminal buffering
buf_arg = 0
if sys.version_info[0] == 3:
os.environ['PYTHONUNBUFFERED'] = '1'
buf_arg = 1
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', buf_arg)
sys.stderr = os.fdopen(sys.stderr.fileno(), 'w', buf_arg)
# EDIT FOR YOUR FILES - relative to current working dir
mybibfiles = ["path1/file1.bib", "path2/file2.bib"]
numcommas = 0
# homogenize_fields: Sanitize BibTeX field names, for example change `url` to `link` etc.
tbparser = BibTexParser()
tbparser.homogenize_fields = False # no dice
tbparser.alt_dict['url'] = 'url' # this finally prevents change 'url' to 'link'
for bibfile in mybibfiles:
print((bibfile, os.path.isfile(bibfile)))
with open(bibfile) as bibtex_file:
bibtex_str = bibtex_file.read()
bib_database = bibtexparser.loads(bibtex_str, tbparser)
pprint.pprint(bib_database.entries) # already here, would by default replace 'url' with 'link'!
bibdblen = len(bib_database.entries)
for icpbe, paperbibentry in enumerate(bib_database.entries):
authstr = paperbibentry['author']
if ("," in authstr):
numcommas += 1
report = "%d/%d: Comma present: '%s'"%(icpbe+1, bibdblen, authstr)
authstrauthors = authstr.split(" and ")
for ia, author in enumerate(authstrauthors):
if ("," in author):
authorparts = author.split(", ")
# the first part [0] is last name, needs to become last
# get and remove the first part, then append it as last
lastname = authorparts.pop(0)
authorparts.append(lastname)
authorfirstlast = " ".join(authorparts)
authstrauthors[ia] = authorfirstlast
paperbibentry['author'] = " and ".join(authstrauthors)
bib_database.entries[icpbe] = paperbibentry
report += " -> '%s'"%(paperbibentry['author'])
else:
report = "%d/%d: OK"%(icpbe+1, bibdblen)
if sys.version_info[0] == 3:
print(report)
else: #python 2
print(report.encode('utf-8'))
with open(bibfile, 'w') as thebibfile:
bibtex_str = bibtexparser.dumps(bib_database)
if sys.version_info[0]<3: # python 2
thebibfile.write(bibtex_str.encode('utf8'))
else: #python 3
thebibfile.write(bibtex_str)
print("\nFound & converted total of %d author fields in format Last, First (with commas)."%(numcommas))
答案2
一年后,在尝试解决同一问题时,我发现 JabRef 在“质量”菜单下有一个名为“清理条目”的选项。如果为“作者”和/或“编辑”字段添加“规范化人名”规则,JabRef 会将姓名规范为“von Last, Jr., First”格式。这与原始问题要求的并不完全一致,但由于它使 bib 文件中所有姓名字段的表示方式均质化,我认为值得一提。
JabRef 还可以通过“质量”>“检查完整性”选项指出哪些条目不符合规格。
它不适用于 Bibtex 扩展名称格式(请参阅biber 手册那是什么)。