Wie arbeite ich mit mehreren Make4ht-Filtern?

Wie arbeite ich mit mehreren Make4ht-Filtern?

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.luamit

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 domfiltersVerzeichnis 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/domfiltersoder 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:

  1. make4ht-Konfigurationsdatei
  2. neue Erweiterung

make4ht-Konfigurationsdateiist etwas anderes als die TeX4ht-Konfigurationsdatei (TeX-Datei mit .cfgErweiterung). 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 .make4htund 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/extensionseinem 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.testverwendet 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 falseund überhaupt nicht verwendet wird.

Funktionen M.modify_buildkönnen ähnlichen Code wie Build-Dateien enthalten, aber anstelle des globalen Objekts, das in den normalen Build-Dateien verwendet wird, make4htwird eine als Parameter übergebene Variable verwendet .Make4ht

Eine Erweiterung kann mit dem fParameter 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

verwandte Informationen