Como devo trabalhar com vários filtros make4ht?

Como devo trabalhar com vários filtros make4ht?

À medida que uso mais tex4ht/make4ht, descubro que estou construindo uma coleção de minhas próprias personalizações. Para ajudar a organizar isso, existe uma maneira recomendada de gerenciar a inclusão de (múltiplos) filtros/domfilters personalizados no make4ht?

Eu sei que (especificamente para um domfilter) posso criar um arquivo build.luacom

local domfilter = require "make4ht-domfilter"
local process = domfilter {
  -- do stuff here
  return dom
  end
}
Make:match("html$", process)

e então execute make4ht -e build.lua.

Mas e se eu quiser ter alguns filtros (dom) diferentes para fazer coisas diferentes? Posso dividi-los em arquivos diferentes e especificar de alguma forma qual executar?

Além disso, é possível especificar filtros (personalizados ou 'padrão') para serem executados em um pacote .sty/.4ht ou em .cfg? (Reconheço que isso pode representar um risco de segurança...)

Muitas perguntas aqui, infelizmente, mas respostas para qualquer uma seriam muito bem-vindas.

Responder1

Infelizmente não é possível modificar a sequência de construção do lado do TeX, tudo precisa ser feito em arquivos Lua.

Você pode definir facilmente novos módulos de filtro DOM. Você só precisa usar o seguinte esquema de nomes: domfilters/make4ht-<filtername>.lua. O domfiltersdiretório pode ser colocado em seu diretório atual, mas se você quiser torná-lo universalmente disponível, é melhor colocá-lo em sua árvore TEXMF local, no scripts/lua/diretório. Por exemplo, no meu sistema, pode ser ~/texmf/script/lua/domfiltersou ~/texmf/script/lua/make4ht/domfilters.

O módulo de filtro DOM deve exportar uma função que pega o objeto DOM, faz modificações nele e depois o retorna. Verfiltros DOM existentespara inspiração.

O exemplo de filtro DOM pode ficar assim (nomeado ~/texmf/scripts/lua/make4ht/domfilters/make4ht-test.lua):

return function(dom)
  print "Hello world"
  return dom
end

Você pode exigir esse filtro DOM de um arquivo de construção como este:

local domfilters = require "make4ht-domfilter"

local process = domfilters {"test"}
Make:match("html$", process)

Você pode encadear vários filtros:

local process = domfilters {"test", "fixinlines"}

Cada etapa pega o objeto DOM do filtro anterior, então você não precisa analisar o arquivo HTML novamente.

Se quiser disponibilizar sua sequência de construção em vários projetos, você tem duas opções:

  1. arquivo de configuração make4ht
  2. nova extensão

arquivo de configuração make4hté algo diferente do arquivo de configuração TeX4ht (arquivo TeX com .cfgextensão). É um arquivo de construção Lua especial que pode ser colocado em seu diretório inicial ou na raiz do projeto. Deveria ser nomeado .make4ht. Portanto, você pode simplesmente pegar o exemplo do arquivo de construção acima, renomeá-lo .make4hte colocá-lo em qualquer um dos diretórios pais do seu projeto e ele será usado automaticamente.

Extensõespode modificar vários aspectos do processo de construção. Eles devem ser colocados no make4ht/extensionsdiretório e nomeados como make4ht-ext-<filename>.lua. Eles precisam exportar tabelas com funções, principalmente modify_build.

Aqui está um exemplo de extensão 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

A função M.testpega o formato de saída atual e decide se a extensão deve ser executada ou não. Algumas extensões suportam apenas HTML, por exemplo, então esta função retorna falsee não é usada.

A função M.modify_buildpode conter código semelhante aos arquivos de construção, mas make4hta variável, passada como parâmetro, é usada em vez do Make4htobjeto global usado nos arquivos de construção comuns.

A extensão pode ser necessária usando o fparâmetro de make4ht, como

make4ht -f html5+sample filename.tex

A saída deste comando é:

[STATUS]  make4ht: Conversion started
[STATUS]  make4ht: Input file: sample.tex
hello format    html5
hello modify build
Hello world
[STATUS]  make4ht: Conversion finished

informação relacionada