本文へスキップ

章 10 · 部 II · 技法

テンプレートページ

テンプレートページのMarkdown。ページテンプレートを指定するコロン4つのページフェンス、テンプレートの枠へ内容を送る枠とslot属性、絵のアンカーにラベルを置く図、そして内容をテンプレートと照らし合わせる警告

更新日 2026-10-169分enescadefritptzhjaar

かんたんな説明

ページの中には、1段の本文ではなく、いくつもの枠を組み合わせてできているものがあります。たとえば教科書のページで、題名の帯と本文があり、写真の付いた色付きの囲みが3つ並んでいるようなものです。Postextはこうしたページをテンプレートページと呼びます。ページの形は設定の中のテンプレートが決め、Markdownにはどの文章をどの枠に入れるかだけを書きます。このページでは、ページフェンス、枠、スロットの名前、地図の地名のようにラベルを付けた絵という、そのMarkdownの書き方を説明し、文章とテンプレートが合わないときにPostextが出す警告も挙げます。

ページの形はテンプレートが持ち、Markdownは中身を持って、それぞれをどの枠に入れるかを示します。

テンプレートページは、テンプレートから組むページです。テンプレートには名前の付いた枠(題名の帯、本文、写真の付いた囲み)、まとめて動くグループ、飾りがあり、すべて設定のpageTemplatesに定義します。ページのMarkdownはフェンスで囲んだブロックで、使うテンプレートを名指しし、内容を名前で各枠に流し込みます。Markdownに位置や大きさを書くことはなく、設定に本文の文章を書くこともありません。ですから翻訳は、同じテンプレートに別の言葉を入れたものになります。

このページではMarkdownを扱います。今回のリリースでは、パーサーがテンプレートページを読み、スロットの検査が働くので、テンプレートに合わないページは検査パネルとpostext checkに報告されます。テンプレートをページに割り付ける処理は次のリリースで入ります。それまでは、テンプレートページの中身はMarkdownの順に本文の流れに組まれ、専用のページに置かれるので、書いたものは何も失われません。テンプレートページのない文書は、これまでとまったく同じに組まれます。

#ページフェンス

::::page{template="tema-cajas" fondo="banda-retos"}
# La actividad económica y el dinero
 
Las personas utilizan :chip[recursos]{style="clave"} que se obtienen de la naturaleza…
::::

テンプレートページは、コロン4つにpageと属性を続けた行で始まり、同じ数のコロンだけの行で閉じます。中では、コロン3つのコンテナー(:::frame、:::callout、:::figure、:::columns、:::paper)がいつもどおり開いて閉じるので、単独の:::はそのうちいちばん内側のものを閉じ、ページを閉じることはありません。コロン5つで書いたページ(:::::page)は5つで閉じ、その中ではコロン4つの行はただのテキストです。

属性働き
template="…"必須。pageTemplatesの項目のIDです。
spreadページを向かい合う2ページの見開きにします。テンプレートも見開き用でなければなりません。
id="…"、#idアンカーです。これを指す:refは、テンプレートページが入ったページの番号を印字します。
その他の属性テンプレートが{attr.name}として読む値です。たとえばページごとに選ぶ背景の絵なら、ページにfondo="banda-retos"、飾りにresourceId: "{attr.fondo}"と書きます。

テンプレートページはいつも新しいページ(または見開き)から始まり、閉じるフェンスの後のテキストは次のページから始まります。

コロン3つの:::page{split=…}はコミックのページで(漫画を参照)、その意味は変わりません。template=を持つコロン3つの:::pageもコミックのページとして読まれ、警告pageFenceLengthがテンプレートページにはコロンが4つ要ることを知らせます。

フェンスが欠けていても、パーサーはテキストを失わずに立て直します。

  • 開いたままのページは章の終わりまで続き、開始行で閉じていないコンテナーとして報告されます。
  • ページが開いている間に::::pageの行が現れると、まずそこで開いているページを閉じます(同じように報告されます)。
  • 閉じるフェンスは、ページの中でまだ開いている枠やボックスをすべて閉じ、その一つ一つを報告します。
  • コロンの数が違う閉じるフェンスは、そのページのものではありません。テキストに残るので、目で確かめられます。

#枠とスロット

:::frame{slot="dinero" label="El dinero"}
Es el instrumento utilizado como medio de pago…
 
Hasta hace pocos años, lo más normal era pagar con dinero en **efectivo**…
:::

スロットは、内容が求める行き先の名前で、テンプレートの枠の名前と対応します。:::frame{slot="…"}は、中のものをすべてその枠に送ります。中身には、段落、リスト、見出し、チップ、::resourceの埋め込み、:refの参照、脚注、:::columns、入れ子の囲みなど、どんなMarkdownでも書けます。labelとtitleは、:::calloutと同じく、枠のタブや見出しの文字を与えます。枠の見た目は、テンプレートがその枠に割り当てた囲みスタイルで決まります。

1つのブロックが自分でスロットを名乗ることもできます。

