RustのTUIアプリをそのままPDFとして出力できる——そんな発想のライブラリが登場しました。
2026年4月に公開されたオープンソースライブラリ「ratatypst」について解説します。
この記事でわかること:
- ratatypstが何をするライブラリか
- RatatuiとTypstの関係
- 動作の仕組みと使い方
- 現状の制限と向いているユースケース
ターミナルUIをPDFで残すのが難しい理由
ターミナルで動くUIアプリ(TUI)は、実行中の見た目をドキュメントとして残すのが不便です。スクリーンショットは撮れても、それを自動化したり、別のドキュメントに埋め込んだりするには一手間かかります。ratatypstはその課題を、RustのTUIフレームワーク「Ratatui」とドキュメント生成ツール「Typst」を組み合わせることで解決します。
RatatuiとTypstについて
Ratatui はRust製のTUIフレームワークです。ターミナル上でパネル、リスト、チャートなどを描画するGUIライクなUIを構築できます。多くのRustプロジェクトでCLIのインタラクティブ画面に使われています。
Typst は、MarkdownとLaTeXの中間的なマークアップ言語で、PDFを生成するツールです。コードを書いてPDFを出力する、という点ではLaTeXに近いですが、構文がはるかに簡潔です。WASMプラグインで外部コードを呼び出す機能があり、ratatypstはこの機構を活用しています。
ratatypstの仕組み
https://github.com/sermuns/ratatypst
ratatypstは、Ratatuiの「バックエンド」として機能するライブラリです。
Ratatuiは描画先(バックエンド)を差し替えられる設計になっており、通常は標準ターミナル向けのバックエンドを使います。ratatypstが提供する TypstBackend はそれを置き換え、描画データをTypstのマークアップコードとして出力します。
具体的な流れは次の通りです。
- RatatuiアプリをWASMとしてビルドする
- TypstがWASMプラグインとしてそのアプリを読み込む
- Typstが
.typファイルでWASMプラグインを呼び出し、幅・高さ・キー入力を渡す - プラグインが
TypstBackendを使って描画し、Typstマークアップとして結果を返す - TypstがそのマークアップをPDFとしてレンダリングする
TypstBackend の内部では、セルごとに text(fill: 色, raw("文字"));linebreak(); という形のTypst構文を生成しており、Typstがフォント・色つきのテキストとして描画します。
使い方
1. ratatypst-core をCargoプロジェクトに追加する
cargo add --git https://github.com/sermuns/ratatypst
2. RatatuiアプリでTypstBackendを使う
通常のRatatuiアプリと同じように書き、バックエンドだけ TypstBackend に変えます。WASMとしてビルドするため、wasm_minimal_protocol も組み合わせます。
use ratatypst_core::TypstBackend;
use wasm_minimal_protocol::{initiate_protocol, wasm_func};
initiate_protocol!();
#[wasm_func]
pub fn run(width: &[u8], height: &[u8], input: &[u8]) -> Vec<u8> {
let width = u16::from_le_bytes(width.try_into().unwrap());
let height = u16::from_le_bytes(height.try_into().unwrap());
let mut terminal = ratatui::Terminal::new(
TypstBackend::new(width, height)
).unwrap();
terminal.draw(|frame| { /* アプリのUIを描画 */ }).unwrap();
terminal.backend().to_vec()
}
3. Typstファイルからプラグインを呼び出す
#import plugin("release/myapp.wasm"): run
#(
eval(
str(
run(
80.to-bytes(endian: "little", size: 2),
24.to-bytes(endian: "little", size: 2),
bytes("kl"),
),
),
)
)
typst compile main.typ でPDFが生成されます。typst watch main.typ を使えば、.typ ファイルを保存するたびにPDFがリアルタイムで更新されます。キー入力(上記の "kl" 部分)を変えれば、異なる操作状態のUIスナップショットを出力することも可能です。
向いているユースケース
ratatypstが役立つのは、TUIアプリのUIを文書として記録したい場面です。たとえばREADMEやドキュメントにUIスナップショットを自動的に埋め込む仕組みが作れます。「この操作後にこの画面になる」という状態を複数パターン生成してドキュメント化する、といった使い方も考えられます。
typst watch との組み合わせで、Ratatuiアプリの描画結果をリアルタイムにPDFプレビューで確認しながら開発する、という使い方もできます。
現状と制限
ratatypstはPoC(概念実証)段階のプロジェクトです。作者自身も「barebones な概念実証」と明記しており、スクロール対応や複雑なウィジェットの完全な再現には制限があります。出力はあくまで静的なスナップショットで、インタラクティブなPDFにはなりません。
ライセンスはパブリックドメイン(Unlicense)で、商用・非商用を問わず自由に利用・改変・再配布できます。
まとめ
ratatypstは、RustのTUIフレームワークRatatuiとドキュメントツールTypstを組み合わせ、ターミナルUIをPDFとして出力するというアプローチを試みたライブラリです。WASMプラグイン機構をうまく活用したアーキテクチャで、アイデアとしての完成度が高いです。PoC段階ではありますが、開発ドキュメントの自動化やUIスナップショット生成など、応用範囲は広く、今後の発展が注目されます。