重点解説！ TeX Live 2023はココが違う！

毎年1回の定期リリースがあるTeX Liveですが、今年も当初の予定通り、2023-03-19にTeX Live 2023がリリースされました。

* [TeX Live][texlive]（公式サイト）
* [TeX Live 2023 released][norbert]（There and back again）

TeX Live 2023では日本の多くのTeXユーザに影響がある変更がありました。この記事ではその概要を紹介します。

## Windows版のバイナリが64ビット版になった

TeX Live 2022までは、Windows版のバイナリは**32ビット版**のものでした[^tlw64]。これは「32ビット版のWindowがインストールされたPCでも使えるようにするため」「32ビット版と64ビット版のバイナリを共存させるのが困難」というのが理由です。

[^tlw64]: 実際には64ビット版のバイナリが別途配布されていている（[参考][lualatexlab]）のですが、これを導入するにはPCについての知識が多少は必要でした。

TeX Live 2023ではWindows版のバイナリが**64ビット版に置き換えられます**（やはり共存は難しいらしい:upside_down:）。

### 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`）

一般のユーザが（特にバイナリの）ディレクトリを意識する必要は普通はありません[^path]が、何か「TeX Liveの設定を自動化するツール」を自作している人は留意する必要がありそうです。

[^path]: Windows版のインストーラは`PATH`環境変数を自動的に設定してくれます。

## pLaTeXがe-upTeXで動作するようになった

:::note warn
TeX Live 2023のリリース時点ではこの変更は開発版（dev版）にのみ反映されている状態でしたが、**2023-06-01の更新において**、一般ユーザが使うコマンドにも変更が反映されました（[参考情報][are]）。従って、現在はこの節の内容が当てはまります。
:::

:::note info
日本のTeX界隈ではpLaTeXが[滅亡する][doomsday]とか[素敵:blush:になる][nice]とか噂されていますが、この変更はその話とは直接は関係ありません。ただし「pTeX周りのメンテナンスのコストを下げる」努力の一環であるのは確かでしょう。
:::

端的にいうと、TeX Live 2022までは「pLaTeXはe-pTeXエンジン上で、upLaTeXはe-upTeXエンジン上で動作している」だったのが、TeX Live 2023では「**pLaTeXも**upLaTeXも**e-upTeX上で動作する**」ように変わります。

これは一見非常に大きな変更のようにみえますが、実は全く違います。むしろ、これによるpLaTeXの**仕様の変更は全くない**[^jismode]ことが想定されています。（なので、もし動作が変わったらそれは**想定外のバグ**です。）

[^jismode]: 実は(e-)upTeXには元々「pTeXと互換の動作をするモード」が備わっていて、そのモードを利用しています（[参考][jismode]）。

ただし一般のユーザが気を付けるべき点が一つだけあります。e-upTeXで動作しているので、pLaTeXを起動した時の**バナー**は当然`This is e-upTeX, …`になります。「アレレ、upLaTeXが動いているぞ:astonished:」と驚いてはいけません。

```text
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…`）の直後にある括弧[^kanjiparen]の中身に注目します。前掲のバナー表示の例では次のようになっています。

```text
(utf8.sjis)
```

この括弧の中に**`uptex`という文字列がある場合は**、起動しているエンジンはupLaTeXであり、それ以外の場合はpLaTeXです。上記の例では`uptex`がないのでpLaTeXであると判断できます。

[^kanjiparen]: この括弧はpTeX系エンジンの漢字コード設定状態を表すもので、`(入力漢字コード.内部漢字コード)`という形式（ただし2つの漢字コードが一致する場合は1つだけ表示）になっています。2つの漢字コードの意味については次小節を参照してください。なお、pTeX系以外のエンジンではこの「漢字コードを表す括弧」は表示されず、バージョン表記の直後に`(TeX Live 2023)`が続きます。

### 補足：pLaTeXとかはどのTeXで動作しているのか

一般のLaTeXユーザ向けの解説では「ﾅﾝﾁｬﾗTeX上で動くLaTeXがﾅﾝﾁｬﾗLaTeXです」と説明されることが多くて、大まかな理解としてはそれでかまわないのですが、実際のTeXエンジンとLaTeXエンジンの対応は結構複雑です。

:::note info
TeXエンジンの種類についての詳しい話については記事[「TeX処理系御伽話」][texengines]を参照してください。
:::

pTeX系については（TeX Live 2013以降は）TeX Live 2022までは以下のようになっていました。

| LaTeXエンジン | コマンド名 | TeXエンジン |
|:--|:--|:--|
| pLaTeX  |`platex`| e-pTeX（内部漢字コード[^kanjiinternal]＝EUC/SJIS） |
| upLaTeX |`uplatex`| e-upTeX（内部漢字コード＝Unicode） |

[^kanjiinternal]: 「内部漢字コード」というのはTeX言語のレベルで和文文字を表現するのに用いられる文字コードのことです。これは入力ファイルの文字コード（入力漢字コード）とは必ずしも一致しません。pLaTeXはUTF-8のファイルを“入力”できる一方で“内部”がJIS符号系の文字コードであるため「UTF-8なのにJISにない文字が扱えない」という現象が起こるわけです。TeXエンジンがe-upTeXに変更されても内部漢字コードがJIS符号系のままなのでこの性質は変わりません。

TeX Live 2023以降では次のようになります。

