withしたい(with

 1// h = block要素の一部を設定した関数
 2#let h = block.with(
 3  fill: luma(90%),  // 背景色を追加
 4  inset: 1em,       // 内側のスペースを追加
 5  above: 1em,  // 見出しの上にスペースを追加
 6  below: 1em,  // 見出しの下にスペースを追加
 7)
 8
 9// h関数を適用
10h[ここは背景色とスペースが追加されたブロック要素で表示]
11
12// h関数をさらに適用
13h.with(fill: luma(150%))[ここはさらに背景色が濃くなったブロック要素で表示]

withメソッドで、関数を部分的に適用した新しい関数を作成できます。 blockのようなビルトイン関数を部分的に適用して、特定の設定を再利用できます。

1#show heading: block.with(...)
2
3// 上のshowルールと同じ意味
4#let h = block.with(...)
5#show heading: h

withメソッドは#showルールを組み合わせて、文書を装飾を変更ことができます。

テンプレートしたい

 1// 関数をインポート: template(title, author, ..., body)
 2#import "settings.typ": template
 3
 4// 全体にtemplate関数を適用
 5#show: template.with(
 6  title: "すばらしいタイトル",
 7  author: "すばらしい著者",
 8  // その他の引数
 9)
10
11// ここから本文
12= 文書のタイトル
13
14本文がここに入ります。
15フォント、ページサイズ、段落スタイルが自動的に適用されます。

withメソッドはすべての関数で利用できます。 そのため、ユーザ定義関数を部分的に適用して、ドキュメント全体の設定をまとめることもできます。

上記のサンプルでは設定ファイル(settings.typ)からtemplate関数をインポートしたあと、 template.with(...)で初期値を設定して、 #show: template.with(...)でページ全体に適用しています。

注釈

テンプレート設計のポイントは、ドキュメント全体の設定をまとめた関数を定義することです。 そのためには、「何が設定で」「何が装飾か」を明確に分けることが重要です。 また、ドキュメントの本文を受け取ることができるように、関数の最後の引数をcontent型にする必要があります。 慣習でbodyという変数名を使うことが多いようですが、content型であれば何でもいいと思います。

参考

 1// ある関数を定義
 2#let f(title, body) = {...}
 3
 4// bodyを引数に設定
 5f(title: "タイトル", [本文])
 6
 7// bodyは関数の外に配置できる
 8f(title: "タイトル")[
 9  本文
10]
11
12// withでtitleを固定した新しい関数を作成
13#show: f.with(title: "タイトル")
14
15本文(ここに書いた文章が、マークアップも含めてすべてf関数のbody引数に渡される)
16
17
18// (おそらく)以下と同じ意味
19#let g = f.with(title: "タイトル")
20
21g[本文(ここに書いた文章が以下略)]

設定ファイルしたい

// Filename: settings.typ

#let config(
    title: none,
    author: none,
    date: none,
    body
) = {
  // フォント設定
  set text(
    font: ("Hiragino Kaku Gothic Pro", "Hiragino Sans"),
    lang: "ja",
    size: 10pt,
  )

  // ページレイアウト
  set page(
    paper: "a4",
    numbering: none,
  )

  // 段落スタイル
  set par(
    justify: false,
    first-line-indent: 0pt,
    leading: 0.65em,
    spacing: 1em,
  )

  // 本文を表示
  body
}

まず、ドキュメント全体の設定をまとめたファイル(settings.typ)を作成し、設定用の関数(config)を定義します。

設定ファイルとして分離することで、 ドキュメント設定の管理・保守が簡単になります。

また、複数のドキュメントで同じテンプレートを再利用できるため、ドキュメントの規模が増えても、一貫したフォーマットが保てます。