マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

”pLaTeXがヤバい”問題を一気に解決する話(※ただし画期的)

一昨年に始まったコロナ禍は今も終わりが見えず、日々の生活に薄暗い影を落とし続けています。そこに加えて、最近では世界情勢が……(中略)……ゆきだるま☃!

というわけで、すっかり夏の風物詩として定着したと強弁したい気もする「ゆきだるま☃の日」が今年もやってきました!

pLaTeXがヤバい話

先に述べた通り不穏な世界情勢が続いているわけですが、それとは別に、日本語LaTeXの界隈では最近、ある不穏な言説がとみに聞かれるようになりました。それは

pLaTeX滅亡の危機」

の話です。

acetaminophen.hatenablog.com

なんだかトッテモムズカシイ話ですが、要点をまとめると以下の通りです:

  • 最近ではLaTeXの開発チームがLaTeXカーネルに対する大規模な改修を強力に推し進めている。
  • その改修の中で大きな役割を果たすのが「文字列に対する処理」である。
  • ところが、(u)pTeX「欧文と和文の文字空間が分離している」という異質な特徴を持っている。このため、(u)pTeXをサポートするためにそれ専用の特別な実装が必要になるという事態が往々にして発生する。
  • 海外のTeX開発者は日本の(u)pTeXの仕様に関する知識をほとんど持ち合わせていないため、(u)pTeXのサポートが円滑に行われるためには、何らかの形で日本の開発コミュニティから相当のコミットを行う必要がある。
  • しかし現状の日本の開発コミュニティではその「相当のコミット」を行うだけの余力がない

TeX界隈全体において開発が継続する中で「(u)pLaTeXが正常に使える状態を維持する」ためには相応のリソースが必要になるというのは当然である一方で、最近のLaTeXカーネルの開発の規模と影響範囲を考慮する限り、日本の開発コミュニティにはリソースが全く足りていないというわけです。このまま日本のコミュニティが海外のLaTeXの開発の進捗に追随できない状態が続くと、やがては「(u)pLaTeXに不具合が多発して使い物にならなくなる」という事態に陥ることは容易に想像がつきます。

※ここでは詳細は省きますが、「ヤバさの度合い」でいうとupLaTeXに比べてpLaTeXの方が圧倒的にヤバい状態です。(これはpLaTeXの内部漢字コードがUnicodeでないことに起因します。)従って以下ではpLaTeXの方に話題を絞ることにします。

pLaTeXがやっぱりヤバい話

さて、この話が出たのが昨年の6月のことで、それから1年余りの時が経ちました。現時点で「pLaTeXが滅亡している」のか、というと、そのような様子には見えません。pLaTeXは今でも不具合を特に頻繁に起こすことなく動作し続けています。もっと言えば、今年に入ってpLaTeXに対象を絞ったLaTeXの入門書が出版されていたりさえします。

ということは、「pLaTeXが滅亡する」という話は単なる杞憂だったのでしょうか? あるいは、話の前提となっている「日本の開発コミュニティのリソース不足」の問題がこの1年の間に解決したということでしょうか?

残念ながらどちらも違っていて、今でも「滅亡の危機」は緩慢に続いています。

LaTeXカーネルの大規模な改修は非常に長い期間(恐らく3~5年ほど)を見積もって行われいて、その成果が現実のLaTeXに反映されるのはかなり先のことになります。つまり、それまではたとえpTeXと非互換な改修が開発されていたとしても現実に影響が出ることはないのです。

翻って日本の開発コミュニティの現在での状況を考えてみると、自分が観察した限りでは、メンバー各々の個人的な事情などがあって、1年前に比べて状況はむしろ悪化しているようにもみえます。以下のリンクは「今年6月のLaTeXカーネル改修への対策」を扱うGitHubのイシューです。

これを見ると「既にいくつかの細かい不具合が判明しているのに、何も動きがないまま2ヶ月が経過している」ことがわかります。ある意味で、pLaTeXは現時点で既にチョット壊れているわけです。同様の状況が続いたまま「LaTeXカーネルの大規模改修の本番リリース」の日を迎えることを考えると、pLaTeXの将来について悲観的に考えざるを得ないところでしょう。

