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").

Open in Online-Editor
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
#! /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:

Open in Online-Editor
@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.

gefragt 25 Apr '15, 12:35

glauschwuffel's gravatar image

glauschwuffel
1112
Akzeptiert: 0%

bearbeitet 27 Apr '15, 04:36

saputello's gravatar image

saputello
18.4k22352

Da scheint die Formulierung meiner ersten Frage ja gründlich in die Hose gegangen zu sein :-( Ich formuliere mal etwas ausführlicher und konkreter.

Konkrete Problemstellung: Ich möchte alle Werke eines Autors innerhalb eines bestimmten Zeitraums in meinem LuaLaTeX-Dokument in einer Tabelle darstellen.

Da ich ja schon alle Daten in der BibTeX-Datenbank habe, möchte ich sie nicht in meinem Dokument duplizieren, sondern per Lua-Code auslesen und dann in dem Dokument weiterverarbeiten.

Ich suche also (vermutlich) ein Lua-Modul, das eine BibTeX-Datenbank parsen kann.

(25 Apr '15, 13:14) glauschwuffel

Danke für die Hinweise. Ich habe die Frage erneut überarbeitet. Den Lua-Bezug habe ich entfernt, weil es mir tatsächlich egal ist, ob ich den Auszug mit Lua oder einem LaTeX-Paket erhalte.

Code habe ich noch nicht, daher kann ich auch kein Minimalbeispiel liefern. Sobald das möglich ist, liefere ich aber gerne eines nach.

(26 Apr '15, 10:48) glauschwuffel
1

Du sagst du hast eine Datenbank aus der du etwas auslesen willst. Zeig die doch mal in Abschnitten her.

Das Paket biblatex bietet verschiedenste Filter, da ist bestimmt einer dabei der passt. Momentan ist die Frage aber so allgemein gestellt, dass man dazu nicht wirklich viel schreiben kann. Man könnte die Doku abschreiben, aber das wäre ja quatsch.

(26 Apr '15, 11:00) Johannes

So, Datenbankauszüge hinterlegt. Ein Hinweis auf einen entsprechenden Abschnitt der biblatex-Dokumentation würde mir schon helfen.

(26 Apr '15, 11:40) glauschwuffel

Danke! Ich grabe mich dann mal da durch.

(27 Apr '15, 15:04) glauschwuffel

Danke Ulrike, das hilft mir schon einmal weiter.

(10 Mai '15, 15:57) glauschwuffel
Ergebnis 5 von 7 Alle anzeigen

Ich habe einen minimalen Lua-Parser geschrieben, wobei die Regexes von http://rgieseke.github.io/ta-bibtex/ stammen. Ich bin mir sicher, dass der Parser nicht stabil ist und bei fehlformatierten BibTeX-Datenbanken scheitern wird. Derzeit werden nur BibTeX-Key, Autor, Titel und Jahr ausgelesen. Im Beispiel ist auch nur die Funktion \queryauthor implementiert. Man könnte das sicher noch besser machen indem man die Einträge ausliest und in eine relationale Datenbank speichert auf die man dann entsprechende Queries loslassen kann.

Die im Beispiel geladene test.bib ist die aus der Frage.

Open in Online-Editor
\documentclass{article}
\usepackage{luacode,booktabs,tabularx}
\begin{luacode*}
function parse_bibtex(filename)
   refs = {}
   file = io.open(filename, 'rb')
   entries = file:read('*all')
   file:close()
   for entry in entries:gmatch('@.-}\n') do
      key = entry:match('@%w+{(.-),') or ''
      author = entry:match('author%s*=%s*["{]*(.-)["}],?') or ''
      year = entry:match('year%s*=%s*["{]?(%d+)["}]?,?') or ''
      title = entry:match('title%s*=%s*["{]*(.-)["}],?') or ''
      refs[#refs + 1] = {
         key = key,
         author = author,
         year = year,
         title = title
      }
   end
   return refs
end

function query_author(lrefs,author)
   author_refs = {}
   for i=1,#lrefs do
      print(author .. " == " .. lrefs[i].author)
      if (author == lrefs[i].author) then
         print(lrefs[i].title)
         author_refs[#author_refs + 1] = lrefs[i]
      end
   end
   return author_refs
end

function pretty_print_table(lrefs)
   tex.sprint("\\begin{tabularx}{\\textwidth}{cXc}")
   tex.sprint("\\toprule")
   tex.sprint("Author & Title & Year \\\\")
   tex.sprint("\\midrule")
   for i=1,#lrefs do
      tex.sprint(lrefs[i].author .. " & "
              .. lrefs[i].title  .. " & "
              .. lrefs[i].year   .. " \\\\")
   end
   tex.sprint("\\bottomrule")
   tex.sprint("\\end{tabularx}")
end
\end{luacode*}
\newcommand\loadbibfile[1]{\directlua{refs = parse_bibtex('#1')}}
\newcommand\queryall{\directlua{pretty_print_table(refs)}}
\newcommand\queryauthor[1]{\directlua{pretty_print_table(query_author(refs,'#1'))}}
\begin{document}

\loadbibfile{test.bib}

\queryall

\queryauthor{Robert Arthur}

\queryauthor{M.V. Carey}

\end{document}

alt text

Permanenter link

beantwortet 03 Mai '15, 08:49

Henri's gravatar image

Henri
10.1k31730

Danke Henri, das geht genau in die Richtung, in die ich ursprünglich gehen wollte. Ich war davon ausgegangen, dass es einen BibTeX-Parser im Lua-Universum schon gibt und ich nur nicht weiß, wie ich ihn benutzen soll. Aber dem scheint ja nicht so zu sein.

Deine Lösung hilft mir schon sehr, dankeschön! :-)

(10 Mai '15, 16:00) glauschwuffel
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×56
×35
×30
×28

Frage gestellt: 25 Apr '15, 12:35

Frage wurde angeschaut: 2,809 Mal

Zuletzt aktualisiert: 10 Mai '15, 16:00