
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 ファイルを再度解析する必要はありません。
ビルド シーケンスを複数のプロジェクトで使用できるようにするには、次の 2 つの選択肢があります。
- 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