| LaTeXエンジン | コマンド名 | TeXエンジン |
|:--|:--|:--|
| pLaTeX  |`platex` | **e-upTeX**（内部漢字コード＝EUC/SJIS） |
| upLaTeX |`uplatex`| e-upTeX（内部漢字コード＝Unicode） |

pTeX系以外も含めて示すと以下の通りです（ヤヤコシイですね:frowning:）。

| 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でも通用する方法を紹介します。

:::note info
詳細については記事[「LaTeX で条件分岐や反復処理：ifthen パッケージのキホン」][ifthen]を参照してください。
:::

#### LaTeXレベルの話

ごく最近のTeXシステム（2.2c版[2023-04-08]以降のifptexパッケージが利用可能）で通用すれば十分だという場合は、以下のコードが使えます。

```tex
%プリアンブルで以下の2つのパッケージを読み込む
\usepackage{ifthen,ifptex}
%必要に応じて以下のコードを書く; プリアンブルでも本体でも可
\ifthenelse{\boolean{strictuplatex}}{%
  % upLaTeXの場合
}{%else
  % upLaTeX以外(pLaTeXも含む)の場合
}
%あるいは
\ifthenelse{\boolean{strictplatex}}{%
  % pLaTeXの場合
}{%else
  % pLaTeX以外(upLaTeXも含む)の場合
}
```

あるいは、TeX Live 2017以降であれば、以下のコードが使えます。

```tex
%プリアンブルで以下の2つのパッケージを読み込む
\usepackage{ifthen,ifptex}
%必要に応じて以下のコードを書く
\ifthenelse{\boolean{ptex}}{%
  % pLaTeXまたはupLaTeXの場合
  \ifthenelse{\boolean{nativeuptex}}{%
    % upLaTeXの場合
  }{%else
    % pLaTeXの場合
  }
}{%else
  % pLaTeXでもupLaTeXでもない場合
}
```

#### :sushi:TeX言語レベルの話

もちろん前述の「LaTeXでの方法」を使うのでも全くかまいません[^texifthen]。

[^texifthen]: 余談ですが、実際にパッケージの実装でifthenパッケージを使っているTeX言語開発者は結構います。

[ifthenパッケージ][ifthen]を使わないとしても、[ifptexパッケージ][ifptex]は利用しておく方が「将来の仕様変更にも対応できる」という点を考えた上でも無難でしょう。（ただしTeX Liveでifptexが収録されているのは2017以降です。）

```tex
\RequirePackage{ifptex}
%(必要に応じて以下のコードを書く)
\ifnativeuptex
  % upLaTeXの場合
\fi
\ifptex
  % pLaTeXまたはupLaTeXの場合
\fi
```

もし「pTeX系であることが前提で、upLaTeXである（つまり『内部漢字コードがUnicodeであるupTeX』である）か否かの判定」（ifptexの`\ifnativeuptex`相当）を自分で実装したい場合は以下のコード[^texnical]が使えます。

[^texnical]: `\ifnum\jis"2121="3000`は「JISコードが2121hである文字の内部漢字コードが3000hに等しいならば」という条件を表します。「JISコードが2121hである文字」は全角空白（すなわちU+3000 IDEOGRAPHIC SPACE）であり、この文字の符号値が3000hである文字コードはUnicodeしかないので、この条件は「内部漢字コードがUnicodeならば」と等価になります。

```tex
%(pTeX系であることを前提とする)
\ifnum\jis"2121="3000
  % 内部漢字コードがUnicodeのupTeXである場合
\fi
```

## まとめ

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">リリースされたので、例によって、乗っけておきますね😃<a href="https://twitter.com/hashtag/TeX?src=hash&amp;ref_src=twsrc%5Etfw">#TeX</a> <a href="https://twitter.com/hashtag/%E3%83%86%E3%83%95%E3%83%A9%E3%82%A4%E3%83%96?src=hash&amp;ref_src=twsrc%5Etfw">#テフライブ</a> <a href="https://twitter.com/hashtag/%EF%BD%B6%EF%BE%9D%EF%BE%84%EF%BD%B6?src=hash&amp;ref_src=twsrc%5Etfw">#ｶﾝﾄｶ</a> <a href="https://t.co/myRPnhRwEy">pic.twitter.com/myRPnhRwEy</a></p>&mdash; 某ZR（ざんねん🙃） (@zr_tex8r) <a href="https://twitter.com/zr_tex8r/status/1637713316956221441?ref_src=twsrc%5Etfw">March 20, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[are]: https://twitter.com/aminophen/status/1638179829546901504
[doomsday]: https://acetaminophen.hatenablog.com/entry/2021/06/18/022108
[ifthen]: https://qiita.com/zr_tex8r/items/71ae46c9c4e8cb575073
[ifptex]: https://github.com/zr-tex8r/ifptex/blob/master/README-ja.md
[jismode]: https://twitter.com/zr_tex8r/status/1629808936936423424
[lualatexlab]: https://lualatexlab.blog.fc2.com/blog-entry-65.html
[nice]: https://zrbabbler.hatenablog.com/entry/2022/08/08/080002
[norbert]: https://www.preining.info/blog/2023/03/tex-live-2023-released/
[sore]: https://twitter.com/aminophen/status/1663747859634860034
[texengines]: https://qiita.com/yyu/items/6404656f822ce14db935
[texlive]: https://www.tug.org/texlive/