
隨著我更多地使用 tex4ht/make4ht,我發現我正在建立自己的自訂集合。為了幫助組織這個,是否有建議的方法來管理 make4ht 中的(多個)自訂過濾器/domfilter?
我知道(特別是對於 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