以下の内容はhttps://zrbabbler.hatenablog.com/entry/2024/12/13/001104より取得しました。


某ZR的徹底比較! LaTeXとTypstの数式記法

これは「TeX & LaTeX Advent Caleandar 2024」の13日めの記事です。
(12日めは 津茶利休 さんです。14日めは TPKato さんです。)
これは「Typst Advent Caleandar 2024(シリーズ2)」の13日めの記事です。

結論

めでたしめでたし😊

……なのですが、なぜ「LaTeXの方がsimple」という考え方が成立するのかが全くピンと来ない人もいると思うので、チョット解説しておきます。

※なお「LaTeXの標準的1な数式機能」の範囲としては「LaTeXカーネル+amsmath」または「LaTeXカーネルunicode-math」の何れかを想定します。

前提

まずはこの「数式の記法はTypstよりLaTeXの方が簡単(simple)」という言葉で自分が何を意図しているのかを明確にしておきます。

“数式の記法”

LaTeX/Typstで実際に数式を記述しようとすると、次の2つの知識が必要となります。

  • LaTeXの数式モード/Typstの数式モードの文法。
  • LaTeX/Typstの数式記法の中で現れる個々の要素の用法。
    • LaTeXでは\pi\sin\sqrtcases環境、……。
    • Typstではpisinsqrt()関数、cases()関数、……。

「数式の記法」という言葉は、このうちの前者、つまり数式モードの文法体系を指すものとします2

また、フツーの学習過程においては“数式”(数式モードの文法)の方が“非数式”(LaTeXのテキストモード/Typstのマークアップモードの文法)よりも後に学習されるため、“非数式”の文法を既に習得しているユーザの視点を想定します。

“簡単(simple)”

例のツイートでは、敢えて“意外性”3を狙って「simple」の日本語に「簡単」を使いましたが、以降はより適切な​「単純」​という日本語を使うことにします。

文法の体系が「単純(simple)」であるとは以下のことを意図しています。

その体系を(フツー4に)使いこなすために
習得すべき知識の量が少ない。

つまり、LaTeXとTypstの数式の記述のどちらが単純(simple)であるかは、習得すべき文法項目を書き出してみればわかります。

“単純”以外の概念

「単純(simple)」と似て非なる概念と挙げておきます。

  • 簡潔(concise): 当該の記法に従って数式を記述する場合の記述量が少ないこと。Typstの数式記法の方が簡潔であることは多くの人が同意するところでしょう。
  • 容易(easy): 学習にかかる労力が少ないこと。これは学習者がもつ背景知識や性格に大きく依存するものだと自分は考えています。

これらの概念の違いはそれぞれの対義語を考えてみれば理解しやすいかもしれません。

  • 「単純(simple)」の対義語は「複雑(complex)」
  • 「簡潔(concise)」の対義語は「煩雑(verbose)」
  • 「容易(easy)」の対義語は「難解(difficult)」

“簡単”という日本語は「単純(simple)」「簡潔(concise)」「容易(easy)」の何れの意味にもなりえますが、世間で「Typstの数式記法はLaTeXより“簡単”」といわれる場合の“簡単”は恐らく「簡潔(concise)」「容易(easy)」あたりを指しているのだと思われます。

比較

目的が明確になったので、実際にLaTeXとTypstの数式の文法体系を比較してみます。前述の通り「“非数式”の文法が既習であるユーザ」の立場に立ち​“非数式”の文法との差異​に注目することにします。

LaTeX

“非数式”の文法との差異を思いつく限り列挙してみます。

  • 数式モードのみで使用可能な命令・環境がある。
    ※例えば^\fracpmatrix環境など5
  • 空白文字は水平空きにならない。空白は文字の並びを考慮して自動的に調節される。
  • “記号の特殊入力規則”6がテキストと数式では異なる。
  • 文字の書体が自動的に調節され、例えば英字は斜体、数字は立体になる。
  • \left‹記号›...\right‹記号›で自動伸長する括弧で囲われたサブ数式を表す。
    ※「\left\rightの対象となる記号は波括弧で囲わず直後に続ける」「サブ数式なので局所化される」という特徴をもつため、\left\rightは通常の命令ではなく特殊な構文7である。

※目的が「LaTeXの方が規則が少ない」の主張であるため、LaTeX側の列挙に漏れがないことは重要です。何か漏れがあると思った方は指摘をおねがいします🙇

Typst

