问题

问题

问题

如果文档本身不引用交叉引用条目,而只引用引用它们的条目,我该如何确保交叉引用条目包含在为文档.bib生成的文件中?需要明确的是,我不希望交叉引用条目单独出现在参考列表中,但我需要它们出现在文件中,以便我引用的条目有完整的数据。biber.bib

背景

考虑以下使用常规参考书目条目数据库(此处包含为orig.bib)的文档:

\documentclass{article}
\usepackage[backend=biber]{biblatex}
  \bibliography{orig}
\usepackage{filecontents}
\begin{filecontents}{orig.bib}
@bookinbook{author-bk1,
  crossref = {author-bigbk},
  title = {Originally a Separate Book},
  pages = {345--789}}

@suppbook{author-essays-intro,
  crossref = {author-essays},
  title = {Introduction},
  pages = {1--8}}

@incollection{author-essay,
  crossref = {editor-collection},
  title = {My Essay},
  pages = {8-34},
  author = {Author, Bit Busy}}

@book{author-bigbk,
  author = {Author, Prolific},
  title = {Collected Works},
  year = 1453,
  publisher = {Printers 'R Us},
  address = {Milky Way}}

@book{author-essays,
  title = {Essays},
  author = {Author, Busy},
  year = 1578,
  publisher = {We Print 4U},
  address = {Alpha Centauri}}

@book{editor-collection,
  editor = {Editor, Fair},
  booktitle = {Collection of People's Thoughts},
  year = 1679,
  publisher = {Great Collections in Print},
  address = {Earth}}
\end{filecontents}

\begin{document}

\autocites{author-bk1,author-essays-intro,author-essay}

\printbibliography

\end{document}

正如预期,结果如下:

完整参考列表

承诺

现在假设我想要生成一个.bib仅包含此特定文档所需的条目的文件。(显然,对于此示例来说,这毫无意义,因为orig.bib不包含任何其他内容,但当然通常情况并非如此。)

翻看biber的手册,我发现了这一点:

3.1.1 output_format 选项

Biber 能够输出 ... BibTeX .bib 文件。当您独立于任何特定文档转换整个数据源文件时,可以在工具模式下输出 .bib 文件(请参阅第 3.12 节)。当您想要一个仅包含文档中引用条目的新 .bib 文件(而不是 .bbl)时,它也很有用,例如,您可以将一个最小完整的包发送给某人进行排版。为此,您需要在第一次运行 LaTeX 后像这样调用 Biber:

biber --output_format=bibtex test.bcf 

这将生成一个名为 test_biber.bib 的新 .bib 文件,其中包含 test.tex 中所有引用的条目,按引用顺序排列,并根据各种 ouput_* 选项进行格式化。

所以我尝试这个:

biber --output_format=bibtex prawf3.bcf

问题

我的尝试创建prawf3_biber.bib

@BOOKINBOOK{author-bk1,
  CROSSREF = {author-bigbk},
  PAGES    = {345--789},
  TITLE    = {Originally a Separate Book},
}

@SUPPBOOK{author-essays-intro,
  CROSSREF = {author-essays},
  PAGES    = {1--8},
  TITLE    = {Introduction},
}

@INCOLLECTION{author-essay,
  AUTHOR   = {Author, Bit Busy},
  CROSSREF = {editor-collection},
  PAGES    = {8-34},
  TITLE    = {My Essay},
}

这显然不是你所希望的,因为使用这个.bib文件显然不会产生所需的结果。即:

\documentclass{article}
\usepackage[backend=biber]{biblatex}
  \bibliography{prawf3_biber}

\begin{document}

\autocites{author-bk1,author-essays-intro,author-essay}

\printbibliography

\end{document}

biber运行时会遇到问题:

INFO - Found 3 citekeys in bib section 0
INFO - Processing section 0
INFO - Looking for bibtex format file 'prawf3_biber.bib' for section 0
INFO - Found BibTeX data source 'prawf3_biber.bib'
WARN - I didn't find a database entry for crossref 'author-bigbk' in entry 'author-bk1' - ignoring (section 0)
WARN - I didn't find a database entry for crossref 'author-essays' in entry 'author-essays-intro' - ignoring (section 0)
WARN - I didn't find a database entry for crossref 'editor-collection' in entry 'author-essay' - ignoring (section 0)

由于没有交叉引用的条目,这显然是意料之中的。

biber手册确实讨论了在tool模式下使用 crossref 数据,但这似乎仅适用于转换整个数据源的情况。因此,如果我想将其应用于orig.bib,我可以这样做,然后我可以prawf3_biber.bib使用上述命令将(现在完整的)条目提取到其中。[至少,我认为我可以 - 我还没有测试过。]

重新审视问题

但是我如何确保生成的.bib文件中的条目包含来自交叉引用条目的数据没有转换原始.bib文件并没有引用文档中的交叉引用条目?

答案1

我终于搞清楚了如何做到这一点。在文档中,似乎--output_format我使用的方式与调用模式不同tool。因此,那里处理数据的方式crossref似乎与此处关注的情况无关。然而,

biber --help

更有帮助。特别是,它指出--output_format=bibtex tool仅在模式下有意义。因此,由于该选项显然是针对这种情况而设计的,正如文档所建议的那样,tool在这里使用模式也一定很有意义。此外,对于相对简单的用途,命令帮助也更容易理解。虽然tool模式文档详细介绍了如何为不同的数据源转换配置正确的处理类型,但命令帮助更好地阐明了基本选项。

具体来说,事实证明有一个选项可以实现这里想要的功能:

biber --output_format=bibtex --output_resolve prawf3.bcf

这样做的目的是不将交叉引用的条目包含在结果中.bib。相反,它的作用是完全的使用它们的条目与交叉引用条目中的数据。结果prawf3_biber.bib

@BOOKINBOOK{author-bk1,
  AUTHOR     = {Author, Prolific},
  BOOKAUTHOR = {Author, Prolific},
  BOOKTITLE  = {Collected Works},
  LOCATION   = {Milky Way},
  PAGES      = {345--789},
  PUBLISHER  = {Printers 'R Us},
  TITLE      = {Originally a Separate Book},
  YEAR       = {1453},
}

@SUPPBOOK{author-essays-intro,
  AUTHOR     = {Author, Busy},
  BOOKAUTHOR = {Author, Busy},
  BOOKTITLE  = {Essays},
  LOCATION   = {Alpha Centauri},
  PAGES      = {1--8},
  PUBLISHER  = {We Print 4U},
  TITLE      = {Introduction},
  YEAR       = {1578},
}

@INCOLLECTION{author-essay,
  AUTHOR    = {Author, Bit Busy},
  BOOKTITLE = {Collection of People's Thoughts},
  EDITOR    = {Editor, Fair},
  LOCATION  = {Earth},
  PAGES     = {8-34},
  PUBLISHER = {Great Collections in Print},
  TITLE     = {My Essay},
  YEAR      = {1679},
}

从很多方面来说这实际上比单独包含交叉引用的条目要好。

答案2

如果可能的话,出于显而易见的原因(尤其是方便),最好选择 cfr 的答案。

然而,如果需要避免 Biber 如何“解析”交叉引用的条目并将所有条目分开 - 例如,可能是因为您引用了一本论文集中的几篇文章,因此您仍然需要让每篇文章仅仅指向参考书目中的书籍而不是每篇文章都提供完整的书目参考 - 那么您可以这样做:

latex      basefile.tex 
biber -m 1 basefile.bcf     # `--mincrossref | -m 1` produces a .bbl with all the references
bbl2nocite basefile tmpfile # see below
latex      basefile.tex
biber --output_format=bibtex basefile.bcf # produces `basefile_biber.bib`

为了使它工作,您需要以某种方式\input提取您要提取的内容.bbl。我用一个无意义的脚本完成了此操作bbl2nocite,该脚本本质上只是总结grepsed

#!/bin/bash
#
# Find and convert all lines in a .bbl file from
# \entry{<key>}{<entrytype>}{}
# to
# \nocite{<key>}
#
# usage: bbl2nocite inputfile outputfile
INFILE=$1
OUTFILE=$2

grep '\\entry' $INFILE.bbl | sed 's/\\entry/\\nocite/g' | sed 's/}{.*/}/' > $OUTFILE.tex

您需要进行的其他修改是在.tex: 中,您需要将其添加到\input我上面调用的内容tmpfile.tex中。使用 cfr 的示例文件,您需要添加的内容是:

\input{tmpfile}

就在 ; 之前\printbibliography,或者你可以这样做:

\InputIfFileExists{tmpfile.tex}{\input{tmpfile}}{\relax}

最后,您将获得新的参考书目文件,以 结尾_biber.bib,在本例中应包含六个条目。

最后要注意的是,您可能需要注释掉该行并再次运行、和\Input...的序列以恢复参考书目的原始外观。例如,在上面的 cfr 文件中,此技术将导致所有六个项目都显示在参考书目中,这可能是不想要的。latexbiberlatex

相关内容