typstによる帳票出力システム開発日記
狂気に囚われたためtypstで帳票を作っております。
というのは冗談で、帳票システムを作りたいという欲求は世の中に溢れているらしいので、貴重なプライベートの時間を使って帳票システムの予備調査をしていました。やはり狂っているのでは?
帳票システムは昔ながらのソフトウェアが綺羅星のごとく存在しておりそれらが様々な企業を様々な形で囲い込んでいると思われますが(社会人エアプなので詳細はよく分かっていない)、お世辞にもイケているとは言い難いソフトウェアが多いためこれまた様々な蛮勇が勢いよく新規参入している分野でもあります。
そうした帳票システム群のごくごく一部を書き下すと以下の通り。
老舗で業界筆頭の一角と思われる
帳票開発を、もっと簡単に「Docurain-ドキュレイン-」|帳票開発エンジン
割と新しめのやつ。ユーザーがExcelで作った帳票にテンプレート文字列を入れて置換させるタイプ
yagisan-reports JavaScriptで動くWebフレンドリーな帳票発行エンジン
これも新しめのやつ。なんで今さら帳票エンジンを新規開発しているのか というエントリに開発理由が書かれている
帳票開発の何が人々の心を惹きつけるのかはわかりませんが、データとビュー(見た目)の関心を分離したいというITエンジニアの普遍的欲求に突き刺さるのかもしれません。
しかし実際に帳票のビューを作り込もうとするとこれがとにかく地獄のように難しく(難しさについては上の「なんで今さら~」を参照)、そもそもよほどの蛮勇でない限りレイアウトの計算などが難しいことはやらなくても自明(というか分かったつもりになっている)ため、この分野に参入するエンジニアが少ないというのも事実としてあります。
さてtypstです。
typstはLaTeX代替の組版システムです(ここにおける「代替」とはalternativeのほうでありsubstituteではないという点に注意が必要です)。
LaTeXを代表とする組版システムは学術の世界でよく利用されてきました。ノーコードローコードの時流に逆らいガチガチのコードまみれの世界で組版をする取っつきづらさがありtypstも同様なのですが、typstはLaTeXよりも構文が簡潔に整理されており、表現力も高いためこれを使って簡単に帳票システムが作れるのでは? と考えました。データとビューを分離し、typstの機能で私のような素人でも簡単にレイアウトが組めたら万々歳、というわけです。
というわけで思い立ったが吉日、昨日からスキマ時間でやっていた作業の途中経過を報告します。
パッと見てみていかがでしょうか? レイアウトは筆者のセンスもあり適当だし、請求書としては項目が色々足りていません。しかしその辺りはtypstのレイアウト命令で細かく制御することができます。
注目してもらいたいのは画像左側のtypファイルと右上のyamlファイルでビューとデータが分離されている点です。当たり前ながら商用システムには遠く及ばないですが、これ育てていったら自社内の帳票システムくらいは軽く回せそうな感じが漂っていませんか?
typstには組み込みでyamlやjsonを読み込む関数が用意されており、データとビューの関心の分離を簡単に行うことができます。実際上の画像では、yamlから読み込んだ注文データの配列を受け取り、可変行の注文詳細を出力できています。これはすごいことです。何がすごいのかというと、関心が分離されているということは帳票の設計作業と入力作業も完全に分離できるため、直ちに分業が可能になるということを意味するからです。
もちろんデータ入力者がExcelなりに入力した結果をyamlに変換するプログラムは必要ですが、yamlという中間表現を取ったことで機械にこれを出力させても良くなった、という点に注目してください。こうした誰でも取り扱える中間表現の挿入は、計算機科学者David Wheelerの言葉を借りれば「いかなる問題も他のレベルの間接性を導入することにより解決できる」を体現していると言えるでしょう(大げさ)。
しかしながらMVPにしても帳票として作り込みが足りていないためなんとかしたいです。特に数値が3ケタ区切りになっていないのは気になるかもしれません。typstはロケール系のユーティリティが標準未実装なので[1]、通貨3桁カンマ区切りは自力実装になるらしいです(正規表現による置換が使えるので楽勝ですが、できれば自作はしたくないですよね)。
[1] Locale-aware number formatting · Issue #1093 · typst/typst
この記事が気に入ったらサポートをしてみませんか?