Folio Writer のコンパイルパイプラインは 99% をカバーします——引用、相互参照、テンプレート、形式。Lua フィルタは残りの 1% のための抜け道です。学術誌の風変わりな独自ルール、自分だけの略記、どのチェックボックスも想定していないこと。フィルタはコンパイル中に文書を書き換える数行の Lua で、pandoc がネイティブに実行します——インストールするものはありません。
pandoc は原稿をコンパイルするとき、まず Markdown を文書ツリーに解析します——段落、見出し、スパン、引用。Lua フィルタは、それらの要素の名前を付けた関数の集まりです。各関数は一致する要素ごとに呼び出され、置き換えを返すことができます。何も返さなければそのまま、{} を返せば削除、新しい要素を返せば変換。モデルはそれだけです。
.lua ファイルとして保存します——プロジェクト内(たとえば Research の Filters サブフォルダ)に置いておけば、原稿と一緒に同期され、移動します。どこにでも @@today と入力すると、コンパイルされた文書にはコンパイル日が入ります——カバーレターや草稿の透かしに便利です。
-- today.lua
function Str(el)
if el.text == "@@today" then
return pandoc.Str(os.date("%B %e, %Y"))
end
end
自分宛てのメモをフェンス付きの div に書けば、下書き中は見えて、出力には確実に含まれません。
::: draft Ask Wei whether the 2019 calibration applies here. :::
-- strip-draft.lua
function Div(el)
if el.classes:includes("draft") then
return {} -- deleted from every compiled format
end
end
これを投稿用プロファイルにだけ付ければ、指導教員向け草稿のプロファイルではメモが表示されたままです——プロファイルごとのフィルタは、まさにこのためにあります。
[key result]{.highlight} に、形式ごとの本当の意味を与えます——HTML では黄色のマーカー、LaTeX の PDF ではハイライトに。
-- highlight.lua
function Span(el)
if not el.classes:includes("highlight") then return nil end
if FORMAT:match("latex") then
local out = pandoc.Inlines(pandoc.RawInline("latex", "\\hl{"))
out:extend(el.content)
out:insert(pandoc.RawInline("latex", "}"))
return out
elseif FORMAT:match("html") then
local out = pandoc.Inlines(pandoc.RawInline("html", ""))
out:extend(el.content)
out:insert(pandoc.RawInline("html", ""))
return out
end
end
LaTeX 側では、フォーマットのメタデータにハイライト用のパッケージを一度だけ追加します:header-includes: \usepackage{soul}。
二つの習慣で、フィルタ作りは苦になりません。照合対象のツリーを見るには、ターミナルでコード片に pandoc -t native を実行します——関数が受け取る要素がそのまま表示されます。そしてコンパイルがおかしいときは、コンパイルとプレビューのログに、フィルタのエラーを含む pandoc のコマンドライン全体とその出力が表示されます。Folio Writer 固有の注意を一つ:ファイルが移動したフィルタは、コンパイルを失敗させずにスキップされます——フィルタが黙って効いていないように見えたら、ログを確認してください。
pandoc の Lua フィルタのドキュメントにはすべての要素とヘルパーが載っており、コミュニティのフィルタ集には、略語の処理、表の調整、図表の描画など、すぐに使えるフィルタがたくさんあります。そこにあるものは何でも、そのままコンパイルシートに追加できます。