因为这可能会成为XY问题,我会尽量提供尽可能多的附加信息。但首先,我的问题是:
- 问题 (Y):如何
biber
(在工具模式下).bib
基于文件创建文件.bcf
并使用其他.bib
文件作为数据源,而不是.bcf
文件中指定的数据源?
问题和背景(X):
最近我开始使用 JabRef 进行书目管理。一方面,它使用.bib
数据库格式非常方便,但另一方面也有一些缺点:
- 所有元信息都包含在该
.bib
文件中,包括文件引用、个人评论和数据库特定配置。出于某些原因(我认为这些原因在这里并不重要),我想.bib
为我的项目使用一个“干净”的文件,其中仅包含相关的书目数据。因此,我需要创建一个“精简”版本的数据库.bib
文件,这引出了下一点: - JabRef 没有添加自定义 BibTeX 导出过滤器的选项当然,也可以以 BibTeX 格式导出参考书目的子集但这并不能解决新文件中有配置数据和个人字段的问题。我知道后一个问题可以通过 JabRef 的“设置/清除/重命名字段”功能解决,但这只是一个部分解决方案,而且当需要重复执行时非常麻烦。
- 我希望只有实际的参考资料用过的在项目
.bib
文件中。这意味着我需要创建一个.bib
仅包含更大.bib
文件的引用参考文献的文件。
目标
所以我想要的是:
- 在 JabRef 中管理我的参考书目。
biblatex
使用with编写 LaTeX 文档biber
。- 生成一个
.bib
仅包含文档中引用的参考文献的文件作为我的 JabRef 数据库的子集。 - (从较小的
.bib
文件中删除所有包含多余信息的字段。这是不属于当前问题;我上面只是提到了这一点,作为我想做到这一切。
我目前拥有的
基本上,我发现了三种不同的方法来解决我的问题:
- 方法 1:使用
bibtool
以减少.bib
文件。问题:bibtool
不是为与 BibLaTeX/biber 一起使用而设计的,请参阅再次将 BibTool 与 BibLaTeX 结合使用。 - 方法 2:使用 JabRef 的功能“基于 AUX 文件的新子数据库”。同样,这与 不兼容
biber
。 - 方法 3:
biber
在工具模式下使用。
方法 3几乎成功了。以下命令获取 中引用的所有参考文献,paper.tex
并将其写入paper_biber.bib
:
biber --output_format=bibtex --output_resolve paper.bcf
不过,回想一下,我想要二 .bib
paper_biber.bib
文件:从文件自动创建的精简文件( ),此外还有一个包含以下内容的.bcf
主/数据库文件master.bib
全部我的参考文献。
这意味着,在 中paper.tex
我有一行类似\addbibresource{paper_biber.bib}
。因此,biber
将以下内容写入paper.bcf
<bcf:bibdata section="0">
<bcf:datasource type="file" datatype="bibtex">paper_biber.bib</bcf:datasource>
</bcf:bibdata>
当我运行时biber --output_format=bibtex --output_resolve paper.bcf
,从中biber
查找引用的数据。paper.bcf
paper_biber.bib
但这是错误的文件。我需要在中biber
查找参考资料的数据。paper.bcf
master.bib
当我手动编辑paper.bfc
并paper_biber.bib
替换master.bib
<bcf:bibdata section="0">
<bcf:datasource type="file" datatype="bibtex">master.bib</bcf:datasource>
</bcf:bibdata>
我得到了完全想要的结果,即包含在中引用的paper_biber.bib
所有条目。master.bib
paper.bcf
不幸的是,手动编辑paper.bcf
不太方便,而且很难实现自动化。这让我回到最初的问题:
我怎样才能
biber
(在工具模式下).bib
基于文件创建文件.bcf
并使用其他.bib
文件作为数据源,而不是.bcf
文件中指定的数据源?
我尝试在biber
手动的但却biber --help
找不到任何有用的东西。
我想我可以使用一个biber.conf
文件,根据手册,该文件应该可以覆盖.bcf
文件中的任何设置,但我不知道我必须在该文件中写入什么。我尝试了以下操作,但没有效果:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<!-- SECTION 0 -->
<bibdata section="0">
<datasource type="file" datatype="bibtex">master.bib</datasource>
</bibdata>
</config>
答案1
我自己找到了解决方案,它非常简单:该选项指定查找源文件的--input-directory
目录。biber
唯一的限制是缩小后的.bib
文件和完整文件需要具有相同的名称。那么解决方案是:
biber --output_format=bibtex --input-directory "path/to/database/" --output_resolve paper.bcf
编辑:上面的命令是不是一个完整的解决方案。它生成一个简化的文件,其名称如下,[name of input file]_biber.bib
这意味着这只适用于非常具体的文件名关系:
- 主 BIB 文件(数据库):
somename_biber.bib
\addbibresource{somename_biber.bib}
- 文档:
somename.tex
但是,这非常有限制。因此,我决定编写一个小的批处理文件(我使用 Windows)来一次性解决所有问题:
cd %~dp0
cp relative/path/to/MasterDB.bib reduced.bib
biber --output_file=reduced.bib --output_format=bibtex --output_resolve --strip_comments ../paper
biber ../paper
@echo off
echo.
echo Done!
if "%1"=="--background" exit
Pause
假设上述脚本位于 中src/
并paper.tex
带有addbibresource{src/reduced.bib}
。
工作流程如下:编译。运行脚本。这将使用必要的数据进行paper.tex
更新/创建src/reduced.bib
MasterDB.bib
和创建。再次paper.bbl
编译。paper.tex