LaTeX News斜め読み (4) Issue 40, 2024年11月発行

2024-11-13 (updated: 2024-11-14)  #LaTeX  #ltnews 

LaTeX Newsを斜め読みしていきます。完全な翻訳を目指す類のものではなく、私が興味を持った項目だけを、ざっくり説明しようと思います。網羅性と正確性には期待しないでください。

今回はLaTeX News Issue 40, November 2024 (LaTeX release 2024-11-01)を読んでいきます。



LaTeX2eの30年

1994年の夏、すなわち30年前、LaTeX2eの最初のリリースが行われた。当時、LaTeX2eは新しいメジャーバージョンのLaTeX1開発の途中で生じた中間バージョンとなることが意図されていた(だから$\epsilon$なのである)。開発チームは新しいメジャーバージョンは数年で成熟すると期待していたが、実際には遥かに多くの時間が必要となってしまった。その結果、見ての通りLaTeX2eは今日でも現役である。

一方で、LaTeX2eはこの30年で多くの変化を遂げてきた。その足跡は、この間のLaTeXリリースの度に発刊されてきたこのLaTeX Newsに記録されている。

LaTeX2eのリリースから最初の20年間は、LaTeXカーネルは基本的に安定しており最低限のバグ修正活動しか行われていなかった。この期間、追加機能のほとんどは、文書プリアンブルで読み込むことのできる新規もしくは拡張されたパッケージとして提供されてきた。このような形で提供された追加機能には、expl3(LaTeX3プログラミング言語)、xparse(新しいドキュメントコマンドインターフェース)、xtemplate(文書設定のメカニズム)などLaTeX3をターゲットに据えたアイデアも含まれている。

最初は、このようにパッケージによって追加機能を提供するアプローチはうまく機能し、高い後方互換性を保つことができていた。しかし、時が経つにつれ新機能の提供手段をパッケージ経由に留めおくことによる弊害はどんどん大きく膨らんでしまった。広く利用可能であるべき(つまり、カーネルに取り込まれるべき)機能やバグ修正がパッケージを用いることでしか利用できないため、パッケージ間に大量の依存関係が発生した。その結果、LaTeX周辺のコードは複雑怪奇で管理困難な状態に陥ってしまった。例えばhyperrefはカーネルや外部パッケージのマクロを書き換える必要性に見舞われ、さらにhyperref以外のパッケージはhyperrefが読み込まれているか否かによって振る舞いを変えなければならなくなってしまった。

こうした状況を受けて、LaTeXチームは2015年に方針を転換し積極的なカーネル開発を再開した。それと同じくして、後方互換性を維持し続けるためにlatexreleaseパッケージを導入し、ユーザはLaTeXカーネルを古いバージョンに巻き戻すことができるようになった。これにより、ユーザは必要に応じて過去の文書を当時と同じように再処理できるようにしたのである。

この方針転換のため、直近10年間はより多くの拡張や修正がLaTeXカーネルに取り込まれた。全体を通して、LaTeXチームは「この新しいアプローチはうまく機能し、何年も前に書かれた古い文書も同じように再処理することができるというLaTeXの根幹となる優れた性質を維持しながらLaTeXを現代的にすることができた」と自信を持って言うことができる。

LaTeXカーネルの更新と現代化を実施したことで、2019年には複数年に亘る「タグ付きPDFプロジェクト」を開始することができた。このプロジェクトの目的はLaTeXを用いて自動的に高アクセシビリティなPDFを生成できるようにすることである。このプロジェクトの完了にはまだいくつものフェーズを乗り越える必要があるが、これまでに達成されたマイルストーンによってユーザはすでに一定の条件下(入力文書が対応済みの文書クラスとパッケージのみを利用して作成されている場合)でPDF/UAに準拠したPDFを生成することが可能となっている。

プロジェクトの一環として、2020-02-02のLaTeXリリースでは大きな転機が訪れた。もっとも、この件について当時のLaTeXチームによる説明は「expl3の読み込み時間が改善された」とやや難読化されてしまっている。この説明は技術的には間違っていないが、本当に言いたかったことは「LaTeXチームがついにLaTeX3のプログラミングレイヤをLaTeX本体に統合した」ということである。LaTeX3のプログラミングレイヤに関する最初のアイデアは、1992年頃に出てきたものであるから、これは大きな出来事である。別の言い方をすれば、この2020-02-02という日は、元来のLaTeX3に関するアイデアが実際にLaTeXカーネルの標準機能となった日ということである。

