Folio Writer

コンパイラを曲げる:
Folio Writer の pandoc Lua フィルタ

Folio Writer のコンパイルパイプラインは 99% をカバーします——引用、相互参照、テンプレート、形式。Lua フィルタは残りの 1% のための抜け道です。学術誌の風変わりな独自ルール、自分だけの略記、どのチェックボックスも想定していないこと。フィルタはコンパイル中に文書を書き換える数行の Lua で、pandoc がネイティブに実行します——インストールするものはありません。

フィルタとは実際何なのか

pandoc は原稿をコンパイルするとき、まず Markdown を文書ツリーに解析します——段落、見出し、スパン、引用。Lua フィルタは、それらの要素の名前を付けた関数の集まりです。各関数は一致する要素ごとに呼び出され、置き換えを返すことができます。何も返さなければそのまま、{} を返せば削除、新しい要素を返せば変換。モデルはそれだけです。

Folio Writer でフィルタを付ける

  1. フィルタを .lua ファイルとして保存します——プロジェクト内(たとえば Research の Filters サブフォルダ)に置いておけば、原稿と一緒に同期され、移動します。
  2. コンパイルシートのスタイルタブで:Lua フィルタ ▸ Lua フィルタを追加…。複数追加すると、pandoc-crossref の後に順番に実行されます。
  3. フィルタはコンパイルプロファイルと一緒に保存されます——なので「Elsevier への投稿」と「指導教員向けの草稿」に、それぞれ別のセットを持たせられます。
プレビューも足並みをそろえます:ライブプレビューはコンパイルと同じ順序でフィルタを実行します——フィルタの効果は PDF で驚かされるのではなく、書きながら確認できます。

例 1 · 常に最新の日付

どこにでも @@today と入力すると、コンパイルされた文書にはコンパイル日が入ります——カバーレターや草稿の透かしに便利です。

-- today.lua
function Str(el)
  if el.text == "@@today" then
    return pandoc.Str(os.date("%B %e, %Y"))
  end
end

例 2 · 決して出荷されない草稿メモ

自分宛てのメモをフェンス付きの 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

これを投稿用プロファイルにだけ付ければ、指導教員向け草稿のプロファイルではメモが表示されたままです——プロファイルごとのフィルタは、まさにこのためにあります。

例 3 · 自分だけのインラインマークアップ

[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 フィルタのドキュメントにはすべての要素とヘルパーが載っており、コミュニティのフィルタ集には、略語の処理、表の調整、図表の描画など、すぐに使えるフィルタがたくさんあります。そこにあるものは何でも、そのままコンパイルシートに追加できます。

Folio Writer を無料でダウンロード →  ·  ほかのガイド