LuaTeX, Module und TeXlive 2017
Heute schreibe ich über eine Sache, die nicht unmittelbar mit dem Publisher zu tun hat. LuaTeX kann seit langem C-Module (.so) zur Laufzeit hinzulinken. In der Version kommenden Version 2017 von TeXlive funktioniert das nun auch für Mac OS X. Unter Linux geht das schon länger und unter Windows vermutlich auch (wer mag das testen?). Dieses Feature werde ich in einer zukünftigen Version des Publishers nutzen.
Ein Beispiel, das ich schon mal vor längerer Zeit auf tex.stackexchange.com gepostet hatte, wiederhole ich hier. Es geht um den Zugriff von Datenbanken (hier: sqlite) von LaTeX (LuaLaTeX). Es soll eine einfache Tabelle aus den Daten der Datenbank ausgegeben werden. Dazu wird erst einmal das slite3-Modul von LuaRocks installiert.
LuaRocks
Unter https://luarocks.org/ kann man sich viele Module für Lua herunter laden. Man kann sich das wie ein Paketmanager für Lua vorstellen.
Der Befehl, um z.B. das Modul für die sqlite3 Datenbank herunter zu laden, lautet
luarocks install luasql-sqlite3
Da bei mir die sqlite3 Bibliothek nicht in einem Standardpfad installiert ist, muss ich zusätzlich den Pfad angeben:
luarocks install luasql-sqlite3 SQLITE_DIR=/opt/homebrew/Cellar/sqlite/3.9.2
Dieser ist natürlich für jeden unterschiedlich.
Einbinden des Moduls
Das Modul wird in Lua mit
luasql = require("luasql.sqlite3")
geladen. LuaTeX hat aber keine direkte Verbindung zu LuaRocks, so dass man zwei Möglichkeiten hat, auf das Modul zuzugreifen.
- Das Modul in das lokale Verzeichnis kopieren (der einen symbolischen Link zu erstellen)
- Einen speziell angepassten Loader für Module zu nutzen. Hier werde ich nicht weiter drauf eingehen, einen funktionierenden Code gibt es unter tex.stackexchange.com/a/219228.
Da das Modul mit luasql.sqlite3
eingebunden wird, sucht LuaTeX im Verzeichnis luasql
eine Datei mit dem Namen sqlite3.so
(bzw. unter Windows vermutlich mit der Endung .dll
).
Dazu erstelle ich ein Verzeichnis und den symbolischen Link:
mkdir luasql
cd luasql
ln -s /opt/homebrew/lib/lua/5.2/luasql/sqlite3.so
Die Datenbank
Zum Testen erzeuge ich eine kleine Datenbank mit einer Tabelle und drei Einträgen:
CREATE TABLE people(
name varchar(50),
email varchar(50)
);
INSERT INTO "people" VALUES('Jose das Couves','jose@couves.com');
INSERT INTO "people" VALUES('Manoel Joaquim','manoel.joaquim@cafundo.com');
INSERT INTO "people" VALUES('Maria das Dores','maria@dores.com');
Diesen Text speichert man unter createdb.txt
und erzeugt die Tabellen wie folgt:
sqlite3 luasql-test < createdb.txt
Die Datenbank heißt nun luasql-test
.
Und nun der LaTeX-Quellcode
\documentclass{article}
\usepackage{luacode,booktabs}
\begin{document}
\begin{luacode*}
luasql = require("luasql.sqlite3")
env = assert (luasql.sqlite3())
-- connect to data source
con = assert (env:connect("luasql-test"))
-- retrieve a cursor
cur = assert (con:execute"SELECT name, email from people")
-- print all rows, the rows will be indexed by field names
row = cur:fetch ({}, "a")
tex.sprint([[\begin{tabular}{@{}ll@{}}\toprule]])
tex.sprint([[Name & email \\\midrule]])
while row do
tex.sprint(-2,row.name)
tex.sprint("&")
tex.sprint(-2, row.email)
tex.sprint("\\\\")
-- reusing the table of results
row = cur:fetch (row, "a")
end
tex.sprint([[\bottomrule\end{tabular}]])
-- close everything
cur:close()
con:close()
env:close()
\end{luacode*}
\end{document}
Der Code ist zwar etwas unübersichtlich, aber gar nicht so kompliziert.
Es wird praktisch nur Lua-Code ausgeführt.
Dort wird die (oben erstellte) Datenbank geöffnet, die SQL-Abfrage ausgeführt und in einer Schleife mit speziellen tex.sprint()
-Befehlen LaTeX-Code erzeugt.
Solange die Tabelle in der Variablen row
existiert, werden die einzelnen Inhalte ausgegeben. Die -2 bei tex.sprint()
bedeutet, dass die Sonderzeichen wie &
oder #
keine besondere Bedeutung haben und einfach so ausgegeben werden (für TeXniker: die Catcodes haben alle den Wert 12 - other).
Um diese Schleife herum wird eine tabular
-Umgebung erzeugt, die man von LaTeX her kennt.
Die übrigen Zeilen dienen nur zum Öffnen und Schließen der Datenbank. Die Dokumentation zu luasql ist auf der Seite des Kepler-Projekts zu finden.