1ヶ月ほど前から LaTeX 文書ビルド補助ツールの開発を始めました.
このプロジェクトの最終的な目標は,端的に言えば「latexmk を置き換える」ことです.
つまり,単に自分用のスクリプトとして最低限の機能を実装して終わりにするというよりは,きちんと普及を推進して,Overleaf や Cloud LaTeX などのクラウドサービスを含め,あらゆる LaTeX 環境で使用可能な標準ツールとなることを目指しています.
モチベーション
LaTeX 文書のビルドを補助するツールは既に数多く存在しています.既存ツールについては,mod_poppo 氏のブログ記事に詳しいです.
あまり知られていないビルドツールは多数ありますが,現状 LaTeX 文書ビルドツールの中で支配的な地位を占めるのは latexmk です1.しかしながら,私の見るところ latexmk には少なくとも3つの重大な欠点があります.
1. 設定ファイルが .latexmkrc
という “隠しファイル”
まず,大前提として LaTeX 文書においてその「ビルド手順」(どのツールを,どういう順番で,どういうオプションと共に用いるか)は文書作者の思う “正しい” 出力を得るために必要不可欠な情報です.このように重要で本質的な情報を,あろうことか “隠しファイル” に書けてしまう2というのはまったくもって妥当な設計とは思えません3.
2. 設定の記述形式が汎用言語 perl そのもの
設定の記述が汎用言語というのも,およそ現代的とは言い難いまずい設計といえるでしょう.
これがまずい理由は,本質的には表現力が高すぎることです.もう少し具体的に挙げるのであれば
などを挙げられそうですが,実際多くの “現代的な” ビルドツールが汎用言語を設定記述様式に採用していないことからも明らかと言っていいでしょう6.
3. ビルド手順の多くが暗黙的に決定
これも latexmk の欠点としてよく挙げられるものです.設定ファイルを見たとしても,実際に latexmk を実行した際に何が起きるかを完全に予想することは,よほどのエキスパートでない限り困難です.
latexmk のこうした欠点を克服するために,ルールを明示的に書くことを特徴とする arara というツールもあり,近年ヨーロッパを中心に人気を集めているようです7.このツールは設定様式に YAML という設定記述専用の言語を採用していることもあり,その設計思想の多くが私の思うところと一致するものではあります8.しかし,非常に惜しいことに Java で実装されているため JVM がインストールされている環境でないと動作しないため,「あらゆる TeX 環境で使用可能」という要件を満たせそうにありません.
というわけで,上記の欠点を克服しつつ「あらゆる TeX 環境で動作する」ことが期待できる新たな LaTeX 文書ビルドツールを独自に設計・開発することに決めました.
llmk の特徴
1. texlua 単体で動作する
llmk は Lua で実装されています.また,外部ライブラリには一切依存していないため,LuaTeX エンジンがあればそれだけで動作します.つまり,少なくとも近年の TeX Live がインストールされた環境であれば OS や他の開発環境(JVM など)のインストール状況を問わず動作するということです.
2. 設定記述用言語 TOML をその設定記述様式に採用
GitHub の中の人から提案された TOML は,人間にとって読み書きのしやすく習得も容易な設定記述用言語です(ついでに言うと仕様がシンプルなのでパーサの実装も比較的簡単です).JSON や YAML に替わるものとして,近年人気を集めつつある期待の設定記述言語です.
llmk は,この TOML をその主要な設定記述言語と位置づけ,すべての設定項目を TOML によって記述することが可能です9.
3. 設定は文書ソースまたは llmk.toml
のいずれか1箇所に集約して書くような設計
先述したように「ビルド手順」は LaTeX 文書の “正しい” 組版結果を得るために必要不可欠な本質的情報なので,隠しファイルに記述したり,随所に分散して記述したりせず,文書毎に1箇所にまとめて明示的に指定されるべきと考えます.
そのため llmk は,LaTeX 文書ファイル(*.tex
)のコメント部分か,llmk.toml
という専用の設定記述ファイルのいずれか一方に集約して「ビルド手順」を記述する方式を採用しました.
4. 現代の TeX 環境を考慮したデフォルト設定
TeX の原作者は Knuth ですが,2018年の今 “Knuth が実装した TeX エンジンそのもの” を使用している人は極めて少数派でしょう10.同様に素の e-TeX や素の pTeX を使用している人も稀だと思われます.
現時点で最も支配的な TeX エンジンは何かという議論はナンセンスですが,TeX 界隈全体の流れとしては将来的に LuaTeX がデファクト・スタンダードになるという見方が優勢です.この流れにしたがい,llmk もデフォルトの TeX エンジンとしては LuaTeX を採用しました.つまり,何の設定も記述せずに文書を処理した場合は lualatex
コマンドが実行されます11.
開発状況と今後の予定
llmk は既にその基幹部の実装を終えていて,筆者は実際に欧文・和文の LaTeX 文書をビルドする際に実用しています.llmk の使い方そのものの解説は後日改めて記事を書きたいと思いますが,英語が読める方や新しいもの好きで気骨のある方あれば README や examples ディレクトリにある例を参考に試していただけると思います.
llmk プロジェクトは TeX Users Group (TUG) の TeX Development Fund により経済的に支援をいただいています.
支援額は$1,000とものすごく多額というわけではありませんが,これを原資に Windows 搭載マシンを1台購入し,Windows サポート体制を強化しようと思っています12.
また,11月に札幌で開催される TeXConf 2018 では llmk について話をするので,参加予定の皆さまは楽しみにしていただければ幸いです.
-
実際,世界的に使用されている LaTeX クラウドサービス Overleaf も latexmk をその主要ビルドツールとして採用しています. ↩︎
-
latexmk はデフォルトで
.latexmkrc
の他にlatexmkrc
という隠しファイルでないファイルも読み込みますが(さらに-r
オプションで任意名称の設定ファイルを読み込むこともできるようです),実際に多くの場所で隠しファイル.latexmkrc
を用いて運用されてしまっているので,同じことでしょう. ↩︎ -
そもそも “〜rc” というファイル名は run commands に由来していて,その言葉の指すイメージは「(個々の文書ではなく)“latexmk というプログラムそのもの” の設定ファイル」です.つまり,latexmk は設計思想として「ビルド手順が文書の正しい出力結果を得るために本質的な情報だ」とは考えていないことが伺えて,その時点で llmk とは大きく考え方を異にします. ↩︎
-
ライトユーザならば「雰囲気で書ける」で良いかもしれませんが,少なくとも自分が latexmk を使いこなしたり,使いこなしている人の設定を読むためには設定記述言語は習得せざるを得ないでしょう.しかも採用されている汎用言語が perl というのも,この不幸さに拍車をかけます. ↩︎
-
設定記述用の言語を採用すれば直ちに安全になるというものではありませんが,少なくともある程度機能を制限し,また難読化を困難にする等のメリットはあると思われます. ↩︎
-
この点はもう少しまともに調査・検討してまとめた資料がどこかにありそうに思うのですが,もしご存知の方がいらっしゃいましたら情報提供いただけますと嬉しいです. ↩︎
-
arara については ZR さんによる記事に少し情報があります:チョット arara してみた件 - マクロツイーター ↩︎
-
とはいえ,arara も設定の記述は文書ファイルとは(位置的に)独立な外部ファイルにするようなので「ビルド手順が文書の正しい出力結果を得るために本質的な情報」という哲学に忠実であるためには設定を記述した外部ファイルも必ず文書ファイルと同梱するという運用が必要な気もします(私は現時点で arara を使ったことがないので要調査). ↩︎
-
ただし,将来的には既にある程度普及している他の形式(shebang や TeXworks 等がサポートするマジックコメントなど)にも対応する予定です. ↩︎
-
未だに TeX Live に Knuth 実装の TeX 処理系が含まれているのは「Knuth が使うため」(あるいは「Knuth への経緯の表明として」)というのが唯一の理由と言われています. ↩︎
-
ただし,この挙動は将来的にユーザ設定により変更できるようにするかもしれません. ↩︎
-
ついでにいうと,この Win 機は Texdoc のメンテナンスをする上でも役立つと思っています.既に5年ほど Windows 環境にはほとんど触れていないので,おすすめの PC がありましたら情報提供をお待ちしております. ↩︎