我应该如何使用多个 make4ht 过滤器?

我应该如何使用多个 make4ht 过滤器?

随着我更多地使用 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>.luadomfilters目录可以放在您当前的目录中,但如果您想让它普遍可用,最好将其放在本地 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

相关内容