章 10 · 部 II · 技法
テンプレートページ
テンプレートページのMarkdown。ページテンプレートを指定するコロン4つのページフェンス、テンプレートの枠へ内容を送る枠とslot属性、絵のアンカーにラベルを置く図、そして内容をテンプレートと照らし合わせる警告
かんたんな説明
ページの中には、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.と書きます。 |
テンプレートページはいつも新しいページ(または見開き)から始まり、閉じるフェンスの後のテキストは次のページから始まります。
コロン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を直すか、テンプレートを設定に加えます。 |
slotUnknown | slot="…"の名前が、ページのテンプレートのどの枠にも当たらない(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種を返します。