W32TeX向けアーカイブマネージャを作った

こんにちは。最近部誌でTeXを使っているのでTeXにお熱のNakayaです。ブログ更新が2週間空きましたが元気に生活しています。

WindowsでTeXLiveを使うと毎年更新しないといけないみたいだし、tlmgrが重いしで、私はW32TeXを使っています。しかし、パッケージの管理が大変なので先日W32TeX向けのアーカイブマネージャを開発しました。その経緯と思想、内部構造、今後などを語っていきたいと思います。

経緯

先日ConTeXtを試してみるかと思い立ってConTeXtのアーカイブをダウンロードし、 texinstwin からの installmk4 と、TeXjpWiki通りにコマンドを実行してみると、どうもLuaLaTeXのバージョンが古いみたいでインストールに失敗しました。
その後W32TeX版LuaLaTeXの最新版を落として無事にConTeXtはインストールできたのですが、 W32TeX公式のCLIインストーラ版にはパッケージマネージャが付属していないのでこうなったのかなあ、と思ったわけです。 ちゃんと更新くらい確認しろ W32TeXには他にも初心者向GUIインストーラもあるのですがどうも私の環境では不安定なようで、CLIインストーラを導入して今に至っていて不便なあとずっと思ってました。

思想

先日のConTeXtの件で本格的にパッケージマネージャを作るぞ、となりましてあれこれ考えて以下のように思想が固まりました。

  • Arch Linux のパッケージマネージャ、 pacman の良さを取り入れたい
    apt install なんて長い文字列打ちたくないですよね。でもPacmanなら pacman -S でできて楽ですね。

  • TeXの面倒な部分をなくしたい
    そういえばマクロパッケージとかインストールするのも面倒だったなと思って、マクロの管理もできるといいなと思いました。

書いてて思ったことなど

  • GolangのFTP系ライブラリが弱い
    後述するのですが、ファイルリストを詳細取得するコマンド(MLSD)に対応してなかったり、コマンド直打ちできなかったりいろいろでした。勉強がてらGolangでFTP系ライブラリ書くのはアリだなと思ったりしました。

  • interface{} 、お前……
    Golangの空interfaceはどんな型でも取ることができます。これがGolangのいい点であり悪い部分でもあるんですよね……。

  • PythonもGolangも久し振りに書いた
    Pythonはもうめっきり(9ヶ月~半年)書いてないので覚えているわけもなく……。Golangも数ヶ月前まで書いてたのにエラー吐かれまくってました。GolangはTILにまとめたはずなのにTILはまともに使えない代物だったし……。

  • FTPってこんな感じなのか……
    FTPに触れるのが始めてだったのでとても勉強になりました。

  • Python便利だな……
    ほとんど標準ライブラリで書けてしまいました。すごい……。

内部では何が起こっているのか

2019/08/18時点では内部構造は以下のようになってます。

  1. CLIで欲しいパッケージを取得する
    wtmgr -S luatexja だったら luatexja が欲しいんだなとなるわけです。
    また、コマンドライン引数のパースにはPython標準ライブラリの Argparse を使ってます

  2. FTPでミラーにアクセス
    W32TeXのアーカイブをミラーしてくださっているサーバはいくつかあるのですが、選ぶアルゴリズムを考えるのも面倒だったのでringから取ってくるようにしてます。
    これまたPython標準ライブラリである、 ftplib を使ってFTPの操作をしてます。

    1. 目的のディレクトリまで CWD
      UNIXでいうとこで cd ですね、FTPでは CWD (Change Working Directory)とかいうっぽいです

    2. MLSD してファイルリストを取得
      LIST だかというFTPのコマンドがあるのですがこれだと単純にファイルリストを返すだけなのでファイルの変更日時とかが分からないので MLSD を使うことにしました

    3. 欲しいパッケージとファイルリストを照合する
      forとif文をブン回すやつです

    4. 目的のファイルを RETR する Pythonではバイナリを open() でhogehogeするさいは modeの最後に rb のように b をつけるっぽいですね。勉強になります。

今後

現時点では最低限のことしてできないのでまだまだ拡張していきたいところでして、今後計画しているのは機能の拡張と言語を変えてのリライトの2つです。

機能の拡張

とりあえずアーカイブのダウンロードが簡易的にはできるようになったので、それをアップデートできる機能が欲しいと思ってます。
また、そういえばLaTeXのパッケージってインストールするの面倒だったよなと思ったので、ここからLaTeXのパッケージを管理できるようになりたいと思ってます。 環境変数 TEXMF って探すの面倒じゃないですか?毎回ggってしまいます

開発言語の変更

PythonはArgperserやftplibが標準ライブラリとなっていて魅力的な言語ではありますが、 Windowsで使うにはPythonインストールする手間などを考えると少々ハードルが高くなるかと思ってます。 そもそもTeXの導入はハードルが高いのでは?
また、私自身さまざまな言語に触れてみたいと思っていることもあり、他言語で開発しようかなと思ってます。
移行先の言語候補としては、なんだかんだ単一バイナリが吐けて便利なGolang、 勉強がてらRust、F#のあたりかななんて。

おわりに

TeXの何がダメってエラーメッセージの適当さですよね。 まあ、そこを気にしたらTeX使えませんし膨大なマクロが使えるのがいいんですけど……。 しかも最近は代替としてSATySFiやRe:view、Asciidoctorもあることですし……。