.bib 文件:版本、语言、langid

.bib 文件:版本、语言、langid

在编写 bib 文件时,bibtex 规定版本使用大写序数词,例如edition={Fourth}。但babelbibbiblatex坚持使用数字,例如。这意味着每当我们从一种设置切换到另一种设置时,我们都必须重写 bib 文件。在 biblatex+biber 和babelbib+bibtex 中edition=4必须进行类似的重写。langidlanguage

例如,以下文件是用 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,我们必须重写12Twelth。如果使用 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}

相关内容