使用bibmap方便的修改bib文件中参考文献的期刊或会议名的字母大小写格式为titlecase
1. 引言
英文语句的字母大小写形式有多种格式,常用的格式是
-
全大写(upper case),即句子的所有字母都大写。常见于学位论文、报告等的封面标题(当然也有用titlecase)
-
标题格式(title case),即句子中除一些介词和连词外,每个单词首字母大写。常见于文献标题名、期刊名、会议名等
-
句子格式(sentence case),即句首字母大写其它所有字母小写。常见于段落中的句子。
在latex的参考文献中也存在类似的格式,由于不同的出版社对于文献的格式要求不同,所以很多时候我们需要进行大小写调整。
比如有的期刊要求文献的题目是sentence case,有的则是title case,各种需求不一而足。
理论上这些格式的调整应该由参考文献样式文件来调整,
但由于latex处理句子大小写编程的复杂性,通常各宏包提供的宏会存在一定局限。
详见latex中字母大小写转换实践,
latex中英文字母大小写变换再讨论.
所以我们其实没有必要再latex中来处理这种复杂的字符串的大小写变换,完全可以使用功能强大的其它编程语言来处理。
由于bib文件本身就是一个文本文件,所以处理起来非常的方便。只要我们按照要求先处理好bib文件中信息的大小写,
那么也就无需再latex中去处理了。
所以我们介绍一个参考文献库文件即bib文件的修改工具,能够方便的实现对指定域信息的字母大小写格式修改。
2. bibmap工具
bibmap工具 是我写的一个latex参考文献处理的后端程序,类似于bibtex、biber,但也提供了一些中文环境下有用的特色的功能,比如增加拼音信息域等,见为中文参考文献自动添加排序用的拼音信息域。
本质上这个一个解析bib文件,然后根据设置做bib信息修改以及根据要求输出指定格式的文本的一个工具。
这个工具是用python写的,在处理文本字符串方面使用字符串函数和正则表达式是相当容易的,所以根据大小写模式需求编辑修改的功能也是实现了的。
下面我们介绍这个工具怎么用。因为提供源码所以用户可以直接运行bibmap.py来工作,也可以使用提供的封装好的bibmap.exe来工作。
bibmap程序命令行参数主要是指定的要处理的文件名以及修改信息相关的设置文件。
主要包括:
bibmap.py
或
bibmap.exe
filename 单个输入文件的文件名,可带后缀名如bib或aux,无后缀名时默认为辅助文件.aux
[-a AUXFILE] 辅助文件的文件名,可带后缀名.aux,如果filename已经设置aux文件则无效
[-b BIBFILE] 文献数据库文件名,可带后缀名.bib,如果filename已经设置bib文件则无效
[-s STYFILE] 设置文献样式文件的文件名,可带后缀名.py,不给出则使用默认样式文件
[-m MAPFILE] 数据库修改设置文件文件名,可带后缀名.py,不给出则使用默认设置文件
[--addpinyin] 给出该选项则将为每个文献条目增加带有拼音的key域。
[--nofmt] 给出该选项则不做格式化输出
[--nobdm] 给出该选项则不做bib数据修改
[-h] 输出帮助
那么如果我们要修改一个名为test.bib文件的信息,并用指定的设置文件bibmaptitlecase.py来修改相关信息,那么命令为:
python bibmap.py test.bib -m bibmaptitlecae.py
只要bibmaptitlecae.py设置清楚,那么就会实现对test.bib文件实现对应的修改。
3. 在设置文件中指定需要的修改方式
设置文件是一个python文件,里面就是一个sourcemaps列表,在它内部每一个修改也用列表表示。每个修改内部则用字典表示具体的修改内容和方式。
这里我们假设需要将bib文件中的所有参考文献的title、booktitle、journal、journaltitle域内的文本(字符串),修改为titlecase模式,那么可以使用如下设置:
sourcemaps=[
[#map1:将设置title为sentencecase
{"fieldsource":"title","final":True},#
{"fieldset":"title","origfieldval":True,"fieldfunction":'setsentencecase',"overwrite":True}#step1
],
[#map2:将设置booktitle为titlecase
{"fieldsource":"booktitle","final":True},#
{"fieldset":"booktitle","origfieldval":True,"fieldfunction":'settitlecase',"overwrite":True}#step1
],
[#map3:将设置journal为titlecase
{"fieldsource":"journal","final":True},#
{"fieldset":"journal","origfieldval":True,"fieldfunction":'settitlecase',"overwrite":True}#step1
],
[#map3:将设置journaltitle为titlecase
{"fieldsource":"journaltitle","final":True},#
{"fieldset":"journaltitle","origfieldval":True,"fieldfunction":'settitlecase',"overwrite":True}#step1
]
]
其原理是:第一步修改title域,通过"fieldsource"搜索title,如果没有找到,则根据"final":True选项终止此步,若找到了则进入下一行的修改:“fieldset"设置title域,通过"origfieldval”:True获取原来的字符串,并利用"fieldfunction"指定的函数做修改这里是改为sentencecae,并根据"overwrite":True,将修改完成的信息写入title域中。后面的三步对booktitle、journal、journaltitle域的修改是类似的,但是设置成titlecase。
注意:这些设置方式的命名与biber是类似的。
其中"fieldfunction"指定的函数还包括:‘sethzpinyin’,‘sethzstroke’,‘setsentencecase’,‘settitlecase’,‘setuppercase’,‘setlowercase’,‘setsmallcaps’,‘setalltitlecase’。sethzpinyin函数以域内容为参数,输出其对应的拼音。'sethzstroke’设置用于排序的笔画顺序字符串。
剩下的大小写修改函数一目了然。
4. 实践
假设我们有如下test.bib文件,其内容为:
@Inproceedings{Nemec1997-209-214,
Title = {Force control of redundant robots},
Author = {B Nemec and Zhao, Mou Mou},
Booktitle = {Processings of Symposium on Robot Control},
shortbooktitle ={(PSRC)},
Pages = {209-214},
Country = {Nantes France},
Year = {1997},
AUTHOR+an = {2=thesisauthor},
}
@Article{Chiani1998-2998-3008,
Title = {Error probability for block codes over channels with block interference},
Author = {Zhao, Mou Mou and Chiani, M.},
Journal = {IEEE Trans. Inf. Theory},
shortbooktitle ={(ITIT)},
Number = {7},
Pages = {2998-3008},
Volume = {44},
Year = {1998},
AUTHOR+an = {1=thesisauthor},
}
若python文件和bib文件在同目录下,使用如下命令:
python bibmap.py test.bib -m bibmaptitlecae.py
则可以得到一个新的bib文件名为newtext.bib文件。内容为:
%%
%% bib file modified by biblatex-map.py
%% 2021-10-23T16:55:20
%%
@inproceedings{Nemec1997-209-214,
title = {Force control of redundant robots},
author = {B Nemec and Zhao, Mou Mou},
booktitle = {Processings of Symposium on Robot Control},
shortbooktitle = {(PSRC)},
pages = {209-214},
country = {Nantes France},
year = {1997},
author+an = {2=thesisauthor},
}
@article{Chiani1998-2998-3008,
title = {Error probability for block codes over channels with block interference},
author = {Zhao, Mou Mou and Chiani, M.},
journal = {Ieee Trans. Inf. Theory},
shortbooktitle = {(ITIT)},
number = {7},
pages = {2998-3008},
volume = {44},
year = {1998},
author+an = {1=thesisauthor},
}
可以看到不同的域已经根据要求完成了相应的大小写设置。
5. 小结
本文为参考文献库文件bib文件中的一些信息的大小写修改提供了除latex宏本身方法外的一种途径。利用bibmap工具,可以快速的实现对大批量的信息的修改,而不需要在latex中使用复杂的宏。