ClutTeXとLunarMLの近況

本の諸々が一段落したので、最近はLaTeX処理自動化ツールClutTeXの開発を進めています。前(2023年11月)に計画を書いて以降の進捗を書きます。

Standard MLへの移植

Standard MLへの移植は一段落しました。今後はLunarMLを使ってStandard MLからLuaへコンパイルしたものを頒布する予定です。利用する側は従来通りTeXLuaさえあればClutTeXを動作させられます。

とは言っても、すべてのコードをStandard MLへ移植したわけではありません。一部のモジュールはLuaのままにして、LunarMLのFFIでStandard MLから呼び出す形にしています。

移植の際にバグを埋め込んでいると嫌なので、もう少し使い込んでみてから新しいバージョン(0.7.0)をリリースしたいです。

新機能:設定ファイル

ClutTeXはターミナルの出力を一部色付けしていますが、配色は従来はカスタマイズ不可能でした。新バージョンでは、設定ファイルによって配色をカスタマイズできるようにします。

また、デフォルトでは出力ディレクトリは TMPDIR 等の環境変数を元にしていますが、これもカスタマイズできるようにします。例えば、ホームディレクトリの下などを指定できるようになります。

設定項目はプロジェクトに依存しないものとします。つまり、エンジンの種類等は指定できません。設定ファイルの内容は出力結果のPDFには影響しません。

設定ファイルの形式はTOMLです。私が前に書いたStandard MLによるTOMLパーサーを利用しています。

設定ファイルの場所や書き方などについては、将来出る新バージョンのマニュアルを参照してください。

ファイルサイズとLunarMLの改良

従来のClutTeXの実行ファイルは100KB程度でした。しかし、Standard MLへ移植したところ、Luaスクリプトとして1MBを超えるようになってしまいました。10倍です。

まあ、Standard MLへの移植の際にはMD5の実装を自前で用意するようにしましたし、TOMLパーサーも内蔵するようにしたので、単純な比較はできません。しかし、もうちょっとどうにかならないかと思うわけです。

現行のLunarML(0.2.0)が出力するLuaコードは非常に冗長です。例えば、1行につき1つの演算しか行いません。ネストした式を出力しないのです。識別子も長ったらしい数字が後についています。

そこで、出力されるLuaコードがもうちょっと短くなるように、LunarMLを改良しています。例えば、CPS中間言語で最適化を行った後に式を再びネストさせるような変換を噛ませることにしました。識別子につける数字もなるべく小さいものを選ぶようにしました。

ある程度改良ができたらLunarML 0.2.1をリリースして、ClutTeXのビルドにはそれを使うようにします。

ClutTeXの他の改良案

他には、BibTeXやmakeglossariesへの対応をマシにしたいです。

あとは、この間PDF/Xの出力をした時に環境変数 SOURCE_DATE_EPOCH を指定する必要があったという話をしましたが、この辺をClutTeX内部でいい感じにやってくれるオプションも用意したいです。

プロジェクトごとの設定を管理するするツールがあると良いのか

現状のClutTeXにはプロジェクトファイルやマジックコメントという概念がなく、その辺は外部ツールにお任せという形です。私自身はGNU makeと連携させています。

しかし、makeと --watch オプションを連携させるのは少しコツが必要だったりします。本当はmakeがwatch modeを持っていて欲しいのですが。

そういうわけで、プロジェクトファイルから構成を読み取ってビルドしてくれるツールがあると良いのかなという気がしています。単一のLaTeXファイルから複数種類の出力を得たい場合もあると思うので、マジックコメントよりはプロジェクトファイル(複数のターゲットを書ける)が良さそうです。

やるとしたら、cluttex とは別のコマンドを用意して、それを叩くとプロジェクトファイルを読み取って適切なオプションで cluttex コマンドを実行するという形になると思います。ClutTeXの一部として(同じパッケージとして)用意するのか、別のパッケージとして用意するのかはわかりません。

まあ、まだ構想を温める段階で、すぐに実装ということにはなりません。

フォーク

私が「ClutTeXをStandard MLで書き換える」ということをGitHub Issueに書いたところ、以前からたまにコントリビュートしてくれていた人が「それには乗れない」という感じでフォークを作りました。その人はTealという型付きLuaみたいなやつを使っているようです。

詳しくは Plan: Rewrite in Standard ML · Issue #17 · minoki/cluttex を参照してください。

下手にマイナー言語を採用するとそのマイナー言語の開発が中断した時にどうするのかという問題があるわけですが、Tealはどうでしょうか。TealのGitHubを見たところ、Lua界隈で昔から活動している人が開発をやっているようです。なら安心と言って良いでしょうか。

人が去っていくことは寂しくはありますが、それもOSSプロジェクトにはあることでしょう。その人も私も、お互い頑張っていきたいものです。