![biblatex:按不同的 .bib 文件分类的多个参考书目](https://linux22.com/image/242775/biblatex%EF%BC%9A%E6%8C%89%E4%B8%8D%E5%90%8C%E7%9A%84%20.bib%20%E6%96%87%E4%BB%B6%E5%88%86%E7%B1%BB%E7%9A%84%E5%A4%9A%E4%B8%AA%E5%8F%82%E8%80%83%E4%B9%A6%E7%9B%AE.png)
biblatex
通过查找 1) 条目类型、2) 关键字或 3) 类别支持多个书目。
这一切都很好,但在主要来源和次要来源的用例中:1)“类型”方法不起作用,2)为每个.bib
条目输入“主要”和“次要”关键字非常繁琐,3)声明按类别排序需要在文档中输入所有主键。
因此,如果我将所有主要 bib 条目存储在一个.bib
文件中,将次要条目存储在另一个文件中,biblatex
那么在导入该 bib 文件时,是否可以自动为所有条目分配关键字或类别?通过这种方式,可以轻松地在主要.bib
文件和次要文件之间交换条目,而无需摆弄单个关键字,我也不必在每个文档中将所有主要和/或次要条目输入到类别中。
答案1
这现在已在 Biber 0.9.8 中实现。以下是处理您的问题的方法。给出示例文件:
\begin{filecontents}{\jobname-primary.bib}
@BOOK{hectic,
AUTHOR = {Henry Hectic},
TITLE = {How Horticulturalists Howl},
PUBLISHER = {Honorary Books: Henage},
YEAR = {2000}
}
\end{filecontents}
\begin{filecontents}{\jobname-secondary.bib}
@BOOK{flutter,
AUTHOR = {Frederick Flutter},
TITLE = {Fraternising with Flowers},
PUBLISHER = {Frippery Pamphlets: Folkestone},
YEAR = {1995}
}
\end{filecontents}
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[backend=biber,style=authoryear]{biblatex}
\usepackage{csquotes}
\addbibresource{\jobname-primary.bib}
\addbibresource{\jobname-secondary.bib}
\begin{document}
Some citations: \cite{hectic}, \cite{flutter}.
\printbibliography[title=Primary Sources, keyword=primary]
\printbibliography[title=Secondary Sources, keyword=secondary]
\end{document}
您可以使用以下 biber.conf 文件在 Biber 读取数据时自动将正确的关键字添加到数据中:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<sourcemap>
<maps datatype="bibtex" bmap_overwrite="1">
<map>
<per_datasource>test-primary.bib</per_datasource>
<map_step map_field_set="KEYWORDS" map_field_value="primary"/>
</map>
<map>
<per_datasource>test-secondary.bib</per_datasource>
<map_step map_field_set="KEYWORDS" map_field_value="secondary"/>
</map>
</maps>
</sourcemap>
</config>
这将根据数据源名称添加必要的关键字。如果您的数据源中已经有要保留的 KEYWORD 字段,则可以使用匹配/替换功能:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<sourcemap>
<maps datatype="bibtex" map_overwrite="1">
<map>
<per_datasource>test-primary.bib</per_datasource>
<map_step map_field_source="KEYWORDS" map_match="^" map_replace="primary,"/>
</map>
<map>
<per_datasource>test-secondary.bib</per_datasource>
<map_step map_field_source="KEYWORDS" map_match="^" map_replace="secondary,"/>
</map>
</maps>
</sourcemap>
</config>
Biber 手册已在 0.9.8 中更新,其中包含配置文件格式的文档和更多示例。用户配置文件的格式与 0.9.6 相比发生了重大变化(与 0.9.7 相比也有一些变化),因为旧格式有点混乱,并且由于格式本身固有的限制,无法扩展以应对这种情况。我选择了真正的 XML 格式以获得灵活性。您现在还可以通过将选项传递--validate_config
给 Biber 来验证您的配置文件。
编辑:自 biber 1.3 起,您可以使用“附加”模式在源映射中设置值,因此这样更容易,当您想要保留任何现有值时,它可以处理有或没有现有 KEYWORDS 字段的条目:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<sourcemap>
<maps datatype="bibtex" bmap_overwrite="1">
<map>
<per_datasource>test-primary.bib</per_datasource>
<map_step map_field_set="KEYWORDS" map_field_value="primary" map_append="1"/>
</map>
<map>
<per_datasource>test-secondary.bib</per_datasource>
<map_step map_field_set="KEYWORDS" map_field_value="secondary" map_append="1"/>
</map>
</maps>
</sourcemap>
</config>
以下是使用 biblatex 宏接口的相同功能,您可以将其直接放入文档中:
\DeclareSourcemap{
\maps[datatype=bibtex, overwrite]{
\map{
\perdatasource{test-primary.bib}
\step[fieldset=KEYWORDS, fieldvalue=primary, append]
}
\map{
\perdatasource{test-secondary.bib}
\step[fieldset=KEYWORDS, fieldvalue=secondary, append]
}
}
}
答案2
我认为处理这个问题的最佳方法不是在 .bib 文件层面,而是使用特殊的 \cite 命令,它允许您临时定义哪个条目进入哪个参考书目。使用两个不同的 .bib 文件来处理两个参考书目意味着您必须提前一劳永逸地决定哪个条目进入哪里,我认为这并不明智。
我做了这样的事情:
\DeclareBibliographyCategory{sek}
\DeclareBibliographyCategory{prim}
\newcommand*{\citeprim}[2][]{\addtocategory{prim}{#2}\cite[#1]{#2}}
\newcommand*{\citesek}[2][]{\addtocategory{sek}{#2}\cite[#1]{#2}}
现在,如果您想将条目添加到主要来源的参考书目中,只需键入 即可\citeprim{citekey}
。您必须以这种方式设置要使用的所有 \cite 命令。但至少对我来说,这更有意义,因为当我实际处理文档时,我只需要关心哪个条目放在哪里。
答案3
使用 refsegment 实现难道不能实现这一点吗?摘自 Biblatex 文档:
refsegment 环境用于在文档主体中标记参考段。如果您想要一个按章节、节或文档的任何其他部分细分的全局参考书目,此环境非常有用。(第 74 页)
另请参阅第 101 - 103 页的使用示例
当然,如果您的两个参考书目仅适用于两个不同的部分,这才会适合您的需要。