pLaTeXがヤバくなっても大丈夫な話

ところで、この「pLaTeXがヤバい」話に関して、世の中には「別に大した問題ではない」と主張する人もいます。

実は私自身も「pLaTeXユーザ(文書作成者を指す)この問題について今からあまり心配する必要はない」と考えています。先述の経緯を考えると、もしLaTeXカーネルの大改修のリリースが実際に(半年後などに)スケジュールされたとなると、その時点での日本の開発コミュニティ側での対応状況は判明しているはずです。そうであれば「pLaTeXが滅亡するのでupLaTeXに移行すべし」あるいは「upLaTeXも滅亡するのでLuaLaTeXに移行すべし」というアドバイスが開発コミュニティから出されるはずです。「古いTeX Liveを容易にインストールできるようにする」などの緩和策も取られるでしょう。ユーザ(文書作成者)の立場では実際にアドバイスが出てから行動したとしても十分に間に合うはずです。

※私の考えでは、むしろこの問題について「今からもっと心配してほしい」のは「pLaTeX専用の文書クラスで運用している組織(学会など)」だったりします。「文書クラスの他エンジン対応の改修」というのは一般に相当の時間と労力がかかるものだからです。

一方で、この問題について別の画期的な観点から「今のpLaTeXがヤバくなっても大した問題にはならない」と主張する人もいます。

そうです。「ゆきだるま☃の日」の某ZR氏のネタの大ファンであれば既におわかりだと思いますが、一般に「LaTeXの問題は“出力を☃に変える”と一気に解決する」ということが経験則として知られています。そうであれば「今のpLaTeXのサポートが困難でヤバい」という問題も

pLaTeXの全ての出力を☃に変更する

ことで一気に解決できることが大いに期待されます。

pLaTeXがヤバくなると素敵になる話

というわけで、pLaTeXがいよいよヤバくなった時に備えて、つくってみました

これらのファイルには“pLaTeXの新しい画期的な実装”が記されています。本来はインストールして使うものですが、今はまだpLaTeXがヤバくなってないので、カレントディレクトリで試しに使うことにします。以下の手順に従ってください。

  1. platex.iniとsclatex.texをカレントディレクトリに置く。
  2. eptex -ini -etex platex.ini を実行する。

すると、以下のような表示が出て、ファイルplatex.fmtが生成されます。

>eptex -ini -etex platex.ini
This is e-pTeX, Version 3.141592653-p4.0.0-220214-2.6 (utf8.sjis) (TeX Live 2022) (INITEX)
 restricted \write18 enabled.
