エディタ・数式

LaTeX対応のノートアプリを、8つの数式で確かめる

今夜は1ページ分の数式をまとめる予定で、iPhoneのノートアプリは「LaTeX対応」をうたっています。ただ、この言葉が指す実装は4通りあり、その差は3つ目の数式で表れます。

ガイドを読む
数式ブロック

x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}

分数の横線は、分子と分母の間に。横に並べない。
表示エンジンが正しく描くべき点と、テストで確かめる点
要点

テスト用の8つの数式をアプリに貼り付け、どう表示されるかを見ます。入れ子の分数、上下に範囲のつく総和、pmatrix、伸びる括弧、alignのブロック、casesの場合分け、\defのマクロ、\ceの化学式。この8つで、本当にLaTeXに対応したノートアプリと、行内の分数をいくつか描けるだけのアプリを見分けられます。平らなテキストや、編集できない画像になったら不合格です。

01

8つの数式を貼り付けて、表示を確かめる

確認は1分もかからず、アカウントも要りません。下のブロックを、試したいアプリの新しいノートにコピーし(1つずつでも、まとめてでもかまいません)、それぞれの数式のあとにある行と結果を比べます。どれもKaTeXで表示できる正しいLaTeXなので、うまく表示されなければ、原因は入力ではなくアプリにあります。

8つの数式で試すLaTeXセルフテスト
ノートアプリのLaTeXセルフテスト
1ブロックずつ貼り付け、「正しい表示」の行と比べます。

1. 入れ子の分数
\frac{1}{1 + \frac{1}{1 + \frac{1}{x}}}
正しい表示:分数の横線が3段に重なり、内側ほど線が短く、外側より小さな文字で組まれる。

2. 上下に範囲のつく演算子
\sum_{n=1}^{\infty} \frac{1}{n^2} = \frac{\pi^2}{6}
正しい表示:ディスプレイ数式では、n=1と∞がシグマの右ではなく真下と真上に置かれ、シグマが周りの文字より大きい。

3. 行列の環境
\begin{pmatrix} a & b \\ c & d \end{pmatrix}^{-1} =
\frac{1}{ad - bc} \begin{pmatrix} d & -b \\ -c & a \end{pmatrix}
正しい表示:2行の行列で、丸括弧が行列の高さいっぱいに伸び、-1が閉じ括弧の右上に上がる。

4. 伸びる括弧
\left( \sum_{i=1}^{n} a_i b_i \right)^2 \le
\left( \sum_{i=1}^{n} a_i^2 \right) \left( \sum_{i=1}^{n} b_i^2 \right)
正しい表示:どの括弧も中の総和の高さまで伸び、対になる括弧が同じ高さで描かれる。

5. 揃え
\begin{align}
(a+b)^2 &= a^2 + 2ab + b^2 \\
(a-b)^2 &= a^2 - 2ab + b^2
\end{align}
正しい表示:2行が1つのブロックになり、等号が同じ列に揃う。

6. 場合分け
f(x) = \begin{cases}
  x^2 & \text{if } x \ge 0 \\
  -x^2 & \text{if } x < 0
\end{cases}
正しい表示:1つの中括弧が2行にまたがり、2つの条件は立体のローマン体で、条件だけの列に並ぶ。

7. マクロの定義
\def\dd#1{\mathrm{d}#1}
\int_0^1 x^2 \dd{x} = \frac{1}{3}
正しい表示:マクロが展開され、xの前に立体のdが現れ、積分記号に0と1がつく。

8. 化学式
\ce{H2SO4 + 2NaOH -> Na2SO4 + 2H2O}
正しい表示:数字が下付きになり、元素記号がイタリックの変数ではなく立体で、反応の矢印がきちんと描かれる。

8つのあとに
- 表示された数式の中にカーソルを置き、1文字を選択する。選択できなければ、その数式は画像。
- システムをダークモードに切り替える。黒いままの数式は、明るい背景ごと画像になっている。
- ノートの文字サイズを最大にする。画像はぼやけるが、組版された数式はくっきりしたまま。
テキストファイルをダウンロード

見るべきは、うまくいった数式より、失敗した数式です。1つ目で、そのアプリが組版をしているのか、文字列を置き換えているだけなのかがわかります。短い置き換え表で作られた表示は、3つ目と6つ目で止まります。7つ目は、LaTeXのパーサーと、LaTeXらしく見えるだけの表示との境目です。\defを無視するアプリは、文字をそのまま表示するか、構文エラーを出します。8つ目には、基本の数式の文法の上に重ねたパッケージであるmhchemが必要なので、最初の7つに合格しても、最後の1つで失敗することがあります。

02

「LaTeX対応」が意味する4つの実装

