SATySFi のrefコマンドでうまく引用できないとき


対象者

  • \theorem, \lemma などにラベルをつけたけど、\ref にラベルを渡してもうまく表示されない人
  • 久しぶりにSATySFiを使って書く自分

SATySFi の version

$ satysfi -v
  SATySFi version 0.0.6

SATySFi のソースを見てみよう

stdjareport.satyh での実装は次のようになっている。

let-inline ctx \ref key =
    let opt = get-cross-reference (key ^ `:num`) in
    let it =
      match opt with
      | None    -> {?}
      | Some(s) -> embed-string s
    in
      inline-frame-breakable no-pads (Annot.link-to-location-frame key None) (read-inline ctx it)

\ref(key); で渡した文字列 key の末尾に ":num" という文字列を追加して検索をするようだ。

(ファイル名).satysfi-aux ファイルを見る

{"generated:4:num":"0.1.3","generated:6:num":"0.2","generated:1:page":"1",
 ...,
 "theorem:hey:num":"0.2.7","generated:9:num":"0.2.8",...
}

色々あるけど、\theorem でラベルを登録すると、"theorem:(ラベル名):num" という形になるようだ。

解決策

例えば、hey というラベルで登録した定理 0.2.7 の定理番号を、+proof の冒頭で書きたいとする。

+proof?:({\ref(`hey`);}){

}

と書き、コンパイルすると

となる。

aux ファイルの構造を参考にして、次のように書いてみる。

+proof?:({\ref(`theorem:hey`);}){

}

コンパイルすると、

と表示される。うまくいった。

まとめ

  • theorem にラベルを登録すると、定理番号は、.satysfi-aux ファイルに "theorem:(ラベル名):num" で .satysfi-aux ファイルに登録されている。
  • "(コマンド名):(ラベル名)" を \ref に渡すとうまく表示される。(lemma や definition でも同じ。)
  • 困ったら aux ファイルやソースコードを見よう。