SATySFiで作った冊子のお話

SATySFi Advent Calendar 2021の最終日の記事です。

24日目の記事はmonaqaさんによる「satysfi-enumitem v3.0 で素敵な箇条書きをいっぱい作る話」でした。

はじめに

SATySFiは最近登場した、テキストファイルをもとにPDFを作成する組版ソフトウェアです。独自の文法をもつマークアップ言語でもあります。また、組版処理を自動化したり、制御したりするための「組版プログラミング言語」の面も持ちます。この部分は静的型付けの関数型言語という言語設計上の特性があります。

ここ数年でSATySFi関連の素晴らしいツールやパッケージが数多くリリースされ、SATySFiで文書を作る環境は整ってきています。

しかし、SATySFiで作られた文書についての情報がまだあまりないので、それについて今回簡単に紹介してみようと思います(yabaitech.tokyoさんや進捗大陸さんがSATySFiで同人誌を作成していることは有名で、ノウハウも記事として出てますが、それの足しになれば幸いです)。

これを参考に「SATySFiって色々使えるんだな」とか「SATySFiで冊子を作るときにこういうことを考えているんだな」とか思ってくださるとうれしいです。

自分がSATySFiで作成し、今回紹介する冊子は - 高校の文化祭で配布する部誌 - 毎年、高三のときに高校のクラスごとに作成するプチ卒業アルバムのような200ページの冊子(運動会活動に絡めて作成されるため、「運動会パンフレット」と呼ばれています) - 高校の卒業文集 の3つになります。

本当はすべて公開して詳しく書いていきたいところですが、個人情報の塊のものが多いのであまり詳しく説明できず簡単な紹介になってしまいす。

では、順番に紹介していきます。

部誌

中高のときにパズル研究部というところに所属しており、そこでは編集長として部誌を作成し配布していました。SATySFiで作成した年には部誌としてはかなり長大となる120ページのものとなりました。これを1000部以上刷って製本して配布しました(学校の輪転機で数十時間使って刷り、部員総出で一枚ずつ集めて冊子としてステープラーで止めていました)。下手なサークルより作ってますね。しかもほぼ全部捌けるんです。

レイアウトの制約については3年前に同じく編集長として部誌をLuaLaTeXで作った時に書いたブログ(LuaLaTeXで部誌を作った話)を読んでいただきたいのですが、簡単にいうと

  • 「問題番号」・「作者名」・「問題の難易度」・「パズルの画像」の4つの要素からブロックを作成し、それを紙面上に並べていく
  • 問題番号に対応する解答画像も別のページに並べる

といった感じになっています。

  • 作者名
  • 難易度
  • 画像のファイル名

のタプルのリストを作成し、そのリストを処理してページを生成する関数を作って自動組版していきました。

また、記事部分もあるので、そこは普通に標準クラスのような感じのレイアウトになるようにコマンドを提供し、それで組んでいきました。

特徴的な機能としては、SATySFiのテキスト出力モードを利用し、PDFと同時にHTMLを吐き出すようにした点があるかもしれません。

パズル研究部のHPの部誌掲載のページの「2019年(ニポリ16号)」をご覧ください。「PDF版」と「HTML版」の二つがあることがわかると思います。これは両方とも同じソースから生成しています。

後悔しているのは、吐き出すHTMLファイルに"id"による参照機能をつけ忘れたことです。どうにかしたいですね。

(製本した部誌はしまってしまったので今写真がありません)

運動会パンフレット

例年Adobe InDesignを使用して作成されているのですが、よい機会なのでSATySFiで作ってみました。

クラスの人について一人一人紹介するページが2ページずつ50人分あり、ここを自動化できればかなり労力の削減につながるということで自動化しました。

出席番号ごとに紹介文を"1.satyg"や"50.satyg"というようファイル名をつけ、中で

let a-1 = '<
  +p{紹介文}
>

というようにblock-textとして保存をし、それを出席番号ごとに呼び出していく感じにしました。これでメインファイルでは

+syoukai <
  +s (1) (a-1);
  +s (2) (a-2);
  +s (3) (a-3);
  +s (4) (a-4);
  ...
  +s (50) (a-50);
>

と書くだけでよくなります。また、こうすることで特定の一人の文章を変更するときに変更差分がわかりやすくなります(Gitを使ってバージョン管理をしていたので)。

もちろん、出席番号から名前と顔写真を引っ張ってきて、文章と共に適切に組んでいくコマンドを関数を作ることが必要ですが、そこはSATySFiの「組版プログラミング言語」としての面を活用すれば十分に行えます。そしてなにより、デザインを変更する際に一発で反映させられるという素晴らしい利点があります。

この冊子でも部誌と同じように記事部分があるので、そこも部誌と同じように適当に良い感じにしました。

紹介部分は画像のようになっています。かなりシンプルなデザインとなってはいますが、それっぽくはなっているのではないでしょうか(右側のぼかされているところが個人紹介の文章となっています)。

f:id:puripuri2100:20211231180740p:plain
パンフの個人紹介のページ

