Neues Feature: tex.tprint(…)4
Ab jetzt gibt es ein neues Feature in LuaTeX. Darauf habe ich schon lange gewartet! Erst einmal zum Hintergrund: ich habe oft Benutzereingaben, die viele Zeichen enthalten, über die TeX stolpern würden. Zum Beispiel:
17% der Mitarbeiter der Müller GmbH & Co. KG aus
Grünwald\Niederhausen wählen gerne Menü #3.
Nun kann man unmöglich einen solchen Text TeX geben zum setzen, da die Zeichen %, &, \ und # (neben anderen Zeichen) eine besondere Bedeutung haben. Um dieses Problem zu umgehen gibt es zwei Wege: ich „escape“ diese Zeichen mit einem Backslash (\). Oder ich gebe diesem Text andere „category codes“ (Catcodes). Bei LuaTeX könnte das so aussehen:
tex.sprint(-2,"17% der Mitarbeiter ...")
Damit wird der Text in den Anführungszeichen mit den Catcodes aus der Catcodetabelle -2 gesetzt, das ist eine interne Tabelle wo keine Zeichen eine besondere Bedeutung haben. Aber das hat einen kleinen Haken: ich kann auch keine TeX-Kommandos mehr ausführen. Es hat etwas von „wasch mich, aber mach mich nicht nass“. Ich will den Text ohne Sonderzeichen benutzen, aber trotzdem die Sonderzeichen erlauben, um TeX-Kommandos auszuführen. Dafür gibt es jetzt eine Lösung: tex.tprint()
tex.tprint(
{ -1, "{\\bf"},
{ -2, "17% der Mitarbeiter der Müller GmbH & Co. KG aus
Grünwald\\Niederhausen wählen gerne Menü #3."},
{ -1, "}"})
tex.tprint() erwartet Tabellen als Argumente, diese enthalten als erstes Element die Nummer der Catcode-Tabelle und danach die Texte. -2 ist die oben erwähnte Tabelle, in der alle Zeichen ohne besondere Bedeutung sind, -1 ist die aktuell aktive Catcodetabelle. Damit kann ich Benutzereingaben sicher zusammen mit TeXs Kommandos verbinden, ohne, dass ich mir Gedanken um Catcodes machen muss. Wer schon einmal einen Konverter von irgendeiner Eingabe (z.B. einer Datenbankquelle) nach LaTeX geschrieben hat, der weiß, was ich meine. Auch hier gilt wieder: dank LuaTeX sind solche Eingaben problemlos möglich! Danke Taco für diese Funktionalität.

4 Kommentare zu "Neues Feature: tex.tprint(…)"
Wolfgang Werners-Lucchini schrieb am 03.04 um 13:14 Uhr:
Ich habe Schwierigkeiten das Beispiel nachzuvollziehen
\starttext \directlua{tex.sprint(-2,"17% der Mitarbeiter ...")} \stoptextstolpert über das Prozentzeichen.
Und
\starttext \directlua{tex.tprint( { -1, "{\\bf"}, { -2, "17% der Mitarbeiter der Müller GmbH & Co. KG aus Grünwald\\Niederhausen wählen gerne Menü #3."}, { -1, "}"})} \stoptextproduziert
Was mache ich falsch?
Patrick Gundlach schrieb am 03.04 um 13:32 Uhr:
Danke Wolfgang für den Kommentar. Das Problem ist, dass TeX erst einmal den Lua-Code mit den eigenen “Catcodes” interpretiert und dann an Lua übergibt, das heißt, dass Lua schon etwas anderes sieht, als du schreibst. Es sollte funktionieren, wenn du den Lua Code in eine eigene Datei schreibst und dann mithilfe von
\directlua{ dofile("meinedatei.lua") }lädst.
Wolfgang Werners-Lucchini schrieb am 05.04 um 19:59 Uhr:
In einer externen Datei funktioniert das aber auch mit
einem einfachen ‘print’ ohne ‘s’:
Was also ist das besondere an ‘sprint’?
Patrick Gundlach schrieb am 05.04 um 20:37 Uhr:
Das besondere an
tex.sprint()im Gegensatz zutex.print()ist das Verhalten bei Leerzeichen, aber sonst sind diese gleich. D.h. in dem Beispiel macht es keinen Unterschied (ich nutze irgendwietex.sprint()aus Gewohnheit).Kommentar schreiben