BibTeX, Ruby und CSL

Veröffentlicht von Ramon Voges am 16.05.2017 7 Minuten zum Lesen

In diesem Beitrag zeige ich, wie sich dank Ruby und CSL Einträge aus einer BibTeX-Datenbank auslesen und weiterverarbeiten lassen. Das ist insbesondere dann hilfreich, wenn man außerhalb des LaTeX-Ökosystems auf seine Literaturangaben zugreifen möchte.

Das Problem

Als Historiker liest man viel. Um einen Überblick über die zahllosen Bücher zu behalten, die man im Zuge seiner Forschung und Lehre durcharbeitet, sind digitale Werkzeuge zur Literaturverwaltung unabdingbar. LaTeX hilft hier weiter, weil es mit BibTeX eine Möglichkeit bietet, Literaturangaben nicht nur in reinem Text zu speichern, sondern auch auf unterschiedliche Weise in die selbst geschriebenen Texte einzubinden. Programme wie BibDesk erleichtern zudem die Eingabe der Daten und bieten zugleich einen komfortablen Überblick über die einzelnen Einträge.

Wie aber lässt sich mit den mühevoll eingetragenen Daten arbeiten, wenn man kein LaTeX-Dokument erstellen möchte? Was ist, wenn man schnell einen Eintrag in einem bestimmten Zitationsschema benötigt? Copy und Paste der einzelnen Angaben und dann von Hand in das richtige Format bringen?

CSL und Ruby

Abhilfe schaffen hier zwei großartige Technologien: die Citation Style Language (CSL) und die Programmiersprache Ruby.

Hinter dem Akronym CSL verbirgt sich eine domänenspezifische Auszeichnungssprache, die auf XML basiert und dazu genutzt wird, Style Sheets bzw. Zitationsschemata zu definieren. Das bedeutet, CSL dient dazu, das Format von Zitationen und Bibliographien zu beschreiben. Da es sich bei CSL um eine XML-Sprache handelt, ist sie quelloffen und steht jedem zur Verfügung, um einen eigenen Zitationsstil zu entwickeln. Mittlerweile gibt es bereits mehr als 6000 Stile, die über Github heruntergeladen werden können. Einige Programme zur Literaturverwaltung benutzen sie standardmäßig, um ihre Angaben damit zu formatieren. Zotero ist eines von ihnen. Über das Zotero Style Repository lassen sich darüber hinaus einzelne Zitationsschemata auswählen und speichern.

Mit CSL allein kommt man allerdings noch nicht weit, wenn man einen BibTeX-Eintrag in ein bestimmtes Format überführen möchte. Für gewöhnlich sehen solche Einträge wie folgt aus:

