マクロツイーター

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

pLaTeX のコードに潜在するバグを一気に消し去る話

最近、pLaTeX がますます新しくなってますますアレ、なことになっている。

長らく放置されている pLaTeX のチョットアレな点を改善していこうという取組みは基本的には好ましいと考えている。ただ今の開発者チームにおける開発体制がチョットアレなために、「チョットアレを直すと別のチョットアレが出てくる」という残念なことになっている。このような現状を打開するために、開発体制の見直しが目下進められている。

※開発方針の議論に興味のある方はこちらへ:
今後の pLaTeX/upLaTeX の開発について (GitHub:texjporg/platex Issue #10)

本質的に問題なもの

確かに体制を工夫することも重要ではある。だがしかし、この「テスト(バグ出し)が困難である」という問題の裏にある、pLaTeX の“本質的な問題点”について、私は決して見過ごすべきでないと考える。

バグを入れないためには、該当部分が絡むあらゆる原稿 tex ファイルを想定してコードを書く能力が必要である。そして、それが正しいかどうかテストしなければならない。……(中略)…… 「バグがないことの証明」は悪魔の証明とも匹敵する難易度だろうと思う。

なぜテストケースを出し切れないかというと、その根本的な原因は、

pLaTeX の機能が多すぎる

からである。pLaTeX を使うと多種多様な文書が作成できる。その可能性は限りない。しかし、その多様性こそがテストを著しく困難なものにしていることは否めない事実である。

確かに、多様な文書が作成できることは一般的に好ましいと捉えられている。しかしそれは必要不可欠なものであろうか。ここで別の立場を取ることもできるのではないか。

現状の tcclearerr については
TeX文書の出力に本当に必要なもの」
に対する考察が致命的に欠けている。
本当に出力すべきものなんて、ゆきだるま☃しかないはず。
(なお、tcclearerror というのは、とある画期的な LaTeX パッケージの名前である。)

抜本的でかつ画期的な対策

もしこの考えを推進する立場に立つならば、「テストが困難」という問題に対して画期的な対策を見出せる。

入力のソースに応じて出力が変わる、という(バグの温床になる)複雑な仕様を排除して、出力を“本当に必要なもの”に限定する。すなわち、入力ソースの内容の如何に関わらず、出力は常に「ゆきだるま☃」とする、という“新しい仕様”を採用する。

すなわち、“新しい仕様”では以下のようになる。

[入力]
\documentclass[a4paper]{article}
\begin{document}
{\TeX} is great!
\[ \int x = \frac{x^2}{2} + C \]
\end{document}
[出力]
[入力]
10 INPUT A
20 INPUT B
30 C=A+B
40 PRINT C
50 END
[出力]
[入力]
ルイズ!ルイズ!ルイズ!ルイズぅぅうううわぁああああああああああああああああああああああん!!!
あぁああああ…ああ…あっあっー!あぁああああああ!!!ルイズルイズルイズぅううぁわぁああああ!!!
あぁクンカクンカ!クンカクンカ!スーハースーハー!スーハースーハー!いい匂いだなぁ…くんくん
んはぁっ!ルイズ・フランソワーズたんの桃色ブロンドの髪をクンカクンカしたいお!クンカクンカ!あぁあ!!
……(以下略)……
[出力]

この仕様を採用することで、TeX エンジンは入力のソースを全く読む必要がなくなり、それに伴い、処理の流れを完全に一本化される。結果的に、数個の入力ケースに対して正常な(仕様通りの)出力が得られることが判れば、あとはどんな入力ケースについても正常な出力が得られることの確信を持つことが可能になる。

実装

先に示した仕様に従って実装してみた。

pLaTeX カーネルに対する修正であるので、次の手順でフォーマットを再作成するのが本来の使い方となる。(初心者が誤って実行してしまうのを防ぐために敢えて不親切な書き方にしている。)

  • 先の tcsafepltx.sty を「TeX から見える場所」におく。

  • platex.ltx を以下のように編集する。
    platex.ltx 末尾]
    \let\dump\orgdump
    \let\orgdump\@undefined
    \makeatother
    \input tcsafepltx.sty % この行を追加
    \dump
    \endinput
    \endinput
    %%
    %% End of file `platex.ltx'.
    
  • pLaTeX のフォーマット(platex.fmt)を再作成する。

なお、LaTeX の初級者が簡単に“新しい仕様”を体験できるようにするため、tcsafepltx.sty は“LaTeX のパッケージとして読み込む”ことも可能なように作っている。この使い方をする場合、文書の先頭(\documentclass よりも前)において \RequirePackage 命令を用いてパッケージを読み込む。

[入力]
\RequirePackage{tcsafepltx}[] % この行を追加する!
\documentclass[a4paper]{article}
\begin{document}
{\TeX} is great!
\[ \int x = \frac{x^2}{2} + C \]
\end{document}

この場合はフォーマットの再作成は不要で、上掲の文書ソースを“普通の pLaTeX”でコンパイルすればよい。もちろん、出力は以下のようになる。

[出力]

まとめ

TeX に本当に必要なもの”に関する洞察を基にして、現状の「テストができない」問題を根本的に解決する画期的な手法を提案した。この方法を取り入れるなどして「バグの無い幸せな pLaTeX」が使える日が来ることを切に願う。


ZR「なお、この tcsafepltx については、あまりにも下らないネタであるため、ロクにテストをしていない。なのでバグが残っている可能性があることを予め断っておく」
*「えっ」