随着我更多地使用 tex4ht/make4ht,我发现我正在建立自己的自定义集合。为了帮助组织这一点,有没有推荐的方法来管理在 make4ht 中包含(多个)自定义过滤器/domfilters?
我知道(特别是对于 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