2019年8月18日

この前RIMSで話したときの報告をSATySFiで書いている.stdjaをもとにちょっと改変したクラスファイル(?)を利用.フォントサイズはもう少し大きい方がよいかな.

必要な部分しか手を入れていないので,かなりもとのままだけど,タイトルをシンプルにして,基本版面改変して,定理環境を入れたくらいかな.LaTeXと違って,何を書くべきかがThe SATySFi bookに書いてあったのであまり苦労はしていない.凝ったことをしようとすると大変そうだけど.参考文献だけちょっと困った.やっぱりBibTeXを使いたいので,昔作って放置してあるLuaなBibTeXに手を入れて,連携させるようにしてみた.\citeを定義して相互参照を吐き出させて,それを読み込んでデータベースを吐き出す感じ.こんな感じのファイルを作るようにした.

let bibliography-data = [
(`arXiv:1901.02336`,`Abe19`,{N. Abe, \emph{On Soergel bimodules}, arXiv:1901.02336. });
(`MR3555156`,`EW16`,{B. Elias and G. Williamson, \emph{Soergel calculus}, Represent. Theory \textbf{20} (2016), 295–374. });
(`MR2329762`,`Soe07`,{W. Soergel, \emph{Kazhdan-Lusztig-Polynome und unzerlegbare Bimoduln über Polynomringen}, J. Inst. Math. Jussieu \textbf{6} (2007), no. 3, 501–525. });
]

これを受けて文献一覧を吐き出すように+bibliographyを定義.具体的な\cite+bibliographyの定義はこんな感じ.

let-block ctx +bibliography dbs =
  let a = dbs |> List.mapi (fun n x -> register-cross-reference (`bibliography_database_` ^ arabic(n)) x) in
  let b = bibliography-data |> List.map (fun (key,label,i) -> register-cross-reference (`cite_key:` ^ key) label) in
  let get-length inb = match get-natural-metrics inb with (l,a,b) -> l in
  let length-list = bibliography-data |>
    List.map (fun (key,label,item) -> get-length (read-inline ctx (embed-string(`[` ^ label ^ `]`))))
  in
  let max a b = if a >' b then a else b in
  let label-length = (List.fold-left max 0pt length-list) +' 10pt in
  let output lst ctx = 
    let get-block (key,label,item) = 
      let label-box = read-inline ctx (embed-string(`[` ^ label ^ `]`)) in
      let length = get-length label-box in
      line-break true true ctx (
        inline-skip (0pt -' label-length) ++ label-box ++ inline-skip (label-length -' length) ++ 
        read-inline ctx item ++ inline-fil
      )
    in
    let a = lst |> List.map get-block in
    List.fold-left (+++) block-nil a
  in 
  let ctxheading =
    ctx |> set-font HanIdeographic font-cjk-gothic
        |> set-font Kana           font-cjk-gothic
        |> set-font Latin font-latin-sans
        |> set-font-size 16pt
  in
  let pads = (label-length, 0pt, 0pt, 0pt) in
  let decos =
    let deco _ _ _ _ = [] in
    (deco, deco, deco, deco)
  in
  block-skip 5pt +++
  (line-break true true ctxheading ((read-inline ctxheading {参考文献}) ++ inline-fil)) +++
  block-skip 0pt +++
  block-frame-breakable ctx pads decos (output bibliography-data)

let-inline \cite key =
  let opt = get-cross-reference (`cite_key:` ^ key) in
  let () = register-cross-reference (`cite_keys_` ^ arabic(!cite-keys-counter)) key  in
  let () = cite-keys-counter <- !cite-keys-counter + 1 in
  match opt with
    | None    -> {[???]}
    | Some(s) -> embed-string(`[` ^ s ^ `]`)

使い方は\cite(`key`);で引用して,+bibliography [`db1`;`db2`];で文献出力.本当は文献自身の読み込みをSATySFi側ですればよいのかもしれないけどなー..bibにあるLaTeXの命令は引っかかることも多いので,適当に変換している.\'{e}éにしたりとか.

0 件のコメント:

コメントを投稿

コメントの追加にはサードパーティーCookieの許可が必要です