
Je häufiger ich tex4ht/make4ht verwende, desto mehr eigene Anpassungen baue ich auf. Gibt es eine empfohlene Methode, um die Einbindung (mehrerer) benutzerdefinierter Filter/Domfilter in make4ht zu verwalten und so die Organisation zu erleichtern?
Ich weiß, dass ich (speziell für einen Domfilter) eine Datei erstellen kann build.lua
mit
local domfilter = require "make4ht-domfilter"
local process = domfilter {
-- do stuff here
return dom
end
}
Make:match("html$", process)
und dann ausführen make4ht -e build.lua
.
Aber was ist, wenn ich mehrere verschiedene (Dom-)Filter für verschiedene Zwecke haben möchte? Kann ich sie in verschiedene Dateien aufteilen und irgendwie angeben, welche ausgeführt werden sollen?
Ist es außerdem möglich, (benutzerdefinierte oder „Standard-“)Filter anzugeben, die innerhalb eines .sty/.4ht-Pakets oder innerhalb der .cfg-Datei ausgeführt werden sollen? (Mir ist bewusst, dass dies ein Sicherheitsrisiko darstellen könnte …)
Das sind leider viele Fragen, aber wir freuen uns über alle Antworten.
Antwort1
Leider ist es nicht möglich, die Build-Reihenfolge von der TeX-Seite aus zu ändern, alles muss in Lua-Dateien erfolgen.
Sie können problemlos neue DOM-Filtermodule definieren. Sie müssen nur das folgende Namensschema verwenden: domfilters/make4ht-<filtername>.lua
. Das domfilters
Verzeichnis kann in Ihrem aktuellen Verzeichnis abgelegt werden. Wenn Sie es jedoch universell verfügbar machen möchten, platzieren Sie es am besten in Ihrem lokalen TEXMF-Baum im scripts/lua/
Verzeichnis. Auf meinem System kann es beispielsweise ~/texmf/script/lua/domfilters
oder sein ~/texmf/script/lua/make4ht/domfilters
.
Das DOM-Filtermodul sollte eine Funktion exportieren, die das DOM-Objekt nimmt, Änderungen daran vornimmt und es dann zurückgibt. SieheVorhandene DOM-Filterfür Inspiration.
Ein Beispiel für einen DOM-Filter kann dann wie folgt aussehen (mit dem Namen ~/texmf/scripts/lua/make4ht/domfilters/make4ht-test.lua
):
return function(dom)
print "Hello world"
return dom
end
Sie können diesen DOM-Filter aus einer Build-Datei wie dieser anfordern:
local domfilters = require "make4ht-domfilter"
local process = domfilters {"test"}
Make:match("html$", process)
Sie können mehrere Filter verketten:
local process = domfilters {"test", "fixinlines"}
Jeder Schritt übernimmt das DOM-Objekt aus dem vorherigen Filter, sodass Sie die HTML-Datei nicht erneut analysieren müssen.
Wenn Sie Ihre Build-Sequenz in mehreren Projekten verfügbar machen möchten, haben Sie zwei Möglichkeiten:
- make4ht-Konfigurationsdatei
- neue Erweiterung
make4ht-Konfigurationsdateiist etwas anderes als die TeX4ht-Konfigurationsdatei (TeX-Datei mit .cfg
Erweiterung). Es handelt sich um eine spezielle Lua-Build-Datei, die in Ihrem Home-Verzeichnis oder im Stammverzeichnis eines Projekts abgelegt werden kann. Sie sollte den Namen haben .make4ht
. Sie können also einfach das Build-Dateibeispiel von oben nehmen, es umbenennen .make4ht
und in einem der übergeordneten Verzeichnisse Ihres Projekts ablegen, und es wird automatisch verwendet.
Erweiterungenkönnen verschiedene Aspekte des Build-Prozesses ändern. Sie sollten in make4ht/extensions
einem Verzeichnis abgelegt und als benannt werden make4ht-ext-<filename>.lua
. Sie müssen Tabellen mit Funktionen exportieren, insbesondere modify_build
.
Hier ist eine Beispielerweiterung make4ht-ext-sample.lua
:
local M = {}
local filter = require "make4ht-domfilter"
function M.test(format)
print("hello format", format)
return true
end
function M.modify_build(make)
-- number of filters that should be moved to the beginning
print "hello modify build"
local process = filter {"test"}
make:match("html?$", process)
return make
end
return M
Die Funktion M.test
verwendet das aktuelle Ausgabeformat und entscheidet, ob die Erweiterung ausgeführt werden soll oder nicht. Einige Erweiterungen unterstützen beispielsweise nur HTML, sodass diese Funktion dann zurückgegeben wird false
und überhaupt nicht verwendet wird.
Funktionen M.modify_build
können ähnlichen Code wie Build-Dateien enthalten, aber anstelle des globalen Objekts, das in den normalen Build-Dateien verwendet wird, make4ht
wird eine als Parameter übergebene Variable verwendet .Make4ht
Eine Erweiterung kann mit dem f
Parameter von angefordert werden make4ht
, wie
make4ht -f html5+sample filename.tex
Die Ausgabe dieses Befehls lautet:
[STATUS] make4ht: Conversion started
[STATUS] make4ht: Input file: sample.tex
hello format html5
hello modify build
Hello world
[STATUS] make4ht: Conversion finished