typstのテンプレート

はじめに

最近typstを使ってみたのですが、デフォルトだとさすがに味気がなさすぎるけど 公開されている豪華だったり論文チックなテンプレートが少し求めているものと違う かなと感じたので、自分で作ってみました。

資料化までのフロー

個人的な使い方は以下の流れにしてます。

  1. emacsのorg-modeで記事を書く
  2. ox-typstでtypstの形式に変換
  • M-x org-typst-export-to-typ にて変換
  • 下記の設定を生成あとのtypファイルに追記
#import "style/style.typ": *
#show: init
  1. typst compile <hoge.typ>でpdfに変換

テンプレート

以下がテンプレートです。 説明はコメントに書いています。

#let init(body) = {
  // 本文の設定
  set text(lang: "ja", font: "Noto Sans CJK JP", size: 8pt)

  // 見出し後の1行目の字下げ対策
  set par(
    leading: 0.85em, // 行間 default=0.65em
    first-line-indent: 1em
  )

  set page(
    paper: "a4",
    width: 210mm,
    height: 297mm,
    margin: 20mm,
    columns: 1,
    number-align: "center"
  )

  // リンクを青文字下線付きに
  show link: set text(fill: blue)
  show link: underline

  // 注釈を青文字下線付きに
  show footnote: set text(fill: blue)
  show footnote: underline

  // コードブロックはテンプレートを使わせて頂きます。
  import "@preview/codly:1.2.0: *"
  import "@preview/codly-languages:0.1.1: *"
  show: codly-init.with()
  codly(languages: codly-languages)

  // codlyの行番号を非表示に
  codly(number-format: none)

  let titlepageitem(body, size: 22pt, vt: 0%) = {
    set align(center)
    set text(size: size, font: "Noto Sans CJK JP")
    v(vt)
    body
  }

  show heading: it => {
    let level = it.level

    if level == 1 {
      // レベル1の見出し設定
      // 改ページを挟む
      pagebreak(weak: true)

      // ボックスで囲む
      block(
        width: 100%,
        fill: luma(240),
        stroke: 1pt,
        radius: 4pt,
        inset: 8pt,
        it
      )
      v(0.5em)
    } else if level == 2 {
      // レベル2の見出し設定
      block(it)
      line(length: 100%, stroke: 1pt)
    } else {
      // レベル3以降の見出し設定 (デフォルト)
      block(it)
      v(0.5em)
    }
  }

  body
}

おわりに

これで、一旦満足できるテンプレートができました。 必要に応じて更新していこうと思います。

訳あってWSLでないWindows環境でox-typstを使っていたのですが、 うまく動作せず辛かったので、そこらへんの改善が課題ですね。

  • リストの生成
  • 画像の埋め込み あたりが、うまく動作しませんでした。
Hugo で構築されています。
テーマ StackJimmy によって設計されています。