このプログラミングレイヤが(LaTeXカーネルの)内部的に利用できるようになったことで、新しい概念や拡張をLaTeX本体に提供することができるようになった。具体的には、フック管理システム、新しいマーク機構、タグ付けとPDFリソース管理に係わるコア機能、一貫性のあるkey-valueインターフェース、ソケット・プラグ機構などが次々にLaTeXカーネルに導入された。

LaTeXの現代化とタグ付きPDFプロジェクトの完遂のため、LaTeXチームは今後も活発な開発活動を継続する。そのため、さらに多くの機能や拡張が導入されることになるだろう。ぜひLaTeX Newsの今後のアナウンスに注目して欲しい。


LaTeX2e 30周年を記念するこの最初のセクションは、最近のLaTeXチームの動きを理解するためにも広い文脈で重要な内容が多く含まれていたので、このブログ記事シリーズでは珍しいことにほぼ全文を丸々翻訳しました(ただし、かなり意訳したと思います)。またLaTeXチームの主要メンバーであるJoseph Wright氏が本リリースに合わせて類似する内容をブログに投稿されているので、合わせて目を通すと有益でしょう。

さて、以降はいつも通りの(網羅訳ではない)「斜め読み」です。


タグ付きPDFプロジェクトからのニュース

重要:サポートするエンジンの更新

後述するように、数式の完全なサポートも含めタグ付きPDFプロジェクトの中で多くの作業が進められている。こうした中、各種TeXエンジンの技術的な能力が調査された。その結果、今後のタグ付きPDFプロジェクトでサポートするエンジンの数は絞られることになった。

XeTeXでは、エンジンの制約のため信頼に足るタグ付きPDFを生成することは不可能である。そのため、今後タグ付きPDFプロジェクトの文脈ではXeTeXはサポート外となる。LaTeXチームとしては、引き続き「ベストエフォート」でXeTeXの問題への対処やLaTeXチームが管理するコードのXeTeX対応を行う。一方、LaTeXチームによって新しい機能が追加されることはない。将来的にはXeTeXで利用できる機能がさらに制限されることになる可能性もある。ユーザには、XeTeX文書をLuaTeXに移行しておくことを強く推奨する。

pdfTeXでは、必要なTeXソースを追加したり外部で生成したMathMLを含めることで数式のタグ付けをサポートすることができる。MathMLの自動生成はLuaTeXでしかサポートされない。pdfTeXの数式以外の要素のサポートは継続するが、LuaTeXへの移行を推奨する。

(u)pTeXをはじめ、上記以外のエンジンについてはLaTeXチームが技術的詳細を把握していないため、今後サポートできるか否かを明言できない2。LaTeXチームは今後も調査を続け、いずれサポートの方針をLaTeX Newsでアナウンスする。

外部パッケージのタグ付けサポート

さまざまなLaTeXパッケージと文書クラスのタグ付けPDF生成への対応状況は、以下のページにまとめられている。

LaTeXチームは外部パッケージによるタグ付けサポートの改善にも取り組んでいる。phase-IIIに加えてfirstaidを指定すると、amsthmやfancyvrbを含む複数のパッケージが提供する基本コマンドも利用できるようになる。

表組みへのタグ付けの改善

表組みへのタグ付けも拡張されている。今後はヘッダー行をタグ付けできるほか、複数行にまたがるセルも作成することができる。

この機能に対するインターフェースはまだ確定していないが、今のところはヘッダーとして扱う行と列を指定することでタグ付けを行うことができる。例えば

\tagpdfsetup{
   table/header-rows={1,2},
   table/header-columns={1} }

という指定は、これに続く表組みの上から2行と第1列をヘッダーとしてタグ付けする。

同様に複数行にまたがるセルについては以下の指定でRowSpan属性を与えることができる。

\tagpdfsetup{table/multirow={2}}

自動でのMathMLタグ付け

LuaLaTeXを使用していて、luammlパッケージが利用可能であり、かつunicode-mathパッケージを使用している場合には、各数式は自動的にMathMLに変換されMathML関連付けファイル(MathML構造エレメントとも呼ばれる)としてタグ付きPDFに添付することが可能となる。この新機能は

\tagpdfsetup{math/mathml/luamml/load=false}

によって無効化することもできる。MathMLタグ付けをコントロールするための詳細なオプションについてはlatex-lab-mathのドキュメントを参照されたい。