シンプルなデザインになった言い訳をすると、コロナ禍によるオンライン授業の影響で自分が編集担当になったのが遅く、長期休みまでに紹介文の回収をしようとすると、早くレイアウトを決定しなければならなくなったためです。適当な字数を制約として紹介文を書かせて、後からレイアウトを決めていけばもっと凝れたのでしょうが、もし改行数を多くして送って来られたりするとかなり面倒なことになってしまうので「一行○○文字で△△行まで」として書かせたかったのです。SATySFiのグラフィック機能を使って飾りつけをすることも一瞬考えましたが、「無償でやってるんだからそこまでしなくて良いだろう」ということでやめました。

ところで、氏名を表示するところが縦組みっぽい何かになっていますね。この運動会パンフレットを作ったときはv0.0.6のときなので縦組み機能はありません。頑張って一文字ずつdraw-textプリミティブを使って縦組みっぽく配置しています。

卒業文集

今絶賛印刷製本中になるわけですが、高校卒業文集もSATySFiで作っています。

部誌も運動会パンフレットもすべてSATySFiで作成しましたが、この卒業文集は「生徒の書いた文章部分はSATySFiで作る」「扉や表紙などは別のGUIソフトで作成する」と役割分担をしました。

卒業文集も運動会パンフレットと同じように、同じレイアウトで数百人分のページを作るものなので、SATySFiでプログラムを組んで自動化することのメリットがかなり出たのではないかと思います。逆に、各ページごとの調整がかなり細かく必要となった組ごとの扉ページについてはそれが得意なソフトウェアを活用しています。

これも運動会パンフレットと同じく、一人一人ファイルを作成して読み込んでいます。ただ、メインファイルで全員分を一気に読み込むとプリアンブルだけで数百行になってしまうので、一旦クラスごとにまとめて class-1 のようなblock-textを作り、それを組の数だけメインファイルに書き込んでいます。階層化は大事ですね。

卒業文集委員会の委員長が、文章の提出方法を以下のような様式に指定して学年に通達してくれました。

  • 提出はメール本文に平打ちとし、docxファイルでの提出などは認めない
  • 本文の一行目には4桁番号のみを書くこと(「4桁番号」とは、学年・組・出席番号を順に並べたもので、例えば1年2組34番であれば「1234」となります)
  • 2行目には氏名のみを書くこと
  • 3行目にはタイトルのみを書くこと
  • 4行目以降は本文を書くこと ただし、全ての改行は改段落として扱う

かなり機械的に処理しやすい形式にしてくれました(もちろん、意図的に上の形式を課しています)。ですので、この形式に従ったテキストを処理して、自動で一人一人の文章をblock-textとして定義するsatygファイルを生成するプログラムを作って運用しました。

スクリプト言語で書くか、と思ったのでRubyで書いてみました。余計な改行などは手動で削除してそれをそのプログラムに投げれば終わりです。 後は4桁番号から組と番号を特定して自動でファイル作成をして本文を改行ごとに段落として+pコマンドに入れていきます。また、特殊文字などもエスケープするようにしています。

かなり便利で、単純なコピペを繰り返すだけで一人あたり一分でページが作られていきます(あれ?なんか遅いような気もするが?)。

「二段組のデザインにしたい」と委員長から要望されたので、SATySFiの二段組機能を用いて作成しました。

個人情報の塊かつ作成中のものなので残念ながら写真は出せません……。

使って便利だったパッケージ

satysfi-tombo

印刷所に入稿するPDFなので当然裁ち落としが必要になります。

そいうわけで、特に大きく手を加えることなく裁ち落としとトンボを自動でつけられるsatysfi-tomboパッケージがかなり便利でした。

使い方については「SATySFiでトンボと裁ち落としを設定するパッケージを作った話」という記事を読んでください。

satysfi-base

ベージ番号に関するフックをかなり活用しており、そのときにsatysfi-auxに書き出したページ番号を読み取ってint型に変換する必要がありました。そんなときにはint.satygに定義されている Int.from-string 関数がかなり便利でした。

satysfi-image

画像を回転させたりする必要があるときに便利でした。本当は無精せずにきちんと画像編集ソフトウェアで回転させてあげれば良いのでしょうが、さすがに数百枚もそんな編集はしたくなかったので……。

satysfi-easytable

「これは表です!」という感じで使うことはありませんでしたが、「よく考えたらこれは表だよな」という場合がいくつかあり、罫線の出し方を簡単に弄りつつさっさと作ることができて便利でした。

欲しいと思ったパッケージ

satysfi-auxファイルとのやりとりを上手くラップしてくれるパッケージが欲しいですね。一々プリミティブを使ったり、ラップする関数を定義していくのは面倒でした。

また、飾りなどを描画するときのデバッグ用としてheader・footer・本文箇所のそれぞれにグリッドを表示できるようなものとかも欲しいですね。

(こういうことを書いておくとpuripuri2100という人がやる気を出したときに作ってくれることがあるらしいです)

おわりに

今までSATySFiで作った冊子について簡単に紹介していきました。

公開しにくいものばかりなので写真などをほとんど出せないのが残念ですが、わりと重要な冊子の作成にSATySFiが結構使われていることがわかっていただけましたでしょうか?

自分はほかにも筑波大学AC入試の自己推薦を作成するときにもSATySFiを使ったりしました(クラスファイルのリポジトリ)。

SATySFiはきちんと実用されまくっている組版ソフトウェアです! 皆さんもぜひ使って楽しいSATySFiライフを送りましょう!