LaTeXと同様に、“非数式”の文法との差異を列挙してみます。

  • 非数式(スクリプトモード)と数式で可視な識別子のスコープが異なる。
    • 数式モードではmathsymのモジュールの要素が直接可視になる。つまりmath.sinsym.sumの代わりにsinsumと書ける。
    • 代わりに標準で定義されたcenterredtypeなどの識別子は数式モードでは見えない8
  • 空白文字は水平空きにならない。空白は文字の並びを考慮して自動的に調節される。
    ※確か例外(空白文字が水平空きになる)があったような記憶がある😐
  • “入力上の特殊文字”が非数式(マークアップモード)と数式では異なる。
    ※例えば*マークアップモードでは強調(emph)のマークアップだが、数式モードでは非特殊文字9である。/マークアップモードでは非特殊文字だが数式モードでは分数(frac)のマークアップである。
  • “短縮記法”が非数式(マークアップモード)と数式では異なる。
  • 文字の書体が自動的に調節され、例えば英字は斜体、数字は立体になる。
  • 数字の列は一纏まりの要素と見なされる。
    ※つまりa^10a^(10)と書いたのと同じ。
  • 2字以上の英字の列はその英字列からなる識別子の参照と見なされる。
    ※つまりsinは数式のスコープのsinという識別子を参照する。これは#math.sinと書いたのと同じ。
  • ダブルクオート"…"は文字列を表す(str型の値を示す)。
    ※つまり"foo"#"foo"と書いたのと同じ。
    • 文字列はそのまま出力することもできるが、その際の規則については自分はよくわかっていない🙃
  • 対の括弧で囲った部分は一纏まりの要素と見なされる。
    • 括弧は自動伸長されて出力される。
    • マークアップの引数丸括弧(…)で囲った纏まりである場合、その丸括弧は出力されない。
      ※例えば、a_[0]の下添字は“[0]”、a_(0)の下添字は“0”、a_((0))の下添字は“(0)”と出力される。
  • 識別子(英字列)の直後に(…)がある場合は数式関数呼出と見なされる。
    ※ただしexp(n-1)とかは数式関数呼出にならないので何か追加の規則があるはず(よくわからない🙃)。
  • 数式関数呼出の書式はスクリプトでの関数呼出と一見似ているが、実際はかなり相違点がある。
    ※例えばmat(#(n*2), a; rho, "ef")#math.mat((n*2, [a]), (sym.rho, "ef"))と書いたのと同じ。
    • 引数は数式モードで解釈される。例えば123はint値ではなくcontent値となる。int値の123を表すにはスクリプトモード(#記法)を用いて#123と書く。
    • 引数区切りで;が特殊な意味を持つ。
    • “コンテンツブロックの外出し”や“スプレッド構文”10は使えない。
  • 多分他にも細かい規則がイロイロあるはずだけど把握し切れていない😢

……メッチャ複雑🤯

まとめ

LaTeXとTypstのうち「数式の記法が単純(simple)な方」は明らかにLaTeXです11。取り違えないように十分に留意しておきましょう💁


  1. LaTeXとTypstのどちらにしても、追加のパッケージは各人が利点(利便性)と欠点(学習コスト)を勘案して採用を決めるべきものです。
  2. まあ、後者については、LaTeXとTypstで“simple性”はそれほど変わらないと思いますけどね。
  3. 実は「簡単」は「easy」ではなく「simple」の意味だった、というオチです。
  4. つまり、上級レベルにならないと関わってこないような知識は含めないということです。まあ「某ZR氏のいう“フツー”はレベルが高すぎる」という噂もありますが……🙃
  5. LaTeXの文法では^\frac\itemなどと同じく「命令」の一種です。
  6. 命令(つまり入力上の特殊文字)ではないがそのまま出力されるのでもない文字。
  7. \left\rightは必ずペアで使わないといけない」という性質もこれが“構文”であることに由来します。なお、\bigl\bigrの類は通常の命令の一種と考えられます。
  8. これらの値を参照したい場合は#記法を用いてスクリプトモードに入ります。すなわち#centerと書きます。あるいは、stdは可視なのでstd.centerのように書く方法もあります。
  9. ただし*は「∗」(U+2217;ast.op)に対する短縮記法です。
  10. 数式関数呼出でのスプレッド構文は0.13.0版から使用可能になりました。
  11. 単純(simple)と簡潔(concise)はしばしば相反します。例えば、Typstのマークアップモードにおいて、#emph[…]などの関数呼出の代わりに_(強調)や_(強い強調)や=(節見出し)や+(箇条書き)などの簡易マークアップを導入することで、表記はより簡潔(concise)になりますが、明らかに文法規則は増えて複雑(complex)になっています。しかしTypstユーザの多くはこの簡易マークアップを有益なものと見ているはずです。つまり「単純(simple)でないことは必ずしもデメリットにはならない」ということです。



以上の内容はhttps://zrbabbler.hatenablog.com/entry/2024/12/13/001104より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14