Как работать с несколькими фильтрами make4ht?

Как работать с несколькими фильтрами make4ht?

По мере того, как я все больше использую 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-файл.

Если вы хотите сделать свою последовательность сборки доступной в нескольких проектах, у вас есть два варианта:

  1. файл конфигурации make4ht
  2. новое расширение

файл конфигурации 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

Связанный контент