Ich frage mich, ob es eine Möglichkeit gibt, die BibTeX-Einträge direkt aus dem LuaLaTeX-Quellcode des zu kompilierenden Dokuments zu generieren. Bei einem bestimmten Ablagesystem könnte der LuaTeX-Quellcode alle gewünschten Informationen enthalten:
- Dokumenttyp (Artikel, Bericht, Buch)
- Autor/Titel
- Benutzerdefinierte Variablennamen wie Version, Abteilung usw.
Wenn auf diese Variablen vom Lua-Teil des Codes aus zugegriffen werden kann und das \directlua
Schreiben von Dateien möglich ist, kann .bib
beim Kompilieren des Dokuments möglicherweise eine Datei generiert werden.
Ich frage mich, ob meine Frage berechtigt ist und ob jemand bereits etwas Ähnliches versucht hat, wie ich es oben beschrieben habe.
Antwort1
Lua ist definitiv nicht erforderlich. Meine Vorlage für meine eigenen Arbeitsdokumente beginnt mit
%% Metadata
\begin{filecontents}[overwrite,noheader]{\jobname.meta-bib}
@article
author = {test, test},
title = {title},
keywords = {GR},
\end{filecontents}
\documentclass{amsart}
\usepackage{...
Auf diese Weise können Sie beliebige bibliografische Daten in die filecontents
Umgebung einfügen und in einer Datei speichern .meta-bib
, die Sie dann mithilfe eines Shell-Skripts absaugen können. (In meinem Fall sind die von mir eingefügten Daten unvollständig [es fehlen einige Klammern und der Identifizierungsschlüssel], da mein Shell-Skript zum Absaugen diese automatisch generiert, aber Sie können stattdessen auch alles von Hand machen.)
Die obige Lösung ist wahrscheinlich die flexibelste, da sie keine Kenntnisse/Annahmen über einzelne Dokumentklassen erfordert. Eine alternative Methode besteht darin, eine Paketdatei ( .sty
) zu schreiben, die diesen Prozess automatisiert; dies würde erfordern
Neudefinition
\title
zum Schreiben des Langtitels in die Bib-Datei; bei Dokumentklassen, die optionale Argumente zulassen, muss darauf geachtet werden\title
.Neudefinition
\author
, um die Autoreninformationen in die Bib-Datei zu schreiben. Dies kann äußerst schwierig sein, da einige Dokumentklassen die Autorenadresse als Teil des\author
Befehls erwarten und andere nicht. Einige Dokumentklassen listen einzelne Autoren mit mehreren\author
Aufrufen auf und einige Dokumentklassen verwenden\author{Author1 \and Author2 \and Author3}
.Da es mir nicht gelingt, dies für alle von mir verwendeten Dokumentklassen vollständig zu automatisieren, bin ich dazu übergegangen,
filecontents
die Daten einfach von Hand zu schreiben.Wenn Ihr Artikel veröffentlicht wird, können Sie die Veröffentlichungsinformationen (Zeitschrift, Band, Datum) auf keinen Fall allein anhand der Quelle herausfinden.es sei dennSie codieren es irgendwie fest in die TeX-Datei. In diesem Fall erhalten Sie etwas, das fast dasselbe ist wie die
filecontents
oben erwähnte Lösung, aber viel weniger Flexibilität bietet.
Auf Anfrage das „Vakuumskript“ (nichts Besonderes, außer dass es auch Zeitstempel mithilfe der Git-Commit-Informationen generiert)
#!/bin/bash
BIBFILE="entries.bib"
echo '% Automatically generated entries database' > $BIBFILE
echo -n '% Updated: ' >> $BIBFILE
date >> $BIBFILE
for texfile in `git ls-tree master --name-only *tex`
do
bname=`basename -s .tex $texfile`
if [ ${bname}.meta-bib -ot $texfile ]
then
echo "${texfile} out of date, skipping."
else
moddate=`git log -n 1 --date="format:%F %R" --format="format:%cd" ${texfile}`
modcommit=`git log -n 1 --format="format:%h" ${texfile}`
origdate=`git log --date="format:%F" --format="format:%cd" --diff-filter=A ${texfile}`
head -n 1 ${bname}.meta-bib >> $BIBFILE
echo "{ $bname," >> $BIBFILE
tail -n +2 ${bname}.meta-bib >> $BIBFILE
echo "lastdate = {${moddate}}," >> $BIBFILE
echo "lastcommit = {${modcommit}}," >> $BIBFILE
echo "origdate = {${origdate}}," >> $BIBFILE
echo "url = {${texfile}}," >> $BIBFILE
echo '}' >> $BIBFILE
fi
done
Antwort2
Obwohl lua
es nicht erforderlich ist, lua
erleichtert es das Übertragen von Informationen von Tex in eine Datei. Soweit ich weiß, filecontents
handelt es sich um eine verbatim-ähnliche Umgebung, und es ist nicht einfach, Variablen aus TeX zu übergeben. Daher habe ich mir ein eigenes Minimalbeispiel ausgedacht, das ich unten zeige. Jetzt, da man Variablen an Lua übergeben kann, kann man ein so komplexes oder einfaches Skript schreiben, wie es in Lua erforderlich ist, um die Dinge in Gang zu bringen.
\documentclass{article}
\title{New Article}
\author{New Author}
\RequirePackage{luatextra}
\begin{luacode}
function writebib(author)
bibtex_file = io.open("meta.bib", "w")
bibtex_file:write("@techreport{alpha,title={Me},author={")
bibtex_file:write(author)
bibtex_file:write("}}")
end
\end{luacode}
\begin{document}
\maketitle
\makeatletter
\directlua{writebib("\luaescapestring{\@author}")}
\makeatother
\end{document}