
2026/05/05 1:19
RaTeX:純粋な Rust で実装された、KaTeX と互換性を持つ LaTeX 描画エンジン
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
RaTeX は、ごみ収集(garbage collection)を排除することで決定論的なタイミングを実現し、一貫した Rust コアを活用することにより、高性能な数学表現における画期的な成果を提供します。このアーキテクチャにより、開発者は単一のエンジンで iOS、Android、Flutter、React Native、サーバー、そして Web(WASM)を含む全てのプラットフォーム上で、複雑な数学表現—including 化学マクロ(\ce, \pu)や物理単位—をレンダリングできます。従来の WebView に依存するアプローチや、KaTeX や MathJax のような重厚なブラウザベースのライブラリーとは異なり、RaTeX は品質を損なうことなく、競合製品よりも著しく小さい JavaScript バンドルサイズ(コアは WASM 形式で配信され、約 0 kB against 競合製品の約 280–500 kB)を提供します。自動化されたテストにより、大規模なゴールデンスイートと参照画像に対するピクセル差分を通じて、既存の標準とのピクセルレベルでの一致が確認されています。この決定論的かつ軽量なソリューションは、モバイルユーザーインターフェース、サーバーサイドレンダリング、そしてフルな JavaScript ランタイムを必要としない CI レイスタートストに最適です。Rust コアから一つのエンジンをネイティブ FFI と WASM バックエンド(CoreGraphics、Skia、Canvas 2D、またはカスタムベクター)の跨って共有することで、RaTeX はサードパーティ製 SDK が化学サポート、単位スタイル、あるいはクロスプラットフォームの一貫性に欠けるという断片化問題を解決します。その結果、チームはパフォーマンスや機能の完全性を損なうことなく、エコシステム全体で信頼性と予測可能性のある数学表現レンダリングを実現できます。
本文
Rust を基盤とし、1 つのレイアウトエンジンから「ネイティブ環境」と「WebAssembly(WASM)」の両方で品質に優れた TeX 方式の数式レンダリングを提供します。
RaTeX は LaTeX の数式を読み込み、TeX スタイルのルールを適用した後、CoreGraphics、Skia、Canvas 2D および独自のベクターバックエンドなどに flat display list を出力します。このプロセスにより、「ネイティブ FFI」と「WebAssembly」環境であっても全く同一の結果が得られます。
精度と信頼性: RaTeX は、重要な点において KaTeX と完全に互換性を備えるように設計されています。継続的統合(CI)では、標準の画像群とのピクセルレベルの差異を確認する大規模なゴールデンテストスイートを実行しており、このコーパスにおける出力は概して KaTeX と同等です。サポートページには、KaTeX と並列で全ゴールデンリストを比較するための詳細なテーブルが用意されています。
適した使用シーン: 通常の Web ページ内の数式表示では、DOM 上に KaTeX を使用するのが依然として優れたデフォルト選択肢です。一方、RaTeX は、WebView を必要としないネイティブアプリ、サーバー、または埋め込みシステム向けに設計されており、モバイルから WASM まで同一のエンジンを利用できます。
どこでも利用可能なパッケージ化:
- 用意された SDK および WASM ビルド版: Rust コアから単一ソースで展開されます。npm、Maven、pub.dev、または SPM からインストール可能です(詳細は「入門」ガイドをご覧ください。サーバーサイド PNG 生成コマンドラインツールも含まれています)。
主なプラットフォームごとの利用方法:
- Web (WASM):
npm install ratex-wasm - Android:
(Maven)io.github.erweixin:ratex-android - Flutter:
(pub.dev)ratex_flutter - iOS: SPM を介して直接使用
RaTeX を選択すべきタイミング:
- ネイティブまたはサーバー環境: WebView の導入を避け、iOS、Android、Flutter、あるいは Rust サービスにおいて同じレイアウトエンジン(PNG 風ラスタライズなど)を活用したい場合。
- ホスト上での WASM 環境: WebAssembly 上でコアを実行し Canvas で描画し、ライブデモで KaTeX との出力を比較したい場合。
- 化学式・単位: 通常の数式の隣に
スタイルのmhchem
や\ce
が利用可能(反応矢印や物理的単位も同一パイプライン内で処理)。\pu
メモリ安全な Display List: レイアウトエンジンは 1 つだけであり、ホットパスにガベージコレクション(GC)を含まないため、モバイル UI、サーバー、および CI のラスタライズテストにおいて予測可能なタイミングを保証します。
どこでも利用可能: 互換性のあるプラットフォーム対応
- C ABI: Swift、Kotlin、Dart などのネイティブ言語と互換。
- WASM: Web 環境向け。
- 描画エンジン: tiny-skia や独自の実装も受け入れられ、全てのバックエンドで同一の display list を出力します。
- FFI: WebAssembly 経由でのインターフェース対応。
- 科学計算:
スタイルの化学式機能(mhchem
/\ce
)を内蔵。反応矢印や物理単位を、通常の数式のライン上で処理可能。\pu
ブラウザでの試行: RaTeX の WASM 版でレンダリングされた、CI で使用されている LaTeX コードの一覧を以下のギャラリーでご覧ください。
- 数学
- 化学
- 物理学 詳しくは、KaTeX との比較デモページをご覧ください。
なぜ WebView スタックを採用しないのか? ブラウザ内では通常、KaTeX や MathJax は JavaScript として DOM 上で動作します。WebView を介して数式を埋め込む場合でも、結局はブラウザのスタック全体を配布することになります。RaTeX は、このアプローチを避けることを希望するホスト環境向けに、レイアウトとラスタライズ処理を Rust で完結させることで対応します。
Web ス tack との比較: RaTeX vs KaTeX/MathJax
| 機能 | RaTeX | KaTeX (Web) | MathJax |
|---|---|---|---|
| ランタイム | Pure Rust (純粋な Rust) | JavaScript + DOM | JavaScript + DOM |
| モバイル対応 | ネイティブ / WASM | WebView | WebView |
| デスクトップ対応 | ネイティブ | WebView | WebView |
| オフライン動作 | 可能 | 依存する場合あり | 依存する場合あり |
| JS バンドルサイズ (典型値) | 0 kB (コアは WASM) | 〜280 kB | 〜500 kB |
| メモリモデル | 予測可能 | GC / ヒープ管理 | GC / ヒープ管理 |
RaTeX と既存のネイティブ数式 SDK の比較 WebView を使用しない場合、チームは Swift、Objective-C、または Flutter ライブラリを選択する傾向にあります。以下に広く利用されているオープンソースレンダラである
swiftMath (Swift)、flutter_math_fork/flutter_math (Dart/Flutter)、および iosMath (iOS) とのハイレベル比較(化学マクロ、移植性、エンジン構造について)を示します。サードパーティ製 SDK は独自に進化するため、統合時にはバージョンの確認を推奨します。
| 機能 | RaTeX | swiftMath | flutter_math | iosMath |
|---|---|---|---|---|
mhchem (化学) | ✅ | ❌ | ❌ | ❌ |
/ siunitx スタイルの単位 | ✅ | ❌ | ❌ | ❌ |
| 同一エンジン:ネイティブ FFI + WASM | ✅ | ❌ | ❌ | ❌ |
| 同一 Rust コアからのモバイル+デスクトップ対応 | ✅ | ❌ | ❌ | ❌ |
| Rust 実装の TeX レイアウトコア(ホットパスの予測可能性) | ✅ | ❌ | ❌ | ❌ |
※ パフォーマンスはワークロードに依存します。Swift は ARC、Dart はトレース型 GC を採用していますが、両者とも RaTeX の Rust コアとは異なり、「ブラウザなし」な埋め込みアーキテクチャでは根本的な違いがあります。
科学 UI の配信をブラウザエンジンを埋め込まずに行う: