
A medida que uso más tex4ht/make4ht, descubro que estoy creando una colección de mis propias personalizaciones. Para ayudar a organizar esto, ¿existe alguna forma recomendada de administrar la inclusión de (múltiples) filtros/domfilters personalizados dentro de make4ht?
Sé que (específicamente para un filtro dom) puedo crear un archivo build.lua
con
local domfilter = require "make4ht-domfilter"
local process = domfilter {
-- do stuff here
return dom
end
}
Make:match("html$", process)
y luego correr make4ht -e build.lua
.
Pero, ¿qué pasa si quiero tener algunos filtros (dom) diferentes para hacer cosas diferentes? ¿Puedo dividirlos en archivos diferentes y especificar de alguna manera cuál ejecutar?
Además, ¿es posible especificar filtros (personalizados o 'estándar') para ejecutar desde un paquete .sty/.4ht o dentro del .cfg? (Reconozco que esto podría representar un riesgo de seguridad...)
Me temo que hay muchas preguntas aquí, pero las respuestas a cualquiera serían bienvenidas.
Respuesta1
Desafortunadamente no es posible modificar la secuencia de compilación desde el lado TeX, todo debe hacerse en archivos Lua.
Puede definir fácilmente nuevos módulos de filtro DOM. Sólo necesitas usar el siguiente esquema de nombres: domfilters/make4ht-<filtername>.lua
. El domfilters
directorio se puede colocar en su directorio actual, pero si desea que esté disponible universalmente, es mejor colocarlo en su árbol TEXMF local, en el scripts/lua/
directorio. Por ejemplo, en mi sistema, puede ser ~/texmf/script/lua/domfilters
o ~/texmf/script/lua/make4ht/domfilters
.
El módulo de filtro DOM debe exportar la función que toma el objeto DOM, le realiza modificaciones y luego lo devuelve. Verfiltros DOM existentespor inspiración.
El filtro DOM de muestra puede verse así (llamado ~/texmf/scripts/lua/make4ht/domfilters/make4ht-test.lua
):
return function(dom)
print "Hello world"
return dom
end
Puede solicitar este filtro DOM desde un archivo de compilación como este:
local domfilters = require "make4ht-domfilter"
local process = domfilters {"test"}
Make:match("html$", process)
Puedes encadenar múltiples filtros:
local process = domfilters {"test", "fixinlines"}
Cada paso toma el objeto DOM del filtro anterior, por lo que no es necesario analizar el archivo HTML nuevamente.
Si desea que su secuencia de compilación esté disponible en varios proyectos, tiene dos opciones:
- archivo de configuración make4ht
- nueva extensión
archivo de configuración make4htes algo diferente al archivo de configuración TeX4ht (archivo TeX con .cfg
extensión). Es un archivo de compilación especial de Lua que se puede colocar en su directorio de inicio o en la raíz del proyecto. Debería nombrarse .make4ht
. Por lo tanto, puede tomar el ejemplo del archivo de compilación anterior, cambiarle el nombre .make4ht
y colocarlo en cualquiera de los directorios principales de su proyecto y se usará automáticamente.
Extensionespuede modificar varios aspectos del proceso de construcción. Deben colocarse en make4ht/extensions
el directorio y denominarse make4ht-ext-<filename>.lua
. Necesitan exportar tablas con funciones, en particular modify_build
.
Aquí hay una extensión de muestra 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
La función M.test
toma el formato de salida actual y decide si la extensión debe ejecutarse o no. Algunas extensiones solo admiten HTML, por ejemplo, por lo que esta función regresa false
y no se usa en absoluto.
La función M.modify_build
puede contener código similar al de los archivos de compilación, pero make4ht
se usa una variable, pasada como parámetro, en lugar del Make4ht
objeto global que se usa en los archivos de compilación normales.
Se puede requerir una extensión usando el f
parámetro de make4ht
, como
make4ht -f html5+sample filename.tex
La salida de este comando es:
[STATUS] make4ht: Conversion started
[STATUS] make4ht: Input file: sample.tex
hello format html5
hello modify build
Hello world
[STATUS] make4ht: Conversion finished