毎年1回の定期リリースがあるTeX Liveですが、今年も当初の予定通り、2023-03-19にTeX Live 2023がリリースされました。
- TeX Live(公式サイト)
- TeX Live 2023 released(There and back again)
TeX Live 2023では日本の多くのTeXユーザに影響がある変更がありました。この記事ではその概要を紹介します。
Windows版のバイナリが64ビット版になった
TeX Live 2022までは、Windows版のバイナリは32ビット版のものでした1。これは「32ビット版のWindowがインストールされたPCでも使えるようにするため」「32ビット版と64ビット版のバイナリを共存させるのが困難」というのが理由です。
TeX Live 2023ではWindows版のバイナリが64ビット版に置き換えられます(やはり共存は難しいらしい)。
64ビット版で何がうれしいのか
32ビット版のバイナリでは「使用可能なメモリ領域は2GBまで」という制約がありますが、64ビット版にはありません。TeXにおいてメモリ領域の制限が問題になることは滅多にないのですが、一つだけ重要な違いがあります。
- 64ビット版ではLua(La)TeXで巨大なフォントファイルを多く使ってもメモリ不足で落ちることがなくなる。
LuaTeXでのOpenTypeフォントの処理は大量のメモリを消費します。特に日本語のフォントはそれ自体のサイズが大きいので影響が顕著になります。5個くらいの書体を使おうとしたり、あるいは「游明朝」のような“複雑”なフォントだとそれ一つを使おうとしただけで、メモリ不足で異常終了する事態が発生していました。
TeX Live 2023ではWindowsユーザでも安心してLuaTeXの「強力なフォント処理能力」を使えるようになります。
64ビット版で何に注意すべきか
64ビット版への移行に伴い、Windows版のバイナリの格納ディレクトリが変更されました(64ビット版がwin32
にあるのは流石に奇妙なので)。
- TeX Live 2022まで:
$TEXMFROOT/bin/win32
(デフォルトではC:\texlive\20XX\bin\win32
) - TeX Live 2023から:
$TEXMFROOT/bin/windows
(デフォルトではC:\texlive\20XX\bin\windows
)
一般のユーザが(特にバイナリの)ディレクトリを意識する必要は普通はありません2が、何か「TeX Liveの設定を自動化するツール」を自作している人は留意する必要がありそうです。
pLaTeXがe-upTeXで動作するようになった
TeX Live 2023のリリース時点ではこの変更は開発版(dev版)にのみ反映されている状態でしたが、2023-06-01の更新において、一般ユーザが使うコマンドにも変更が反映されました(参考情報)。従って、現在はこの節の内容が当てはまります。
端的にいうと、TeX Live 2022までは「pLaTeXはe-pTeXエンジン上で、upLaTeXはe-upTeXエンジン上で動作している」だったのが、TeX Live 2023では「pLaTeXもupLaTeXもe-upTeX上で動作する」ように変わります。
これは一見非常に大きな変更のようにみえますが、実は全く違います。むしろ、これによるpLaTeXの仕様の変更は全くない3ことが想定されています。(なので、もし動作が変わったらそれは想定外のバグです。)
ただし一般のユーザが気を付けるべき点が一つだけあります。e-upTeXで動作しているので、pLaTeXを起動した時のバナーは当然This is e-upTeX, …
になります。「アレレ、upLaTeXが動いているぞ」と驚いてはいけません。
This is e-upTeX, Version 3.141592653-p4.1.0-u1.29-230214-2.6 (utf8.sjis) (TeX Live 2023) (preloaded format=platex)
restricted \write18 enabled.
entering extended mode
pLaTeXなのかupLaTeXなのか一目で調べる術
ビルド時のトラブルを解決するなどの目的で「どのエンジンが起動しているのか」を知りたいことがあります。新しいTeX Liveにおいて「pLaTeXとupLaTeXのどちらが起動しているか」をバナーを見て判断する方法を説明します。
バナー(端末出力の冒頭)のバージョン表示(Version 3.14…
)の直後にある括弧4の中身に注目します。前掲のバナー表示の例では次のようになっています。
(utf8.sjis)
この括弧の中に**uptex
という文字列がある場合は**、起動しているエンジンはupLaTeXであり、それ以外の場合はpLaTeXです。上記の例ではuptex
がないのでpLaTeXであると判断できます。
補足:pLaTeXとかはどのTeXで動作しているのか
一般のLaTeXユーザ向けの解説では「ナンチャラTeX上で動くLaTeXがナンチャラLaTeXです」と説明されることが多くて、大まかな理解としてはそれでかまわないのですが、実際のTeXエンジンとLaTeXエンジンの対応は結構複雑です。
TeXエンジンの種類についての詳しい話については記事「TeX処理系御伽話」を参照してください。
pTeX系については(TeX Live 2013以降は)TeX Live 2022までは以下のようになっていました。
LaTeXエンジン | コマンド名 | TeXエンジン |
---|---|---|
pLaTeX | platex |
e-pTeX(内部漢字コード5=EUC/SJIS) |
upLaTeX | uplatex |
e-upTeX(内部漢字コード=Unicode) |
TeX Live 2023以降では次のようになります。
LaTeXエンジン | コマンド名 | TeXエンジン |
---|---|---|
pLaTeX | platex |
e-upTeX(内部漢字コード=EUC/SJIS) |
upLaTeX | uplatex |
e-upTeX(内部漢字コード=Unicode) |
pTeX系以外も含めて示すと以下の通りです(ヤヤコシイですね)。
LaTeXエンジン | コマンド名 | TeXエンジン |
---|---|---|
欧文LaTeX | latex |
pdfTeX(DVIモード) |
pdfLaTeX | pdflatex |
pdfTeX(PDFモード) |
XeLaTeX | xelatex |
XeTeX |
LuaLaTeX | lualatex |
LuaHBTeX(PDFモード) |
pLaTeX | platex |
e-upTeX(内部漢字コード=EUC/SJIS) |
upLaTeX | uplatex |
e-upTeX(内部漢字コード=Unicode) |
補足:pLaTeXなのかupLaTeXなのかマクロで調べる術
「pLaTeXでもupLaTeXでも使える文書・文書クラス・パッケージ」を作製していて、実行するコードを分ける等の目的で「pLaTeXとupLaTeXを判別したい」場合があります。TeX Live 2023での変更により、従来使っていた方法(特にTeXエンジンの判別に委ねていた方法)が通用しなくなる可能性があります。ここでは新しいTeX Liveでも通用する方法を紹介します。
詳細については記事「LaTeX で条件分岐や反復処理:ifthen パッケージのキホン」を参照してください。
LaTeXレベルの話
ごく最近のTeXシステム(2.2c版[2023-04-08]以降のifptexパッケージが利用可能)で通用すれば十分だという場合は、以下のコードが使えます。
%プリアンブルで以下の2つのパッケージを読み込む
\usepackage{ifthen,ifptex}
%必要に応じて以下のコードを書く; プリアンブルでも本体でも可
\ifthenelse{\boolean{strictuplatex}}{%
% upLaTeXの場合
}{%else
% upLaTeX以外(pLaTeXも含む)の場合
}
%あるいは
\ifthenelse{\boolean{strictplatex}}{%
% pLaTeXの場合
}{%else
% pLaTeX以外(upLaTeXも含む)の場合
}
あるいは、TeX Live 2017以降であれば、以下のコードが使えます。
%プリアンブルで以下の2つのパッケージを読み込む
\usepackage{ifthen,ifptex}
%必要に応じて以下のコードを書く
\ifthenelse{\boolean{ptex}}{%
% pLaTeXまたはupLaTeXの場合
\ifthenelse{\boolean{nativeuptex}}{%
% upLaTeXの場合
}{%else
% pLaTeXの場合
}
}{%else
% pLaTeXでもupLaTeXでもない場合
}
TeX言語レベルの話
もちろん前述の「LaTeXでの方法」を使うのでも全くかまいません6。
ifthenパッケージを使わないとしても、ifptexパッケージは利用しておく方が「将来の仕様変更にも対応できる」という点を考えた上でも無難でしょう。(ただしTeX Liveでifptexが収録されているのは2017以降です。)
\RequirePackage{ifptex}
%(必要に応じて以下のコードを書く)
\ifnativeuptex
% upLaTeXの場合
\fi
\ifptex
% pLaTeXまたはupLaTeXの場合
\fi
もし「pTeX系であることが前提で、upLaTeXである(つまり『内部漢字コードがUnicodeであるupTeX』である)か否かの判定」(ifptexの\ifnativeuptex
相当)を自分で実装したい場合は以下のコード7が使えます。
%(pTeX系であることを前提とする)
\ifnum\jis"2121="3000
% 内部漢字コードがUnicodeのupTeXである場合
\fi
まとめ
リリースされたので、例によって、乗っけておきますね😃#TeX #テフライブ #カントカ pic.twitter.com/myRPnhRwEy
— 某ZR(ざんねん🙃) (@zr_tex8r) March 20, 2023
-
実際には64ビット版のバイナリが別途配布されていている(参考)のですが、これを導入するにはPCについての知識が多少は必要でした。 ↩
-
Windows版のインストーラは
PATH
環境変数を自動的に設定してくれます。 ↩ -
実は(e-)upTeXには元々「pTeXと互換の動作をするモード」が備わっていて、そのモードを利用しています(参考)。 ↩
-
この括弧はpTeX系エンジンの漢字コード設定状態を表すもので、
(入力漢字コード.内部漢字コード)
という形式(ただし2つの漢字コードが一致する場合は1つだけ表示)になっています。2つの漢字コードの意味については次小節を参照してください。なお、pTeX系以外のエンジンではこの「漢字コードを表す括弧」は表示されず、バージョン表記の直後に(TeX Live 2023)
が続きます。 ↩ -
「内部漢字コード」というのはTeX言語のレベルで和文文字を表現するのに用いられる文字コードのことです。これは入力ファイルの文字コード(入力漢字コード)とは必ずしも一致しません。pLaTeXはUTF-8のファイルを“入力”できる一方で“内部”がJIS符号系の文字コードであるため「UTF-8なのにJISにない文字が扱えない」という現象が起こるわけです。TeXエンジンがe-upTeXに変更されても内部漢字コードがJIS符号系のままなのでこの性質は変わりません。 ↩
-
余談ですが、実際にパッケージの実装でifthenパッケージを使っているTeX言語開発者は結構います。 ↩
-
\ifnum\jis"2121="3000
は「JISコードが2121hである文字の内部漢字コードが3000hに等しいならば」という条件を表します。「JISコードが2121hである文字」は全角空白(すなわちU+3000 IDEOGRAPHIC SPACE)であり、この文字の符号値が3000hである文字コードはUnicodeしかないので、この条件は「内部漢字コードがUnicodeならば」と等価になります。 ↩