はじめに
とりあえず動くものを書きました、という姿勢の軽薄な記事です。
環境
- Mac OS X Mojave 10.14.5
- SATySFi 0.0.3
目的
SATySFi で期末試験の問題を組版したい。
そのために、大問用のコマンド
+question
: inline-text → block-text → block-text
と小問用のコマンド
+qitem
: inline-text → block-text
を用意し、本文中で次のように書けるようにする。
+question{次の各主張の真偽を述べよ(答えのみでよい)。}<
+qitem {
ところで、カルタゴは滅ぼされるべきである。
}
+qitem {
それにつけても、カルタゴは滅ぼされるべきである。
}
+qitem {
とはいえ、カルタゴは滅ぼされるべきである。
}
>
ポイントは、大問と小問の番号を自動で振ること。
LaTeX ならカウンターを使うところだが、SATySFi ではどうすればいいのだろうか。
解決
可変参照 (The SATySFibook 3.2.3; p.57) を使って実現する。
プリアンブルに次のように書いておくと、上の通りのことができる。
なお、パッケージは stdjabook を使っている。
let-mutable question-number <- 0
let-mutable qitem-number <- 0
let-inline ctx \q-num it =
let size = get-font-size ctx in
let ctx-enlarge = set-font-size (size *' 1.5) ctx in
read-inline ctx-enlarge {〔#it;〕}
let-block +question lead bt =
let () = question-number <- !question-number + 1 in
let () = qitem-number <- 0 in
let it-num = embed-string (arabic !question-number) in
'<
+pn {
\q-num{ #it-num; } #lead;
}
#bt;
>
let-block ctx +qitem ib-body =
let () = qitem-number <- !qitem-number + 1 in
let size = get-font-size ctx in
let it-num = embed-string (arabic !qitem-number) in
let ib-head = read-inline ctx { (#it-num;) } in
let ib-indent = inline-skip ((size *' 0.88) *' 1.5) in
let ib-sep = inline-skip ((size *' 0.88) *' 0.5) in
line-break true true ctx
(ib-indent ++ ib-head ++ ib-sep ++ (read-inline ctx ib-body) ++ inline-fil)
簡単なコメント
最初の 2 行で、大問用の「カウンター」 question-number
と小問用の「カウンター」 qitem-number
を用意している。
4〜7行目は大問番号の整形用のコマンド \q-num
の定義。
9〜18行目が大問用コマンド \question
の定義で、最初に question-number
に 1 を足し、qitem-number
をリセットしている。The SATySFibook p.82 にある +section
の実装も参考にした。
20行目から最後までが小問用コマンド +qitem
の定義。
参考文献
Takashi Suwa, The SATySFibook v1, https://booth.pm/ja/items/1127224