LaTeXカーネルへの変更

段落継続の取り扱い

LaTeX 2.09の時点で、すでに箇条書きなどのディスプレイ(別行立て)環境直後のテキストが現在の段落を継続するべきか新しい段落を開始すべきかの自動判定を行う機構が存在していた。LaTeXの文書レベルにおける書式としては、そうした環境直後の空行の有無が新しい段落を開始するか否かを指示することになっている。すなわち、空行がない場合には新しい段落が作成されず、現在の段落が継続しているとみなされる。

しかし残念ながら、このLaTeX 2.09以来のアプローチがうまく機能しないケースがたくさん存在する。例えば

{〈何らかのローカルなカスタム設定〉
\begin{equation} a<b \end{equation}}
〈何らかのテキスト〉

というようなコードを記述すると、〈何らかのテキスト〉は間違って新しい段落と判定されてしまう3。この問題はLaTeX2eの開発時点で報告されていたが、抜本的には改善されないままとなってきた。この問題の主要な原因は(想像がつくと思うが)段落継続の判定機構が、あとの空行に辿り着く前の{}\begingroup/\endgroup\bgroup/\egroupによって作成されるグループの中で実行されてしまうことにあった。

これまでのところは、この問題については明示的に\noindentを追加することで見た目上は修正できていた。しかしタグ付けPDFを実装しようとすると状況は悪化し、誤った構造が生成されるかそれ以上にまずい事態が発生してしまう。そのため、LaTeXチームは上記の状況を含め、あらゆる状況で正しく段落継続が判定される機構を開発しようと試みている。

偽物の“no item”エラーを回避

\addvspace\addpenaltyは垂直モード以外の場面で使用されると“Something’s wrong―perhaps a missing \item”エラーを引き起こす。かつてLaTeX 2.09の時代にはこれらのコマンドは垂直モードでしか利用できなかったので、このエラーは必要なものであった。しかし1994年以降のLaTeX2eでは内部的には垂直モード以外でも利用できるようになっていた。開発チームは単純にこのエラーの存在を見落としており、無意味にも放置してしまっていた。今回のリリースで、すなわち30年遅れで、この問題は修正された。

\DocumentMetadata利用時のデフォルトエンコーディングをT1に変更

よく知られているように、フォントエンコーディングOT1はたった128種類の文字しかサポートしておらず、いくつもの問題を抱えている。特に英語以外の言語ではこの問題は顕著であった。それにもかかわらず、OT1はLaTeXのデフォルトエンコーディングのままであり続けた。このデフォルトはあまりに多くの既存文書に影響を与えてしまうため、容易に変更することができなかった。T1バージョンのフォントはOT1のそれとは若干異なるメトリクスを持っているためである。

\DocumentMetadataコマンドの導入は、それが置かれた文書についてはレイアウトに影響のあるものも含めて後方非互換な変更を可能にした。したがって、LaTeXチームはようやくデフォルトのフォントエンコーディングを変更できる機会を得た。今回のバージョンからは、(pdf)LaTeXを使用していて、かつ\DocumentMetadataを使用した場合にはT1エンコーディングがデフォルトで利用されるようになる(Unicodeエンジンでは引き続きTUエンコーディングが用いられる)。拡大可能なフォントの利用を確実にするにはcm-superパッケージがインストールされている必要がある。OT1エンコーディングに戻したいユーザは\usepackage[OT1]{fontenc}を利用すればよい。

コード改善

key-valueオプションが文書クラスとパッケージで衝突するのを回避

2022年6月のリリースで、key-valueオプションの処理がカーネルに導入された。LaTeX2eの原則通り、\documentclassに与えられるkey-valueオプションはグローバルオプションとして扱われ、各パッケージにも伝達される。しかし、key-value形式のオプション名は、通常のオプション文字列と比べると格段に衝突しやすく、クラス固有のオプション名とパッケージが提供するオプション名が(意図せずに)一致してしまう可能性が高い。そこで、今回のリリースではこの衝突問題を改善する機構を導入する。

文書クラスがカーネルのkey-value処理機構を利用している場合、key-valueオプションとして認識されたものはすべて記録されるが、各パッケージのオプションを処理する際にこれらのグローバルオプションはデフォルトでは無視される。文書クラスが直接利用するオプションのうち、グローバルオプションとしても利用されるべきもの(例えばdraft)を設定するため、新しいキープロパティ.pass-to-packagesが追加された。このプロパティが設定されているキーは、パッケージで処理される場合にも無視されない。例えば

