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がありましたら情報提供をお待ちしております。 ↩︎