本稿はTeX & LaTeX Advent Calendar 2022の10日目の記事です。9日目はZRさんでした。11日目はmunepiさんです。
約3週間ほど週末をすべて返上して1日16時間ぐらい執筆作業を行い、ようやく昨日博論を提出し、さらに同日午後には半日会社の部署のイベントに参加して忘年会まで参加してきたワトソンです。ごきげんよう。
さすがに今日ぐらいは1日のんびり過ごしたいということで、アドベントカレンダー用の記事を書いていきたいと思います(えっ)
まあいくらなんでもこの疲れ果てた状態で気合の入った記事は書けないので、代わりに最近話題のAI、すなわちChatGPTを使ってコンテンツを無理やり生成していこうと思います。
ChatGPTというのは、いわゆる巨大言語モデルというやつで、日頃から自然言語処理をやっている人間からするとそこまで新鮮味はないのですが、とはいえ細かいことはともかくなかなかすごいやつです。言語モデルに関する説明の詳細はネット上にいくらでもあると思うのでニッチをいく本ブログではごっそり割愛します。
さて、このChatGPTですが学習に使用しているデータがすごいのでめちゃめちゃ博識です。ほとんどどんな話題にもちゃんとついて来て「もっともらしい」受け答えをしてくれます。ただこの「もっともらしい」というのが曲者で、それっぽいだけで平然と嘘をつくことも多いことが知られています。
というわけで、私たちの方が正確な知識を持っているだろうTeXに関して色々話を振ってみて、その内容をチェックをしていきたいと思います。
Q1. TeXのコードをパースするにはどうしたらいい?
なるほど。わりと正確ですね。というか前半部分は満点回答な気がします。後半は若干前半と矛盾していることを言っていて、大嘘とは言えないまでも少し微妙な感じがします。
TeXは構文解析が困難なため、パースすることは難しいです。TeXを実行するためには、TeXインタプリターを使用する必要があります。TeXインタプリターは、TeXコードを解釈して処理するプログラムです。TeXインタプリターを使用してTeXコードを実行することで、そのコードをパースすることができます。
TeXを実行するには、次のような手順を踏むことができます。
- TeXインタプリターをダウンロードしてインストールする。
- TeXコードをテキストエディターなどで作成する。
- TeXインタプリターを使用して、作成したTeXコードを実行する。
TeXインタプリターは、様々な種類があります。例えば、pdfTeX、XeTeX、LuaTeXなどがあります。どのTeXインタプリターを使用するかは、実行するTeXコードや目的に応じて選択することができます。
具体的には、上記の部分には卒がないように思います。実際、ChatGPTの言うように、TeXの構文解析はとても難しいです。カテゴリーコードなどという余計な機能のせいで、TeXのコードにおける各トークンの役割を実行時に変更できてしまうため、パースするだけで(正確には字句解析するだけで)チューリングマシンが必要になります。
「TeXインタプリター」というのは、専門的にはTeXエンジンと呼ばれるもののことでしょうが、そういう呼び方をしても間違いではないでしょう。一般的なインタプリタの意味から言っても、TeXエンジンは該当すると言ってよいでしょう。TeXエンジンはTeXコードを解釈して実行するので、これにTeXコードを与えればもちろんその過程でパースが行われていると言えますね。
続くTeXの実行の手順を説明する部分も、そのためにTeXのインストール方法から説明する必要があるのか謎ですし、あまり具体性がないのでこれだけ言われても何をすればいいのかよくわからない人が大半でしょうが、別に嘘は言っていないですね。
TeXエンジンに様々な種類があるのは事実ですし、pdfTeX、XeTeX、LuaTeXはたしかにすべてTeXエンジンです。ナンチャラTeXと名の付くものには、TeXエンジンではないものも色々ありますが、この列挙の中ではそういったものを避けて正確にエンジンであるものだけが挙がっているのが高度だなと思います。
そしてどのエンジンを選ぶのかは、まさにTeXコードや目的によって選択する必要があります。ちなみに、このエンジン選択は、TeXユーザでも迷ったことがあるという方が多いのではないでしょうか。そういう方には、ZRさんのOnline.tex 2022での発表資料をおすすめします。各エンジンの機能や役割の違いが説明されています。
もし、TeXコードを解析することを目的としている場合は、TeXインタプリターではなく、TeXパーサーを使用することができます。TeXパーサーは、TeXコードを構文解析して、その構造を理解するプログラムです。TeXパーサーを使用することで、TeXコードを解析することができます。
TeXパーサーも様々な種類があります。例えば、ANTLR TeX、TeX.js、TeXZillaなどがあります。どのTeXパーサーを使用するかは、実行するTeXコードや目的に応じて選択することができます。
一方でこの後半部分は、明確な誤りがあるかはともかく、やや微妙な感じがします。そもそも冒頭で「TeXを実行するためには、TeXインタプリターを使用する必要があります」と言っていたのに、突然「TeXパーサー」なる新概念が登場したのはどういうことでしょう? さらに言えば、「TeXパーサー」という用語は実際のところあまり一般的でないように思います。仮にTeXをパースする(特に、本当にパースするだけで実行はしない)プログラムがあるとしたら、それはもちろん「TeXパーサー」と呼べると思いますが、そういうプログラムはあまり多くはないような気がします1。
具体例として挙がっているANTLR TeX、TeX.js、TeXZillaというのは、個人的にはあまり馴染みがないプログラムたちです。それぞれ調べてみました。
ANTLRというのはLL(*)構文解析に基づくパーサジェネレータだそうです。ということは、パーサを作るやつなのでかなりそれっぽいです。ただ、前述の通りTeXコードの厳密な解析にはチューリングマシンが必要なので、LL(*)では間に合わないはずです。調べてみると、ANTLR TeXという名前そのもののソフトウェアはなさそうでしたが、ANTLRを使用して(La)TeXコードを解析しようという試み自体は実在しそうです。
ただし、これは対象がLaTeX数式に限定されており、「TeXパーサー」とは言えなそうです。
TeX.jsという名前のプログラムは、広く知られているものにはなさそうです。LaTeX.jsならありますが、LaTeXのみが対象なのは明らかで、「TeXパーサー」と呼ぶには不適な気がします。
またTeXZillaは実在しました。LaTeXを(Presentation) MathMLに変換する変換器で、やはり対象がLaTeXに限定されており「TeXパーサー」にはあたらないと思います。
Q2. TeXのカテゴリーコードって何? 0〜15までの各カテゴリーコードの意味も教えて
まず冒頭部ですが、これは実質的にゼロ回答な気がします。
TeXのカテゴリーコードは、文字のカテゴリーを定義するものです。
「TeXのカテゴリーコードは、文字のカテゴリーを定義するものです」それは自明ですが、カテゴリーが何かを教えてくれてはいません。カテゴリーコードとは、TeXコード中の各文字の役割を定めるものです。
TeXでは、16種類のカテゴリーコードを使用します。カテゴリーコードは、0〜15までの数値で表されます。0〜15までの各カテゴリーコードの意味は次のようになります。
続く部分ですが、0〜15と聞いて「16種類」となるのは私よりも頭がいいかもしれません。こういうのにすぐ引っかかって「15種類」とか言いそうなので。
しかし、それ以下の説明はめちゃくちゃです。
0: 無効文字。このカテゴリーに属する文字は、TeXでは無効となります。
1: 字母。このカテゴリーに属する文字は、TeXでは通常の文字として扱われます。
2: スペース文字。このカテゴリーに属する文字は、TeXではスペースとして扱われます。
3: 句読点文字。このカテゴリーに属する文字は、TeXでは句読点として扱われます。
4: 終端文字。このカテゴリーに属する文字は、TeXでは文章の終わりを示すために使われます。
5: トークンの区切り。このカテゴリーに属する文字は、TeXではトークンの区切りに使われます。
6: スキップする。このカテゴリーに属する文字は、TeXではスキップされます。
7: 左括弧。このカテゴリーに属する文字は、TeXでは左括弧として扱われます。
8: 右括弧。このカテゴリーに属する文字は、TeXでは右括弧として扱われます。
9: マクロの引数。このカテゴリーに属する文字は、TeXではマクロの引数として扱われます。
10: 字句解析中に現れるトークン。このカテゴリーに属する文字は、TeXでは字句解析中に現れるトークンとして扱われます。
11: アクティベーション文字。このカテゴリーに
見事に1つも合っていません。すべての項目がもっともらしい雰囲気ですが、すべて間違いです。正確な情報は、例えば当ブログの過去記事を参照してください。
しかしでっち上げのカテゴリーコードの説明もなかなか興味深いですね。字母や句読点文字に固有に割り当てられるカテゴリーコードがあったらちょっと面白い気がします。終端文字は「行の終端文字」ならカテゴリーコードにあるのですが(実際はコード5)、文章の終わりということは「句読点」の一種なのでは…… TeXは組版に関する低レイヤ機能を提供するので、基本的に「文章」という単位を認識することはありません。カテゴリーコード7, 8は実際は「上付き文字」「下付き文字」なので括弧の開始・終了ではありませんが、この間違った説明でもある意味での対応関係にあるというのは偶然でしょうか。「字句解析中に現れるトークン」とか「アクティベーション文字」というのも実際のTeX言語にはない概念ですが(アクティブ文字ならあります)、なんか強そうなので導入してみて欲しいところです(?)
さて、ChatGPTの回答の長さ制限なのかカテゴリーコード11の説明の途中で途切れてしまったので続きも聞いてみましょう。
Q3. カテゴリーコード11〜15の意味も教えて
相変わらずすべて間違いです。またしてもカテゴリーコード11は「アクティベーション文字」ということになっています。一貫していて素晴らしいですが、いずれにしても間違いです。
Q4. TeX言語を学習するにはどうしたらいい?
無難な回答ですね。TeXをインストールさせるのが好きですね。またしても「そこから言う必要があるのか」という疑問はありますが、その通りだとは思います。以下は基本的に「TeXのマニュアルやリファレンス」に丸投げされています。要するに「TeXbookを読め」ということですかね。ぐうの音も出ないほどにその通りです。
Q5. LaTeXを学習するにはどうしたらいい?
1つぐらいはLaTeXについても聞いてみました。LaTeX入門者に対して、どのようなLaTeX学習方法を勧めるかはTeX界隈の積年の議題です。ここで決定的回答が得られるかと期待したのですが……
LaTeXは、TeXを拡張した文書作成システムです。
まずLaTeXに関する説明がやや微妙ですね。「TeXを拡張した」といわれるとpdfTeXとかXeTeXとかLuaTeXとか、TeXの拡張エンジンの方向に意識が向きます。LaTeXはどちらかといえば「TeXの上に構築された」文書作成システムという方が正確な気がします。詳しくは先ほども言及した当ブログの過去記事を参照してください。
LaTeXを学習するには、まずTeXを学習することから始めることができます。TeXを学習するには、TeXをインストールすることが最初に必要です。TeXのインストール方法については、TeXのウェブサイトやデベロッパーからの情報を参照することができます。また、TeXを使用するための基本的な操作方法も学習する必要があります。TeXを使用するための基本的な操作方法については、TeXのマニュアルやリファレンスなどを参照することができます。
続く上記の部分ですが、鬼でしょうか。LaTeXを学ぶのにTeXを学べと言ってきました。なるほど…… そして相変わらずChatGPT先生はTeXのインストールが大好きなようです🙃 TeXのインストール作業は、だいたいの人が大嫌いな印象があります。昨今のTeX Liveは巨大なので、単純に時間がかかるという側面は確かにあります。
LaTeXで特有の命令や文法については、LaTeXのマニュアルやリファレンス、書籍やオンラインリソースなどを参照することができます。
具体的な書籍やオンラインリソースを挙げて欲しいところではありますが、その通りですね。ところで、やはり現状のTeX界隈の課題の1つは無料で誰でもアクセスできる標準的な入門リソースがないことのようにも思います。市販の書籍はいくらか充実しているのですが、オンラインリソースは定評のあるものというと難しい印象です。
近年、LaTeX本家チームがLearnlatex.orgという公式の入門サイトを立ち上げました。筆者はここ数年この日本語翻訳に取り組んでいて、実際翻訳自体はほぼ全面的に完了しているのですが、日本語TeXに特有の事情というのもあるので「ただ翻訳して終わり」というわけにもなかなかいきません。最近は忙しめで、あまりこのプロジェクトは進捗していないのですが、お手伝いいただける方がいるようであれば歓迎します。ご連絡ください。
Q6. TeXでFizzBuzzするコードを書いて。
TeXでと指定しましたが、LaTeXコードが出てきましたね。まあそれはいいとしましょう。かなりそれっぽい感じですが、このコードはそのままではLaTeXで処理することはできなそうです。いわゆるTeX on LaTeX的なループの書き方ではなく、\loop
と\repeat
というplain TeX実装由来のマクロが用いられているのはかなりガチ勢の香りがします。しかし\mod
コマンドで剰余を計算しようというのは通常のプログラミング言語の文法に引っ張られすぎですね。LaTeXで\mod
コマンドと言ったら、普通はamsmathパッケージに定義されている「modを印字するためのコマンド」の方でしょう。
Q7. TeXでNabeAzzするコードを書いて。
いくら博識なChatGPT先生といえどもNabeAzz問題はご存じないようです。TeX界隈ではおなじみのお題なのですが。
ところで、聞いてもいないのにTeXは「特定のゲームをプログラムすることはできません」などと言ってきました。これも明らかに間違いですね。
Q8. TeXとゆきだるまの関係は?
したがって、TeXとゆきだるまとの関係はありません。
その通りです。TeXとゆきだるまは関係ありません☃
*「なるほど、やっぱり、TeXと☃は…」
— 某ZR(ざんねん🙃) (@zr_tex8r) May 28, 2019
☃「一切関係ありません!」#TeX #ナントカ
-
自称「TeXパーサー」ならたくさんあるかもしれませんが、その多くはLaTeX記法の一部のみに対応したアドホックなものであることが多い印象です。 ↩︎