2024年12月15日

Typst Advent Calendar 2024

Typst Advent calendar 2024の15日目です.昨日は清水団さんのTypstの中でJuliaのコードを実行するでした.明日は@zr_tex8rさんです.

先日の表現論シンポジウム予稿はTypstで書きました.その時のお話.主に空きと参考文献を手動で対応した話.

基本設定

日本語用の設定はいつもの通りです.

// フォントはヒラギノ
#let mincho-font = ("New Computer Modern", "Hiragino Mincho ProN"/*"Yu Mincho"*/)
#let gochic-font = ("New Computer Modern", "Hiragino Kaku Gothic ProN"/*"Yu Gochic"*/)
#set text(
  lang:"ja",
  font: mincho-font
)
#set par(first-line-indent: 1em, leading: 1em, justify: true, spacing: 1em)
// 強調は太文字
#show emph: it => {text(font: gochic-font, weight: "bold",it.body)}
#show strong: set text(
  weight: "bold",
  font: gochic-font
)

好みの設定.

#set enum(numbering: "(1)")
// 今回は見出しは一種類しか使わなかったのでそれだけ再定義.
// 前後空き0.5em,ラベルはピリオドなし数字,そのあとに一文字分空き
#set heading(numbering: "1.1.1")
#show heading.where(level: 1): it  => {
  block(width: 100%)[
    #set text(font: gochic-font)
    #set text(weight: "bold")
    #v(0.5em)
    #counter(heading).display("1")#h(1em)#it.body
    #v(0.5em)
  ]
}
// タイトルは適当に定義
#let title(
  body, 
  author: "",
  institute: ""
) = {
  block(width:100%)[
    #set text(
      size: 1.5em,
      font: gothic-font,
      weight: "bold"
    )
    #set align(center)
    #body
    #set text(
      size: 1em/1.5,
      font: mincho-font,
      weight: "regular",
    )
    #set align(right)
    #author#footnote(numbering: "*")[#institute]
  ]
}

数学っぽいやつ.

// 定理環境
#import "@preview/ctheorems:1.1.3": *
#show: thmrules
#let thm = thmbox(
  "thm", "定理",
  separator: [#h(1em)],
  inset: 0pt, 
)
// 以下同様に命題とかも定義
// \DeclareMathOperator{\Hom}{Hom}と近いと信じている
#let Hom = $op("Hom")$
// \newcommand{\aff}{\mathrm{aff}}と近いと信じている
#let aff = $"aff"$

空き

Typstの空き調整はLaTeXと異なる点や単に実装が足りていない点がある.気が付いたのはこんなところ.

  • 和文文字と数式の間に四分空きが入らない.現状手動で入れるしかないと思う.が,0.25emの空きを入れるのは面倒だったので群 $G$ を考えるのように半角空白で代用しました…….なお,もちろん次に,$G$をのように前が句読点だったりする時には空白は入れない.
  • 見出し後の段落がインデントされない.リンク先のIssueではいろいろなワークアラウンドが提供されているが,どれも完璧ではなさそうなので手動で入れるようにした.
    = はじめに
    #(1em)
    表現論に……
    
  • 改行も半角空白扱い.LaTeXでは一文毎に改行して書くことが多いのだけど,Typstでこれをすると和文の後に余計な空白が入る.これは単に文を続けて書くだけでよい.ちょっとソースが見にくいが.(ちなみに(u)pTeXやLuaTeX-jaでは和文文字の後の改行はなかったもの扱い,和文文字でない場合は半角空白扱い.)

参考文献

Typstにはbibliographyという関数があり,これで参考文献が出力できる.なんとBibTeXデータベースも読み込めるというすぐれモノ.使うには同じフォルダにBibTeXのデータベースファイル(拡張子がbibのファイル)を置き,出力したいところに次のように書けばよい.

#bibliography(
  "bib.bib",// データベースのファイル名
  style: "american-physics-society",// スタイルを用意されている一覧から指定できる.
  title: [参考文献],// 参考文献自身の見出し.デフォルトでは言語に応じて出てくるので必要ないかも.
)

本文内では@REFのように(REFの部分はデータベース内のラベル)参照すればよい.[1, Proposition 1.2]のようにするには@REF[Proposition 1.2]とすればよい.

参考文献一覧には「参考文献」という見出しが出る.通常「1 参考文献」のように番号は入らないのだが,上のようにheading自身を関数で定義しているとその関数がそのまま適用されて番号が出てくる.それはいいのだが,番号がおかしくなるようだ.番号はいらないと思うので,直前でheadingの定義を番号なしに変更して対処した.

#show heading: it  => {
  block(width: 100%)[
    #set text(font: gothic-font)
    #set text(weight: "bold")
    #v(0.5em)
    #it.body
    #v(0.5em)
  ]
}
#bibliography("bib.bib")

出力に関するカスタマイズは上のstyleを指定するくらいでほとんどできず,しかもその出力形式はあまり数学のよくあるやつにはそぐわないように思える.例えば次の点が気になる.

  • 文献一覧は本文で引用した順番に並べられる.数学では著者名でアルファベット順に並べる.(かなり致命的.)
  • 参照は[1]のように番号.これは好みだが制約がない状況では個人的には著者名省略形+年号(BibTeXのalphaスタイル)が好み."alphanumeric"というかなりそれっぽいスタイルがbibliography関数には用意されているのだが,これを選ぶと「CSL style is not suitable for bibliographies」とエラーが出てしまう.よくわからない.
  • ちなみに用意されているスタイルの中では"american-physics-society"が比較的しっくりきた."american-mathematical-society"はないっぽい.
  • 上で書いたように@REF[Proposition 1.2]とすると[1, Proposition 1.2]と出る……はずなのだが,スタイルによっては出てこない.例えば"american-physics-society"ではProposition 1.2の部分が無視される.なんで?

特に一つ目があるのでこの関数を使うのは諦めて直書きすることにした.bxbibwriteを使うことにしたのだが,公式サイトにはないので自分でもってくる必要がある.Localに持ってくる方法は公式サイトに説明があるがなんとなく日本語訳(?)しておくと次の通り.(ちなみに0.2.1は使ったbxbibwriteのバージョン.)

  • Windowsならば%APPDATA%\typst\packages\local\bxbibwrite\0.2.1以下(標準的にはC:\Users\<ユーザ名>\AppData\Roaming\typst\packages\local\bxbibwrite\0.2.1)にファイルをおく.今の場合はtypst.tomlとbxbibwrite.typを置けばよい.
  • #import "@local/bxbibwrite:0.2.1": *によりパッケージを呼び出す.

なお文献一覧自身はBibTeXを使いLaTeX形式の一覧を出力して,Microsoft Copilotに変換してもらいました.\'eをéに変換するのも頼めばやってくれるので便利.

typst-jlreq?

LaTeXのjlreqクラスファイルのTypst版は可能かというのを検討してみようかと思ったのですが時間切れです.

0 件のコメント:

コメントを投稿

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