\DeclareKeys{
  draft .if = {ifl@cls@draft},
  draft .pass-to-packages = true,
  mode  .store = \cls@mode
}

という指定が文書クラスで行われるとdraftmodeという2つのオプションが作成される。このうちdraftオプションは各パッケージでも通常通りに扱われるが、modeオプションは各パッケージの処理においては無視される。すなわち、modeオプションは文書クラスの「プライベート」なものとしてマークされたことになる。

その他の改善

  • XeTeXで\showhyphensを使用すると、Latin Modernに収録されていない任意の文字が使用されると警告が出ていた。この問題は修正され、警告は抑制された。
  • LaTeXのフック管理機構では、空のフック名と空のラベル名はいずれも許容されていない。以前はどちらのケースでもラベルに関するエラーが出ていたが、フックの場合にはフックに固有のエラーが出るように改善された。
  • リンクごとに固有のターゲット名を生成するため、hyperrefは特別なカウンタ表現\theH〈カウンタ〉を利用してきた。このカウンタ表現の存在を確実にするため、hyperrefは\@definecounter\@addtoreset\refstepcounterの定義を上書きする。このカウンタ表現がタグ付きPDFプロジェクトでも必要であったので、これらの上書きされた定義がカーネルにも取り込まれた。そのため、今後はすべての\newcounter{〈カウンタ〉}\the〈カウンタ〉だけでなく\theH〈カウンタ〉も定義することになる。
  • 何年もの間、hyperrefはリンクターゲットが生成されるように\refstepcounterの定義を上書きしてきた。このコマンドのカーネルでの定義は拡張され、ソケットインターフェースを持つように変更された。これにより、hyperrefは\refstepcounterの定義を上書きする必要がなくなった。この新しいインターフェースはタグ付きPDFプロジェクトでも利用されている。

カーネル以外の改善

amsmath: \dotsサポートの拡張

amsmathパッケージの提供する\dotsを利用すると、前後の状況に合わせて3点リーダの種類(中央寄りか下寄りか)を自動で切り替えることができる。しかし、\congなどの動く引数での展開から保護された記号が存在すると\dotsによる自動判定がうまく機能しないという制約が存在した。今回、この問題は修正された。

array: >{...}指定子の改善

>{...}の引数が末尾にオプション引数を取る場合(例えば\NewDocumentCommand\foo{o}{...}のように定義されたコマンド)低レベルのパースエラーが発生していた。今回、この問題は修正された。

array: \clineに対するタグ付けサポート

前回のリリースでarray、longtableなどの表組みパッケージのサポートを追加したが、\clineへの対応が不十分であることを見落としていた。今回のリリースで、十分な対応が行われた。

longtable: キャプションタイプの拡張

longtableパッケージは新たに\LTcaptypeコマンドを提供するようになった(このコマンドはltcaptionパッケージが提供していたものである)。このコマンドを利用することで、longtableが提供する環境における\captionの種類を変更することができる。例えば\renewcommand\LTcaptype{figure}とすることで、longtableはtableカウンタの代わりにfigureカウンタをインクリメントし、そのキャプションは図目次にエントリを生成するようになる。\renewcommand\LTcaptype{}のように空の定義を行うとカウンタのインクリメントを停止することも可能である。これにより採番されないlongtalbeの亜種環境を簡単に作成できるようになる。

\newenvironment{longtable*}
  {\renewcommand\LTcaptype{}\longtable}
  {\endlongtable}	

l3build: --devオプションの追加

サードパーティ開発者がプレリリース版のLaTeXを利用したテストを簡単に実施できるよう--devオプションがl3buildに追加された。LaTeXの最新リリースを利用してテストを実行するにはこれまで通り

l3build check

とすればよい。まったく同じテストをLaTeXのプレリリースを利用して実行するには次のようにする:

l3build check --dev

  1. 原文では"mythical LaTeX3"(神話上のLaTeX3)と表現されている。 ↩︎

  2. LaTeXチームは公式見解の表明を避けていますが、pdfTeXやXeTeXですら完全にはサポートできないということは(u)pTeXがサポートできる可能性はかなり低いと思われる。 ↩︎

  3. 具体的なコード例はZRさんのツイートで紹介されている。 ↩︎