使用 biber,如何声明给定文件中的所有引用属于给定类别?

使用 biber,如何声明给定文件中的所有引用属于给定类别?

我正在使用biblatexBiber。我使用类别来分离属于不同类型的引文,并相应地生成不同的参考书目。假设我有一个a.bib文件,其中包含 bib 记录(假设带有标签a1、a2、...),它们都属于一个类别c1,还有一个b.bib文件,其中包含 bib 记录(标签b1b2...),它们都属于类别c2。目前,我写了类似这样的内容:

\usepackage[citestyle=numeric-comp,backend=biber,defernumbers=true]{biblatex}
\DeclareBibliographyCategory{c1}
\DeclareBibliographyCategory{c2}
\addtocategory{c1}{a1,a2,...}
\addtocategory{c2}{b1,b2,...}
\addbibresource{a.bib}
\addbibresource{b.bib}

有没有一种简单的方法可以说:“中的所有 bib 记录都a.bib属于c1,而无需全部列出?”

答案1

biblatex为将条目拆分/分类为任意子集的任务提供了两种主要解决方案

  1. 书目类别和
  2. 关键词。

书目类别在文档端实时工作。您可以使用声明类别,\DeclareBibliographyCategory并使用将条目添加到类别中\addtocategory。类别对于临时分类和分组很有用,这些分类和分组可能因文档而异。类别的一个很好的例子是如何将参考书目分为“引用的作品”和“未引用的作品”?,其中类别用于划分所引用著作和添加的参考书目\nocite

另一方面,关键字被添加到.bib字段中的文件中keywords。它们不需要在文档中进一步设置,可以直接用于过滤书目keyword=<keyword>或用于通用测试\ifkeyword{<keyword>}{<true>}{<false>}。由于关键字来自.bib,因此它们通常与特定入口而不是文档

大多数情况下,一旦了解/定义了类别和关键词,就可以以类似的方式使用。


当 Biber/BibTeX 处理完您的.bib文件并将数据传递到biblatex时,.bbl没有关于每个条目的数据源的信息。这使得从.bib文件生成类别变得极其困难,因为相关数据不再可用。

不过,有一个技巧可以让 Biber 添加不同的关键词对于每个.bib文件,如下所示biblatex:按不同的 .bib 文件分类的多个参考书目

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{csquotes}
\usepackage[backend=biber,style=authoryear]{biblatex}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \perdatasource{\jobname-primary.bib}
      \step[fieldset=keywords, fieldvalue={, primary}, append]
    }
    \map{
      \perdatasource{\jobname-secondary.bib}
      \step[fieldset=keywords, fieldvalue={, secondary}, append]
    }
  }
}

\usepackage{filecontents}
\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}

\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}

如果你坚持类别,这可以作为一种迂回的方式,最终产生如下的类别。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{csquotes}
\usepackage[backend=biber,style=authoryear]{biblatex}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \perdatasource{\jobname-primary.bib}
      \step[fieldset=keywords, fieldvalue={, primary}, append]
    }
    \map{
      \perdatasource{\jobname-secondary.bib}
      \step[fieldset=keywords, fieldvalue={, secondary}, append]
    }
  }
}

\DeclareBibliographyCategory{primary}
\DeclareBibliographyCategory{secondary}

\AtDataInput{%
  \ifkeyword{primary}
    {\addtocategory{primary}{\thefield{entrykey}}}
    {}%
  \ifkeyword{secondary}
    {\addtocategory{secondary}{\thefield{entrykey}}}
    {}%    
}

\usepackage{filecontents}
\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}

\addbibresource{\jobname-primary.bib}
\addbibresource{\jobname-secondary.bib}

\begin{document}
Some citations: \cite{hectic}, \cite{flutter}.
\printbibliography[title=Primary Sources, category=primary]
\printbibliography[title=Secondary Sources, category=secondary]
\end{document}

但我怀疑这是否会带来很大的优势。

相关内容