Acetaminophen’s diary

化学に関すること,TeXに関すること,ゆきだるまに関すること。

私と TeX Live と LuaTeX の近況レポート

これは TeX & LaTeX Advent Calendar 2018 の 9 日目の記事です。昨日は CareleSmith9 さんでした。明日は wtsnjp さんです。

おことわり

重点テーマにあまり関係しない記事です。TeX & LaTeX Advent Calendar 2016 の記事の続きのような感じですが,どうぞお付き合いください。

 

日頃やっていること

TeXConf 2018 の懇親会の席でリクエストを受けたので,この辺の話を書いてみます。

私は 2017 年に TeX Live チームにも入りました。「TeX Live チーム」の定義が明確ではありませんが,ここでは以下のように定義することとし*1,私は一つ目に該当します。

以下のいずれかの条件を満たす開発者を「TeX Live チーム」とみなす。

さて,TeX Live チームの一員になって以降,私は以下のような活動をしています。すべて毎朝一回,お出かけ前に必ずやることです。毎日やっていれば,大体 15 分くらいで終わります(溜め込んでしまうとむしろ訳が分からなくなり,余計に時間がかかってしまいます)。

  1. TeX Live の subversion をチェックする。具体的には,ブラウザから Log of /trunk を訪問し,その日の変更内容を見る。
  2. W32TeX の [ChangeLog] をチェックする(ほぼ常に TeX Live と同期しているので軽く眺める程度)。
  3. 購読している TeX Live 関連のメーリスの配信を読む。具体的に特に重視するのは以下:
  4. GitHub にログインして https://github.com/ を訪れ,All activity を見る。TeX Live チームの一員であると同時に,2015 年から日本語 TeX 開発コミュニティの一員でもあるという立場上,特に注意して見るのは以下:
    • texjporg, TeX-Live 以下の全てのリポジトリ(当然)。
    • latex2e: LaTeX2e の開発元。
      → ここ,ちゃんと見ないと例えば「LaTeX が変わると pLaTeX が動かなくなる」という問題(例えばこんなの)が起こるので,極めて重要です。
    • latex3: LaTeX3 (expl3) の開発元。
      → expl3 という新しい言語は,それを使うだけで pdfLaTeX / XeLaTeX / LuaLaTeX / pLaTeX / upLaTeX の違いを考えずに済む「クロス・エンジンなコード」が保証されることを理念に掲げています。しかし,それをマクロで実現するためには「全てのエンジンに必要な機能が揃っている」ことが必須です。そこで例えば「足りない機能を e-pTeX と XeTeX に追加したい」という提案が出ることがあり*3,その動向からは目が離せません。
    • graphics-def: graphicx パッケージのドライバオプション(\usepackage[dvipdfmx]{graphicx} とか)の開発元。
      2017 年のバウンディングボックスの仕様変更をいち早く事前につかめたのも,ここを watch しているからです。

あとは,暇を見つけて(毎日ではない)TwitterTeX Live 関連,W32TeX 関連のツイートが流れていないか探す。ここは,どういうワードで検索フィルターをかけるかがノウハウになってきます…。

そして,何か気になる変更があったら覚えておいて,帰宅後に $ git pull なり $ svn update なりして取ってきます。特に,TeX Live subversion の Build/ 配下に気になる変更があったら,ビルド*4して試してみます。だいたい,週に1回か2回はビルドを走らせます。その結果,特に問題なさそうならそのままですが,もし何か日本で関心がありそうな変化があれば(この判断も経験がものを言います),TeX Forum あるいは GitHub の関連する場所で周知を図ります。

 

最近の LuaTeX の動向

今年の Advent Calendar の重点テーマが「とにかくLua(La)TeXしよう」なので,ここから無理やり LuaTeX っぽい話に移ります。とはいっても,LuaTeX を使う話ではなく,ここまでの流れと続く「LuaTeX を使えるようにする側」の話をします。

さて,TeX Live 2018 がインストールされている環境では

$ luatex hoge.tex
This is LuaTeX, Version 1.07.0 (TeX Live 2018)

と表示されます。現在の TeX Live subversion にある最新版をビルドしてみると

$ luatex hoge.tex
This is LuaTeX, Version 1.09.0 (TeX Live 2019/dev)

と出てきます。そして,LuaTeX の roadmap によると

Version 1.10
This will be the TeXLive 2019 release. (後略)

というわけで,TeX Live 2019 では LuaTeX 1.10.0 になると思われます。数字だけみると大したことはない違いに見えますが,これが結構大きな影響かもしれない,という話をします。

Lua 5.2 → 5.3 に完全移行

今年 4 月の記事にも書いていた予定では

  • LuaTeX 1.07 以降は Lua 5.3 ベースでビルドできる
  • TeX Live 2018 では従来の Lua 5.2 ベースの LuaTeX が標準だが、luatex53(LuaTeX として)と texlua53(Lua インタプリタとして)も一緒に配布する
  • TeX Live 2019 では標準が Lua 5.3 ベースになる