機能紹介のページに同じく「LaTeX」と書いてあっても、2つのアプリの動きがまったく違うことがあります。下の4つの実装は、それぞれ、ソースコードを読まなくても外から見てわかる形で失敗します。

レベル仕組み見分け方困るところ
行内のサブセットドル記号で囲んだ分数、上付き文字、ギリシャ文字を、短い置き換え表で処理する3つ目が、pmatrixという文字が見えたまま、または1行につながって表示される最初に書く行列、積分、場合分け
画像への変換LaTeXを変換サービスに送り、戻ってきたビットマップやSVGをノートに置く数式の中にカーソルを置けず、文字を大きくすると画像がぼやけるダークモードでは暗いページに黒い文字が残り、直すにはソースを打ち直すことになる
ブラウザのエンジン見えないWebViewの中で、JavaScriptのKaTeXやMathJaxを動かす開いて最初の数式が、ノートのほかの部分より一拍遅れて表示されるWebViewに50〜150MBのメモリを使い、最初の数式までに起動の待ち時間がある
ネイティブのエンジンTeXのボックスとグルーの規則を、ブラウザを介さずアプリ自身のコードで処理する行がスクロールして表示されると同時に数式が描かれ、システムの外観に合わせて色が変わる問題は速度ではなく対応範囲になるので、やはり8つの数式を試す

3行目の数字は、SwaTexのREADMEによるものです。READMEは、クロスプラットフォームのよくある構成を、見えないWebViewが50〜150MBのメモリを消費し、最初の数式までに起動の待ち時間があり、オフラインで動く保証もない、と説明しています。自分で書いていないJavaScriptのライブラリを流用する代償です。4つ目のレベルは作るのにはるかに手間がかかりますが、ページからブラウザがなくなります。

03

ネイティブの組版エンジンは何が違うか

Phraseは、数式をSwaTexで描画します。SwaTexは、純粋なSwiftで書かれたKaTeX互換の数式描画エンジンで、JavaScriptもWebViewもDOMも使いません。MITライセンスでgithub.com/PhraseHQ/SwaTexに公開されており、Rustで書かれたKaTeX互換の数式レンダラーRaTeXを、Swiftで一から移植したものです。PhraseのAIノートの数式は、すべてSwaTexが描画しています。レイアウトエンジンは、プラットフォームのテキストAPIではなく、同梱したKaTeXのフォントメトリクスをもとにTeXのボックスとグルーの規則を処理するため、出力はKaTeXやRaTeXと字形単位で一致します。

Phraseで仕上がった会議ノート。要約、フロー図にした開業計画、損益分岐点の数式、ToDo。
iPhone版Phraseのノートで、フロー図の横にSwaTexで組版した損益分岐点の数式。

対応範囲は、KaTeX公式のサポート表1008項目のうち1007項目です。その中には、pmatrix、align、cases、CDの各環境、伸びる括弧、アクセント、\def、\newcommand、\expandafterなどのマクロが含まれます。化学式は\ceと\puでmhchemに完全対応しており、253件のコーパスでRaTeXとバイト単位で一致することを確かめた、状態機械の移植にもとづいています。証明図は、推論規則やシーケント計算のためのbussproofs形式のprooftreeを使います。上の3、5、6、7、8つ目の数式は、どれもこの範囲に入っています。

下の速度の数字は、Rustの基準エンジンと同じコーパス、同じマシンで比べ、3回の実行の中央値をとったものです。2,541件の基準となる数式は、両エンジンでビット単位まで一致しています。どの数字も、リポジトリのBENCHMARKS.mdにあるコマンドで再現できます。

処理RaTeX(Rust)SwaTex
解析からレイアウト、描画リストまで41.4 µs/数式12.5 µs/数式(3.3倍)
PNGの一括出力(100数式、40px、2倍解像度)約200 µs/数式実質34 µs(並列、5.9倍)
同じ数式の再描画(エディタのキャッシュに命中)41.4 µs105 ns(約390倍)
エディタのスクロール対応する数字なし字形のラスタライズ0回(updateLayer)

一致していると言うだけでなく、確かめています。リポジトリにはscripts/diff_layout.pyが含まれ、1000件を超える基準の数式について、LayoutDumpツールの出力をRaTeXのレイアウト用バイナリと比較します。テストスイートは、RaTeX自身の字句解析、構文解析、環境、mhchem、レイアウトのテストをSwiftに移植しています。ただ、数式を描くのは、エディタの課題の半分にすぎません。ブロックには正確な高さが必要で、ビューの再利用にも耐えなければなりません。これは、数式ブロックの高さを決める仕組みと、計算を説明のそばに置くための工夫の記事で扱っています。

