2年ほど前からマイペースで作っていたLaTeX処理自動化ツールClutTeXだが、ある程度の機能が整ったと判断し、バージョン0.1をリリースした。ClutTeXに関しては2年前にもブログ記事で紹介したが、初のリリースを迎えた今、改めてその機能と使い方を紹介する。
- 2年前のブログ記事:TeX 実行の自動化ツールを作った (ClutTeX)
- CTAN告知:CTAN: CTAN-ann – New on CTAN: cluttex
- CTAN: Package cluttex
- GitHub: minoki/cluttex: Process LaTeX documents without cluttering your working directory
リリースしても、使ってもらえなくては意味がない。このツールをLaTeXユーザーに広く使ってもらうには、TeX Liveへの収録が不可欠である。というわけで、リリースに合わせてCTANへアップロードした(CTANへのアップロードはTeX Liveへの収録の前提条件らしいので)。そして、TeX Liveのメンテナーの方にTeX Liveへ収録していただいた。
(TeX Liveがどういうものかについては、TeX Live をホンキで語る ― 「TeX Live ってなんだろう?」 – Acetaminophen’s diary)
氏による記事が詳しい:よって、TeX Live ManagerでTeX Liveを最新版にアップデート(ターミナルからだったら $ sudo tlmgr update –all)すれば、cluttexがインストールされるはずである。
きてますね #cluttex pic.twitter.com/bmDXULK9En
— だめぽラボ@技術書典5 か38 (@mod_poppo) October 11, 2018
これなに?
LaTeXの処理を自動化するツールである。
自動化というのは、具体的には
- 必要に応じて複数回処理を行い、相互参照等を解決してくれる
- (オプションを指定すれば)MakeIndexやBibTeXを適切に起動してくれる
- (pTeX系で)一発でPDFを生成してくれる
ことを指す。
その際に、作業ディレクトリを汚さない、つまり .aux だの .log だの .out だのを撒き散らさないことが最大の特徴である。
基本的な使い方
コマンドラインで
platex foo.tex dvipdfmx foo.tex
と打っていたところを
cluttex -e platex foo.tex
に変える。pTeX系でも一発でPDFが生成される。
LuaLaTeXなら
cluttex -e lualatex foo.tex
となる。
主なオプションは
-e
,--engine=ENGINE
エンジン・フォーマットを指定する。可能な値はpdflatex
,pdftex
,lualatex
,luatex
,luajittex
,xelatex
,xetex
,latex
,etex
,tex
,platex
,eptex
,ptex
,uplatex
,euptex
,uptex
のいずれか。-o
,--output=FILE
出力ファイル名 [省略時:JOBNAME.FORMAT
]--fresh
処理前に補助ファイルを抹消し、まっさらな状態から始める。--output-directory
とは併用できない。--max-iterations=N
相互参照やその他を解決するために処理を行う回数の上限。 [省略時:3]--[no-]change-directory
処理時に(補助ファイルの)出力ディレクトリに cd する。シェルエスケープが有効な場合に効いてくる。--watch
入力ファイルを監視する。別途 fswatch コマンドが必要となる。--color[=WHEN]
ClutTeXのメッセージに色付けする。WHEN
はalways
,auto
,never
のいずれか。 [--color
が省略された場合はauto
、WHEN
が省略された場合はalways
]--includeonly=NAMEs
\includeonly{NAMEs}
を挿入する。--tex-option=OPTION
TeXに一つのオプションOPTION
を渡す。--tex-options=OPTIONs
TeXに複数のオプションOPTIONs
を渡す。--dvipdfmx-option[s]=OPTION[s]
dvipdfmxにオプションを渡す。-h
,--help
おなじみ-v
,--version
おなじみ-V
,--verbose
より詳細なメッセージを出力する。複数回指定するとよりやかましくなる。--makeindex=COMMAND
MakeIndexを使って.idx
ファイルを処理する。言語(欧文 vs 日本語)によって使用されるコマンドが違うため、コマンド名は明示的に指定する(例:--makeindex=makeindex
,--makeindex=mendex
)--bibtex=COMMAND
BibTeXを使って.aux
ファイルから.bbl
ファイルを生成する。言語によって使用されるコマンドが違うため、コマンド名は明示的に指定する(例:--bibtex=bibtex
,--bibtex=upbibtex
)。Biberを使う場合はこっちじゃなくて--biber
を使う。--biber[=COMMAND]
Biberを使って.bcf
ファイルから.bbl
ファイルを生成する。省略時のコマンド名はbiber
だが、biber
にオプションを渡したい場合は--biber="biber --foo"
という感じで指定する。- 【実験的】
--makeglossaries[=COMMAND]
makeglossariesを使って.glo
ファイルから.gls
fファイルを指定する。これ以外の拡張子の組み合わせには今の所対応していない。
である。このほか、 --synctex=1
や --shell-escape
等のTeX互換オプションを指定できる(いくつかのオプションはデフォルト値が標準と異なる)。
長いオプションを指定する場合、ハイフンは基本的に2つ必要である。ただし、TeX互換オプションに関してはハイフンが1つでも良い(-color
は受け付けないが -synctex=1
は受け付ける)。
複数の短いオプションをハイフン1つの後にまとめて書くことはできない。
ファイル名の後にオプションを指定することは今のところできないようになっているが、要望があれば帰るかもしれない。
実装済みの機能と今後の予定
現時点で実装済みの主な機能:
- 作業ディレクトリを散らかさない
- 相互参照やら何やらが正しくなるまで何回も処理する
- pTeX系列で自動でdvipdfmxを実行し、PDFを取得する(ptex2pdfの機能を内包する)
- MakeIndexやBibTeX, Biberの実行(明示的にオプションを指定した場合)
- 入力ファイルの監視(別途fswatchコマンドが必要)
- includeonlyをコマンドラインで指定できる
- LuaTeXの実行を少し静かにする(今のところオプションでの指定はできない)
今後実装したい機能:
- ビューワーの起動
- 設定のカスタマイズ(ビューワーや、メッセージの色)
- 外部コマンドに頼らない、自前での入力ファイルの監視
- 補助ツール(MakeIndexやBibTeX等)実行のためのルールを追加できるようにする
- その他、より広範なLaTeXパッケージや補助ツールへの対応
- 「作業ディレクトリを散らかさない」挙動を実現するには、「シェルエスケープするパッケージ」「Luaでファイルを読み書きするLuaTeXパッケージ」「補助ツールと連携することが前提のパッケージ」に個別の対応が必要となるので
ドキュメント化:
- ちゃんとしたマニュアルを作る(英語、日本語)
- コマンドラインオプション、よくあるuse case、それから実装の詳細を書く(少なくとも日本語版には)
- 英語での紹介記事を書く
- TeXworksやTeXShop、その他エディター・統合環境から使うための手順を調査・まとめる
現時点で判明している問題:
- cluttexではメッセージの色付けにANSIエスケープシークエンスを使っているが、古いWindowsのコマンドプロンプトではこれに対応していないので表示が崩れる(ConEmu、MinTTYや、最新のWindows 10のコマンドプロンプトでは問題ない)
- cluttex -e lualatex のエイリアスとして cllualatex を用意しているが、WindowsのTeX Liveでは runscript.tlu がアップデートされないとエイリアス使えない
思想
LaTeX文書処理ツールにはそれぞれの思想がある。例えば、「ビルド手順をユーザーが明示するか、ツールが適切に判断するか」「プロジェクトの設定を設定ファイルに書くか、magic commentとしてファイル自体に記述するか」などはツールの設計者によって判断が分かれるところだろう。
cluttexは今のところ、
- 処理の回数やBibTeX実行の有無はツールが判断する
- プロジェクトごとの設定(使用するエンジン・フォーマット、MakeIndexやBibTeX使用の有無)は、コマンドラインオプションによって明示する(設定ファイルやmagic commentには対応していない)
という方針を取っている。
cluttexでいろんな機能を提供できれば便利かもしれないが、実装の複雑化、作業量の増大のことを考えると、無節操に機能を追加していけるものではない。大事なのは「作業ディレクトリを汚さずに処理をする」ことで、最低限、cluttexはそのための部品として使えたら良い。
例えば、「プロジェクトごとの設定はコマンドラインオプションによって明示する」という方針を取っているが、これが面倒なら、シェルスクリプト(Windowsならバッチファイル)、Makefile や llmk のようなツールを別途利用すれば良い。cluttexはそういうツールから使うための便利なインターフェースを提供したい。
そういう意味では、監視モードつまり「入力ファイルの変更を検知して自動で再処理する」という機能は異色かもしれない。この機能の実現にはソース文書の名前だけではなく、その依存関係(\input, \includeするサブ文書、画像等)のリストも必要となるが、そのリストを得るにはcluttex本体と密結合していた方が良いと考えられたからそういう風にした。しかし、「依存関係を機械可読な方法で吐き出す」機能を実装すれば、監視モードは外付けできるようになるかもしれない。
最後に
「cluttexを使ってみた」「cluttexにこういう機能が欲しい」「こういう状況でうまく動かなかった」などの声をお待ちしています!
何か問題があれば、Twitterで呟く(ハッシュタグ #cluttex 推奨)か、GitHub Issuesに報告してください(後者は日本語でもOKです)。
ピンバック: TeX 実行の自動化ツールを作った (ClutTeX) | 雑記帳