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)を定義します。
設定ファイルとして分離することで、 ドキュメント設定の管理・保守が簡単になります。
また、複数のドキュメントで同じテンプレートを再利用できるため、ドキュメントの規模が増えても、一貫したフォーマットが保てます。