Wie kann ich Auszüge aus BibTeX-Datenbanken in Tabellenform darstellen?
Ich möchte in einem LaTeX-Dokument Auszüge aus einer BibTeX-Datenbank tabellarisch ausgeben.
Konkrete beispielhafte Problemstellung: Ich möchte alle Werke einer Reihe, die ein bestimmter Autor verfasst hat, in meinem LaTeX-Dokument in einer Tabelle darstellen.
Darüber hinaus möchte ich nicht nur ein Autorenverzeichnis erstellen, sondern weitere Auszüge tabellarisch darstellen, die auf nahezu beliebigen Filtern basieren (z.B. Autor, Verlag, Jahr der Originalveröffentlichung).
Mein Dokument übersetze ich mit LuaLaTeX. Ich vermute daher, dass es am aufwandärmsten ist, mit einem Lua-Modul direkt die BibTeX-Datenbank einzulesen, die erhaltene Datenstruktur zu filtern und die Ergebnisse als Tabelle auszugeben.
Nachfolgend gebe ich ein nicht-minimales Beispiel zum Auslesen der BibTeX-Datenbank "Referenzen.bib" in Perl 5. Der hier erstellte Auszug enthält alle Einträge des Autors "Robert Arthur" und der Reihe "Die drei ???". Sortiert wird die Tabelle nach dem Jahr der Originalveröffentlichung ("origyear").
#! /usr/bin/env perl
use strict;
use warnings;
use Text::BibTeX;
use feature 'say';
my $bibfile = Text::BibTeX::File->new('Referenzen.bib');
my @entries_by_author;
while ( my $entry = Text::BibTeX::Entry->new($bibfile) ) {
next unless $entry->parse_ok;
my $name = $entry->get('author');
next if $name ne 'Robert Arthur';
my $series = $entry->get('series');
next unless defined $series;
next if $series ne 'Die drei ???';
push @entries_by_author, $entry;
}
print_table( \@entries_by_author );
sub print_table {
my ($entries_by_author) = @_;
# sort ascending by origyear;
my @sorted = sort {$a->get('origyear') <=> $b->get('origyear')} @$entries_by_author;
open_table();
print_table_entry($_) for @sorted;
close_table();
}
sub open_table {
say '\begin{longtable}[c]{@{}llll@{}}
\caption{Alle von Robert Arthur verfassten Titel der
Buchreihe.}\tabularnewline
\toprule
\begin{minipage}[b]{0.38\columnwidth}\raggedright\strut
Originaltitel
\strut\end{minipage} &
\begin{minipage}[b]{0.08\columnwidth}\raggedright\strut
Jahr
\strut\end{minipage} &
\begin{minipage}[b]{0.36\columnwidth}\raggedright\strut
deutscher Titel
\strut\end{minipage} &
\begin{minipage}[b]{0.07\columnwidth}\raggedright\strut
Jahr
\strut\end{minipage}\tabularnewline
\midrule
\endfirsthead
\toprule
\begin{minipage}[b]{0.38\columnwidth}\raggedright\strut
Originaltitel
\strut\end{minipage} &
\begin{minipage}[b]{0.08\columnwidth}\raggedright\strut
Jahr
\strut\end{minipage} &
\begin{minipage}[b]{0.36\columnwidth}\raggedright\strut
deutscher Titel
\strut\end{minipage} &
\begin{minipage}[b]{0.07\columnwidth}\raggedright\strut
Jahr
\strut\end{minipage}\tabularnewline
\midrule
\endhead';
}
sub close_table {
say '\bottomrule
\end{longtable}';
}
sub print_table_entry {
my ($entry) = @_;
my $origyear = $entry->get('origyear');
my $year = $entry->get('year');
my $origtitle = $entry->get('origtitle');
my $title = $entry->get('title');
unless ( $origyear and $year and $origtitle and $title ) {
warn 'There are undefined values in entry ' . $entry->key . "\n";
return;
}
say '\begin{minipage}[t]{0.38\columnwidth}\raggedright\strut
' . $origtitle . '
\strut\end{minipage} &
\begin{minipage}[t]{0.08\columnwidth}\raggedright\strut
' . $origyear . '
\strut\end{minipage} &
\begin{minipage}[t]{0.36\columnwidth}\raggedright\strut
' . $title . '
\strut\end{minipage} &
\begin{minipage}[t]{0.07\columnwidth}\raggedright\strut
' . $year . '
\strut\end{minipage}\tabularnewline
';
}
Ein ähnliches Beispiel in Lua kann ich leider nicht liefern, da ich nicht weiß, wie ich die BibTeX-Datenbank einlesen und in eine Datenstruktur überführen kann.
Ein paar Einträge aus der Referenzen.bib:
@book{arthur:1975a,
Author = {Robert Arthur},
Language = {deutsch},
Origauthor = {Robert Arthur},
Origlanguage = {english},
Origtitle = {Alfred Hitchcock and The Three Investigators in The Mystery of the Green Ghost},
Origyear = {1965},
Publisher = {Frankh'sche Verlagsbuchhandlung, W. Keller \& Co.},
Series = {Die drei ???},
Title = {Die drei ??? und der gr{\"u}ne Geist},
Translator = {Leonore Puschert},
Year = {1975}}
@book{carey:1975,
Author = {M.V. Carey},
Date-Modified = {2015-04-26 11:10:08 +0000},
Language = {deutsch},
Origauthor = {M.V. Carey},
Origlanguage = {english},
Origtitle = {Alfred Hitchcock and The Three Investigators in The Mystery of the Singing Serpent},
Origyear = {1972},
Publisher = {Frankh'sche Verlagsbuchhandlung, W. Keller \& Co.},
Series = {Die drei ???},
Title = {Die drei ??? und die singende Schlange},
Translator = {Leonore Puschert},
Year = {1975}}
@book{arden:1976a,
Author = {William Arden},
Date-Modified = {2015-04-26 11:04:11 +0000},
Language = {deutsch},
Origauthor = {William Arden},
Origlanguage = {english},
Origtitle = {Alfred Hitchcock and The Three Investigators in The},
Origyear = {1972},
Series = {Die drei ???},
Title = {Die drei ??? und die r{\"a}tselhaften Bilder},
Translator = {Leonore Puschert},
Year = {1976}}
@book{carey:1976,
Author = {M.V. Carey},
Date-Modified = {2015-04-26 11:05:31 +0000},
Language = {deutsch},
Origauthor = {M.V. Carey},
Origlanguage = {english},
Origtitle = {Alfred Hitchcock and The Three Investigators in The Mystery of the Monster Mountain},
Origyear = {1973},
Series = {Die drei ???},
Title = {Die drei ??? und das Bergmonster},
Translator = {Leonore Puschert},
Year = {1976}}
Ich möchte nun nur jene Einträge ermitteln, bei denen Author und Series einen festen Wert annehmen (hier "Robert Arthur" und "Die drei ???"). Vielleicht hilft zur Konkretisierung ja mein obiger Perl-Code.