von Patrick Gundlach |

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.

  1. Das Modul in das lokale Verzeichnis kopieren (der einen symbolischen Link zu erstellen)
  2. 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.

Die Ausgabe aus unserer TeX-Datei von oben.