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"). # !TEX none #! /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. gefragt 25 Apr '15, 18:35 glauschwuffel stefan ♦♦
Ergebnis 5 von 7
show 2 more comments
|
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 Die im Beispiel geladene 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} beantwortet 03 Mai '15, 14:49 Henri 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, 22:00)
glauschwuffel
|
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.
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.
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.
So, Datenbankauszüge hinterlegt. Ein Hinweis auf einen entsprechenden Abschnitt der biblatex-Dokumentation würde mir schon helfen.
http://tex.stackexchange.com/search?q=biblatex+filter
Danke! Ich grabe mich dann mal da durch.
Danke Ulrike, das hilft mir schon einmal weiter.