
По мере того, как я все больше использую tex4ht/make4ht, я обнаруживаю, что создаю коллекцию собственных настроек. Чтобы помочь организовать это, есть ли рекомендуемый способ управления включением (нескольких) пользовательских фильтров/domfilters в make4ht?
Я знаю, что (специально для domfilter) я могу создать файл build.lua
с помощью
local domfilter = require "make4ht-domfilter"
local process = domfilter {
-- do stuff here
return dom
end
}
Make:match("html$", process)
а затем бегите make4ht -e build.lua
.
Но что, если я хочу иметь несколько разных (dom)фильтров для разных целей? Могу ли я разбить их на разные файлы и как-то указать, какой из них запускать?
Также, возможно ли указать (пользовательские или «стандартные») фильтры для запуска из пакета .sty/.4ht или из .cfg? (Я понимаю, что это может представлять угрозу безопасности...)
Боюсь, вопросов много, но ответы на любые из них будут очень кстати.
решение1
К сожалению, изменить последовательность сборки со стороны TeX невозможно, все нужно делать в файлах Lua.
Вы можете легко определить новые модули фильтра DOM. Вам просто нужно использовать следующую схему имен: domfilters/make4ht-<filtername>.lua
. domfilters
Каталог может быть помещен в ваш текущий каталог, но если вы хотите сделать его общедоступным, лучше всего поместить его в локальное дерево TEXMF, в каталог scripts/lua/
. Например, в моей системе это может быть ~/texmf/script/lua/domfilters
или ~/texmf/script/lua/make4ht/domfilters
.
Модуль фильтра DOM должен экспортировать функцию, которая берет объект DOM, вносит в него изменения и затем возвращает его. См.существующие фильтры DOMдля вдохновения.
Пример фильтра DOM может выглядеть следующим образом (с именем ~/texmf/scripts/lua/make4ht/domfilters/make4ht-test.lua
):
return function(dom)
print "Hello world"
return dom
end
Вы можете потребовать этот DOM-фильтр из файла сборки следующим образом:
local domfilters = require "make4ht-domfilter"
local process = domfilters {"test"}
Make:match("html$", process)
Вы можете объединить несколько фильтров:
local process = domfilters {"test", "fixinlines"}
Каждый шаг берет объект DOM из предыдущего фильтра, поэтому вам не нужно снова анализировать HTML-файл.
Если вы хотите сделать свою последовательность сборки доступной в нескольких проектах, у вас есть два варианта:
- файл конфигурации make4ht
- новое расширение
файл конфигурации make4htэто нечто иное, чем файл конфигурации TeX4ht (файл TeX с .cfg
расширением). Это специальный файл сборки Lua, который можно разместить в домашнем каталоге или корне проекта. Он должен называться .make4ht
. Так что вы можете просто взять пример файла сборки из вышеприведенного, переименовать его в .make4ht
и поместить в любой из родительских каталогов вашего проекта, и он будет использоваться автоматически.
Расширениямогут изменять различные аспекты процесса сборки. Они должны быть помещены в make4ht/extensions
каталог и названы как make4ht-ext-<filename>.lua
. Им необходимо экспортировать таблицу с функциями, в частности modify_build
.
Вот пример расширения 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
Функция M.test
принимает текущий формат вывода и решает, следует ли выполнять расширение или нет. Некоторые расширения поддерживают только HTML, например, поэтому эта функция затем возвращается false
и вообще не используется.
Функция M.modify_build
может содержать аналогичный код, что и файлы сборки, но make4ht
переменная, переданная в качестве параметра, используется вместо глобального Make4ht
объекта, который используется в обычных файлах сборки.
Расширение может потребоваться с использованием f
параметра make4ht
, например
make4ht -f html5+sample filename.tex
Вывод этой команды:
[STATUS] make4ht: Conversion started
[STATUS] make4ht: Input file: sample.tex
hello format html5
hello modify build
Hello world
[STATUS] make4ht: Conversion finished