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のマークアップコードとして出力します。

具体的な流れは次の通りです。

  1. RatatuiアプリをWASMとしてビルドする
  2. TypstがWASMプラグインとしてそのアプリを読み込む
  3. Typstが .typ ファイルでWASMプラグインを呼び出し、幅・高さ・キー入力を渡す
  4. プラグインが TypstBackend を使って描画し、Typstマークアップとして結果を返す
  5. 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スナップショット生成など、応用範囲は広く、今後の発展が注目されます。