Typstのパッケージ作成補助ツールTylerを作った件

2024/11/20に公開

https://x.com/mkpoli/status/1859199539250598169

Typstとは

Typstはアカデミック・ライティング用途を念頭に開発された、TeX などの今までのシステムを覆しうる革新的で多機能な組版エンジンです。もちろん、数式を含めた学術論文や試験問題などに限らず、雑誌や書籍、書類、スライド、ポスターなどの様々な場面の組版にも適しています。私達が翻訳している日本語版Typstドキュメントも是非ご覧になってみてください。

Tyler

Tylerとは、Typstのパッケージ(ライブラリやテンプレート)を作ってリリースすることを簡単にするためのツールです。

使い方

https://github.com/mkpoli/tyler

モチベーション

Typstはパッケージシステムがすでにありますが、パッケージ周りのルール制定・システム開発が非常に慎重に行われ、機能が最小限になっているため、パッケージを作成してリリースする際には、手動で引用を変更したり、ファイルや内容をコピペしたりしなければなりないことがかなり多いです。また、バージョンを上げるのにも大量な手動の操作をしなければなりません。そのため、パッケージの環境をより豊富で使いやすいものにするためにも、パッケージ作成・リリースの簡単化・効率化を図る必要があります。個人的にもいくつかのライブラリやテンプレートを開発したりしておりますが、やはりその流れがあまりにも面倒なので、それを改善したいです。

まだ確立されたパッケージのリリース機能

パッケージ・マネージメントシステムがなく、

機能一覧

  • 📥 パッケージをローカルに自動インストール(@local/somepkg:0.1.0
  • 📄 相対インポートを自動コンパイル(../lib.typst@preview/somepkgs:0.1.0
  • 🔄 インタラクティブやCLI指定によるバージョン上げ
  • 🔍 リリース前のtypst.toml内外での有効性チェック
  • 📦 typst/packagesにリリースするパッケージを用意する
  • 🚀 Pull Requestを出す半自動なリリース・ワークフロー

さらに、PRのテンプレート入力やリリースの改善を考えております。皆様があったら便利だと思う機能があればぜひ教えて下さい!

実際に使ってみよう!

https://cdn.discordapp.com/attachments/1308756183330459648/1308756183703621632/recording.mp4

リリースしたいパッケージのフォルダーにて、アップロードしたいコードをsrcフォルダーに置き、さらにtypst.tomlと同じフォルダにて以下のコマンドを実行します。

curl -fsSL https://bun.sh/install | bash
bun i -g @mkpoli/tyler
tyler build -i -p

解説

  1. curl -fsSL https://bun.sh/install | bash: Bunのインストール
  2. bun i -g @mkpoli/tyler: Tylerのインストール
  3. tyler build -i -p: パッケージのチェック・ビルド・インストール・パブリッシュ準備を行う

詳細

すべてのファイルをsrcに置く方法が現状のデフォルトとなっておりますが、実は--srcdirを指定することによって、裸でも動きます。しかし、その場合--ignoreを指定しなければ、非常に汚くなるなります(例えばtyler build --ignore="CONTRIBUTING.md,hello.world,neko/*"`)

使用例

チェックのみ

tyler check

特定なフォルダから

tyler /home/user/your-typst-package

インストールのみ

tyler build -i

ビルドして別のところにインストール

tyler build /home/user/typst/some-package --outdir=/home/user/typst/packages/packages/preview/some-package/0.1.0

パブリッシュ

gitおよびgh(GitHub CLI)のインストールが推奨されます。

tyler build -p

以下のエラーが出ている場合はgit config --global http.version HTTP/1.1を実行してHTTPバージョンを下げてみてください(戻すにはgit config --global http.version --unset

error: RPC failed; curl 92 HTTP/2 stream 0 was not closed cleanly: CANCEL (err 8)
error: 1143 bytes of body are still expected
fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: fetch-pack: invalid index-pack output

配置

tylerコマンドに直接設定事項を渡すか、あるいはtypst.tomlの中に[tool.tyler]欄を設けることによってできます。コマンドラインのオプションの方が高い優先度を持ちます。また、[tool.tyler]では以下のような設定しかありません。

[tool.tyler]
srcdir = "src"
outdir = "dist"
ignore = []

開発

以上に述べたように、inboisuを開発する際にパッケージを作るのめんどくさいなと思っていたので、ビルドステップを入れたいと思いました。実は以前公開したプロジェクトにも似たような機能をPythonやシェルスクリプトなどで行いましたが、やはり一貫性がめんどくさいのと、パッケージと無関係なものを中に入れたくないと思ったからです。

JavaScript(TypeScript)+Bunで開発したのは、やはりPythonだとおもすぎるし、CLI文化が一番発達しているのはWeb系なので、開発用のツールは一通り揃っているので、そうしました。本当はRustで開発したかったのですが、やはりRustで開発してたらいつまでも終わらないと思いましたので、とりあえずJSで開発して、実験的にパッケージ開発の流れを簡単化にしてから、最終的には公式様が公式のワークフローをRustで書いてくれることを望みます。

開発自体は特に難しいことは使っておらず、コミットログを見ればわかると思います。主に、command-line-argscommand-line-usagechalkinquirerなどのCLIプラットフォームを使い、単純なルールベースのファイル操作によって実装されています。

コミュニティ

「くみはんクラブ」というコミュニティを創設しました。そこで、Typstに関する話もされますので、何か質問や不明点があれば、ぜひいらしてください。また、

https://discord.gg/dHRaAsBeRY

https://x.com/mkpoli/status/1746874400618815813?s=20

コミュニティ

「くみはんクラブ」というコミュニティを2024年1月に創設し、そこでTypstを始めとする様々な組版の話について議論されています。何かTypstなどを使う上で質問や不明点があれば、ぜひいらしてください。また、そのメンバーが中心となって、Typst Japan Communityを結成し、公式の認可を得てドキュメントの非公式日本語翻訳プロジェクトも始動しました。

https://discord.gg/dHRaAsBeRY

https://x.com/mkpoli/status/1751193383085973670

https://x.com/mkpoli/status/1827242838880408036

https://x.com/mkpoli/status/1858311758517326002

Discussion