SATySFiでトンボと裁ち落としを設定するパッケージを作った話

これは「SATySFi Advent Calendar 2020」の6日目の記事です。

5日目はmonaqaさんによる「SATySFi で湯婆婆」でした。

6日目はabenoriさんのSATySFiで可換図式です。


「ネタがないなら今年作ったパッケージについて語ろう」ということで、自作パッケージを宣伝する記事第二弾です。

今回はSATySFiでトンボと裁ち落としを簡単に付けるためのパッケージを紹介したいと思います。

作ったものについて

クラスファイルの中を少し変更するだけでトンボや裁ち落としを付けることができ、さらに裁ち落としのサイズやトンボを付けるか付けないかなどを自由に弄ることができるような機能を提供するパッケージを作りました。

パッケージのリポジトリは"puripuri2100/satysfi-tombo"にあります

実際に使ってみるとこのようになります(実際には色はつきません)。

f:id:puripuri2100:20201212110250j:plain

薄い灰色部分の本文の周りに暗い縁で3mm幅の裁ち落としが付けられ、さらにトンボもついているのがわかると思います。

使い方

インストールは

opam install satysfi-tombo
satyrographos install

によってインストールできます。 提供されるパッケージファイルはtombo/tombo.satyhで、モジュール名はTomboです。

クラスファイル内での使用を想定しており、一般の文書作成者が触ることは想定していません(クラスファイルから作る場合は触るでしょうが)。

クラスファイルにおいてdocument型を生成するために使われるpage-breakプリミティブをTombo.page-break関数に置き換え、context型の引数を最初に追加で与えるだけで、生成されるPDFに裁ち落としとトンボが付いてきます。

具体的には、普通クラスファイルの中で

page-break page pagecontf pagepartsf bb-main

のようにしてdocument型を作っている部分を

Tombo.tombo-page-break ctx-doc page pagecontf pagepartsf bb-main

のように変更するだけです。

二段組にも対応していて、

Tombo.tombo-page-break-two-column ctx-doc page len f pagecontf pagepartsf
bb-main

とするだけで出来ます。

オプション引数で裁ち落としのサイズとトンボのための余白の大きさを変えることができます。

Tombo.tombo-page-break ?:(Some(<裁ち落としの長さ:length>)) ?:(Some(<余白の大きさ:length>)) ctx-doc page ...

一番目が裁ち落としの長さで、二番目が余白の大きさです。

どちらもlength optionで与えます。一番目にNoneを与えると裁ち落としが設定されなくなり、二番目にNoneを与えるとトンボが付けられなくなります。

作った動機

私用で印刷所に入稿するPDFデータをSATySFiで作ることにしたため、必要になると思い作成しました。

「進捗大陸」というSATySFiで同人誌を作成しているサークルでは手動でページサイズを3mmずつ増やしていたりするらしいですが(参考:進捗大陸6「SATySFiで技術同人誌を作ろう」 by amutake)、そこでも指摘されている通り、PDFを配布したいときなどの裁ち落とし等を設定しない場合との切り替えが面倒であったりするので、そこら辺の面倒を無くしたい気持ちが結構ありました。

実装方法

page-breakには

  • ページサイズ
  • ページ番号を受け取って本文の高さと本文の開始座標を返す関数
  • ページ番号を受け取って
    • ヘッダーの中身
    • ヘッダーの開始位置の座標
    • フッターの中身
    • フッターの開始位置の座標

を返す関数

を与えます。

そこで、この3つの値に対して

  • ページサイズを裁ち落としとトンボの余白大きくした値を設定しなおす
  • 本文・ヘッダー・フッターの開始位置の座標をそれぞれ大きくする余白分ずらす

という操作を行います。

これで裁ち落としの設定ができました

あとはトンボのグラフィックを用意し、それを描画させるだけです。

グラフィックを用意しても、それが評価されないと出力されないので、

inline-graphics 0pt 0pt 0pt (fun _ -> tombo-gr)

のようにして大きさの無いinline-boxesを作り、これをblock-boxesに変換した後にヘッダーの下などに付けておくようにします。

こうすることで全てのページでトンボを描画する関数が評価され、トンボが出力されることになります。

もっと詳しく知りたい人はコードを読んでください。

課題

現状SATySFiはPDFの書き出しでMediaBoxしか設定できません(これはSATySFiがPDF書き出しに使用しているcamlpdfを弄れば実現できるかもしれません)。

そのため、「裁ち落とし」や「トンボ」と言ってもBleedBoxやTrimBoxが設定されているわけではないため、ある意味「飾り」と言っても過言ではない状況になっています(裁ち落としに関しては実用性はそこそこありますが)。

将来SATySFiがMediaBox以外も書き出せるようになったらここに対応したいと強く思っています。

また、page-breakをラップして実装しているため、graphicsの座標指定で絶対座標を使っている場合は大きくズレてしまうという欠点も抱えています。

さいごに

(様々な都合で)実用できるか微妙なところのSATySFi-tomboですが、どうやら自分が使う予定である用事では「トンボは付けず、3mmの裁ち落としと塗り足しを設定すること」という印刷所からの指定への対応としては使えそうです(3mmである前提で印刷所が作業をするのでTrimBoxなどを設定してなくても大丈夫、とのことでした)。

入稿の設定によってはこのパッケージが使える場面はあると思いますので、使っていただけると嬉しいです。