これは「TeX & LaTeX Advent Caleandar 2021」の1日目の記事です。
(2日目は h20y6m さんです。)
例によって、今年も「TeX & LaTeX Advent Calendar」の季節が到来しました。素敵な記事が毎日(日付通りに)届けられることに期待しましょう!
今日は初日ということもあって1、軽いネタで済ませておきましょう「TeX言語学習における“CAP定理”」というネタ話です。
「CAP定理」とは何か
「CAP定理」というのは、2000年頃にEric Brewerによって提唱された定理で、分散システムの“限界”について示したものです。具体的には、それぞれ「C」「A」「P」の頭文字をもつ3つの要件について、同時にそれら3つ全てを満たすことはできないことが主張されています。
この定理の示唆する(少なくとも当初示唆していた)ことは、「3つの要件を同時に満たすことはできないのだから、どの2つを選択するのかの戦略を明確に決める必要がある」ということです。
本来の「CAP定理」についての詳細や議論に興味のある人は以下の記事を参照してください。
- CAP定理(Wikipedia)
- CAP定理を見直す。“CAPの3つから2つを選ぶ”という説明はミスリーディングだった(Publickey)
「TeX言語学習の“CAP定理”」とは何か
「TeX言語学習の“CAP定理”」というのは、先月辺りにどっかの某ZR氏がふらっと思いついたネタで、TeX言語学習の“限界”についてテキトーに述べたものです。具体的には、それぞれ「C」「A」「P」の頭文字をもつ3つの要件について、同時にそれら3つ全てを満たすことはできないと言い張っています。
本来の「CAP定理」はちゃんと定式化されて証明された「定理」です。それに対して「TeX言語の“CAP定理”」の方は「定理」ではなくて単なるネタです。以下の話では(面倒なので)この“定理”があたかも成立するものだと思い込みましょう(えっ)
C・A・Pの示すもの
「TeX言語学習の“CAP定理”」の「C」「A」「P」が指す3つの要件は、具体的には以下の通りです。
-
Comprehesibility=理解可能性:文書のマークアップに用いている言語の体系が容易に理解できるものであることを指します。文書を作成する作業は常識的にはプログラミングとは区別されるべきものであり、そのため、マークアップの体系はプログラミングの技能をもたない人にも理解できることが要請されます。LaTeX2は一般に理解可能性をもつとされています。
-
Availability=可用性:TeXのもつ組版能力が全て利用可能になっていることを指します。CSS組版などの他の体系と比較した際のTeXの特徴として、TeXは「極めて細粒度の組版機能を提供して、それをプログラムとして組み合わせることで現実の組版の要請を実現する」設計をとっています。このためTeXの組版は極めて高い自由度をもち、これが完全な形で利用できることは大きな利点となります。
-
Predictability=予測可能性:自分の書いたマークアップに対する(論理的な)出力結果が事前に予測できることを指します。マークアップが自分の描いた文書の内容をコードに落とし込む作業である以上は「コードが何を意味するのかが判明していること」は当然の要請と言えるでしょう。
ただし、実情としては予測可能性はそれほど必要視されていないようです。たとえ著者が出力結果について何も期待(expect)できない状況であっても、大抵は何らかの結果が希望(wish)されています。そして、実際に「タイプセットを行った結果が希望通りであればそれでよい」という戦略は実際にある程度機能しています。とはいえ、やはり結果を期待できた方が心理的安全の点で好ましいことは確かでしょう。
「C」「A」「P」の性質がどれも重要な性質であることが理解できるでしょう。
“CAP定理”が成り立つ(ような気がする)理由
先述の通り、「TeX言語学習の“CAP定理”」は形式的な言明ではないため「証明を与える」ことはできませんが、以下のように考えれば、「何となくよさそう」というフインキが得られるでしょう(えっ)
-
LaTeXはその(非プログラマでも習熟可能にするという)目的のためにTeXの自由度に制限を課している。結局「LaTeXの世界」では「LaTeXのカーネルとパッケージが提供する機能」しか利用できない。すなわち、可用性(A)を満たすためにはLaTeXのみの利用では不十分で、TeX言語を用いる必要がある。
-
TeX言語の利用を前提とした上で自身の書いたマークアップが予測可能(P)であるためには、当然(必要な範囲で)TeX言語に習熟する必要があり、特にTeX言語の基礎の習得は避けられない。
-
TeX言語は立派なプログラム言語であり、その習熟には「プログラミング自体の適性」が要求される。さらに実行制御に「項書換系」という他のプログラミング言語とは異なるパラダイムを採用しているため、既にプログラミングの技能をもつ者にとっても馴染みのないものである。このため、TeX言語はその基礎の部分だけみても理解は困難である。すなわち、必然的に理解可能性(C)が失われる。
TeX言語の体系は、本来は「plain TeXでの少々込み入ったマークアップのロジック」程度のものを実装することを念頭に設計されたものであり、そのため、“普通の規模のソフトウェア”を実装には全く向かないものになっています。現在のLaTeXカーネルの実装は既に「TeX言語には手に余る」規模に達していて、これがカーネルの理解の難しさの一因となっています。
LaTeXユーザの“究極の選択”
「TeX言語学習の“CAP定理”」には本来の「CAP定理」と共通する性質があります。それは**「3つのうち2つを満たすのは容易である」**ということです。
このため、LaTeXフォーマットで文書を作成するにあたっては、次のような**3つの「戦略」**が可能です。
-
①ガチTeX言語者:すなわち「必要な範囲でTeX言語を習熟した上で利用する」という戦略です。可用性(A)と予測可能性(P)が保たれますが、TeX言語の習熟が必要なため理解可能性(C)が失われます。
-
②幸せなLaTeXユーザ:すなわち「TeX言語を一切使わずLaTeXのみを使う」という戦略です。理解可能性(C)と予測可能性(P)が保たれますが、LaTeXの範囲に機能が制限されるため可用性(A)が失われます。
-
③TeX言語コピペプログラマ:すなわち「TeX言語を利用したいが学習する気は全くないので、テキトーにググって出てきたTeX言語のコードを何も理解せずにそのままコピペする」という(少々アレみの強い)戦略です。理解可能性(C)と可用性(A)が保たれますが、自分の書いたコードがまるで理解できないため予測可能性(P)が失われます。
LaTeXの世界において「TeX言語の知識を持たない人に対してTeX言語の機能を新たに利用可能にする」ための手段は「パッケージを提供すること」であり、この手段は既によく確立しています。このことを考えると、ブログ記事などで「TeX言語のコードそのものを話題にしている」ものは「TeX言語の知識を持たない人を対象とする」ものではないと考えるのが自然でしょう。私自身が観察した限りでは、そのようなブログ記事の大多数は(もし“解説記事”と見なすならば)TeX言語の学習者を対象にしていると見受けられます。
“CAP定理”が示唆するもの
LaTeXの文書作成者は自分が**「C」「A」「P」のどれを犠牲にするのかについて深い思慮をもって戦略を決定する必要があります。そして、一度戦略を決めたあとはその戦略について自覚的**であるべきでしょう。
3つの要件はどれも“必要性が高い”ものであるがゆえ、自身の戦略への自覚が疎かになると、いつの間にか「捨てたはずの要件を追い求める」ことを始めてしまい不合理な態度につながってしまうからです。
-
「A」を捨てて「幸せなLaTeX者」を選択したはずなのに、「自分が所望した文書レイアウトが実現可能である」ことを不用意に仮定してしまう。
-
「P」を捨てて「コピペプログラマ」を選択したはずなのに、TeXが自身の希望に反する不可解な動作3を示した場合に「(La)TeXはわけがわからない」と不満をもらしてしまう。
これらのユーザにとって、捨てるべきなのは「A」や「P」ではなく「C」なのでした……。
まとめ
……というわけで、結論としては、皆さん、
-
あるいは、「実は本命のネタが完成しなかった」という本当の理由を言い出すのは大いに憚られるので(えっ) ↩
-
本記事では「LaTeX」は常に「LaTeXの文書作成者(author)レベルの言語」を指すことにします。現在の公式解釈では「LaTeXの開発者(programmer)の言語(これはTeX言語の体系を全て内包します)」も“大きな枠組としてのLaTeX”に含まれているのですが、それでもこの2つは区別されるべきだと私は考えています。 ↩
-
下手なTeX言語の使い方をする(例えばカーネルの基礎的な機能を破壊する)と全体の動作が不安定になることがありますが、そもそも出力結果は“予測不能”なのですから、何が起こっても“想定の範囲内”と考えるべきです。 ↩