LoginSignup
3
2

More than 3 years have passed since last update.

SATySFi の可変参照を使って自動で番号を振る

Posted at

はじめに

とりあえず動くものを書きました、という姿勢の軽薄な記事です。

環境

  • 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 {
    とはいえ、カルタゴは滅ぼされるべきである。
  }
>

結果として、次のように出力されるようにしたい。
result.png

ポイントは、大問と小問の番号を自動で振ること。
LaTeX ならカウンターを使うところだが、SATySFi ではどうすればいいのだろうか。

解決

可変参照 (The SATySFibook 3.2.3; p.57) を使って実現する。

プリアンブルに次のように書いておくと、上の通りのことができる。
なお、パッケージは stdjabook を使っている。

exam.saty
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

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2