図版したい(#figure / #figure.caption

1#figure(
2  image("image.jpg", width: 80%),
3  caption: [図版のキャプション],
4)

#figure要素で図版を挿入できます。 第一引数に挿入したい図版コンテンツを指定します。 captionオプションで図版のキャプションを指定します。

図版コンテンツは、画像(#image)だけでなく、表(#table)や数式(#math)、コードブロック(#raw)なども指定できます。 図版全体にラベルを設定して、本文中で参照できます。

ヒント

レポートや論文の場合、本文に関係のない図版は挿入してはいけません。 図版は、本文の内容を補足・説明するものであるべきです。 図版を挿入するときには、その図版が本当に必要かどうか、本文の文脈に沿っているか、など吟味が必要です。

また、図版のキャプションは必須です。 このとき、単に図版のタイトルだけ記述するのではなく、本文を読まなくても、この図版が何を示しているのかわかるように説明するとよいです。

図版を参照したい(#label / #ref

1#figure(
2  image("image.jpg", width: 80%),
3  caption: [図版のキャプション],
4) <fig1>
5
6この図は
7#ref(<fig1>)
8を参照してください。

相互参照の機能をつかって、本文中で図版を参照できます。 図版にラベル(#label)を設定して、#ref要素で参照します。 参照情報は、図版の要素名と番号の形式で表示されます。 図版の要素名は、#page.langで設定した言語に

図版を設定したい(#set figure

1// figureの設定
2#set figure(gap: 1em)
3
4#show figure: block.with(
5  width: 100%,
6  inset: (top: 1em, bottom: 1em),
7  // stroke: 1pt,  // enable when debug
8  // fill: luma(90%)
9)

デフォルトだと図版と本文のアキが窮屈に感じたので、微調整したサンプルです。 figure要素の上(top: 1em)と下(bottom: 1em)に余白(パディング)を追加しました。 また、図版とキャプションのアキもgap: 1emに変更しています。

ヒント

図版の設定を調整するときは、 stroke: 1ptfill: luma(90%)を有効にして、表示エリアを確認しながら調整するのがオススメです。

注釈

1#show figure: set block(
2  width: 100%,
3  inset: 0.5em,
4  stroke: 1pt,
5  fill: luma(90%),
6)

block.withの代わりにset blockを使うこともできます。 ただし、設定が子要素(figure.captionなど)にも引き継がれてしまうため、block.withの方がオススメです。

図版のキャプションを設定したい(#show figure.caption

 1// キャプションの設定
 2#show figure.caption: set align(left)
 3#show figure.caption: block.with(
 4  inset: (left: 1em, right: 1em),
 5  width: 100%,
 6  // stroke: 1pt,  // enable when debug
 7  // fill: luma(80%),  // enable when debug
 8)
 9
10#figure(
11  [content],
12  caption: [...]
13)

図版のキャプション設定はshowルールで変更できます。 デフォルトで、キャプションは図版に対して中央寄せで表示されます。 このサンプルでは、キャプション全体の幅を図版と同じにして、テキストを左寄せにしています。

プレースホルダーしたい

 1#let placeholder(width: 100%, height: 6cm, label: [placeholder]) = rect(
 2  width: width,
 3  height: height,
 4  fill: gray.lighten(80%),
 5  stroke: gray,
 6)[
 7  align(center + horizon )[
 8    text(size: 12pt, color: gray)[label]
 9  ]
10]
11
12// プレースホルダーを作成
13#figure(
14  placeholder(),
15  caption: [図版のキャプション],
16)
17
18// 大きさなどを変更したプレースホルダーを作成
19#figure(
20  placeholder.with(width: 80%, height: 4cm, label: [幅80%のプレースホルダー]),
21  caption: [図版のキャプション],
22)

図版がまだ用意できないときは、プレースホルダーを挿入しておくと便利です。 上記のサンプルでは、placeholder関数を定義して、矩形とテキストを組み合わせたプレースホルダーを作成しています。 withメソッドで、プレースホルダーの大きさやラベルを変更した新しいプレースホルダーを作成できます。

複数の図版を並べたい

 1// +----------+----------+
 2// | image1   | image2   |
 3// | caption1 | caption2 |
 4// +----------+----------+
 5#columns(2, gutter: 0em)[
 6  #figure(
 7    [content],
 8    caption: [左図のキャプションです。],
 9  )<fig-left>
10
11  #figure(
12    [content],
13    caption: [右図のキャプションです。],
14  )<fig-right>
15]

複数の図版を横に並べたい場合は、#grid関数で段組みしたところに、図版(#figure)を挿入します。 上記のサンプルでは、2列のグリッドを作成して、各列に図版を挿入しています。 グリッドのgutterオプションで、図版同士のスペースを調整できます。

複数の図版をまとめたい

 1// +---------+---------+
 2// | image1  | image2  |
 3// +---------+---------+
 4// |      caption      |
 5// +---------+---------+
 6
 7#let images = columns(2, gutter: 1em)[
 8  [左図]
 9  #colbreak()
10  [右図]
11]
12
13#figure(
14  images,
15  caption: [2つの図を説明する1つのキャプションです。]
16)<fig-label>

複数の図版を横にならべて、キャプションを1つにまとめたい場合は、 あらかじめ#gridで段組みしたコンテンツブロックを#figureの第一引数に渡します。 上記のサンプルでは、2列のグリッドに図を並べて、 そのグリッド全体に対してキャプションを設定しています。

注釈

LaTeXで横並びの図を作成する場合、 minipageのような外部パッケージが必要でした。

Typstでは標準機能だけで簡単に作ることができました。 角括弧が多くなり読みづらくなるのはさておき、 コンテンツブロック([...])の柔軟さと使い勝手のよさが、ようやくわかってきた気がします。

リファレンス