でしたが,これは着実に遂行されています。LuaTeX のソース (experimental) は今日現在,LuaTeX 1.09.1 になっていて,これは既に Lua 5.2 ライブラリが削除され,Lua 5.3 に一本化されています。私は Lua に詳しくはありませんが,Lua 5.3 のマニュアルにも 8. Incompatibilities with the Previous Version として Lua 5.2 → Lua 5.3 での非互換な変更が列挙されています。TeX Live にあるパッケージは対応が間に合うのだろうか…?

画像取込ライブラリの poppler → pplib への移行

LuaTeX の roadmap に以下のような記述があります。

Image handling
(略) Inclusion of PDF has been optimized in 0.50. In 1.10 we expect to have replaced the dependency on Poppler for embedding external PDF images by a dedicated small lightweight PDF access library that will also replace the now somewhat inconsistent epdf interface. This is part of the onguing effort to make LuaTeX as independent if other code as possible (the long term stable TeX narrative).

PDF を画像として取り込む(\includegraphics のような)機能を実現するためには,PDF を読み取る能力が欠かせません。その機能を,TeX Live 2018 までの LuaTeX は poppler という外部ライブラリに任せていました。ところが,LuaTeX 1.08.0 以降は poppler を捨て,pplib という小さなライブラリに移管しています。

この「poppler を捨てる」という流れは,TeX Live 界隈の最近の風潮になりつつあります。あまり詳しくない(けれども複数の有識者から話を聞いた)私の理解では,以下の要因が挙げられます。

  1. poppler が安定しない
    • poppler 自体はかなり強力な機能を持っている。(実際,InkscapeTeXworks などのツールも PDF レンダリングに poppler を採用している。)
    • ところが,その機能の多くは外部公開用 API として「仕様化」されているわけではなく,他のソフトウェアが使うことを意図していない
    • 外部公開用 API としては poppler-glib があるが,これはもちろん仕様として安定しているが,機能が足りないので,結局,内部向け API を使わざるを得ない。
    • すると当然ながら,内部用 API には poppler のバージョンアップごとに破壊的変更が入るので,それを使っていたソフトウェアが壊れる。
    • 勿論,安定な poppler-glib に API を追加してほしいという pull request を出している方もいるわけですが,なかなかマージされなかったり…。
  2. 比較的新しいコンパイラ (C++14) が必要
    • TeX Live 特有の事情として,新旧によらず「幅広いプラットフォームをサポートする」ことを目指している(Master/bin/ を見ると,2018 年現在 17 プラットフォーム)。「古いプラットフォームをいつまでサポートし,いつ排除すべきか」という議論でも,新しい言語により得られるメリットとデメリットが天秤にかけられる。
    • ちなみに TeX Live のコンパイルC++11 が必須となったのは TeX Live 2017 以降(dvisvgm version 2.x を皮切りに,ICU や Poppler などのライブラリが C++11 で書かれている)。
    • そんな中,poppler 0.69.0 からは C++14 が必要である。まだまだ C++14 対応コンパイラが利用可能な環境が多くないらしい状況を鑑みると,あと 2, 3 年は先の話になる?

実際に LuaTeX の場合も,poppler を捨てて pplib に乗り換えたことで C++ コンパイラが不要となり,純粋に C コンパイラだけでビルドできるようになったそうです。なお,TeX Live 2019 では恐らく poppler 依存のプログラムは XeTeX だけになると思います。

そもそも,LuaTeX の開発で LuaLaTeX は考慮されていない

この記事を読んでいて,LuaTeX を使ったことがある人のほとんどは,LuaLaTeX で

  • \usepackage{luatexja}
  • \documentclass{ltjsarticle}
  • \documentclass[lualatex]{jlreq}

のいずれかで,直接的あるいは間接的に LuaTeX-ja の成果物を使っていることでしょう。当然ながら,これらは LuaLaTeX で動いています

ところが,LuaTeX の開発目標は LuaLaTeX とは関係ないところにあり,その大きな部分を占めるのは Hans Hagen 氏が開発している ConTeXt です。実際に,forum:2513 の例のように「新しい ConTeXt + 新しい LuaTeX だと問題ないが,古い LuaTeX との組ではエラーが出て動かない(しかもTeX Live 2018 の物も古い部類に入る!)」というほど,LuaTeX と ConTeXt が密接に結びついているのです*5

ConTeXt は LaTeX や plain TeX と双璧をなす(?)マクロの枠組みで,文法が全く異なる(\starttext で始めて \stoptext で終わる等)だけでなく,開発コンセプトも LaTeX とは異なります。What are the differences between ConTeXt and LaTeX? には Hans 氏の考え方が色濃く出ています。また,歴史的背景としても,LaTeX は長年の多くの人による成果物を守るため,よほどのバグは直しつつもなるべく安定志向で維持開発されていますが,ConTeXt はまだその段階に至っていません。

