
Die Frage
Wie kann ich sicherstellen, dass Querverweiseinträge in einer .bib
Datei enthalten sind biber
, die ich für ein Dokument erstelle, wenn das Dokument nicht die Querverweiseinträge selbst zitiert, sondern nur die Einträge, die auf sie verweisen? Um es klarzustellen: Ich möchte nicht, dass die Querverweiseinträge separat im Literaturverzeichnis erscheinen, sondern ich brauche sie in der .bib
Datei, damit vollständige Daten für die Einträge verfügbar sind, die ich zitiere.
Hintergrund
Betrachten Sie das folgende Dokument, das eine reguläre Datenbank mit Bibliografieeinträgen verwendet (hier als enthalten 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}
Wie erwartet ergibt sich daraus folgendes:
Das Versprechen
Nehmen wir nun an, ich möchte eine Datei erstellen .bib
, die nur die Einträge enthält, die für dieses bestimmte Dokument erforderlich sind. (Bei diesem Beispiel wäre das natürlich sinnlos, da orig.bib
nichts anderes enthalten ist, aber das ist natürlich normalerweise nicht der Fall.)
Im biber
Handbuch von finde ich Folgendes:
3.1.1 Die Option output_format
Biber kann ... BibTeX-.bib-Dateien ausgeben. Die Ausgabe von .bib ist im Tool-Modus möglich, wenn Sie eine ganze Datenquellendatei unabhängig von einem bestimmten Dokument konvertieren (siehe Abschnitt 3.12). Dies ist auch nützlich, wenn Sie statt einer .bbl-Datei eine neue .bib-Datei möchten, die nur die zitierten Einträge aus einem Dokument enthält, sodass Sie beispielsweise ein minimal vollständiges Paket zum Satz an jemanden senden können. Dazu würden Sie Biber nach dem ersten LaTeX-Lauf folgendermaßen aufrufen:
biber --output_format=bibtex test.bcf
Das Ergebnis wäre eine neue .bib-Datei mit dem Namen test_biber.bib, die alle zitierten Einträge in test.tex in der Reihenfolge der Zitate enthält und entsprechend den verschiedenen ouput_*-Optionen formatiert ist.
Also versuche ich Folgendes:
biber --output_format=bibtex prawf3.bcf
Das Problem
Mein Versuch erzeugt 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},
}
was natürlich nicht das ist, was Sie sich erhoffen, da die Verwendung dieser .bib
Datei eindeutig nicht die gewünschten Ergebnisse liefert. Das heißt:
\documentclass{article}
\usepackage[backend=biber]{biblatex}
\bibliography{prawf3_biber}
\begin{document}
\autocites{author-bk1,author-essays-intro,author-essay}
\printbibliography
\end{document}
wird auf Probleme stoßen, wenn biber
ausgeführt wird:
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)
was offensichtlich nur zu erwarten ist, da die mit Querverweisen versehenen Einträge nicht vorhanden sind.
biber
Das Handbuch von bespricht zwar die Verwendung von CrossRef-Daten im tool
-Modus, aber das scheint nur beim Konvertieren einer gesamten Datenquelle zu gelten. Wenn ich das also auf anwenden wollte orig.bib
, könnte ich das tun und dann die (jetzt vollständigen) Einträge mit dem obigen Befehl in extrahieren prawf3_biber.bib
. [Zumindest gehe ich davon aus, dass ich das könnte – ich habe es nicht getestet.]
Die Frage noch einmal betrachtet
Aber wie kann ich sicherstellen, dass die Einträge in der generierten .bib
Datei mit Daten aus den Querverweiseinträgen ergänzt werden?ohneKonvertieren der Originaldatei .bib
undohneunter Zitierung der im Dokument enthaltenen Querverweise?
Antwort1
Ich habe endlich herausgefunden, wie das geht. In der Dokumentation sieht es so aus, als ob die Verwendung von --output_format
in der von mir beschriebenen Weise sich vom Aufrufmodus unterscheidet tool
. Die Art und Weise, wie crossref
Daten dort behandelt werden, scheint für den hier betroffenen Fall also nicht relevant zu sein. Allerdings
biber --help
ist eher hilfreich. Insbesondere heißt es darin, dass--output_format=bibtex
macht nur Sinn im tool
Modus. Da diese Option also, wie die Dokumentation nahelegt, eindeutig für solche Fälle vorgesehen ist, muss es sinnvoll sein, tool
auch hier den Modus zu verwenden. Darüber hinaus ist die Befehlshilfe für relativ einfache Anwendungen auch viel einfacher zu verstehen. Während die Dokumentation zum tool
Modus sehr detailliert auf die Konfiguration der richtigen Verarbeitungsarten für verschiedene Datenquellentransformationen eingeht, werden die grundlegenden Optionen in der Befehlshilfe besser erläutert.
Insbesondere stellt sich heraus, dass es eine Option gibt, genau das zu tun, was hier gewünscht wird:
biber --output_format=bibtex --output_resolve prawf3.bcf
Dies bewirkt, dass die Querverweise nicht in die resultierenden Einträge aufgenommen werden .bib
. Stattdessen wird Folgendes ausgeführt:vollständigdie Einträge, die sie verwenden, mit Daten aus den referenzierten Einträgen. Das Ergebnis 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},
}
was für viele Zwecke tatsächlich besser ist, als die mit Querverweisen versehenen Einträge separat aufzunehmen.
Antwort2
Wenn überhaupt möglich, ist aus offensichtlichen Gründen (vor allem der Bequemlichkeit) die Antwort von cfr vorzuziehen.
Wenn man jedoch vermeiden möchte, wie Biber Querverweise auflöst, und alle Einträge getrennt halten möchte – etwa, weil man mehrere Artikel aus einer Essaysammlung zitieren möchte und deshalb jeder Essay in der Bibliografie nur auf das Buch verweisen muss und nicht die vollständige bibliografische Referenz angeben muss –, könnte man etwa Folgendes tun:
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`
Damit dies funktioniert, müssen Sie irgendwie wissen, \input
was Sie extrahieren .bbl
. Ich habe dies mit einem hirnlosen bbl2nocite
Skript gemacht, das im Wesentlichen nur zusammenfasst grep
und sed
:
#!/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
Die andere Änderung, die Sie vornehmen müssen, ist in .tex
: Sie müssen \input
das tun, was ich tmpfile.tex
oben genannt habe. In der Beispieldatei von cfr müssen Sie nur Folgendes hinzufügen:
\input{tmpfile}
direkt vor dem \printbibliography
; oder Sie könnten stattdessen Folgendes tun:
\InputIfFileExists{tmpfile.tex}{\input{tmpfile}}{\relax}
Und schließlich erhalten Sie die neue Bibliografiedatei mit der Endung _biber.bib
, die in diesem Fall sechs Einträge enthalten sollte.
Als letztes ist zu beachten, dass Sie die Zeile möglicherweise auskommentieren \Input...
und eine Folge von latex
, biber
, und latex
erneut ausführen müssen, um zum ursprünglichen Erscheinungsbild der Bibliographie zurückzukehren. In der obigen Datei von cfr führt diese Technik beispielsweise dazu, dass alle sechs Einträge in der Bibliographie angezeigt werden, was möglicherweise nicht erwünscht ist.