複数の 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>.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 ファイルを再度解析する必要はありません。

ビルド シーケンスを複数のプロジェクトで使用できるようにするには、次の 2 つの選択肢があります。

  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

関連情報