ブロック書き方
見出し## Retos {slot="retos-titulo"}
リソースの埋め込み::resource{id="dinero-pago" slot="dinero-fotos"}(2つの属性はどの順でもかまいません)
コードブロック```js {slot="codigo"}
ボックスやその他のコンテナー:::callout{type="nota" slot="aside"}:ボックス全体がスロットに入ります
図:::figure{resource="mapa" slot="mapa"}(下記を参照)

内容は次のように振り分けられます。

  • 同じスロットを持つ複数の内容は、Markdownの順につながります。
  • スロットのない内容は、テンプレートの流し込み枠(flowの付いた枠)に入ります。
  • スロットのない見出しは、テンプレートにその見出しのレベルを受け取る枠(takes: "h1")があれば、まずそこに入ります。ですから教科書の単元の題名は、ページの頭に# 題名と書くだけで済みます。
  • テンプレートにないスロットを名乗る内容は、流し込み枠に入り、報告されます(slotUnknown)。

テンプレートページの外にあるslotは読まれますが、何も変えません。

#ラベル付きの図

:::figure{resource="mapa-europa" slot="mapa"}
::label[OCÉANO ATLÁNTICO]{at="atlantico" style="mar"}
::label[**Madrid**]{at="madrid"}
::label[Mar Negro]{at="62% 48%"}
:::

:::figure{resource="…"}は、::resourceと同じく1つのリソースをキャプションと番号付きで置き、絵の上に置くラベルを並べます。ラベル1つにつき::label[テキスト]{…}を1行書き、間に空行をはさんでもかまいません。

  • atは、リソースのアンカー(絵の上に一度だけ定義し、すべての言語で共有する点)を指定します。アンカーのないラベルには、絵に対するパーセントで点をat="x% y%"と指定します。
  • styleはラベルスタイルを指定し、アンカーのスタイルより優先します。
  • 角かっこの中のテキストはインラインのMarkdownで、ボールド、イタリック、チップが使えます。

図は、枠の中だけでなく本文の流れの中でも使えます。ラベルは読み取られ、ソースの位置とともに保持されます。絵の上にラベルを描く処理はテンプレートの割り付けと同時に入り、それまで図はリソースのとおりに組まれます。図の中にラベルでも空行でもない行が現れると、閉じる:::のない図はそこで終わり、閉じていないコンテナーとして報告されます。

#作例

教科書の1ページです。題名の帯、リスト付きの本文、そしてそれぞれ横に写真を添えた色付きの囲みが3つあります。

::::page{template="tema-cajas" fondo="banda-retos"}
# La actividad económica y el dinero
 
## La actividad económica
 
Las personas utilizan :chip[recursos]{style="clave"} que se obtienen de la naturaleza…
 
- Las :chip[empresas.]{style="clave"} Ofrecen bienes y servicios a cambio de un beneficio.
- Las :chip[personas y familias.]{style="clave"} Adquieren lo que ofrecen las empresas…
 
:::frame{slot="dinero" label="El dinero"}
Es el instrumento utilizado como medio de pago, ya que su valor es conocido…
:::
 
::resource{id="dinero-pago" slot="dinero-fotos"}
 
:::frame{slot="gasto" label="El gasto"}
- **Fijo:** es el que se produce todos los meses…
- **Variable:** puede cambiar según las necesidades…
:::
 
::resource{id="gasto-compras" slot="gasto-fotos"}
 
:::frame{slot="ahorro" label="Préstamos y ahorro"}
Si necesitas o quieres comprar algo muy caro…
:::
 
::resource{id="ahorro-balanza" slot="ahorro-fotos"}
::::

題名はh1を受け取る枠に、小見出し、段落、リストは流し込み枠に、囲みと写真はそれぞれのスロットの枠に入ります。カタルーニャ語版は、同じ行に別の言葉を入れたものです。テンプレートもスロットも写真も変わりません。

#警告

検査は割り付けの前にMarkdownと設定を読むので、入力するそばから検査パネルに表示され、postext checkと文書のcontentWarningsにも現れます。どの警告にも、対象となる箇所のソース範囲が付きます(設定 › 文書の中の警告を参照)。

種類原因対処
templateUnknownページフェンスがpageTemplatesのどの項目にもないテンプレートを指定しているか、テンプレートを指定していない。スロットは検査されません。IDを直すか、テンプレートを設定に加えます。
slotUnknownslot="…"の名前が、ページのテンプレートのどの枠にも当たらない(extendsで受け継いだ枠とvariantsのページの枠も数えます)。その内容は流し込み枠に入ります。スロット名を直すか、その名前の枠をテンプレートに加えます。
slotEmptyテンプレートの枠が、このページで何も受け取らない。どのスロットもその枠を指さず、見出しも受け取らず、流し込み枠の場合はスロットのない内容も残っていない。ほかの枠からの続き(next)を受け取るだけの枠は報告されません。postext checkでは注記として挙がります。スロットを付けてその枠の内容を書くか、テンプレートでその枠をoptional: trueにします。
pageFenceLengthコロン3つの:::pageがtemplate=を持っている。これまでどおりコミックのページとして読まれます。ページをコロン4つの::::page{template="…"}で開き、::::で閉じます。
unclosedContainerテンプレートページ、枠、図のどれかが閉じられていない(上の立て直しの規則を参照)。検査パネルではテンプレートページを::::pageと呼びます。閉じるフェンスを加えます。テンプレートページには開始行と同じ数のコロン、枠や図には:::です。

#コードから使う

composedPages(blocks)は、章を解析したブロック(parseMarkdownWithIssues(markdown).blocks)を読み、ページフェンスごとに1つのノードを順に返します。ノードには、template、spread、各値のソース範囲(attrSources)を伴うattrs、fenceIndex(章の中でのフェンスの通し番号で、どの言語でも同じ)、slots(スロットごとのブロックの添字。Markdownの順)、unassigned(スロットのないブロック)、そしてページ全体のソース範囲が入ります。ブロックは、自分が名乗るスロットを、値のソース範囲とともにContentBlock.slotに持ちます。図はresourceBlockで、そのfigureが属性とラベルを持ち、各ラベルにはテキスト、インラインのスパン、Markdownへ戻るソースマップがあります。checkComposedSlots(pages, config)は、それらのページについてスロットの警告3種を返します。