KMC活動ブログ

京大マイコンクラブの活動の様子を紹介します!!

TypstでC105に出す部誌を組みました

こんにちは。KMC 46thのmarimoです。 これはKMC Advent Calendar 2024 1日目の記事です。

KMCはコミケに合わせて部誌を年に二回刷っています。 C103まではLaTeXを使っていました1が、 年末のC105で頒布する予定の部誌をTypstで組んだので、その話をします2

Typstを紹介する記事はすでに多くあるので、Typst自体やその基本的な機能の紹介はそちらに譲ることとして、 実際に印刷物を作る上で必要だったことを書くことにします。

この記事はTypst v0.12.0を前提としています。

ファイルの分割

長い文書は複数のファイルに分割したくなります。 そのための機能としてincludeとimportがあります。 機能としては書いてある通りでincludeはファイルを文書として読み込み、 importはファイルをプログラムとして(moduleとして)読み込みます。

#include "foo.typ"

だとfoo.typを評価した結果(Contents型の値)が入ります。 つまり、LaTeXのincludeなどのようにテキストがそのまま展開されるのではないので、中で書いた設定が外に漏れたりはしません(うれしい)。

目次、queryの活用

Typst標準でoutlineという関数がありますが、凝ったことをするには機能が足りません。 部誌は寄稿誌の形態をとっているので、目次には題だけでなく著者も載せたいです。 今回はheadingの後にmetadataをおいて、queryで情報をとってくるという戦略でやります。

= chapter1
#metadata([alice]) <author>
= chapter2
#metadata([bob]) <author>

このような文書があったときに

#let toc() = {
  let elements = query(heading.where(level: 1, outlined: true))
  for el in elements {
    let metadatas = query(selector(<author>).after(el.location()))
    let author = metadatas.first().value
  }
  <略>
}

などとしてchapter(level-1のheading)のリストと、そのauthorを得ることができます。 実際にはコーナーケースに対応する必要があります。

TypstはLaTeXなどと同様、文書を単なる要素列として取り扱います。 したがって要素に付随する情報を得るためには列の位置に依存して頑張る必要があります。 LaTeXはauxに書き出して収束するまで繰り返しコンパイルする必要がありましたが、 Typstは外部ファイルを使わずにqueryでとってこれたり、勝手に収束するまでコンパイルしてくれたり、そもそもコンパイルが速いといったうれしさがあります。

凝ったページデザイン

縁付けたりとか背景付けたりしたいときがあります。page関数のbackground,foregroundを使いましょう。

#set page(background: image("hogehoge.jpg"))

フォント

これはそこそこ知られていますが、v0.12.0現在、和文と欧文のフォントを別に設定するのに困難があります。 正規表現をつかうと禁則処理が壊れるなどの問題があります。

#show regex("[\p{scx:Han}\p{scx:Hira}\p{scx:Kana}]"): set text(font: "Hoge Font")

フォントのフォールバックを使ったほうがいいです。

#set text(font: ("Latin Font","Japanese Font"))

段組みの注意

Typstはpage(column: 2)とすれば2段組ができます。 あとは、v0.12.0になって段抜きの浮動図を置くことができるようになりました。 しかしv0.12.0現在、最後のページでバランスすることはできません(#466)。

さいごに

京大マイコンクラブ(KMC)は、C105の2日目(月曜日)西-08aで参加します。 年2回発行の部誌に加えて、今回はKMCが管理するAS59128の本も出す予定です。 コミケに参加する方はぜひお願いします。

さいごに参考にしたドキュメントを紹介します。 Typst公式のドキュメントは今どきらしく綺麗にまとまっています。 また、技術書展17で頒布されたTypstで技術同人誌を書こう!すぐに役立つ20のトピックも大いに参考になりました3。 テンプレートの例としては公式のtemplatesを見ると良いです。 Typstは開発が活発でその辺のコードは使い物にならないことがあるので(この記事含め)、基本的には公式のものを見ることになります。

Footnotes

1 https://github.com/kmc-jp/bushi-template2

2 ちなみにC104でも私が組版を担当して、そのときはSATySFiを使いました。

3 たまたまハンドルネームが一致していますが別人です。