ノートができたら、アシスタントに、そのノートをもとに作ってほしいものを頼みましょう。Proなら、Phraseはノートをスライド、ページ、ダッシュボード、暗記カード、クイズ、マインドマップにできます。導出を書き込んだページは、クイズや暗記カードの題材にぴったりです。数式の出てくる講義のノートも同じです。

04

SwaTexが描画しない、ただ1つの項目

対応していないのは、1008項目のうち唯一の例外である\includegraphicsで、KaTeX自身もこのコマンドをtrustの設定の裏に置いています。このコマンドは外部の画像を数式に取り込むため、KaTeXの側では、組版ではなく許可の問題として扱っています。また、4つの\html*コマンドは、中身は描画しますが、DOM専用の属性は取り除きます。ネイティブのレンダラーには、それらの属性が指すDOMがないからです。

KaTeXのサポート表1008項目のうち1007項目

  • 描画できる1003
  • 描画できるが、DOM専用の属性は取り除く(4つの\html*コマンド)4
  • 描画しない:\includegraphics(KaTeX自身もtrustの設定の裏に置いている)1
SwaTexは、KaTeXのサポート表1008項目のうち1007項目を描画します。唯一の例外は\includegraphicsで、KaTeX自身もtrustの設定の裏に置いています。
  • 動作に必要なOSは、iOS 18、macOS 15、tvOS 18、watchOS 11、visionOS 2以降です。これはSynchronization.Mutexによる制約で、それより古いOSを対象とするアプリは、まだSwaTexを採用できません。
  • 対応するのはAppleのネイティブのプラットフォームだけです。React Native、Flutter、Web向けのラッパーはありません。
  • いくつかの動作は、意図的にRaTeXと違えてあり、それぞれ回帰テストで固定されています。閉じていない\verbやx\limits^2は、黙って受け入れるのではなく、構文エラーになります。
  • 深く入れ子になった入力は、再帰の回数とスタックの余裕で保護されており、クラッシュではなく構文エラーになります。それでも、悪意のある入力の長さは、組み込む側のアプリで制限すべきです。

このページで扱っていないことが2つあります。手書きの数式は別の問題です。Phraseが扱うのは、手書きではなく、入力、録音、読み込んだ素材だからです。図やコードブロックも、数式とは別の話です。上でリンクした2つの技術記事で、どちらも同じエディタにどう収まっているかを説明しています。

もう1組、混同しやすい事実があります。SwaTexはmacOS 15向けにビルドできますが、Mac版PhraseにはmacOS 26以降が必要です。エンジンがあるプラットフォーム向けにコンパイルできることと、アプリがどのシステムに対応しているかは別の話です。PhraseはiPhone、iPad、Macで動き、そのどれでも数式をSwaTexで描画します。録音用のApple Watchアプリもあります。

Mac版Phrase。ノートのライブラリの横に、写真、要約、フロー図、損益分岐点の数式が入ったカフェ開業計画のノート。
Mac版Phraseで開いた同じ種類のノート。Mac版にはmacOS 26以降が必要です。
05

ノートアプリのLaTeXについての質問

Appleの「メモ」で数式は使える? 1年前に書かれた情報をうのみにせず、手元のアプリでセルフテストをしてみましょう。「メモ」でできることはAppleが自社のサポートページで説明しており、答えはiOSのリリースごとに変わります。1つ目と3つ目の数式を試せば、10秒ほどでわかります。

Appleの「メモ」でLaTeXの数式を書ける? LaTeXを入力できることと、LaTeXを表示できることは、別の問題です。\frac{a}{b}という文字列なら、どのアプリでもテキストとして保存できます。大事なのは、横線が現れて、その上にa、下にbが置かれるかどうかで、それを確かめるのが1つ目の数式です。

LaTeX対応のノートアプリは、何に対応しているべき? 共通のものさしとして、KaTeXのサポート表を使いましょう。公開されていて、1008項目あります。環境、伸びる括弧、マクロ、mhchemに対応しているアプリは、基準となる実装と同じ文法で動いています。行内の分数にしか対応していないアプリがしていることは、それよりずっと小さなことです。

数式ノートアプリが数式を描くのに、ネット接続は必要? レベルによります。画像を返す変換サービスなら、通信の往復が必要です。WebViewのエンジンには、最初の数式までに起動のコストがかかります。SwaTexは、ブラウザを介さずに、アプリ自身のコードで解析とレイアウトを行います。

出典と編集上の注記

出典は2026年9月25日に確認しました。Appleの機能の手順は、下にリンクしたAppleの最新のドキュメントに沿っています。条件はiOSのリリースごとに変わります。

Phraseの開発元であるEversightが公開しています。編集方針・修正を提案する