三十年来,我一直将笔记保存在 BibTeX 文件中。不幸的是,我必须使用biblatex
才能获得 footcite。我只想biblatex
跳过任何格式不正确的 BibTeX 条目。如果有过滤器,我可以使用过滤器从我的文件中提取所有正确的 BibTeX 条目,我不介意花时间制作一个中间文件。
请注意,BibTeX 一旦认识到无法解析某些内容,就会放弃并寻找下一个newline-@
。
这就是我所需要的,但我真不敢相信,它还没有被写出来。
答案1
有几个原因可以解释为什么 Biber 对文件的要求比 BibTeX 更高.bib
。我将列出一些 Biber 可能遇到的障碍,而这些障碍对于 BibTeX 来说通常不是什么大问题(如果有的话),并尽可能解释为什么存在差异并尝试提出解决方法。
在深入讨论之前,我们应该注意到,人们经常将 Biber 与biblatex
+Biber 同义使用,将 BibTeX 与\bibliographystyle
+BibTeX 同义使用(有关区别,另请参阅bibtex 与 biber 以及 biblatex 与 natbib 的比较和要切换到 biblatex 该怎么做?)。biblatex
可以与 BibTeX 一起使用作为后端,而不是 Biber,尽管现在明确不鼓励这样做,因为许多高级功能只能在 Biber 中使用。这里讨论的一些限制是其biblatex
参考书目的限制及其方法,无论后端是什么(BibTeX 或 Biber),这些限制都会发生。一些限制与 Biber(程序)特别相关,不会出现在 BibTeX 中(即使在设置中biblatex
)。在下文中,我将尝试说明某件事是biblatex
问题还是 Biber 问题,但我总是将替代方案称为 BibTeX,即使 BibTeX(程序)和“BibTeX 在基本层面上生成参考书目的方式/LaTeX 方面”之间可能应该有所区别。BibTeX 可用的样式相当多变,.bst
在下文中我们通常会假设一种与标准样式类似的样式plain.bst
或其中一种样式natbib
。
BibTeX 和 Biber 的一般相关性和工作描述在使用问号或粗体引用关键字代替引用编号,所以如果您不太清楚为什么需要运行 BibTeX 或 Biber,我建议您查看该帖子。简而言之,BibTeX 和 Biber 使文件中的数据.bib
可供 LaTeX 访问,并执行一些难以直接在 LaTeX 中执行的处理步骤(BibTeX 主要进行排序和一些标签生成,Biber 还计算唯一性信息和一些其他方便的东西)。LaTeX 可消化的数据被写入文件.bbl
。
.bbl
文件
.bst
BibTeX(就 BibTeX 使用files/生成参考书目的方式而言\bibliographystyle
,例如与 一起使用natbib
)和biblatex
的根本区别在于它们生成的 LaTeX 可理解文件的格式.bbl
。BibTeX.bbl
生成的文件通常包含在thebibliography
环境中可直接排版的文本。如果要手动编写参考书目,可能会想出与 BibTeX 生成的输出类似的代码。(有些 BibTeX 样式更进一步,使用更复杂的宏来允许用户动态更改样式的更多方面。您可以在我的回答的背景部分中阅读更多有关此内容的信息并查看一些示例使用 bibulous 自定义引文)该.bbl
文件只是通过命令读取和排版为普通的 LaTeX 代码\bibliography
,并生成完整的参考书目(LaTeX 不知道条目的内容,它只是排版它们)。另一方面,biblatex
文件.bbl
不包含可排版的代码,它们以结构化和 LaTeX 可读的方式包含完整的条目数据和一些附加信息(同样,可以在中找到一个示例)。使用 bibulous 自定义引文)。在文档开头会完整地读取.bbl
for ,以便所有条目数据在整个文档中都可用(因此 LaTeX 会“知道”每个项目的条目数据)。biblatex
字段中的 LaTeX 代码无效
文件之间的差异.bbl
已经解释了为什么 BibTeX 对某些事情比 更宽容的第一个原因biblatex
。使用 BibTeX 方法,只有实际应该打印在参考书目中的数据才会传递给 LaTeX(模数jurabib
),而biblatex
所有已知字段都会传递给 LaTeX。与格式错误的字段相关的问题abstract
通常属于由此事实导致的问题类别。有时从网站导出的文件abstract
字段.bib
包含无效的 LaTeX 代码(参见软件生成的书目条目:使用前应检查的常见错误和其他错误),例如未转义的%
或#
字符。对于 BibTeX 用户来说,这通常不是问题,因为摘要字段很少在参考书目中排版,因此很少包含在文件中并被 LaTeX 看到。与 LaTeX 不同,BibTeX 对未转义的和.bbl
没有任何问题,所以一切都很顺利。但 是一个已知字段,这意味着它会被传递给 LaTeX 并在文档开头读入。未转义的和会造成严重破坏并导致错误。即使从未使用过该字段,即使用户不打算使用它,也会读入该字段。这里的一个可能的补救措施是告诉 Biber 在字段到达文件之前将其删除,请参阅%
#
biblatex
abstract
#
%
abstract
.bbl
使用 biblatex/biber 时 bib 输入字段中的百分号错误。
btparse
Biber 基于 Perl 模块文本::BibTeX,而后者又依赖 C 库btparse
来解析.bib
文件。在接受的有效输入和 BibTeX 接受的输入之间存在一些细微的差别btparse
。例如,btparse
不允许()
输入键,但 BibTeX 可以接受它们(请参阅使用包含括号的 BibTeX 键和 Biber)。
BibTeX 有时即使出现错误仍会尝试生成输出,而 Biber 只会中止处理相关条目,甚至更糟的是,完全停止运行。在这些情况下,BibTeX 输出通常毫无意义,但 BibTeX 错误消息并不十分引人注目,我可以想象它可能会漏掉,尤其是当您的编辑器为您消化日志消息时。除了重写 Biber 或底层解析库之外,您在这里能做的事情不多。
文件编码
BibTeX 只理解 ASCII,而 Biber 完全支持 Unicode,并且可以读取其他编码的文件。当 BibTeX 遇到非 ASCII 字符时,它们通常会不加改变地传递下去,但在某些情况下(主要是排序),结果可能不尽如人意。另一方面,Biber 可以读取和理解各种编码的文件(非 ASCII 字符可以根据指定的语言环境排序等)。这意味着文件.bib
必须以 Biber 期望的编码正确编码(通常biblatex
假设文件具有与引擎声明或指示的文件.bib
相同的编码;当然可以使用 覆盖自动检测):混合编码的文件可能会失败或输出为垃圾。在这种情况下,唯一的解决方案是确保文件正确使用指定的编码。.tex
inputenc
bibencoding
--nodieonerror
Biber 有一个选项--nodieonerror
,允许它跳过一些通常会中止 Biber 运行的错误。实际上,这对于底层btparse
库产生的某些类型的错误很有帮助,这些错误有时可以跳过,但跳过错误可能会导致崩溃或无意义的输出。所以这是我只用于调试的东西,我不会期待奇迹。