TeX言語学習に関する“CAP定理”

:::note info
これは「<a href="https://adventar.org/calendars/6724)">TeX &amp; LaTeX Advent Caleandar 2021</a>」の1日目の記事です。
（2日目は <a href="https://gist.github.com/h20y6m/c4cdd4548334060e7d96afe11675faa3">h20y6m さん</a>です。）
:::

例によって、今年も[「TeX & LaTeX Advent Calendar」][texadvent]の季節が到来しました。素敵な記事が毎日（日付通りに:wink:）届けられることに期待しましょう！

今日は初日ということもあって[^truth]、軽いネタで済ませておきましょう:smiley:**「TeX言語学習における“CAP定理”」**という**ネタ話**です。

[^truth]: あるいは、「実は本命のネタが完成しなかった:cry:」という本当の理由を言い出すのは大いに憚られるので（えっ）

## 「CAP定理」とは何か

**「CAP定理」**というのは、2000年頃にEric Brewerによって提唱された定理で、分散システムの“限界”について示したものです。具体的には、それぞれ「**<font color="#EE0000">C</font>**」「**<font color="#EE0000">A</font>**」「**<font color="#EE0000">P</font>**」の頭文字をもつ3つの要件について、**同時にそれら3つ全てを満たすことはできない**ことが主張されています。

![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14550/09dfd815-e6e4-4de8-4a6d-528a1c2ff74c.png)

この定理の示唆する（少なくとも当初示唆していた）ことは、「3つの要件を同時に満たすことはできないのだから、どの2つを選択するのかの戦略を明確に決める必要がある」ということです。

本来の「CAP定理」についての詳細や議論に興味のある人は以下の記事を参照してください。

  * [CAP定理][wp-cap]（Wikipedia）
  * [CAP定理を見直す。“CAPの3つから2つを選ぶ”という説明はミスリーディングだった][publickey-cap]（Publickey）

## 「TeX言語学習の“CAP定理”」とは何か

**「TeX言語学習の“CAP定理”」**というのは、先月辺りに[どっかの某ZR氏][zr]がふらっと思いついたネタで、TeX言語学習の“限界”についてテキトーに述べたものです。具体的には、それぞれ「**<font color="#EE0000">C</font>**」「**<font color="#EE0000">A</font>**」「**<font color="#EE0000">P</font>**」の頭文字をもつ3つの要件について、**同時にそれら3つ全てを満たすことはできない**と言い張っています。

![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14550/cb40ceb5-d93a-80e4-a414-22814f087598.png)

:::note info
本来の「CAP定理」はちゃんと定式化されて証明された「定理」です。それに対して「TeX言語の“CAP定理”」の方は「定理」ではなくて単なる<strong>ネタ</strong>です。以下の話では（面倒なので:upside_down:）この“定理”があたかも成立するものだと思い込みましょう（えっ）
:::

### C・A・Pの示すもの

「TeX言語学習の“CAP定理”」の「C」「A」「P」が指す3つの要件は、具体的には以下の通りです。

  * **<font color="#EE0000">C</font>omprehesibility＝理解可能性**：文書のマークアップに用いている**言語の体系が容易に理解できるものである**ことを指します。文書を作成する作業は常識的にはプログラミングとは区別されるべきものであり、そのため、マークアップの体系はプログラミングの技能をもたない人にも理解できることが要請されます。LaTeX[^latex]は一般に理解可能性をもつとされています。

  * **<font color="#EE0000">A</font>vailability＝可用性**：TeXのもつ**組版能力が全て利用可能になっていること**を指します。CSS組版などの他の体系と比較した際のTeXの特徴として、TeXは「極めて細粒度の組版機能を提供して、それをプログラムとして組み合わせることで現実の組版の要請を実現する」設計をとっています。このためTeXの組版は極めて高い自由度をもち、これが完全な形で利用できることは大きな利点となります。

  * **<font color="#EE0000">P</font>redictability＝予測可能性**：自分の書いたマークアップに対する（論理的な）**出力結果が事前に予測できる**ことを指します。マークアップが自分の描いた文書の内容をコードに落とし込む作業である以上は「コードが何を意味するのかが判明していること」は当然の要請と言えるでしょう。

:::note warn
ただし、実情としては予測可能性はそれほど必要視されていないようです。たとえ著者が出力結果について何も期待（expect）できない状況であっても、大抵は何らかの結果が希望（wish）されています。そして、実際に<strong>「タイプセットを行った結果が希望通りであればそれでよい」</strong>という戦略は実際にある程度機能しています。とはいえ、やはり結果を期待できた方が心理的安全の点で好ましいことは確かでしょう。
:::

[^latex]: 本記事では「LaTeX」は常に「LaTeXの**文書作成者**(author)**レベルの言語**」を指すことにします。現在の公式解釈では「LaTeXの開発者(programmer)の言語（これはTeX言語の体系を全て内包します）」も“大きな枠組としてのLaTeX”に含まれているのですが、それでもこの2つは区別されるべきだと私は考えています。

「C」「A」「P」の性質がどれも重要な性質であることが理解できるでしょう。

### “CAP定理”が成り立つ（ような気がする）理由

