SATySFiでページ数を取得する
要するにLaTeXにおけるlastpageがやりたい。最終ページの番号は組版を終えるまで分からないが,SATySFiでは組版後の情報を触って結果を変えることはできない(これはLaTeXにおいても同様である)ので,必要ならば複数回の組版が必要なことをSATySFiに伝える必要がある。 これを実現するためにSATySFiの参照周りのプリミティヴを使う。ここからはドキュメントクラスの定義において,\ref-page(\`last-page\`)の持つ参照のキーがlast-page:pageであるとして話を進める。 ここまで定義してしまうと話は簡単で,ドキュメントクラスのdocumentの定義の最下部にあるpage-breakを行う箇所において
code:class.satyh
let bb-last = hook-page-break-block (fun pbinfo _ -> register-cross-reference
last-page:page (arabic pbinfo#page-number)) in
page-break page pagecontf pagepartsf (bb-title +++ …… +++ bb-last)
のような感じで末尾に組版結果をフックするブロックテキストを配置してやればよい
hook-page-break-blockはその部分のページ分割が確定したときにフックが呼ばれるブロックテキストを生成する関数で,ページ番号とページ上の座標を取ることができる
( (|page-number=int|) -> point -> unit ) -> block-boxesという型でフックはunitしか返せないので,組版の結果に干渉することはできない。せいぜい参照をいじるくらい
組版中の情報を使って結果に干渉できるのはpage-breakに渡される関数pagecontfとpagepartsfのみ
register-cross-referenceは参照の値を登録する
get-cross-referenceで値を取得することができる
参照の値は全文書に渡って一定であることが求められ,途中で異なる値が登録された場合はその値を使って組版自体が再実行される