Skip to content

SATySFiの2段組機能

T. Suwa edited this page Dec 2, 2019 · 2 revisions

概要

SATySFiに2段組を入れつつあるので,その簡単な報告です(一応既に動かせます).適宜「これを参照してください」などとポインタは張りますが,かなりコアな機能なので The SATySFi​book を大体読んでいる程度の前提知識が必要です.

2段組のAPI

dev-two-column というブランチ(この記事を最初に執筆している現在は c2ee489 というcommitを指しています)で開発しており,このcommitをcheckoutしてインストールすればすぐに以下のプリミティヴを使って2段組が実現できます:

page-break-two-column : page -> length -> T_3 -> T_4 -> T_5 -> block-boxes -> document

where
  T_3 = unit -> block-boxes,
  T_4 = (| page-number : int |) -> (|
    text-origin : point;
    text-height : length;
  |),
  T_5 = (| page-number : int |) -> (|
    header-origin  : point;
    header-content : block-boxes;
    footer-origin  : point;
    footer-content : block-boxes;
  |)

T_4T_5page-break : page -> T_4 -> T_5 -> block-boxes -> document で用いられています.これについては The SATySFi​book 第12章を参照してください.

page-break-two-column page x-shift columnhookf pagecontf pagepartsf bb という形で使います.各引数は以下のような内容です:

  • page : page
    • 紙の寸法.
  • x-shift : length
    • 左段の開始位置(=ブロックボックス列の最も左上の座標)と右段の開始位置の水平方向の距離.すなわち,“段の幅と段間の和”.
    • 段間の長さではないことに注意.段間を指定するAPIではない主な理由は,SATySFiでは “段の幅” という概念が形式上は存在しないため.ブロックボックス列は,左端は揃っているものの一般には右端は揃っておらず,場所によって幅が異なる.
  • columnhookf : unit -> block-boxes
    • 段のページ分割が始まる前に呼び出されるフック函数.戻り値は,まだページ分割が終わっていない残りのブロックボックス列の先頭に追加される.
    • 特に何も追加しない場合は block-nil を返すように与えれば良い.
  • pagecontf : T_4
    • page-break の第2引数と同じ(The SATySFi​book 第12章参照).
    • ページ分割処理で新しいページの開始時に起動され,段落の開始位置と鉛直方向の理想の長さを返すように与える.
  • pagepartsf : T_5
    • page-break の第3引数と同じ(The SATySFi​book 第12章参照).
    • ページ分割処理でページ内容が確定した時に起動され,ヘッダとフッタを附加する.
  • bb : block-boxes
    • 分割して文書にするブロックボックス列.

仕組み

基本的には “単に半分に切れたページを隣り合わせにしている” だけで,脚註も今のところ左右の段ごとにつく形でしか出せません.

n 段組への一般化も特に難しくないので,もう少し一般性の高いAPIにしてもよいかもしれません.

そのうちSATySFiの2段組で組まれた第61回プログラミング・シンポジウムの豫稿が公開されると思いますのでご覧ください(内容自体はSATySFiの計算機科学的に特に面白い側面について触れた16ページの記事で,2段組機能自体については特に言及はありませんけれども).

Clone this wiki locally