HN 日本語サマリー

← 一覧へ戻る
プログラミング

ExactTex: LaTeXの段階的型付けスーパーセット

ExactTex. A gradually-typed superset of LaTeX (github.com)

16 pointsby camilochs1 コメント

要約

ExactTexは、LaTeXに段階的なアノテーション機能を追加したスーパーセットです。これにより、PDFを生成する前にドキュメントの整合性を確認できます。名前を付けたオブジェクトのみがチェックされ、それ以外は通常のLaTeXとして扱われます。ブラウザ上でVitelaエディタを通じて試すことができ、コンパイラはWebAssemblyでローカル実行されます。

全文翻訳

ドキュメントのPDFを見る前に、そのドキュメントが健全かどうかを確認できます。ExactTeXは、段階的なアノテーションを備えたLaTeXです。チェックしたいオブジェクトに名前を付ければ、名前を付けなかった部分は通常のLaTeXとしてバイト単位でそのまま転送されます。.texファイルを.xtexにリネームしても動作し続けます。そこから、どの程度アノテーションを付けるかを選択でき、アノテーションを付けた部分は保証されます。Vitelaで今日からブラウザ上でExactTeXを使用できます。VitelaはコンパイラのWebAssemblyビルド上に構築されたエディタで、同じチェック、診断、ナビゲーションがページ内でローカルに実行されます。現在の状況:コンパイラは動作しており、3つのインターフェース(ターミナル、エディタ、ブラウザ)が利用可能です。xtexはパース、チェック、LaTeX出力、ソースマップの書き込み、リビジョンの適用を行います。xtex-lspはエディタに診断、ホバー、補完、定義への移動機能を提供します。WebAssemblyビルドは、コンパイルサーバーなしで同じコアを任意のホストで実行します。パリティスイートは、3つのインターフェースを1つの回答にまとめます。以下のすべての主張は、構築されたものに関するものであり、各数値はそれを生成したコマンドで再現可能です。 何のためのものか 今日LaTeXができない2つのこと。 自分の言葉でのエラー。 ページに収まらないとき、LaTeXは次のように言います:「Overfull \hbox (12.3pt too wide) in paragraph at lines 45--47」。ExactTeXは次のように言います:「あなたのテーブル "results" は右マージンを12.3pt超えています paper.xtex:212 — 列3は宣言した幅に収まりません」。同じ事実を、オブジェクトに付けた名前を使って伝えます。これは、あなたがそれを宣言したからこそ機能します。それが構文の目的です。ツールに話させるための名前を与えます。 ファイル内に存在するリビジョン。 Wordは追跡された変更を.docx内に保存するため、ツールは編集を提案し、受け入れるか拒否できます。LaTeXには同等のものがないため、すべてのツールが独自のレイヤーを構築し、それらは相互運用できません。ExactTeXはモデルをフォーマットに組み込みます。 数分で試せます。 git clone https://github.com/camilochs/exacttex cd exacttex cargo run -p xtex-cli -- check examples/hello.xtex coverage: 11.8% bibliography: unavailable — the document declares no bibliography ファイルは通常のLaTeXですが、1つのセクションがアノテーション付けされています。メーターは、ドキュメントのどの程度が契約下にあるかを示します。ここで、参照を間違って入力してみてください — @ref(sec:results) を @ref(sec:resutls) に変更 — そして再度チェックしてください:error[XT1003]: identifier `sec:resutls` is not declared — did you mean `sec:results`? --> examples/hello.xtex:6:30 entity: section name: sec:resutls span: offset 106, length 11 --> examples/hello.xtex:4:22: `sec:results` is declared here blame: xtex-construct プレーンなLaTeXでは、これは静かな「?」として表示されていました。 Rustツールチェーン(1.88以降)が必要です。コンパイラ自体は依存関係を一切取得しません。 見た目 \documentclass[11pt]{article} \usepackage{amsmath} \begin{document} \section{Introduction}@id(sec:intro) We argue the opposite in Section~@ref(sec:model), and @cite(knuth1984) showed that cost grows with $n$. The architecture is shown in Figure~@ref(fig:runtime). \figure(fig:runtime) { src = "figures/runtime.pdf" width = 80% caption = {Runtime architecture for \emph{multi-agent} systems} } @import("sections/model.xtex") Ordinary LaTeX keeps working: \emph{emphasis}, $E = mc^2$, \citep{blum2020}. \end{document} 2つのアノテーションレベル。 @id(x) は任意のLaTeX構造に付加され、チェックされた参照と安全なリネームを可能にします — 定理やアルゴリズムは、ExactTeXがそれらを認識していなくても機能します。\figure(x) のような型付きブロックは、コンパイラにチェックすべきフィールドも提供します:画像は解決され、キャプションは存在し、列数は表と一致します。 型システムは段階的であり、それが設計全体です。 ドキュメントの大部分はLaTeXであり、コンパイラはそれをモデル化しません。これは修正されるべき欠陥ではありません。これは言語が構築されている状態です。すべてのエンティティは、コンパイラが知っているクラスか、未知のオープン型である ?O のいずれかです。 クラス Figure, Table (型付きブロック — \figure(fig:x), \table(tab:x)) Section, Appendix, Algorithm, Equation (@id をLaTeX構造に付加し、チェックされた参照と安全なリネームを可能にします) Citation (@cite、IDではなく参考文献に対してチェックされます) ?O それ以外のすべて xtexインベントリ paper.xtex は、あなたのドキュメントのためにそのテーブルを出力します:IDごとの1行、そのクラス、参照されている数、宣言されている場所。 「オープン」が負荷を支える言葉です。 段階的型システムにおける「?」は、「固定セット内の未知」を意味します。LaTeXには固定セットがありません — 任意のパッケージがいずれかの時点で新しいコンストラクタを定義できるため、ここでの未知は無制限です。この用語は、Malewski, Greenberg, Tanter の Gradually Structured Data (OOPSLA 2021) に由来します。 比較は等価性ではなく一貫性です。2行がチェックポリシー全体です。 Known(A) ~ Known(B) iff A == B <- これは失敗する可能性があります ?O ~ T (すべてのTに対して) <- これは決して失敗しません ?O はすべてと一貫性があるため、モデル化されていないLaTeXを含むものは何も一貫性がなく、モデル化されていないLaTeXを含むものは何も失敗しません。?O は無効性ではなく、根拠の欠如を示します。 明確に述べる価値のある2つの結果。 .tex を .xtex にリネームして何も変更しない場合、クリーンにチェックされます。なぜなら、すべてのエンティティが ?O だからです。これは、ケースバイケースの注意なしに、構築によって保持されます。これは、ドキュメントにインスタンス化された段階的保証 (Siek, Vitousek, Cimini, Boyland, SNAPL 2015) であり、オンランプを約束ではなく現実のものにします。 アノテーションをどの程度付けるかを選択すると、コンパイラが選択した量を示します。xtex check はカバレッジを報告します:チェックされたドキュメントの割合。これは、any や noImplicitAny のアナロジーです。この数値自体よりもその傾向が重要です:60%チェックされていたファイルが30%になった場合、それはパーサーがモデル化できないものを獲得したことを意味します。 型が提供するチェックであり、LaTeXツールは実行しません:@ref(fig:main) が able(fig:main) を指している — 接頭辞は図を要求しますが、宣言は表です。その兄弟:Figure~@ref(tab:main) が表を指している — 文章は図と言っていますが、宣言は表と言っています。LaTeXは両方をコンパイルし、間違った単語を出力します。詳細は docs/checking.md および docs/decisions/0019 を参照してください。 どのように構築されているか 依存関係ゼロのコア1つ。それ(コンパイラ)を呼び出す3つの薄いサーフェス(ターミナル、エディタ、ブラウザ)。CIでのパリティスイートによってバイト単位で同一に保たれます。転送保証は、アノテーションのないバイトは処理されず転送されるため、パイプラインの外側に配置されます。完全なウォークスルー:docs/architecture.md。 外部検証 — 参考文献エントリ、URL、DOI、リポジトリはライブソースに対してチェックされます — 独自のドアの後ろにあります:別のステップが日付付きのレコードを書き込み、コンパイラはそれをオフラインで再生するため、ネットワークはコンパイルに入りません。方法と理由:docs/verification.md。 何ではないか LaTeXをより短く書く方法ではありません。TypeScriptはJavaScriptよりも冗長ですが、タイプを少なくするために採用した人はいません。ツールがより多くを知るために、あなたはより多くを書きます。TeXを置き換えず、組版せず、LaTeXエコシステムを離れるように求めません。あなたのジャーナルは依然として.texファイルを受け取ります。 どれくらい新しいか コンパイラは新しく、そうでないふりをすることはあなたの時間を無駄にするでしょう。堅固なもの:転送保証 — 未変更のLaTeXはバイト単位で同一に出力される — は、ここで最も古い不変条件であり、最も頻繁にテストされています。チェッカー、エミッタ、および2つのサーフェス(WebAssemblyとLSP)は、同じ入力に対して同一に応答し、CIのパリティスイートがそれを維持します。100ページ強の本 — 40パッケージ、索引、章ごとの参考文献、TikZ — は、TeX Live全体と同じページ数にコンパイルされます。 まだデリケートな部分:変更モデル。2026年8月の実際の使用で1晩で3つの欠陥が表面化しました — \author{…} 内に書かれたリビジョンは、画面上では解決可能でしたが、PDFにはそのまま出力されました。 返信が、それが応答した変更よりも長く存続しました。 1つを拒否すると、余分なスペースが残りました。 これら3つはすべて同じもので、3つの側面から見られたものでした:ドキュメントがテキストをどこに運ぶかについて異なるルールを参照する2つのコードパス。それらは修正され、それぞれ前のコンパイラに対して失敗するテストがあり、tests/dialogues.rs は現在、タイトルページ、キャプション、ネストされたコマンド、テーブルセル、リストアイテムを通過する完全な会話を実行しています。それが正直な要約です:その部分