@article{Voges:2016,
	Author = {Voges, Ramon},
	Date-Added = {2016-12-14 17:52:59 +0000},
	Date-Modified = {2016-12-14 17:53:20 +0000},
	Gender = {sm},
	Hyphenation = {english},
	Journal = {BMGN -- Low Countries Historical Review},
	Keywords = {Hogenberg, Aufsatz, Ikonoklasmus, Ikonographie, Bildersturm},
	Number = {1},
	Pages = {121--140},
	Read = {1},
	Shorttitle = {Power, Faith, and Pictures},
	Title = {Power, Faith, and Pictures. Frans Hogenberg's Account of the Beeldenstorm},
	Volume = {131},
	Year = {2016}}

Hier kommt Ruby ins Spiel. Ruby ist eine Mehrzweck-Skriptsprache, mit der sich nicht nur Programme für die Systemadministration, sondern auch ganze Web-Applikationen erstellen lassen. Wegen seiner klaren und gut lesbaren Syntax glänzt Ruby insbesondere dann, wenn mit Text gearbeitet wird. Ein Ruby-Programm könnte deswegen den gewünschten Eintrag ansteuern, die einzelnen Felder auslesen und dann wieder in einer vorher festgelegten Weise zusammensetzen. All das ließe sich allein in Ruby bewerkstelligen. Zusammen mit CSL wird aber das ganzen Unterfangen bedeutend einfacher.

Das Skript

Zunächst laden wir die Gems, mit denen sich BibTeX-Dateien verarbeiten lassen. Um CSL in Ruby prozessieren und rendern zu können, benötigen wir außerdem noch das Gem citeproc und die CSL-Stile csl/styles.1

require 'bibtex'
require 'citeproc'
require 'csl/styles'

Anschließend laden wir die BibTeX-Datei, aus der wir unsere Einträge beziehen möchten:

bib = BibTeX.open(ARGV.shift)

Mit dem Argument ARGV.shift geben wir Ruby zu verstehen, dass im ersten Parameter unseres Programmaufrufs Pfad und Dateiname unserer BibTeX-Datei steckt. Die dadurch geladenen Literaturangaben speichern wir in der Variable bib ab.

Den CSL-Prozessor laden wir in die Variable cp:

cp = CiteProc::Processor.new style: 'foerster-geisteswissenschaft', format: 'text', locale: 'de-DE'

Als Stil habe ich hier foerster-geisteswissenschaft gewählt, der den Gepflogenheiten der historischen Zunft am nächsten kommt.2 Als Ausgabeformat kann neben text auch html gewählt werden. Außerdem verwende ich die deutsche Lokalisierung des Stils.

Daraufhin importieren wir die BibTeX-Daten in den CSL-Prozessor:

cp.import bib.to_citeproc

Zuletzt schreiben wir das gerenderte Ergebnis auf die Standardausgabe. Da wir aber nicht alle, sondern nur bestimmte Einträge möchten, müssen wir noch über den Parameter id spezifizieren, welche wir auswählen:

puts cp.render :bibliography, id: ARGV.shift.to_s

Dafür greifen wir auf das nächste Argument zurück, das wir beim Programmstart angeben.

Wenn wir nicht nur einen Cite Key auswählen möchten, sondern mehrere bibliographische Einträge, können wir über das Feld ARGV solange iterieren, bis es keine Werte mehr enthält:

ARGV.each do |cite_key|
  puts cp.render :bibliography, id: cite_key.to_s
end

Das ganze Skript sieht dann wie folgt aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Lädt die benötigten Gems
require 'bibtex'
require 'citeproc'
require 'csl/styles'

# Lädt die Bibtex-Datei
bib = BibTeX.open(ARGV.shift)

# Generiert einen neuen CiteProc-Prozessor
cp = CiteProc::Processor.new style: 'foerster-geisteswissenschaft', format: 'text', locale: 'de-DE'

# Lädt die Bibtex-Angaben in den Prozessor
cp.import bib.to_citeproc

# Schreibt die Einträge mit den Cite Keys aus ARGV in STDOUT
ARGV.each do |cite_key|
  puts cp.render :bibliography, id: cite_key.to_s
end

Speichere ich das Skript unter csl4bibtex.rb ab, kann ich es beispielsweise mit ruby csl4bibtex.rb Arbeit.bib Horkheimer:2006 aufrufen. Ich erhalte dann diese Ausgabe:

Horkheimer, Max und Theodor W. Adorno: Dialektik der Aufklärung. Philosophische Fragmente, 16. Aufl., Frankfurt am Main: Fischer 2006.

Wenn ich ruby csl4bibtex.rb Arbeit.bib Horkheimer:2006 Barthes:2012 eingebe, erhalte ich folgende:

Horkheimer, Max und Theodor W. Adorno: Dialektik der Aufklärung. Philosophische Fragmente, 16. Aufl., Frankfurt am Main: Fischer 2006.
Barthes, Roland: Das Rauschen der Sprache, übers. von Dieter Hornig, Frankfurt am Main: Suhrkamp Verlag 2012 (Kritische Essays).

Über eine sogenannte Pipe | lässt sich die Ausgabe außerdem in die Zwischenablage kopieren. Auf diese Weis können die exportierten Angaben auch in anderen Programmen Verwendung finden:

ruby csl4bibtex.rb Arbeit.bib Horkheimer:2006 | pbcopy

Von hier aus können wir noch zahlreiche Erweiterungen an unserem Skript vornehmen, z.B. eine Hilfeseite und Fehlermeldungen für den Fall einbauen, dass nicht alle oder falsche Argumente angegeben wurden. Oder wir geben eine Reihe von Zitationsstilen zur Auswahl vor. Aber das hebe ich mich für ein andermal auf.

Fazit

In diesem Beitrage habe ich zeigen wollen, wie einfach und praktisch sich Ruby, BibTeX und CSL miteinander kombinieren lassen, um bibliographische Angaben aus einer Datenbank auszulesen und in ein gewünschtes Format zu überführen. Nachdem die dafür notwendigen Bibliotheken geladen wurden, benötigt Ruby dafür lediglich vier bzw. sechs Zeilen.

Wie man das Skript in ein ausführbares Programm verwandelt und damit den Aufruf noch komfortabler gestaltet kann, erkläre ich in einem späteren Beitrag.

  1. Falls noch nicht geschehen, lassen sich alle benötigten Gems mit gem install bibtex-ruby citeproc-ruby csl-styles installieren. Bei manchen Windows-Versionen muss noch ein sudo vorweggeschickt werden. Nach Möglichkeit sollte das aber aus Sicherheitsgründen vermieden werden. Für die Github-Repositorien siehe bibtex-ruby und citeproc-ruby. Die dort gezeigten Beispiele waren sehr hilfreich. 

  2. Vgl. dazu auch die Seite von Sascha Förster