
Als Paketautor möchte ich ein Lua-Modul schreiben, das sowohl von als auch von gefunden werden lualatex
kann context
.
Der lualatex
Prototyp funktioniert einigermaßen und ich bin überzeugt, dass dies auch der Fall sein wird, wenn ich das Paket veröffentliche.
context
Der Prototyp findet meine Dateien allerdings nicht, ich kann ihn aber durch Angabe einer geeigneten LUAINPUTS
Umgebungsvariable (die auf das Verzeichnis verweist, in dem meine Dateien direkt gefunden werden können) dazu zwingen, meine Dateien zu finden.
Ich verstehe jedoch nicht, ob (oder wie) mein Paket in der "wilden" Umgebung funktioniert, in der sich diese Umgebungsvariable befindetnichtwie in meiner Entwicklungsumgebung eingestellt.
Die Frage ist im Wesentlichen: Wo soll ich meine Dateien platzieren, damit sie gespeichert context
werden können require
?
Hier ist meiner Meinung nach ein minimal funktionierendes Beispiel:
Nehmen wir an, dass sich mein Paket in befindet /tmp/luamodule/texmf/tex/generic/pgfplots/libs/foo/bar/xyz.lua
. Das entspricht meiner vagen Vorstellung, die der globale Einstiegspunkt texmf
sein wird . Dann habe ich mein Paket (Verzeichnisse ) und dann habe ich eine Unterverzeichnisstruktur, die meinem Lua-Paket ( ) ähnelt.texmf
tex/generic/pgfplots/libs
foo/bar/xyz.lua
Die Paketdatei xyz.lua
enthält das erweiterte Paket
io.write("\nFOUND IT!\n")
Dann habe ich eine Datei mit
\documentclass{standalone}
\directlua{require('foo.bar.xyz')}
\begin{document}
OK.
\end{document}
Verarbeiten Sie dies mit
export LUAINPUTS="/tmp/luamodule/texmf/tex/generic/pgfplots//:"
lualatex xyz.tex
funktioniert: Ich sehe „FOUND IT“ in der Konsolenausgabe.
Als nächstes versuche ich dasselbe mit context
und schreibe eine Datei xyzcontext.tex
mit
\directlua{require('foo.bar.xyz')}
\starttext
OK.
\stoptext
Übersetzen mit
export LUAINPUTS="/tmp/luamodule/texmf/tex/generic/pgfplots//:"
context xyzcontext
schlägt fehl, da die Lua-Datei nicht gefunden werden kann.
Es funktioniert jedoch, wenn ich schreibe
export LUAINPUTS="/tmp/luamodule/texmf/tex/generic/pgfplots/libs/:"
context xyzcontext
Der Unterschied besteht darin, dass mein erster LUAINPUTS-Pfad ein rekursives Include () enthält, //
während der zweite das genaue Stammverzeichnis enthält.
Ich habe bereits gelernt, dass context
die Dinge anders macht als (verwendet währenddessen lualatex
nicht und behandelt Punkte anders). Aber dieses Problem gibt Anlass zum Nachdenken: scheint mit rekursiv definierten Lua-Dateipfaden zu funktionieren. Gemessen an den mit Tex Live mitgelieferten texmf.cnf-Konfigurationen würde ich erwarten, dass mein Verzeichnisbenennungsschema funktioniert. Aber was ist mit dem Kontext!? Werden meine Dateien gefunden, wenn ich keinen solchen Stammpfad festlege? Es scheint, dass diese Art von Benennungsschema mit der Graphenzeichnungsbibliothek von PGF (sowohl in als auch ) gut funktioniert , aber ich verstehe nicht wirklich, warum.kpse
require
lualatex
lualatex
context
.lua
Ich habe sogar versucht, meine Dateien in den globalen Baum von TL 2014 zu kopieren texmf
(gefolgt von texhash
) – ohne Erfolg.
Daher meine Frage: Wo soll ich meine .lua
Dateien ablegen, damit sowohl lualatex
und context
sie finden können?
verwandt: Best Practices für Lua-Module
Antwort1
Damit wir eine Community-Wiki-Antwort haben, die hochgewählt werden kann, um diese Frage zu entfernen, und die ich möglicherweise neu formatiere, wenn sie genügend Hochstimmungen/Anfragen erhält, hier die Kommentare:
Haben Sie mtxrun --generate ausgeführt, um die Dateinamendatenbank neu zu erstellen? Dadurch sollten Dateien in TEXMF für die Lookup-Routinen von Context verfügbar sein. – Philipp Gesang 25. Dez. 2014, 15:53
[… Fortsetzung] Außerdem ruft Context-Code selten require() auf, um Pakete zu laden, normalerweise nur für externe, nicht-TeX-Bibliotheken. Stattdessen ist es idiomatischer, environment.loadluafile() am Lua-Ende und \registerctxluafile von TeX aus zu verwenden. – Philipp Gesang 25. Dez. 2014 um 15:53
@phg Ich wusste nichts von mtxrun --generate. Ich habe es gerade ausgeführt, ohne dass ein erkennbarer Unterschied auftrat (d. h. die Datei wird immer noch nicht gefunden). – Christian Feuersänger, 25. Dez. 2014, 17:31 Uhr
@phg, Ihr Verweis auf environment.loadluafile ist mir neu. Ist das die Lösung? Ich habe auch von einem Context-Typen den Hinweis erhalten, dass dofile(resolvers.findfile("foo.bar.whatever.lua")) (Teil davon?) eine bewährte Methode ist. Zugegeben, das verstärkt meine Verwirrung darüber, wie man LUA-Bibliotheken schreibt, die sowohl innerhalb von lualatex als auch innerhalb von Context verwendet werden sollen, nur noch. – Christian Feuersänger 25. Dez. 2014, 17:34
... vielleicht könnte eine Antwort auf meine Frage eine Art Schalter sein: „wenn ich Kontext bin, sonst wenn ich lualatex bin ...“ – Christian Feuersänger, 25. Dezember 2014, 17:35 Uhr
Wenn die Datei nach --generate nicht gefunden wird, liegt sie vielleicht im falschen Baum? Module aus dem Garden befinden sich normalerweise in den texmf-Modulen, Sachen, die Sie manuell installieren, gehen unter texmf-local. Das setzt natürlich voraus, dass Sie die Minimals verwenden. Es gibt bestimmte Konventionen bezüglich der Dateispeicherorte. Die meisten Dateien von Drittanbietermodulen gehören unter tex/context/third/${MODULE}/, Skripte, die von mtxrun aufgerufen werden sollen, unter ./scripts/context/lua/third/${MODULE}, aber ich glaube nicht, dass diese Konvention bei der Dateisuche durchgesetzt wird. – Philipp Gesang 27. Dez. 2014 um 11:36
Hier ist ein Vorschlag zum Debuggen der Pfadsuche: Bestimmen Sie zunächst, wo Context seine Dateiinformationen speichert. Normalerweise ist dies ein Verzeichnis namens luatex-cache/context unter dem Stammverzeichnis texmf-cache oder texmf-var. Erstellen Sie dann irgendwo unter Ihrem texmf-local/ eine Dummy-Datei mit einem eindeutigen Namen. Führen Sie nun mtxrun --generate aus und durchsuchen Sie den luatex-cache rekursiv nach dem Namen der Dummy-Datei. Wenn die Datei gefunden wurde, wird sie in einer Beschreibung des Bauminhalts angezeigt (luatex-cache/context//trees/.lua). Wenn nicht, wird der Speicherort von Context überhaupt nicht durchsucht. – Philipp Gesang 27. Dez. 2014 um 11:44
Übrigens funktioniert eines meiner Pakete in Context, Plain und Latex: bitbucket.org/phg/enigma/src – ich habe gerade überprüft, dass das Platzieren der Dateien in den jeweiligen Bäumen unter texmf-local problemlos funktioniert. – Philipp Gesang, 27. Dez. 2014, 11:55 Uhr
@phg, danke für deine Geduld und Zeit! Das hat es gelöst! Ich habe die Datei in /home/ludewich/tl2014/texmf-dist/tex/generic/pgf/math/foo/bar abgelegt, mtxrun --generate ausgeführt und sie wurde richtig indiziert und mein Minimal wurde ausgeführt. Ich dachte, ich hätte nach deinem ersten Kommentar dasselbe getan, aber vielleicht habe ich einen Fehler gemacht? Wenn du deinen Hinweis bezüglich mtxrun in eine Antwort schreibst, werde ich ihn gerne annehmen. – Christian Feuersänger, 27. Dez. 2014, 14:10 Uhr