その ConTeXt を動かす LuaTeX の設計思想にも,Hans 氏の考え方が大いに取り入れられていると感じます。例えば,LuaTeX は KnuthTeX を一から再実装していて,LuaTeX と TeX で生じる任意の違いは仕様 (feature) であり,TeX に合わせる気はないと言います。(Hans 氏がそのような発言をしていた気がするのですが,どこで読んだかは忘れました…。)また,先の「新しい ConTeXt + 古い LuaTeX だとエラーが出て動かない」の例は,ConTeXt のために LuaTeX の挙動が変えられたことを示唆します。何が変わったのか詳細はわかりませんが,ConTeXt のために LuaTeX が変わるようだと,いつか LuaLaTeX にも影響が出る可能性がないとはいえません*6

開発目標をどう持つかは自由なのでそれ自体は問題ではありませんが,「LaTeX 界隈での当たり前」が成り立たない LuaTeX (LuaLaTeX) が日本で受け入れられ,安定して使えるようになるのかどうかは,少なくとも私は見通せません。ただ,LuaTeX が「強い」のは確かなので,「安定」と比べてどちらを重視するかは個々人の判断に委ねられるところでしょう。

LuaTeX のフォーク版:LuaHBTeX

LuaTeX の公式版は主に Hans Hagen,Luigi Scarso,Taco Hoekwater らによって,ここまで述べてきたような独特の思想で開発されています。それとは別の方向性で,最近*7走っている LuaTeX のフォーク版プロジェクトが存在します。「LuaHBTeX」と名付けられたものがそれです。

これはエジプトの Khaled Hosny 氏が進めている「LuaTeX に HarfBuzz ライブラリを組み込む」という試みです。Khaled Hosny 氏といえば,XeLaTeX / LuaLaTeX で欠かせないといっても過言ではない fontspec パッケージに多大な貢献があり,ちょっと前までは XeTeX のメーリスでちょくちょく名前が出ていましたが,最近はどうやら LuaTeX でアラビア語を組むことに興味をお持ちのようです。

Arabic and color fonts in LuaTeX using HarfBuzz:
f:id:acetaminophen:20181209165000j:plain
Twitter より)

HarfBuzz は text-shaping engine と呼ばれるもので,「OpenType フォントに定義されている情報をもとに,ユーザが入力した Unicode コードポイントに対応するグリフを並べ,適切に配置する」という機能を提供するライブラリです。特に HarfBuzz には,アラビア語のような「隣り合う文字によって配置を変えて組む」という複雑な処理にも対応しているという強みがあり,これが現在の LuaTeX では弱いところとされています。同じく Unicode ベースの XeTeX は HarfBuzz を内蔵していて,そうしたアラビア語組版もこなすことができる*8ことと比べると,LuaTeX でも HarfBuzz を使いたくなるのも理解できます。

面白い試みなのですが,TeX Live チームからすると,この流れもまた難しいところです。LuaHBTeX は LuaTeX 本家のあずかり知らぬところで開発されていますから,方向性はよくわかっていません。

  • 先述のとおり LuaTeX は C++ 依存を外したのですが,HarfBuzz は C++11 を使っているので,結局ビルドに C++11 が必要になります。
  • LuaTeX に今後マージされるのかどうかは不明です*9

そういうわけで,動きは承知していながらも TeX Live チームとしては特に何もせず様子見です*10

 

まとめ

とりとめもなくなってしまいました…。でもリクエストは果たしました。

LuaTeX の怪しい動向を取り上げましたが,皆さんが使うのは自由ですし,それを TeX Live チームも最大限サポートしていくということは今後も変わりません。

*1:このように定義すれば,個別の「TeX に関連する何かを作って終了」するのではなく,それを「いかに TeX Live という枠組みに落とし込み,ユーザが使えるようにするか」という,よりマクロな「インフラ整備」とでもいうべき活動を指すことができると考えています。

*2:TeX-Live Organization (on GitHub) に所属している人数は,現在 18 名です(所属していることを非公開にしている人も含む)。しかし,実際には「GitHub アカウントで招待したので参加はしたが,活動実態がないメンバー」もいますので,ここではそれを TeX Live チームのメンバーとはみなしません。

*3:直近では \expanded というプリミティブが提案され,これは TeX Live 2019 の e-pTeX から利用可能となる予定です。

*4:簡単には,Build/source/ 以下にある「Build」というシェルスクリプトを走らせるだけです。

*5:実際に,LuaTeX の開発メーリス (dev-luatex) に修正をお願いするために LuaLaTeX の再現ソースを送ってみると返ってきたのは ConTeXt のソースでした。

*6:以前「LaTeX team の中の人が LuaTeX に要望を送ったけれども,結局通らなかった」という事象が確かあったような気がする…。ConTeXt とは対照的です。

*7:本当にごく最近の話で,おそらく初出は今年の 10 月 16 日のチャット (TeX, LaTeX and Friends - StackExchange) だと思われます。

*8:コマンドで xetex --version としてみると,使われている HarfBuzz のバージョンが表示されます。

*9:個人的には,マージされないのではないかと思っています。というのも,LuaTeX は OpenType フォントの扱いを,組み込みライブラリではなく全て Lua プログラムで書かれた fontloader によって実装しているためです。

*10:この本家 LuaTeX と LuaHBTeX をめぐる混沌が,TeXConf 2018 の懇親会の時に飲みながら Norbert さんと「勘弁してくれー」と言っていた話題です。