44
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-03-20

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

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

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

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

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

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

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

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

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

端的にいうと、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が動いているぞ:astonished:」と驚いてはいけません。

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系以外も含めて示すと以下の通りです(ヤヤコシイですね: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でも通用する方法を紹介します。

詳細については記事「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でもない場合
}

:sushi: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

まとめ

  1. 実際には64ビット版のバイナリが別途配布されていている(参考)のですが、これを導入するにはPCについての知識が多少は必要でした。

  2. Windows版のインストーラはPATH環境変数を自動的に設定してくれます。

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

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

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

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

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

44
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
44
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?