我應該如何使用多個 make4ht 過濾器?

我應該如何使用多個 make4ht 過濾器?

隨著我更多地使用 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 檔案。

如果您想讓建置序列在多個專案中可用,您有兩種選擇:

  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

相關內容