LaTeX Newsを斜め読みしていきます。完全な翻訳を目指す類のものではなく、私が興味を持った項目だけを、ざっくり説明しようと思います。網羅性と正確性には期待しないでください。
今回はLaTeX News Issue 39, June 2024 (LaTeX release 2023-06-01)を読んでいきます。
なお、本記事の投稿に合わせて前回の記事も少し更新しました。これはZRさんの以下の記事に反応してのことです(話題にしていただいてありがとうございます)。
この記事の指摘は、簡単に言えば「オリジナルのltnews38の記述(およびその内容をほぼ忠実に記述した筆者記事の解説)を素直に読むと『新しい文書プロパティを用いると、LaTeXの相互参照(\label
と\ref
)に紐づく情報が取得できる』と誤認しそうになるが、実際はそうなっていない」というものです1。
これを受けて、この「LaTeX News斜め読み」シリーズのスタンスを1つ明示しておきます。本シリーズはltnewsの不完全で雑な抜粋翻訳を提供しようというものなので、基本的には「LaTeXチームがそう言っている」という情報を無批判に取り上げることにしています。ltnewsの説明内容が実際の挙動と一致しているかは、気まぐれ程度にしか確認していません。たまたま気付いた場合や、今回のようにご指摘をいただいて認識した場合には少し補足をする場合もありますが、原則はLaTeXチームの受け売りをしているものだと思って読んでいただくのがよいと思います。
イントロダクション
LaTeXチームは引き続き自動的なタグ付きPDF出力に注力している。2024年の頭にISO PDF/UA-2とWTPDF(well-tagged PDF)の規格がリリースされたが、LaTeXを使用するとこれらを満たす文書を自動的に生成することができる。そうしたドキュメントの実例はGitHubスレッドで確認できる。
2月にはLaTeXチームのUlrikeとFrankがDigitization and E-Inclusion in Mathematics and Science (DEIMS) 2024出席のため来日し、LaTeXプロジェクトの現状を説明した2。
タグ付きPDFプロジェクトからのニュース
前回のニュースでは、表組みのタグ付けをサポートするプロトタイプをアナウンスした。これらの必要コードの一部は、ソケットとプラグの機能を用いつつ、latex-labバンドル内から対応するパッケージとLaTeXカーネルに移動された。カーネルへ移されたタグ付け専用のコードはlttagging.dtx
内に存在する。ここには今のところ、タグ付けに関するソケットを有効化する\UseTaggingSocket
が含まれている。このおかげで、一時的にタグ付け処理を停止するのに便利な\SuspendTagging
と\ResumeTagging
を提供することが可能となっている。
またLamport本で説明されていない少数のコマンドについてもサポートを追加した。これによりphase-III
が利用されている場合、\marginpar
コマンドもAside
またはNote
構造を利用して適切にタグ付けされるようになった(PDFのバージョンにも依存する)。標準文書クラスの\maketitle
は、独立したtestphaseモジュールtitle
が有効になっている場合タグ付けされるようになった。
math
モジュールは拡張されてMathMLファイルを構造に加えるオプションが追加された。
タグ付け関連のIssue報告は歓迎する。
新しいマーク機構の拡張
2022年の6月、複数の独立したマークを管理することができる新しいマーク機構が導入された。この新しい機構は、従前のLaTeXでは確実に実現可能ではなかった上部マークもサポートしている。
Note
新しいマーク機構:このシリーズでは新しいマーク機構の導入を報告するltnews35を取り扱っていないので、この新機構がどのようなものかここで説明しておく。
そもそもTeX用語におけるマークとは、ページ構築の処理(非同期的に発生する)に対して情報を引き渡すための機構である。ここで引き渡される情報の典型例は「そのページにおける最初のセクションや最後のサブセクション」など、ヘッダやフッタに関連する情報である。もっとも、マークはヘッダやフッタ以外の目的にも使用される場合がある。2022年6月に導入された新しいマーク機構は、複数の独立した系統のマークを扱うための一般化された機能を提供する。
マークについてTeXエンジンは低レベルの機構を提供する。文書ソース中で\mark
コマンドを配置した際の情報をページ構築の処理に対して引き渡すというものである。この機構は、plain TeXのような単純なフォーマットではうまく機能する。なぜなら、そのようなフォーマットでは出力ルーチンはページを生成する場合にしか呼び出されないからである。しかし、LaTeXやそれ以上に複雑なフォーマットでは、この仮定は成り立たない。すなわちページ出力を行わない出力ルーチンが呼び出されることがある。そのためページ出力を伴わない出力ルーチン呼び出しがあった直後のページ構築処理においては、もはやTeXの\topmark
の内容がヘッダに反映されない、ということになる。また、TeXは単一のマークしか提供していないが、LaTeXでは複数の系統の情報を追跡したいという要件がある(例えばページの偶奇でマークを別々に管理したい)。
これらの問題に対処するため、従来からLaTeXは独自のマーク機構(2系統のマークを制御する)を備えており、\markboth
、\markright
、\leftmark
、\rightmark
などのインターフェースを提供してきた。
しかし、残念ながら、従来のLaTeXのマークシステムは章とセクションのマークなど一部のシナリオをサポートするものの、十分に一般化されたものとはなっていなかった。ページ上部のマーク状況(\topmark
)は使用できず、また2系統のマークも(名前から明らかなように)\markboth
が両方を一度に設定するものであるため、互いに独立したものとはなっていない。
これに対して、新しいマーク機構は2系統に限定せず、任意個数の完全に独立したマークをサポートする。これらのマークは名前付きで、割り当てられた時点から使用できるようになる。各マークについて、そのトップ・ファースト・ボトムそれぞれの値を別々にアクセスすることが可能である。さらには、新しいマーク機構では異なる「領域」(2024年6月現在サポートされているのはpage
, previous-page
, column
, previous-column
)の情報にもアクセスできるように拡張されている。
新しいマーク機構に関する詳細はtexdoc ltmarks-doc
(パッケージ文書)またはtexdoc ltmarks-code
(実装)で確認できる。
一方で、新しいマーク機構には「ページデータからマークを取り出すためには、TeXが分割マークを生成するように、そのデータを人工的に\vsplit
する必要がある」という制限があった。残念なことに、TeXはこのページデータの中で負の無限大グルー(例えば\vss
由来のもの)を見つけるとエラーを起こしてしまう(この問題は後方のグルー要素により負の無限大グルーをキャンセルしても回避できない)。これは、そのようなグルーが要素のサイズを隠してしまい、任意の要素を分割可能にしてしまうことによる。2022年のコードでは、このような状況を事前に検知して分割を実施しないようにしていたが、そのせいでマーク情報が得られることもないという挙動になっていた。
今回のリリースでは、負の無限大グルーを含む場合でも\vsplit
による分割を実行し、マーク情報の抽出を行うように変更した。TeXのエラーを完全に回避することはできないが、ユーザからはほとんど秘匿することができる。新しいリリースのコードによってTeXが停止したりターミナルにエラーメッセージを書き出すことはない。一方で、logファイルには次のようなエラーメッセージが出力されてしまう3。
! Infinite glue shrinkage found in box being split.
<argument> Infinite shrink error above ignored !
この変更を行った理由は2つある。1つはコーナーケースでマークが失われることがなくなったこと。もう1つはボックス化されたデータについて、確実にマーク情報が取得できるようになったことである。
xtemplateをカーネルとして提供
2020年10月に長年LaTeXチームが温めてきたxparseがltcmdモジュールとしてLaTeXカーネルに取り込まれたが、今回のリリースでは同様に長年温めていたxtemplateがカーネルに取り込まれる。このxtemplateの文脈におけるテンプレートというのは、文書のさまざまな要素(たとえばセクショニング)を実装を交換できる形で抽象化し、デザイン決定を効果的に実装したりコントロールしたりできるようにするものである。
文書の作成者が日常的に使用することになるltcmdとは異なり、テンプレートはより専門的なツールと言える。LaTeXチームはテンプレートは少数の開発者のみによって使用され、文書クラス内で使用される一般的なアイデアを提供するものになると予想している。したがって、ほとんどの文書作成者が直接テンプレートに接する機会は稀だろう。もっとも、文書の作成者もLaTeXチームやサードパーティが提供するテンプレートを利用することにはなる。
テンプレートシステムは3つの独立したアイデアを必要とする。
- テンプレートのタイプ:テンプレートが対象とするモノ。たとえば「セクショニング」や「順序付きリスト」
- テンプレート:タイプの実装に使用できるコードとキーの組み合わせ。たとえば「LaTeXの標準セクショニング」というテンプレートを「セクショニング」タイプ用のものとして作ることができる
- 1つ以上のインスタンス:具体的なテンプレートの(キーが特定の定義された値に設定された)ユースケース。例えば「LaTeXのセクション」や「LaTeXのサブセクション」というのはインスタンスである
なお、本稿の執筆時点ではカーネルに取り込まれたテンプレート機構についての正式なドキュメントはないようである4。したがって、詳細についてはxtemplateのパッケージ文書(texdoc xtemplate
)を読むほかない。ただし、カーネルに取り込まれたのは実験的パッケージxtemplateが提供してきたすべての機能ではなく、安定化した一部であるので留意すること。カーネルに取り込まれたインターフェースの一覧はltnews39の原文を参照されたい。
新しいコマンドと改善されたコマンド
- doc:
\ProvideDocElement
の追加、upquoteパッケージのサポート強化 - ifthen: 比較演算子(
<
,=
,>
)がアクティブ化されている場合も安全に(babel使用時にそういうことが起こるらしい) \IfClassAtLeastT
等の条件命令の追加。これまではTF
しか提供してこなかったがT
とF
のみの変種を追加
コードとドキュメントの改善
- パッケージや文書クラスをグループ内で読み込めないようにチェックする機構の追加
\tracingnone
時にグリフ欠落の警告が出なくなる問題を修正\newcounter
が自動生成するコマンド(\the〈カウンタ名〉
)が定義済みの場合に警告\listfiles
がMD5ハッシュを含められるオプション引数を取るように変更:バージョン情報が未変更でも、ローカルなファイル変更が行われていれば検知できるように\NewDocumentCommand
等によって作成されたシンプルなコマンドの引数解析コードを簡略化:シンプルな引数仕様のコマンドのオーバーヘッドが軽減\NewDocumentCommand
等で使用できる+v
引数の行末(EOL)記号を\obeyedline
に変換- TS1シンボルフォント向けにいくつかの適当なサブエンコーディングを提供
- textcomp5のメッセージが
LaTeX Info
と表示されるべきところ、オプションなしで読み込まれた場合はPackage textcomp Info
に先祖返りしてしまう問題を修正 - LaTeXカーネルやパッケージをロールバックした際に、パッケージのロールバック機能が対応するよりも前のバージョンを指定するとエラーになってしまう問題を修正
- usrguideとclsguide(ltnews37でアナウンス)に加えて、fntguideも抜本的に更新。かつてのバージョンはfntguide-historicに改名
-
もっとも厳密に言えば、ltnews38も私の前回記事も「新しい文書プロパティ機構で、実際に
\label
の情報が取得できる」とは明示的には書いていないので(こういう言い方が適切かはわかりませんが)いわば「優良誤認」のようなものだというのが私の認識です。いずれにしても、ちょっと説明の書き方がミスリーディングなのは事実だと私も思いました。 ↩︎ -
完全な蛇足だが、この来日に際して筆者も直接Frankにお会いした。コロナ禍後だと初のことで、TUG 2019以来なので約5年ぶりの再会だった。 ↩︎
-
l3buildユーザでかつテスト用の機能を使っているような場合には、このメッセージがログファイルの差分として検知される可能性があるので留意すること。 ↩︎
-
実装自体は
lttemplates.dtx
に分離されており、その中のソースにはドキュメント部も存在するが、対応するlttemplates.pdf
は2024-06-13現在提供されていない。 ↩︎ -
textcompパッケージは2020年2月のリリース以降LaTeXカーネルに取り込まれている。 ↩︎