![.bib 文件:版本、语言、langid](https://linux22.com/image/393379/.bib%20%E6%96%87%E4%BB%B6%EF%BC%9A%E7%89%88%E6%9C%AC%E3%80%81%E8%AF%AD%E8%A8%80%E3%80%81langid.png)
在编写 bib 文件时,bibtex 规定版本使用大写序数词,例如edition={Fourth}
。但babelbib
和biblatex
坚持使用数字,例如。这意味着每当我们从一种设置切换到另一种设置时,我们都必须重写 bib 文件。在 biblatex+biber 和babelbib+bibtex 中edition=4
必须进行类似的重写。langid
language
例如,以下文件是用 pdflatex 和 bibtex 处理的:
\documentclass{article}
\usepackage[USenglish,ngerman]{babel}
\usepackage{babelbib}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{Fischer-LineareAlgebra,
author={Gerd Fischer},
title={Lineare Algebra},
edition={12},
isbn={3-528-87217-9},
publisher={Vieweg},
language={ngerman}
}
\end{filecontents}
\bibliographystyle{bababbrv}
\begin{document}
\cite{Fischer-LineareAlgebra}
\bibliography{\jobname}
\end{document}
如果使用 bibtex 但没有 babelbib,我们必须重写12
为Twelth
。如果使用 biber+biblatex,我们必须保留12
但将language
其改为langid
。
那么,如何实现这个过程的自动化?每次手动重写都容易出错,而且很耗时……
答案1
虽然所有 BibTeX 和样式都支持一个共同的核心字段biblatex
,并且所有相关工具都希望输入相同,但有一个较小但不可忽略的字段列表,它们不仅在biblatex
与 BibTeX 的广泛比较中表现不同,而且在不同的 BibTeX 文件之间也表现不同.bst
。因此,每当您切换样式时,最好查看文档并仔细检查输出是否有任何异常。
如果您想要超级灵活,那么将文件.bib
仅视为中间格式并以不同的、更灵活和更强大的格式存储数据库可能会很有吸引力。您可以将参考书目条目存储在不同的数据库中,然后导出到.bib
具有正确数据模型的文件。例如,这可以通过 Zotero 和https://retorque.re/zotero-better-bibtex/(还有其他竞争者,如 Mendeley 和 Citavi,但以我非常有限的经验来看——我从未有效地使用过这些工具,但在这个网站上看到了很多关于它们的问题——Zotero 的.bib
导出功能优于其他两个,尤其是在 BetterBibTeX 的帮助下)。虽然 Zotero 数据模型本身在某些方面不如biblatex
数据模型那么精细(例如),但 BetterBibTeX 提供了各种导出细化功能,可以帮助您.bib
为所使用的每种参考书目样式生成量身定制的文件。当然,这会带来额外的开销,而且我并不完全相信 Zotero 的数据模型是最好的,所以如果您决定选择此选项,您可能需要货比三家或推出自己的系统。
如果您希望坚持使用.bib
文件作为主要书目数据库,那么您需要工具来操作这些文件的内容。
一些.bib
文件管理器(例如 JabRef)已经提供了一组清理选项,并提供其他搜索和替换功能,这些功能对于执行此类任务非常有用。
但也有用于操作.bib
文件的经典命令行工具。我想到的第一个这样的程序是BibTool。Biber 也有一个--tool
模式,但它的缺点是它默认符合标准biblatex
数据模型,并清除它不认识的任何字段。这可以配置,但在开始之前你需要意识到这一点防止 `biber --tool` 删除 .bib 文件中的非标准字段。
BibTool 可以轻松重命名、删除或添加字段,甚至可以使用 RegExp 重写字段内容。
例如
rename.field { language = langid }
rewrite.rule {"^\"\([^#]*\)\"$" # "{\1}"}
rewrite.rule { edition # "^{1}$" # "{First}" }
rewrite.rule { edition # "^{12}$" # "{Twelfth}" }
另存为mytool.rsc
并调用in.bib
@book{Fischer-LineareAlgebra,
author={Gerd Fischer},
title={Lineare Algebra},
edition={12},
isbn={3-528-87217-9},
publisher={Vieweg},
language={ngerman}
}
如下问题所示
bibtool -r mytool.rsc in.bib -o out.bib
生产
@Book{ fischer-linearealgebra,
author = {Gerd Fischer},
title = {Lineare Algebra},
edition = {Twelfth},
isbn = {3-528-87217-9},
publisher = {Vieweg},
langid = {ngerman}
}
(当然这不是输入biblatex
想要的,因为它更喜欢12
而不是Twelfth
,这只是为了展示事情如何运作。)
这需要一些配置,特别是如果你想替换版本号时,因为没有简单的方法可以用几行代码替换它们。你可以用$n$
不同的脚本/编程语言以编程方式生成数字替换规则。虽然我们讨论的是不同的语言,但有一些库可以用来读写.bib
文件Python或者Perl,所以如果您想要一个更强大的操作工具,您可以充分利用这些语言的全部功能来打造自己的工具。
如果你只想使你的条目现代化,biblatex
可以通过 Biber 即时应用一些更改
\documentclass{article}
\usepackage[USenglish,ngerman]{babel}
\usepackage{csquotes}
\usepackage[style=alphabetic, backend=biber]{biblatex}
\DeclareSourcemap{
\maps{
\map[overwrite]{
\step[fieldsource=language, final]
\step[fieldset=langid, origfieldval]
\step[fieldset=language, null]
}
\map{
\step[fieldsource=edition, match=\regexp{\ATwelfth\Z}, replace={12}]
}
}
}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{Fischer-LineareAlgebra,
author = {Gerd Fischer},
title = {Lineare Algebra},
edition = {Twelfth},
isbn = {3-528-87217-9},
publisher = {Vieweg},
language = {ngerman}
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\cite{Fischer-LineareAlgebra}
\printbibliography
\end{document}