先述の通り、「TeX言語学習の“CAP定理”」は形式的な言明ではないため「証明を与える」ことはできませんが、以下のように考えれば、**「何となくよさそう:blush:」**という**フインキ**が得られるでしょう（えっ）

  * LaTeXはその（非プログラマでも習熟可能にするという）目的のためにTeXの自由度に制限を課している。結局「LaTeXの世界」では「LaTeXのカーネルとパッケージが提供する機能」しか利用できない。すなわち、**可用性（A）を満たすためには**LaTeXのみの利用では不十分で、**TeX言語を用いる必要がある**。

  * TeX言語の利用を前提とした上で自身の書いたマークアップが**予測可能（P）であるためには**、当然（必要な範囲で）TeX言語に習熟する必要があり、特に**TeX言語の基礎の習得は避けられない**。

  * TeX言語は立派なプログラム言語であり、その習熟には「プログラミング自体の適性」が要求される。さらに実行制御に「項書換系」という他のプログラミング言語とは異なるパラダイムを採用しているため、既にプログラミングの技能をもつ者にとっても馴染みのないものである。このため、TeX言語はその基礎の部分だけみても理解は困難である。すなわち、必然的に**理解可能性（C）が失われる**。

:::note info
TeX言語の体系は、本来は「plain TeXでの少々込み入ったマークアップのロジック」程度のものを実装することを念頭に設計されたものであり、そのため、“普通の規模のソフトウェア”を実装には全く向かないものになっています。現在のLaTeXカーネルの実装は既に「TeX言語には手に余る」規模に達していて、これがカーネルの理解の難しさの一因となっています。
:::

### LaTeXユーザの“究極の選択”

「TeX言語学習の“CAP定理”」には本来の「CAP定理」と共通する性質があります。それは**「3つのうち2つを満たすのは容易である」**ということです。

このため、LaTeXフォーマットで文書を作成するにあたっては、次のような**3つの「戦略」**が可能です。

![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14550/526b8cbd-4c10-d33e-b2f3-c3575ea357e9.png)

  * **①ガチTeX言語者**：すなわち「必要な範囲でTeX言語を習熟した上で利用する」という戦略です。可用性（A）と予測可能性（P）が保たれますが、TeX言語の習熟が必要なため理解可能性（C）が失われます。

  * **②幸せなLaTeXユーザ**：すなわち「TeX言語を一切使わずLaTeXのみを使う」という戦略です。理解可能性（C）と予測可能性（P）が保たれますが、LaTeXの範囲に機能が制限されるため可用性（A）が失われます。

  * **③TeX言語コピペプログラマ**：すなわち「TeX言語を利用したいが学習する気は全くないので、テキトーにググって出てきたTeX言語のコードを何も理解せずにそのままコピペする」という（少々アレみの強い）戦略です。理解可能性（C）と可用性（A）が保たれますが、自分の書いたコードがまるで理解できないため予測可能性（P）が失われます。

:::note info
LaTeXの世界において「TeX言語の知識を持たない人に対してTeX言語の機能を新たに利用可能にする」ための手段は「パッケージを提供すること」であり、この手段は既によく確立しています。このことを考えると、ブログ記事などで「TeX言語のコードそのものを話題にしている」ものは「TeX言語の知識を持たない人を対象とする」ものでは<strong>ない</strong>と考えるのが自然でしょう。私自身が観察した限りでは、そのようなブログ記事の大多数は（もし“解説記事”と見なすならば）TeX言語の学習者を対象にしていると見受けられます。
:::

## “CAP定理”が示唆するもの

LaTeXの文書作成者は自分が**「C」「A」「P」のどれを犠牲にするのか**について深い思慮をもって戦略を決定する必要があります。そして、一度戦略を決めたあとはその**戦略について自覚的**であるべきでしょう。

3つの要件はどれも“必要性が高い”ものであるがゆえ、自身の戦略への自覚が疎かになると、いつの間にか「捨てたはずの要件を追い求める」ことを始めてしまい**不合理な態度**につながってしまうからです。

  * 「A」を捨てて「幸せなLaTeX者:relaxed:」を選択したはずなのに、「自分が所望した文書レイアウトが実現可能である」ことを不用意に仮定してしまう。

  * 「P」を捨てて「コピペプログラマ:sob:」を選択したはずなのに、TeXが自身の希望に反する不可解な動作[^badtex]を示した場合に「**(La)TeXは**わけがわからない:anger:」と不満をもらしてしまう。

[^badtex]: 下手なTeX言語の使い方をする（例えばカーネルの基礎的な機能を破壊する）と全体の動作が不安定になることがありますが、そもそも出力結果は“予測不能”なのですから、何が起こっても“想定の範囲内”と考えるべきです。

これらのユーザにとって、捨てるべきなのは「A」や「P」ではなく「C」なのでした……。

## まとめ

……というわけで、結論としては、皆さん、

![TeX言語しましょう](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14550/a82242d5-8d42-93a8-b169-b81da821cb4f.png "TeX言語しましょう")

[texadvent]: https://adventar.org/calendars/6724
[wp-cap]: https://ja.wikipedia.org/wiki/CAP%E5%AE%9A%E7%90%86
[publickey-cap]: https://www.publickey1.jp/blog/13/capcap32.html
[zr]: https://qiita.com/zr_tex8r