entering extended mode
(./platex.ini (./sclatex.tex
(c:/texlive/2022/texmf-dist/tex/plain/base/plain.tex
Preloading the plain format: codes, registers, parameters, fonts, more fonts,
macros, math definitions, output routines, hyphenation
(c:/texlive/2022/texmf-dist/tex/generic/hyphen/hyphen.tex))
scLaTeX <2022-08-08>
(c:/texlive/2022/texmf-dist/tex/generic/iftex/ifluatex.sty
……(中略)……
181 for language 0
No pages of output.
Transcript written on platex.log.

このplatex.fmtをカレントディレクトリに置いた状態platexコマンドを起動すると、pLaTeX画期的な実装を使うことができます。

platex.logのファイルは以降の操作では不要です。

早速、簡単なテスト用のpLaTeX文書をコンパイルしてみましょう!

[test1.tex]
\documentclass[dvipdfmx,a4paper]{article}
\usepackage{xcolor}
\begin{document}
Hello, \textcolor{red}{p\LaTeX} world!
\end{document}

※なお、この新しいpLaTeXにおいては\documentclass命令以降の記述は(例によって全く本質的でないため)全く読み込まれず無視されます。そのためドライバ指定dvipdfmxなどのオプション)はグローバルオプション\documentclass命令のオプション)として書く必要があります。とはいっても、イマドキのLaTeXではそれが常識であるため、特に不思議な話ではないですね。

このファイルをいつもの手順でPDFに変換しましょう。

※ptex2pdfコマンドを使うこともできます。

platex test1.tex
dvipdfmx test1.dvi

生成されたtest1.pdfを開くと……。

test1.tex組版結果(素敵😊)

ちゃんと本質的☃な出力(赤マフラー)が得られていますね(素敵😊)

今度は日本語や数式(非本質的😑)を含むpLaTeX文書をコンパイルしてみましょう!

[test2.tex]
\RequirePackage{plautopatch}
\documentclass[dvipdfmx,a4paper,12pt,fleqn]{jsarticle}
\usepackage{xcolor}
\usepackage{amsmath}
\newcommand*{\cAho}{\textbf{\textcolor{red}{アホ}}}
\begin{document}$n$が3の倍数であるかまたは$n$の十進表記に数字3を含む」
という性質を満たす正整数$n$のことを「{\cAho}な整数」
と呼ぶことにする。
「{\cAho}\textbf{ない}正整数全体からなる集合」を$N$と
するとき、以下の式が成立する。
\begin{equation}
  \sum_{k\in N} \frac{1}{k} = 14.273065\cdots
\end{equation}
\end{document}

先ほどと同じ手順でPDFに変換します。

platex test2.tex
dvipdfmx test2.dvi

test2.tex組版結果(素敵😊)

やっぱり本質的☃な出力(赤マフラー)が得られました!(素敵😊)

素敵なpLaTeXはヤバくない話

ところで、“出力を☃に変更する”ことで確かに出力が素敵になりましたが、しかしいまの目的は「LaTeXカーネルが使えなくなる」問題に対処することだったはずです。“出力を☃に変更する”ことで本当に問題は解決されているのでしょうか?

platex.fmtの生成の様子をもう一度見てみましょう。

>eptex -ini -etex platex.ini
This is e-pTeX, Version 3.141592653-p4.0.0-220214-2.6 (utf8.sjis) (TeX Live 2022) (INITEX)
 restricted \write18 enabled.
entering extended mode
(./platex.ini (./sclatex.tex
(c:/texlive/2022/texmf-dist/tex/plain/base/plain.tex
Preloading the plain format: codes, registers, parameters, fonts, more fonts,
……(以下略)

なんと、plain.texが読まれています! つまり、この新しい画期的なpLaTeXLaTeXカーネルlatex.ltx)を全く読み込んでいないわけです。これだとLaTeXカーネルにどんな改修が行われても大丈夫ですね!

素敵なpLaTeXをもうチョット使ってみる話

新しいpLaTeXでは文書の内容やレイアウトは(やっぱり本質的でないため)無視されますが、例外的に、出力用紙サイズ(a5paperなど)と段組設定(twocolumnなど)だけは有効になります。

二段組のpLaTeX文書をコンパイルしてみましょう。

[test3.tex]
\RequirePackage{plautopatch}
% B5判横置き, 2段組
\documentclass[uplatex,dvipdfmx,b5paper,landscape,twocolumn]{jsarticle}
\usepackage{tikzducks,tikzlings-owls}
\begin{document}
例によって、アヒルは最高!
\begin{center}\tikz[scale=3]{\duck}\end{center}
\newpage
いややっぱり、フクロウこそ最高!
\begin{center}\tikz[scale=3]{\owl}\end{center}
\end{document}

test3.tex組版結果(素敵😊)

例によって本質的な出力(赤マフラーと青マフラー)が得られました(素敵😊)

jsarticleクラスを使った場合は用紙サイズは決まった値(a4paperb5varなど)の中から選ぶことしかできませんが、jlreqクラスを使うと自由に長さを指定して用紙サイズを設定できます。jlreqクラスを指定して正方形の用紙に出力してみましょう。

[test4.tex]
% jlreqクラスでは'paper={横,縦}'で自由に設定できる
\documentclass[dvipdfmx,paper={200mm,200mm}]{jlreq}
\begin{document}
% どうせ書いても無視されるでしょ;)
\end{document}

test4.tex組版結果(素敵😊)

素敵!😊

まとめ

というわけで、pLaTeXがいよいよヤバくなったとしても対策はもう万全なので、pLaTeXの大ファンであるという人も「ヤバくなる」ことへの心配は無用です! むしろ「pLaTeXがヤバくなる日」が待ち遠しくなってきましたね🙃(えっ)