本文へスキップ

章 9 · 部 II · 技法

設定:スタイルと部

段落、チップ、コードリスト、囲み、見出しの名前付きスタイルと、各部の扉ページ

更新日 2026-10-107分enescaptzhjaar

かんたんな説明

このページでは、一度決めれば何度でも使える名前付きスタイルを説明します。段落スタイルは、参考文献や用語集のような種類の文章の組み方を決めます。チップスタイルは行の中に小さなラベルを描き、囲みスタイルは注記やヒントのまわりに枠を描きます。コードリストには専用のフォント、枠、色があります。本の各部の最初に置くページと、特別な見出しのスタイルも扱います。

#段落スタイル

paragraphStylesプロパティは名前付きのスタイルを宣言し、文書は:::paragraphs{style="…"}コンテナーで一連の段落にそれを適用します。参考文献、用語集、注記など、独自の書体、ウェイト、傾き、サイズ、行送り、大文字、スモールキャピタル、ぶら下げインデントを必要とする項目のまとまりに使います。文字組みのフィールドはどれも省略でき、未設定のときは本文の値を継承するため、スタイルには通常の本文と異なる点だけを書けば済みます。

const config: PostextConfig = {
  paragraphStyles: [
    {
      id: 'bibliography',
      name: 'Bibliography',
      fontSize: { value: 7, unit: 'pt' },
      lineHeight: { value: 1.2, unit: 'em' },
      hangingIndent: { value: 2, unit: 'em' },
      spaceBetween: { value: 0.25, unit: 'em' },
      marginTop: { value: 1, unit: 'em' },
      marginBottom: { value: 1, unit: 'em' },
    },
  ],
};
## References
 
:::paragraphs{style="bibliography"}
Knuth, D. E. (1984). *The TeXbook*. Addison-Wesley.
 
Bringhurst, R. (2004). *The Elements of Typographic Style*. Hartley & Marks.
:::
プロパティ型既定値説明
idstring必須:::paragraphs{style="…"}から参照する識別子。
namestringid人が読むための名前です(エディターのUIでのみ使います)。
fontFamilystring本文のフォントフォントファミリー。ウェイトは下のfontWeight / boldFontWeightで指定します(未設定のときは本文の値)。
fontSizeDimension本文のサイズフォントサイズ。
lineHeightDimension本文の行の高さ行送り。em/remはスタイル自身のフォントサイズに対する値なので、継承した1.5emはサイズが小さくなるとそれに合わせて詰まります。
colorColorValue本文の色文字色。太字とイタリックの範囲は、boldColor / italicColorでスタイル独自の色を設定しない限り、本文の強調の色を保ちます。
textAlign'left' | 'justify' | 'center' | 'right' | 'start' | 'end'本文のそろえ水平方向のそろえ。'center'と'right'は、すべての行を反対側から不ぞろいに組みます(献辞、署名欄)。右から左の段落では、'left'はその開始側、つまり右になります。
boldColorColorValuebodyText.boldColor太字の範囲の色(著者の一覧で名前をハウスカラーにするなど)。
italicColorColorValuebodyText.italicColorイタリック(…)の範囲の色です。italicのスタイルでは、正体に戻る範囲の色になります。colorには従わないため、イタリックもスタイルの色のままにしたい色付きのスタイルでは両方を設定します。
fontWeightnumberbodyText.fontWeight通常のテキストのウェイト(100–900)。ワークシートのセミボールドの設問、ライトの題辞などに使います。
boldFontWeightnumberbodyText.boldFontWeight太字(…)の範囲のウェイト。
italicbooleanfalse段落をイタリックで組みます(ト書き、題辞)。中にあるイタリックの…の範囲は、引用ブロックと同じく正体に戻ります。
smallCapsbooleanfalse段落をスモールキャピタルで組みます。小文字はサイズの70%の大文字に、大文字はそのままのサイズになり、どのバックエンドでも同じように描かれます(スモールキャピタルを参照)。配役表や用語集の見出し語に使います。
hyphenationboolean本文のハイフネーション両端そろえのときにハイフネーションを行います(文書のロケールを使います)。
indentDimension0段の左端(または段落を収めるボックスの左端)からのすべての行のインデントです。emはスタイル自身のサイズです。1行目のインデントとぶら下げインデントはこの位置から測るため、字下げした詩の行は、折り返し部分を行の開始位置より深くぶら下げられます。indent: 1.5emとhangingIndent: 2.5emでは、行は1.5 em、折り返しは4 emの位置になります。負の値は0として扱います。
endIndentDimension0行末側(横組みの行の右、縦組みの行の下)からのすべての行のインデントです。emはスタイル自身のサイズです。textAlign: 'end'と組み合わせると、日本語の手紙の日付や署名の地からN字上げのように、行を末尾から何字か上げて組めます。postext 1.16から使えます。
firstLineIndentDimension本文の1行目のインデント1行目の字下げで、indentから測ります。hangingIndentが0でないときは、スタイル自身が決めた場合だけ使われます。1行目はindent + firstLineIndentから、2行目以降はindent + hangingIndentから始まるので、詩の行を1 em下げて折り返しを3 emぶら下げられます。本文から受け継いだ値はぶら下げインデントに譲り、1行目はindentから始まります(postext 1.22までと同じ。それ以前に保存された設定では、そうしたスタイルの明示的な値が外されます)。
hangingIndentDimension01行目以外のすべての行に適用するインデントで、indentから測ります。参考文献や用語集の典型的な形で、詩の行の折り返しにも使います。1行目はindentから、スタイル自身がfirstLineIndentを決めていればその位置から始まります。
spaceBetweenDimension0コンテナー内で続く段落の間の垂直方向のアキ。0では項目が接します。
marginTopDimension0コンテナーの最初の段落の上のアキ。ほかのマージンと同じく、保留中のアキと相殺され、段の頭では消えます。
marginBottomDimension0コンテナーの最後の段落の下の最小のアキ。コンテナーの次のブロックのアキとの関係はbodyText.paragraphContainerSpacingで決まります。
snapToGridbooleantrueコンテナーの下で流れをベースライングリッドに戻します。下のアキは最小値になります。falseでは正確なアキを保ち、コンテナーの後のテキストは、次にグリッドに合わせるブロック(見出し、リストの終わり、別行立ての数式)までグリッドから外れたままになります。グリッドに沿わない文書や、独自の行送りを持つまとまりに使います。グリッドのない囲みの中では何も変わりません。
textTransform'none' | 'uppercase''none'段落の大文字・小文字です。'uppercase'は段落を大文字で組み(配役表、ト書きの1行)、チップの語や:refのラベルも対象になります。文字数は変わらないため、エディターのソースマップは1対1のままです。大文字にすると長くなる文字(ß)は書かれたとおりに残ります。数式はそのままで、段落をマークとして読む柱({firstMark.style})は書かれたとおりのテキストを取ります。柱を大文字にするには、デザインのテキスト自身のtextTransformを使います。
wordBreak'normal' | 'keep-all'cjk.wordBreak段落のCJKの行が、文字の間のどこで改行できるかです(cjk.wordBreakを参照)。通常の文章の本の中で引用する、分かち書きのかなの入門書には'keep-all'を、その逆には'normal'を使います。postext 1.16から使えます。
lineNumbersboolean未設定行番号で段落の行を数えるかどうかです。未設定:lineNumbers.countが'all'のときと、詩の行を数えるときにこのスタイルで組んだ詩で数えます。true:'verse'でも数え、囲みの中でも数えます(囲みのテキストは、そうでなければ決して数えません)。false:決して数えません。postext 1.23から使えます。
tabStopsTabStop[]bodyText.tabStopsスタイルの段落のタブ位置で(タブ位置を参照)、スタイルのindentから測ります。段落のテキスト中のタブ文字は、スタイル自身または本文にタブ位置か間隔があればタブになります。未設定なら本文のものを使い、空のリストはタブ位置を1つも設定しません。postext 1.23から使えます。
tabIntervalDimensionbodyText.tabIntervaltabStopsの最後のタブ位置より先の既定のタブ位置です。未設定なら本文のものを使います。postext 1.23から使えます。
dropCapParagraphDropCapなしこのスタイルの各:::paragraphsグループの最初の段落を、each: trueならすべての段落を始めるドロップキャップです(ドロップキャップを参照)。グループのフェンスに{dropcap=false}と書くと解除し、{dropcap=2}と書くと行数を指定します。postext 1.23から使えます。

戯曲では、ト書きをイタリックで、配役表をスモールキャピタルで組みます。

paragraphStyles: [
  { id: 'direction', italic: true, fontSize: { value: 9, unit: 'pt' } },
  { id: 'cast', smallCaps: true, textAlign: 'center', fontWeight: 600 },
],
:::paragraphs{style="direction"}
Elsinore. A platform before the castle. *Francisco* at his post.
:::

ト書きはイタリックで、その中の名前は正体で印字されます。スタイルのウェイト、italic、smallCapsは囲みの中でも適用されます。

詩集では、一部の行を字下げし、行長に収まらない長い行の折り返しを、行そのものより深くぶら下げます。indentは段落のすべての行を内側に寄せ、ぶら下げインデントはそこから数えます。

paragraphStyles: [
  { id: 'verse', textAlign: 'left', firstLineIndent: { value: 0, unit: 'em' }, hangingIndent: { value: 4, unit: 'em' } },
  { id: 'verse-indented', textAlign: 'left', indent: { value: 1.5, unit: 'em' }, hangingIndent: { value: 2.5, unit: 'em' } },
],

verse-indentedの行は1.5 emから始まり、折り返しは4 emから始まるため、verseの行の折り返しとそろいます。indentがなければ、スタイルは1行目を字下げするか、ほかの行をぶら下げるかのどちらかしかできません。hangingIndentを設定するとfirstLineIndentは無視されます。

メニューでは、各料理の値段を点のリーダーの後に置き、行長の終わりにそろえます。

paragraphStyles: [
  {
    id: 'menu',
    textAlign: 'left',
    firstLineIndent: { value: 0, unit: 'em' },
    tabStops: [{ position: 'end', align: 'end', leader: '. ' }],
  },
],
:::paragraphs{style="menu"}
オニオンスープ :tab 850
 
真鯛のグリル、フェンネルとレモン添え :tab 2,100
:::

どの行の点も、値段の二分手前で終わります(leaderGap)。行に収まらない長い料理名は折り返し、その最終行がリーダーと値段を保ちます。値段が最後の語の隣に収まらないときは、その語も一緒に次の行へ送られます。

#:::paragraphsコンテナー

:::paragraphs{style="<id>"}の行でコンテナーを開き、:::だけの行で閉じます。間にあるすべての段落は名前付きのスタイルを取り、中にある見出し、リスト、その他のブロックは通常のスタイルを保ちます。コンテナーはほかのフェンス付きコンテナーの中に入れ子にできます。不明なstyleのidはエラーにならず、段落は通常の本文として描画されます。

フェンスは、スタイルの有無にかかわらずalign(start、end、left、right、center、justify)、indent、endIndent(単位のない数値はem)も取ります。スタイルがあればそれを上書きし、なければ外側のコンテナーのスタイル、またはフェンスのある場所のテキストのスタイル(本文、部、スタイル付きの節、ボックス)の上に適用されます。:::paragraphs{align=end}はブロックを行末にそろえて組み(地付き)、:::paragraphs{align=end endIndent=1}はそこから1字上げて組みます。postext 1.16から使えます。

コンテナーの中では流れがベースライングリッドから外れます(7ptで行送り1.2emの項目は、8pt/1.5emのグリッドには乗りません)。最後の段落で流れはグリッドに戻ります(グリッドが優先され、下のアキは最小値になります。見出しと同じ規則です)。項目は本文の段落と同じく段やページをまたいで分割され、オーファンとウィドウの保護も同じです。コンテナーの直前の見出しは、その最初の段落と離れないように保たれます。

コンテナーの下のアキは、スタイルのspaceBetweenとmarginBottom、そして周囲のテキストの段落間のアキ(bodyText.paragraphSpacingがオンなら1行)のうち最も大きいものになり、2つの本文の段落の間のアキと同じく、次のブロックが自身の上に取るアキと統合されます。参考文献の後の見出しは、最後の項目から自身のmarginTopだけ下に置かれ(スタイルのアキのほうが大きければそちら)、詰めた項目のまとまりの後の段落は、テキストの段落間のアキを保ちます。流れはまずテキストの下でグリッドに戻り、グリッドに戻すことで埋まらなかった分はグリッドの行単位で持ち越されるため、コンテナーの後のテキストはグリッドに乗ります。postext 1.4までは、スタイルのアキはグリッドに戻る前に最後の行の下に置かれ、その下に次のブロックの上のアキが加えられ、段落間のアキは含まれませんでした。bodyText.paragraphContainerSpacing: 'add'はこの規則を保ち、この設定より前に保存された設定はこの規則で読み込まれます。snapToGrid: falseのスタイルはグリッドに戻りません。コンテナーの後のテキストはその正確なアキだけ下に置かれ、次にグリッドに合わせるブロックまでグリッドから外れます。リストで終わるコンテナーは、どちらの規則でも1.4と同じに組まれます。リストは自身の下のアキを保ち、marginBottomはそのアキの後に続いて、次のブロックのアキと統合されます。

:::calloutの中でも、コンテナーはスタイルのマージンを同じように取ります。marginTopとmarginBottomは前後のブロックのアキと相殺され(負の値は前後を近づけます)、ボックスの先頭にあるコンテナーは、段の頭と同じく上のマージンを取りません。ボックスには戻る先のベースライングリッドがないため、最後の段落の下のアキは、marginBottom、spaceBetween、ボックス自身の段落間のアキ(そのbody.paragraphSpacing、つまりボックスのテキスト1行分。paragraphContainerSpacing: 'add'では含まれません)のうち最も大きいもの、または次のブロック自身の上のマージンのほうがさらに大きければそれになります。負のmarginBottomは、代わりに次のブロックを引き上げます(postext 1.4までは、囲みの中のコンテナーはどちらのマージンも無視していました)。

const resolved = resolveParagraphStylesConfig(config.paragraphStyles, resolvedBodyText);
// => every unset field filled from the resolved body text
 
const minimal  = stripParagraphStylesDefaults(config.paragraphStyles);
// => undefined when the list is empty; zero margins and `name === id` dropped

#チップスタイル

chipStylesプロパティは、インラインの:chip[text]{style="…"}の名前付きスタイルを宣言します。単語リストや、キーボードのキー、タグに使う、角を丸めた色付きのボックスです(構文と改行の規則は文書形式のリファレンスにあります)。既定ではchipというスタイルが1つ用意されています(淡い青の塗りに、メインカラーのヘアラインの枠、わずかな角丸、テキストは周囲の語と同じ)。そのため:chip[…]は設定なしで使えます。chipStylesを宣言すると、この既定のリストが置き換えられます。styleのないチップや、どのスタイルも宣言していないidを持つチップは、最初のスタイルになります。

const config: PostextConfig = {
  chipStyles: [
    { id: 'chip', name: 'Word bank' },
    {
      id: 'key',
      name: 'Keyboard key',
      background: { hex: '#fff4d6', model: 'hex' },
      borderColor: { hex: '#8a6d1f', model: 'hex' },
      borderRadius: { value: 2, unit: 'pt' },
      bold: true,
    },
  ],
};
Classify: :chip[battery] :chip[cable] :chip[switch]
 
Press :chip[Ctrl]{style="key"} + :chip[C]{style="key"}.
プロパティ型既定値説明
idstring必須:chip[…]{style="…"}から参照する識別子。
namestringid人が読むための名前です(エディターのUIでのみ使います)。
backgroundEnabledbooleantrueボックスを塗ります。
backgroundColorValue#e8eef7ボックスの塗り(パレットに連動できます)。
borderColorColorValueパレットのメインカラー枠線の色。
borderWidthDimension0.5pt枠線の太さ。0では枠線を描きません。枠線はボックスの縁の内側に引かれます。
borderRadiusDimension0.3em角の半径。ボックスの高さの半分までに制限されます(大きな値にすると錠剤形になります)。
paddingXDimension0.3em枠線とテキストの間の左右の余白。チップの送り幅に含まれます。
paddingYDimension0.1emテキストの帯の上下の余白。行のボックスの外側に描かれ、行の高さは変わりません。
paddingTop、paddingBottomDimensionpaddingYテキストの帯の上または下の余白で、それぞれpaddingYの代わりに使われます。帯はベースラインの0.8 em上から0.25 em下までなので、その中央はベースラインの0.275 em上にあり、大文字の中央(たいていの書体で約0.35 em)より低くなります。そのため、丸いチップ(borderRadius: 1em)の中の大文字や数字は高く見えます。上の余白を下の余白より、その差の2倍だけ大きくすると中央にそろいます。大文字の高さが0.7 emの書体なら、paddingTop: 0.2emとpaddingBottom: 0.05emです。
fontFamilystring周囲のテキストチップのテキストのフォントファミリー。ウェイトは周囲のテキストに従います。
fontSizeDimension周囲のテキストチップのテキストのサイズ。emは周囲のテキストに対する値です。
colorColorValue周囲のテキストチップのテキストの色。未設定のときは、太字とイタリックの範囲は強調の色を保ちます。
boldbooleanfalseチップのテキストを、それ自身の書式に加えて太字にします。
italicbooleanfalseチップのテキストを、それ自身の書式に加えてイタリックにします。
gapDimension0.25em語間のスペースを挟んで隣り合う語やチップとボックスとの間に確保する最小の間隔です。それより狭いスペースはチップの送り幅の内側で補われるため、両端そろえで削られることはありません。行の端や、詰めて組む約物に接する側には何も加えません。

ボックスのemの長さ(paddingX、paddingY、borderRadius、borderWidth、gap)は、チップ自身のフォントサイズに対する値です。ボックスはベースラインの0.8 em上から0.25 em下までの帯で、paddingYと枠線の分だけ大きくなります。行のボックスの外側に描かれ、行送りを変えることはないため、ベースライングリッドは保たれます。ボックスが行送りより高くなると、チップが上下の行のチップに重なることがあります。異なる行の2つのチップが重なると、Sandboxは重なりをポイントで示したチップが隣の行に接触の警告を表示するため、paddingY、枠線、fontSizeを小さくして対処できます。上下にチップのない背の高いチップは報告されません。

VDTでは、チップはkind: 'chip'の行のセグメントで、そのchipフィールドがテキストのラン(それぞれフォント文字列と幅を持つ)、ボックスのジオメトリー(boxWidth、ascent、descent、paddingX、borderWidth、borderRadius、間隔のマージン)、色を持ちます。セグメントのtextは1文字のプレースホルダーなので、プレーンテキストのオフセットとソースマップではチップは1文字として数えられます。

const resolved = resolveChipStylesConfig(config.chipStyles);
// => the built-in `chip` style when unset; every field filled
 
const minimal  = stripChipStylesDefaults(config.chipStyles);
// => undefined for the built-in default; static defaults dropped
 
const style = pickChipStyle(resolved, 'key');
// => the `key` style, else the first one

#コードリスト

codeStyleプロパティは、コードリストの見た目を設定します。対象はテキストの```と~~~のフェンス(文書形式 › コードブロックを参照)と、コードの書体を求めるときのインラインコードです。コードリストは等幅の書体で、書いたとおり1行ずつ枠の中に組まれます。どの行もハイフネーションや両端そろえをせず、スペースはどれも幅を保ち、タブは次のタブ位置まで進みます。枠は:::calloutと同じ仕組みで作られるので、コードリストは行と行の間で分かれて段やページをまたぎ、各部分がそれぞれの枠に入ります。囲みの中のフェンスは、その中に入れ子になった枠です。どのプロパティも省略できます。postext 1.23以降。

const config: PostextConfig = {
  codeStyle: {
    fontFamily: 'JetBrains Mono',
    fontSize: { value: 0.8, unit: 'em' },
    background: { hex: '#0e1116', model: 'hex' },
    color: { hex: '#d3d9df', model: 'hex' },
    padding: { top: { value: 4, unit: 'mm' }, right: { value: 5, unit: 'mm' }, bottom: { value: 4, unit: 'mm' }, left: { value: 5, unit: 'mm' } },
    borderRadius: { value: 2, unit: 'pt' },
    lineNumbers: true,
    tokens: {
      keyword: { color: { hex: '#f2b134', model: 'hex' }, bold: true },
      string: { color: { hex: '#3ddc84', model: 'hex' } },
      comment: { color: { hex: '#8a939d', model: 'hex' }, italic: true },
    },
    inline: { background: { hex: '#eef1f4', model: 'hex' } },
  },
};
プロパティ型既定値説明
blocksbooleantrueフェンスをコードブロックとして読みます。falseにすると、postext 1.22と同じく、フェンスとその中の行をMarkdownとして読みます。1.23より前に保存された設定で、テキストにフェンスがあるものはこの値になります(postext 1.4以前で書き出したバンドルを参照)。
indentedCodebooleanfalse空行の後に4桁(4つのスペースかタブ)字下げした行の並びも、コードリストとして読みます。各行から4桁を取り除きます。既定はオフです。Postextのテキストはしばしばスペースで字下げし、入れ子のリスト項目も行頭のスペースを読むためです。
fontFamilystring'Source Code Pro'コードの書体です。等幅の書体なら桁がそろいます。中国語や日本語のコメントには、漢字を収めた書体(BIZ UDゴシック)を使います。全角文字は2桁分を占めます。
fontSizeDimension0.85ememは本文のサイズです。
fontWeight / boldFontWeightnumber400 / 700コードと、太字の字句のウェイトです。
lineHeightDimension本文のグリッドの行コードの行の行送りです。emはコードのサイズです。未設定なら、行はベースライングリッドに乗ります。
snapToGridbooleantrueコードリストの後のテキストはベースライングリッドに戻ります。falseにすると、囲みと同じく正確なmarginBottomを保ちます。
colorColorValue本文の色コードの色です。独自の色を持たない字句はこの色になります。
backgroundEnabled / backgroundboolean / ColorValuetrue / #f4f4f4枠の塗りです。
border{ enabled, color, width }オフ、#cccccc、0.5pt枠の枠線です。
borderRadiusDimension0角の丸みです。分割されたコードリストの各部分も、分割された囲みと同じく丸い角を保ちます。
padding{ top, right, bottom, left }それぞれ0.6ememはコードのサイズです。
marginTop / marginBottomDimension0.75em枠の上と下のアキです。
span'column' | 'page''column'ページ幅のコードリストは、span: 'page'の囲みと同じく、多段組のページのすべての段にまたがります。フェンスごとにspan=pageで指定できます。
tabSizenumber4タブは、この文字桁数の次の倍数まで進みます(全角文字は2桁と数えます)。タブはタブのまま残り、コピーしたテキストにも含まれます。
overflow'wrap' | 'shrink' | 'clip''wrap'枠より長い行の扱いです。'wrap':収まる最後の空白か約物の後で改行し(どちらもなければ2文字の間で改行し)、続きを次の行に、wrapIndent桁字下げしてwrapMarkerの後に組みます。分割されたコードリストの部分は、ほかの切れ目が収まるなら、こうした続きで始まることはありません。'shrink':最も長い行が収まるまでコードリスト全体をminFontScaleまで小さくし、それでも収まらない部分は折り返します。'clip':行は枠の内側の端で止まり、はみ出した文字は印刷されません。いずれもcodeOverflow警告を出します。
wrapIndentnumber2折り返した行の続きの字下げを、文字桁数で指定します。
wrapMarkerstring'»'その字下げの中に行番号の色で置く記号です。テキストの一部ではありません(コピーには含まれず、タグ付きPDFではアーティファクトとして描かれます)。''なら何も置きません。↪はたいていのコードの書体になく、空の四角として印字されます。
minFontScalenumber0.8'shrink'のとき、コードリストを組む最小のサイズをfontSizeに対する割合で指定します。
lineNumbersbooleanfalseすべてのコードリストの行に、コードの前の余白で番号を付けます。フェンスごとにlineNumbers、lineNumbers=false、start=Nで指定できます。折り返した行の続きには番号が付きません。番号はテキストの中ではなく横に組まれます。HTMLビューアーは番号を選択と支援技術から隠し、タグ付きPDFはアーティファクトとして描きます。
lineNumberColorColorValue#8a8a8a番号の色です(折り返しの記号もこの色になります)。
lineNumberGapDimension1em最も幅の広い番号とコードの間のアキです。emはコードのサイズです。
highlightBackgroundColorValue#fff4c2フェンスがhighlight="3,5-7"で指定した行の背後に、枠の幅いっぱいに敷く色です。
keepTogetherbooleanfalse囲みスタイルと同じです。falseなら、残りの高さより長いコードリストを行と行の間で分割します。trueなら丸ごと送り、1段より長いときだけ分割します。
splitMinLinesnumber2分割の前後それぞれに残す最小の行数です。1行だけの部分ができないようにします。
repeatTitlebooleanfalse各部分の先頭で、文書の言語の「(続き)」の接尾辞を付けてタイトルを繰り返します。
continuesMarkerEnabled / continuesMarkerboolean / stringfalse / 文書の言語の「続く」続きのある部分の最終行の下に置く目印です。
titleStyleCalloutTitleStyleConfigコードの書体、太字、そのサイズの0.9倍フェンスのtitleを印字するタイトル行です(フィールドは囲みスタイルを参照)。
labelCalloutLabelConfigなし設定すると、タイトルは代わりに枠の上辺のラベルタブに印字されます(ラベルが独自に指定しない限り、コードの書体とサイズで組みます)。
highlight'builtin' | 'none''builtin'組み込みの字句解析器(と登録したハイライタ)で字句に色を付けます。'none'なら、どのコードリストもcolorで組みます。
tokensPartial<Record<CodeTokenKind, { color?, bold?, italic? }>>落ち着いた配色字句の種類ごとの見た目で、種類ごとに既定値に重ねます(後述)。パレットに結びつけた色は、colorPaletteと部のパレットに従います。
inlineInlineCodeStyleConfig未設定インラインコードをコードの書体で組みます(後述)。未設定なら、1.23より前と同じく、インラインコードは本文の書体で組みます。

#構文の色分け

エンジンに組み込まれた小さな字句解析器が、jsとts(javascript、jsx、typescript、tsx)、json、python、bash(sh、zsh、shell)、console(シェルのセッション)、css、htmlとxml(svg)、markdown、sqlの字句を見分けます。そのほかの言語のコードリストと、言語のないコードリストはcolorで組まれます。字句解析器はコードリスト全体を読むので、複数の行にわたるコメントや文字列も1つの字句のままです。consoleのコードリストでは、プロンプト($ 、% 、# 、> 、>>> 、PS …> )で始まる行はユーザーが入力したもの(prompt)で、それ以外の行はプログラムが出力したもの(output)です。

種類既定値対象
keyword#8b2c8f予約語:const、def、if、SELECT、HTMLのタグ名、CSSのアットルール。
string#3d7a2a文字列、テンプレートリテラル、属性値。
number#985f00数値と定数(true、None、null)、色、文字参照。
comment#7a7f87、イタリックコメント。
function#2b5fb4括弧が後に続く名前、シェルの組み込みコマンド。
type#99540a型と大文字で始まるクラス名、CSSのセレクター。
operatorコードの色演算子、シェルのパイプとリダイレクト。
punctuationコードの色括弧、区切り記号。
variable#b23b2eシェルの変数、JSONのキー、CSSのプロパティ、HTMLの属性、self。
meta#985f00デコレーター、コマンドラインのオプション(-l、--all)、doctype。
promptコードの色、太字シェルのセッションで入力した行。
output#5c6168プログラムが出力したもの。

ホストはregisterCodeHighlighterで独自のハイライタ(Shiki、Prism、highlight.js)を組み込めます。設定はシリアライズできるデータなので、関数はcodeStyleに書かず、エンジンに登録します。

import { registerCodeHighlighter } from 'postext';
 
// fn(code, lang) returns the listing's lines, each as runs whose texts join into the line.
registerCodeHighlighter('rust', (code) => code.split('\n').map((line) => [
  { text: line, token: line.trimStart().startsWith('//') ? 'comment' : undefined },
]));
registerCodeHighlighter('*', null); // remove the one registered for every language

ある言語に登録したハイライタは'*'に登録したものより優先され、'*'に登録したものは組み込みの字句解析器より優先されます。ランはtokenの種類(tokensで色が付きます)か、独自のcolor(CSSの16進数)を指定します。undefinedを返すハイライタ、例外を投げるハイライタ、つなげてもコードリスト自身の行にならない行を返すハイライタは使われません。レイアウトはコードリストを組むときに登録簿を読みます。ビルドの前に登録し、Web Workerの中で組むとき(Sandboxはそうしています)はWorkerの中で登録してください。

#インラインコード

codeStyle.inlineは、バッククォートで囲んだテキストをコードの書体で組みます。チップと同じく1つのまとまりとして組み、行がその途中で分かれることはありません。未設定なら、インラインコードは本文の書体のままです。

プロパティ型既定値説明
fontFamilystringcodeStyle.fontFamily書体です。
fontSizeDimension0.9ememは周囲のテキストのサイズです。
colorColorValue周囲のテキストの色
bold / italicbooleanfalseテキスト自身の書式に重ねます(太字の中のコードは太字になります)。
backgroundColorValueなし範囲の背後に敷く塗りです。
borderColor / borderWidthColorValue / Dimensionなし / 0.5pt枠線です。
borderRadiusDimension0.2ememは範囲のサイズです。
paddingX / paddingYDimension塗りか枠線があれば0.2em、なければ0 / 0.1em塗りの内側のアキです。上下のアキは行のボックスの外側に描かれます。

#コードリストの組み方

  • 元の1行を1行に:行は段落の改行処理ではなく、コードの書体自身の送り幅から組み立てます。スペースは幅を保ち、連続したスペースもそのまま残り、行頭のスペースは字下げになります。右から左の本のコードリストは左から右に読み、左から右の引用と同じく行を枠の終端の側から組み、番号は行の左の余白に置きます。縦組みの本では、コードリストは縦の流れに従い(ラテン文字は縦組みのテキストと同じく横倒しになります)、行番号は付きません。
  • 分割:残りの高さより長いコードリストは、行と行の間で分かれて段やページをまたぎ、各部分がそれぞれの枠に収まります。どちらの側にもsplitMinLines行未満を残すことはありません。折り返した行の続きは、ほかの切れ目が収まるなら元の行と離れません。
  • 出力:キャンバス、HTMLビューアー、PDFは、組んだとおりに行と枠を描きます。HTMLビューアーはスペースを保つ(white-space: pre)ので、選択するとコードリストが字下げごと、元の各行の後に改行を入れてコピーされ、番号と折り返しの記号は含まれません。タグ付きPDFは各コードリストをCode要素を含む段落とし、本物のスペースのグリフを置き、番号と折り返しの記号はアーティファクトにします。リフロー型のEPUBは、字句の色を付けた<pre><code class="language-…">と、codeStyleから作ったスタイルシートを書き出します。固定レイアウトのEPUBは印刷版のとおりです。
  • フォント:SandboxとconfigFontFamiliesは、テキストにフェンスがあるとき(または設定にcodeStyleの項目があるとき)、コードの書体をレギュラーとボールド、正体とイタリックで読み込みます。PDFは行が使う書体を埋め込みます。

#囲みスタイル

calloutStylesプロパティは、文書が:::callout{type="…"}コンテナーで適用する名前付きの囲みスタイルを宣言します。注記、ヒント、警告、学習目標など、色付きの背景や枠線で本文から切り離して組む内容に使います。既定では中立的なスタイルnoteが1つ用意されています(薄いグレーの背景、枠線・帯・アイコン・タイトルなし)。そのため:::calloutは何も設定しなくても使えます。calloutStylesを宣言すると、この既定のリストは置き換えられます。

const config: PostextConfig = {
  calloutStyles: [
    { id: 'note', name: 'Note' },
    {
      id: 'objectives',
      name: 'Learning objectives',
      title: 'Objectives',
      stripe: { enabled: true, side: 'left' },
      icon: { kind: 'glyph', glyph: '✓' },
      titleStyle: { textTransform: 'uppercase' },
      lists: { bulletChar: '–' },
    },
    {
      id: 'warning',
      title: 'Warning',
      backgroundEnabled: false,
      border: { enabled: true, color: { hex: '#AA0000', model: 'hex' }, width: { value: 1, unit: 'pt' } },
      borderRadius: { value: 1, unit: 'mm' },
      titleStyle: { color: { hex: '#AA0000', model: 'hex' } },
    },
  ],
};
:::callout{type="objectives"}
- Describe the parts of the lantern.
- Trim the wick at dusk.
:::
 
:::callout{type="warning" title="Do not touch the lens"}
The glass stays hot for an hour after the flame is out.
:::
プロパティ型既定値説明
idstring—:::callout{type="…"}で選ぶ識別子です。typeが未知または欠けているフェンスには、設定した最初のスタイルが適用されます(未知のtypeはSandboxが警告します)。
namestringid人が読むための名前です(エディターのUIでのみ使います)。
titlestring''既定のタイトルの文字列です。空ならタイトルはありません。フェンスのtitle属性で個別に上書きできます。
span'column' | 'page' | 'side''column'横方向の広がりです。段、版面の全幅、または1段半レイアウトのフロート専用のサイド段(layout.sideColumnRole: 'floats')のいずれかです。サイド段のとき、囲みは流れから外れ、割り込んだ位置のテキストの横にあるその段に積まれます。span属性で個別に上書きできます。段組みのレイアウトでは'page'の囲みはページ幅のブロック(span block)になります。ページを段の帯に分け、全幅の独自の段に収まります(後述のコンテナーの節を参照)。そのページのサイド段に収まらないサイド段の囲みは、次のページのサイド段に置かれます。その前に章(または文書)が終わると、待っている囲みはそれぞれ、フェンスの順に本文の後のページのサイド段に置かれ、ビルドがそれを知らせます(afterText。postext 1.24までは、そうした最初のページより後の囲みは失われていました)。
columnsnumber1フロートする囲み(placementが'auto'、'top'、'bottom'のいずれかで、span: 'column')がまたがる隣り合う段の数です。図のplacement.columnsと同じ働きで、新聞の5段のうち3段にまたがる記事の囲みなどに使います。ページの段数以上を指定すると、ページ幅の囲みになります。流れの中に組む囲み('here')は自分の段に収まります。インスタンスごとにcolumns属性で上書きできます。postext 1.18以降。
placement'here' | 'auto' | 'top' | 'bottom' | 'fixed''here'囲みを置く場所です。'here'は流れの中にそのまま組みます。'top'/'bottom'はリソースと同じようにフロートとして配置します('auto'はページの上と下のうち先に空いた帯を使います)。囲みは現れた位置で流れから外れ、その位置以降で最初に空いている帯(現在のページの下、または流れが次に開くページの上か下)に入り、後に続くテキストがその周りのページを埋めます。'fixed'は後述のfixedでページ座標に固定し、段の流れから外します。詳しくはコンテナーの節を参照してください。placement属性で個別に上書きできます。
sideAtColumnEnd'before' | 'after''before'フェンスの後のテキストが同じ段で続かないときに、サイドの囲み(span: 'side')を置く位置です。続かないのは、段にそのテキストの入る余地がないときや、改段・改ページの規則がテキストを先へ送るとき(ウィドウとオーファンの規則で段落ごと送られる場合、見出しが本文と一緒に送られる場合)です。'before'は囲みをフェンスの位置、つまりそのページで前のテキストの横に置きます。フェンスの下に収まらないときは段の下端からせり上げます。説明する箇所の後に書いた注釈に向いています。'after'はフェンスの後のテキストの最初の行と高さをそろえ、そのテキストが続くページのサイド段に置きます。行の前に書いた行番号や欄外見出しに向いています。テキストが同じ段で続くときは、どちらもフェンスの位置に置きます。章の中で後に何も続かない囲みは、どちらの場合も前のテキストとともに残り、続けて書いたサイドの囲みは順序を保ちます。postext 1.4まではすべてのサイドの囲みが'before'として動作しており、これが既定のままです。注釈用のスタイルでは、囲みは説明する箇所のページにとどまります。
fixed'fixed'の囲みの位置です。ElementAnchor(to:'container'=版面、偶数ページでは左右反転、'page'=仕上がり枠、'bleed'=裁ち落とし枠。edge:コンテナーの9つの基準位置のいずれか)と、省略できるoffset(x/yの寸法)で指定します。
floatBarrierbooleanfalse囲みをフロートの区切りにします。囲みより前で参照された図や表は、すべて囲みより前に配置されます(ページの空き位置、なければ囲みより先に開くページ)。こうして、章を締めくくる囲み(典型的には「要点」のまとめ)を越えてフロートが流れ出ることはありません。章扉、:::part、文書の末尾は常に区切りになります。
段組みのページにあるspan: 'page'の囲みは、直前のテキストの下で帯を切ります。囲みより前で参照された全幅の図は、先にその切れ目を使います。テキストの段の高さをそろえ、テキストが終わった位置に図を置き、囲みはその下に続きます(収まらなくなったときは次のページへ送ります)。高さをそろえたテキストの後に収まらないほど高い図は次のページの先頭に置き、囲みはその後に続きます。図が抜けた帯も高さをそろえて終わります。分割できる囲み(keepTogether: false)は、テキストと図の下で、入るだけの項目を収めて始まり、残りは次のページに続きます。
width'fill' | 'auto''fill''fill'は使える幅いっぱいに広がります。'auto'はタイトルに合わせて縮み(バッジ用)、子要素は無視します。
backgroundEnabled / backgroundboolean / ColorValuetrue / #f4f4f4囲みの塗りです。
border{ enabled, color, width }false, #cccccc, 0.5pt囲みの枠線です。ボックス要素の枠線と同じく、囲みの縁の内側に引きます(ボックス要素を参照)。
borderRadiusDimension0背景と枠線の角の半径です(囲みの幅と高さの半分までに制限されます)。帯もこれに従います。角の丸い囲みでは、CSSがborder-leftをborder-radiusで切り抜くのと同じように、帯を丸い枠で切り抜きます。labelのタブは角を四角いまま保ちます。
padding{ top, right, bottom, left }各0.75em囲みの縁と内容の間の内側余白です。emの値は囲みの本文のサイズが基準です。
stripe{ enabled, side, width, color }false、'left'、1.5em、メインカラー1辺に沿った塗りの帯です。'left'/'right'の帯は内容の幅を狭め、'top'の帯は内容を下へ押し下げます。'left'と'right'は本文の流れから見た側です(右から左の本では'left'は紙面の右になります)。'start'と'end'は囲み自身の方向に従うので、アラビア語の本の中の:::callout{dir=ltr}では'start'の帯は左に付きます。borderRadiusのある囲みでは、帯の外側の角は枠と同じく丸くなります(postext 1.4までは四角いままで、丸みからはみ出していました)。
icon{ kind, glyph, resourceId, fontFamily, fontWeight, size, width, color, align, position, cornerSide }'none'、見出しのフォント、400、1.5em、メインカラー、'top'、'inline'、'right'内容の横に置く、文字のグリフ(kind: 'glyph')またはビットマップやSVGのリソース(kind: 'resource'+resourceId)です。側辺に帯があるときアイコンは帯の上の中央に置き、帯がなければ専用の列(size+titleStyle.gap)を確保します。align: 'center'は内容に対して縦方向の中央に置きます。リソースの画像は縦横比を保って正方形の中に収めます。widthを設定するとwidth×sizeの枠の中に収めます(横長のアイコンの列など)。内容より高いアイコンは、囲みをその高さまで広げます(align: 'center'のときは内容をアイコンの中央にそろえます)。position: 'corner'はアイコンをバッジとして上の角に掛け、半分を枠の外に出し、内容の場所は取りません。横長のアイコン(width)は描画される幅を基準に角の中央に置き、左の角ではタイトルをアイコンの内側の半分より先から始めます(postext 1.4までは高さを基準に置いていたため、横長の列が囲みからはみ出してタイトルに重なっていました)。cornerSideは角を選びます。'right'/'left'、または左右対称の余白のページの奇偶に従う'outer'/'inner'です(outerは奇数ページでは右、偶数ページでは左)。
marker{ kind, glyph, resourceId, fontFamily, fontWeight, size, color, align, gap, rule }'none'、見出しのフォント、400、1.5em、メインカラー、'center'、0.5em、罫線なし(0.5pt、メインカラー、長さ0)囲みの外、左側の列に描く2つ目のアイコンです。囲みとの間に縦のruleを引くこともできます。自己評価のバッジの横に置く「ここをタップ」の手のマークなどに使います。全体の枠は[marker][rule][gap][box]となり、高さは3つのうち最も高いものに合わせます。alignはそれらを互いの中央にそろえるか、上端にそろえます。rule.lengthは最小値で、罫線は常に少なくとも囲みの高さ分の長さになります。
titleStyle{ fontFamily, fontSize, fontWeight, italic, color, textTransform, gap, letterSpacing, indent, lineHeight }見出しのフォント、本文のサイズ、700、false、メインカラー、'none'、0.5em、0、0、1.2emタイトルの文字組みです。gapはタイトルと最初の子要素の間のアキです(アイコンの列とのアキにもなります)。lineHeightはタイトルの行送りで、emはタイトル自身のサイズが基準です。本文と同じく、ベースラインは各行の上から行送りの0.8の位置に来ます。そのため本文の行送りに合わせたタイトル(12 ptのグリッドでlineHeight: 12pt)なら、囲みの高さは行の整数倍のままで、タイトルもグリッドに乗ります。既定の1.2 emでは、囲みごとに1行の端数が加わります。textTransform: 'uppercase'は文字数を変えません。letterSpacingはタイトルにトラッキングをかけます(canvasのletterSpacing、PDFのTc)。indentはタイトルを囲みの内側の縁から右へ押し出します。タイトル側(左の角)に掛かる角のバッジは、先に自分の場所(バッジの内側の半分+gap)を確保するので、どのページに来てもタイトルはバッジにかかりません。indentはそれに上乗せされるだけです。
body{ fontFamily, fontSize, lineHeight, color, boldColor, italicColor, fontWeight, boldFontWeight, italic, smallCaps, textAlign, hyphenation, paragraphSpacing, firstLineIndent, tabStops, tabInterval }bodyTextを継承。italic/smallCapsはfalse囲みの中の段落とリスト項目の文字組みです。未設定のフィールドはすべて本文テキストを継承します。italicColorはイタリックの部分の色を設定します(囲みの色でイタリックにした引用文など)。fontWeight/boldFontWeightは通常と太字の部分のウェイトを設定します。italicは囲み全体をイタリックにし、…の部分は立体に戻ります。smallCapsは囲み全体をスモールキャピタルにします。tabStopsとtabIntervalは囲みの中で本文のものを置き換えます(タブ位置を参照)。囲みのテキストがほかに何を引き継ぐかは囲みの中の文字組みを参照してください。
lists{ bulletChar, color, indent, gap, itemSpacing, bulletFontSize, bulletFontWeight }unorderedListsを継承囲みの中のリストの文字組みです(color、indent、gap、itemSpacingは番号付きリストにも適用されます)。bulletFontSize/bulletFontWeightは、行頭記号のグリフを囲みの本文の書体でそのサイズとウェイトにします(太い色付きの行頭記号など)。
label{ fontFamily, fontSize, fontWeight, color, background, position, height, paddingX, offset, inset, icon, rule }未設定(タブなし)囲みの上辺に付け、フェンスのlabel属性を印字するタブです。番号付きの囲みの番号(「BOX 1-1」)に使います。positionの角('top-right'/'top-left')に寄せてinsetだけ内側に置き、囲みの上端からoffsetだけ突き出します(この分はブロックの一部としてmarginTopに上乗せされるので、段の先頭でもタブの場所が確保されます)。高さはheightで、テキストの左右にpaddingXを取ります。横にiconリソース({ resourceId, width, gap }、角と反対側)を付けることも、上辺に沿って反対側の角からタブまでrule({ enabled, color, width })を引くこともできます。既定値は見出しのフォント、本文のサイズ、700、メインカラーの地に白、高さ1.4em、内側余白0.6emです。タブは枠の上に立つ独立した形なので、囲みのborderRadiusにかかわらず角は四角いままです。
columnGapDimension1.5em囲みの中の:::columnsグループの段間です(後述のコンテナーの節を参照)。
marginTop / marginBottomDimension0.75em / 0.75em囲みの上のアキ(前のブロックのマージンと相殺されます)と、下の最小のアキ(snapToGrid: falseのときは正確なアキ)です。フロートとして配置した囲み(placement: 'top'、'bottom'、'auto')は、帯とテキストの間にフロートのアキ(本文1行分)を保ちます。それより広いmarginBottomは上の帯にある囲みの下のアキを、それより広いmarginTopは下の帯にある囲みの上のアキを決め、帯とともにグリッドに切り上げられます。postext 1.4までは、フロートとして配置した囲みはマージンを無視していました。
snapToGridbooleantruetrueのとき、囲みの後の流れはベースライングリッドに戻るので、下のアキはmarginBottomをグリッドの行単位に切り上げた値になります。falseのとき、囲みは正確なmarginBottomを保ち、それが次のブロックの上マージンと相殺されます。このスタイルの囲みが2つ続けば、間隔はちょうどmax(marginBottom, marginTop)です。囲みの後のテキストは、次にグリッドに戻る位置(見出し、リストの終わり)までグリッドから外れることがあり、headings.snapToGrid: falseの見出しの後と同じ動作になります。囲みを積み重ねて作る文書(ワークシート、書式)向けです。これが効くのは流れの中の囲みです。段組みのレイアウトのページ全幅の囲み、フロートとして配置した囲み、固定の囲み、サイドの囲みはグリッドを保ちます。段の帯とフロートの領域はグリッドに沿って組まれるためです。段末そろえの手段は変わりません。段を締めくくる囲みは、引き続き段の最後のグリッド位置まで押し下げられます。
keepTogetherbooleantruetrueのとき、囲みは分割しません。残りの場所に収まらない囲みは、まるごと次の段かページに送ります。分割せずに保てないのは、何も入っていない1段分(span: 'page'の囲みでは1ページ分)より高い囲みだけです。そうした囲みは、はみ出す代わりに後述のfalseの規則で分割し、現れた位置から始めます。1段に収まる続きは、そこからまるごと送ります。それほど高いフロートの囲み(placement: 'top' | 'bottom' | 'auto')はフロートにならず、現れた位置で流れの中にとどまります。falseのとき、どの囲みも子ブロックの間、または段落やリスト項目の行の間で分割できます。収まる最も深い切れ目で現在の段(span: 'page'の囲みではページ。段の下端にそろえます)を閉じ、残りは次の段の先頭で独立した囲みとして続きます。枠と帯は同じで、アイコンはなく、repeatTitleで繰り返さない限りタイトルもありません。それでも高すぎれば、さらに分割します。インラインのアイコンが先頭の部分で占める列は、どの断片でも空けたまま残すので、囲みはどのページでも同じ行長になります。リスト項目の中で切るときは、行頭記号を先頭の部分に残します。どの断片の枠もフェンスのcontentIndex/containerIdを共有し、callout.part/callout.continuedを記録します。章を締めくくる長い「要点」の囲みにはheadings.balancing.beforeSpanと組み合わせて、また囲みが図をページから押し出してはならない注記のスタイルに使います。入れ子の囲み(別の囲みの中の:::callout)は親の子要素の1つとして扱います。切れ目はその前後に入り、入れ子の囲みの中で切るのは、そのスタイルが分割を許すとき(keepTogether: false、または1段より高いとき)だけで、そのスタイル自身のsplitMinLinesに従います。
splitMinLinesnumber2分割された囲み(keepTogether: false、または1段より高い分割しない囲み)の断片が、切れ目の前後それぞれに残すテキストの最小行数です。対象はテキストだけです。図、表、別行立ての数式、入れ子の囲みを1つ以上含む側は、行数にかかわらず認められるので、図版の囲みは1点だけをページに残すことがあります。段落やリスト項目の中で切るときも、前後それぞれのすべての行を数えます(そこにある図や数式は1行と数えます)。加えて、その段落や項目の行を前後それぞれに少なくともlayout.boxChildSplitMinLines行残します(既定は2行。この最小値のほうが小さければその値なので、1にすれば1行を許します)。既定値では、2行や3行の項目は分割されず、4行の項目は2行ずつにだけ分割されます。既定値では、段の下端や次の段の先頭にテキストが1行だけ残るような分割はしません。最小値を満たす切れ目がないときは、囲みをまるごと送ります。(postext 1.5より前は、段落の中で切るときに側全体の行数しか確かめなかったため、囲みのほかの行で最小値に達すれば、2行の項目が1行ずつに分割されることがありました。)
repeatTitlebooleanfalse分割された囲みの続きの先頭ごとに、タイトルの後にcontinuedSuffixを付けて繰り返します(「Key points (cont.)」)。繰り返したタイトルにはタイトルのスタイルが適用されます。タイトルのない囲みは何も繰り返しません。分割された囲みの目印を参照してください。
continuedSuffixstring'(cont.)'繰り返したタイトルの後に付ける文字列です。分割された表と同じく文書の言語(locale、なければハイフネーションのロケール)に従い、表と同じ方法でタイトルにつなげます。
continuesMarkerEnabledbooleanfalse分割された囲みのうち、続きのある各部分の最終行の下、囲みの中にcontinuesMarkerを置きます。
continuesMarkerstring'Continued' / 'Continúa'そのマーカーの文字列です(脚本の「(MORE)」など)。囲みの本文の書体とサイズで組み、文書の言語ごとに既定値があります。
continuesMarkerAlign'left' | 'center' | 'right''right'囲みの内側の幅の中でマーカーを置く位置です。
continuesMarkerItalicbooleantrueマーカーをイタリックで組みます。
numbering{ label, counter, numberingTemplate, resetOn, counterFormat, placement, bold, italic, suffix }未設定このスタイルの囲みを、定理、補題、定義のような番号付きの命題として数えます。番号付きの定理と証明を参照してください。
endMarkstring''囲みの最終行の末尾に右端そろえで置く記号です。証明を'∎'や'□'で終えるときに使います。スペースを空けて収まれば最終行に、収まらなければ独立した行に置きます。番号のない別行立て数式で終わる囲みでは、その数式のタグとして置きます。数式が有効なときは、四角(∎ □ ■ ▪ ◻ ▫)をTeXのグリフで描くため、書体にその字形がなくても(Fontsourceのlatinファイルなど)印字されます。数式が無効なときは囲みの本文の書体で組まれます。

#:::calloutコンテナー

:::callout{type="<id>"}の行で囲みを開き、:::だけの行で閉じます。フェンスは5つの属性を受け付けます。type(スタイルのid)、title(スタイルのタイトルを上書き)、span、placement、columns(スタイルの値を上書き)です。間の内容は囲みの中に組まれます。省略できるタイトルの後に段落、リスト、引用、数式、リソースの埋め込みが続き、それぞれスタイルのbody/listsの文字組みで組まれます(見出しは通常のスタイルのままです)。子要素の間のマージンは本文と同じく相殺されます。囲みの内部はベースライングリッドから外れ、囲みの後で流れはグリッドに戻り、下に少なくともmarginBottomのアキを取ります(グリッドが優先され、マージンは最小値です。リソースと同じ約束です)。snapToGrid: falseのスタイルでは代わりに正確なmarginBottomを保ち、囲みの後のテキストは次の見出しかリストの終わりまでグリッドから外れます。囲みの直前の見出しは囲みと一緒に送られます。

このバージョンでの制約は次のとおりです。

  • 囲みは、スタイルでkeepTogether: falseを設定しない限り分割しません。段の残りの場所に収まらないときは、まるごと次の段かページに送ります。フロートの帯や帯の上限で短くなった空の段からも、1段分あれば収まる限り送ります。1段より高い囲みは、分割できる囲みと同じように分割します。どの切れ目でも分割できない囲み(段より高い図、表、:::columnsグループを含むもの、またはどの切れ目でもsplitMinLinesを満たせないもの)だけは、そのまま配置してはみ出させます。このときレイアウトはcalloutOverflow警告(VDTDocument.warnings)を記録し、Sandboxはそれを一覧に表示します。分割できる囲みは、収まる部分(子要素まるごと、または前後それぞれにsplitMinLines行まで残した段落の行。図、表、別行立ての数式は1つで1つの側として足ります)を残し、次の段かページでアイコンのない囲みとして続きます。スタイルで繰り返さない限りタイトルはなく、残した部分の下にマーカーを付けることもできます(分割された囲みの目印を参照)。
  • フロートは分割できない囲みに譲ります。図の参照の直後のブロックがkeepTogetherの囲みのとき、その囲みが現在の帯の中で入る段(フロートの前に囲みを収めていた参照元の段、またはその後の空の段)をなくしてしまう位置は使いません。図は次の候補の位置(たいていは次のページ)に移り、囲みは流れの中にとどまります。囲みをページから押し出して段に図だけを残すのではなく、組版者が組むとおりに組みます。
  • 段組みのレイアウトでspan: 'page'を指定すると、囲みはページ幅のブロックになります。版面の全幅で組まれ、ページを段の帯に分けます。囲みの上の段は切れ目の線で閉じ、囲みは全幅の独自の段に入り、その下で新しい段の帯が始まるので、流れはすべての段で囲みの下に続きます。段の高さがそろっている位置(ページの先頭、span: 'page'の章扉の見出しの直下、別のページ幅のブロックの直下、上のフロートの帯の直下)では、囲みはそこでそのまま切ります。段の高さがそろわないページの途中に来たときは、組版者が組むとおりに組みます。囲みの上のテキストをすべての段で同じ高さに切り(エンジンは帯の段を同じグリッド行数に縮めて配置をやり直すので、テキストは段から段へ自然にあふれ、オーファン、ウィドウ、次と分離しない規則もすべて適用されます)、囲みはページ全幅に広がり、その下で段が再開します。切るには配置を何回か余分にやり直します。切れ目の線で、囲みと、その下にウィドウの最小行数分の本文行を入れる余地がなくなるとき、または数回試しても収まる配置がないときは、囲みを次のページの先頭へ送ります。囲みの上のテキストは切れ目に従います。図の下で段が上に残す数行に入りきらない段落は次の段に送り(その図は段の中で単独になります)、それでもあるブロックが切れ目を越えるときは、そのブロックの終わる位置ではなく、切れ目を1行下げます。帯を開く分割された囲みもそこで切るので、残りが切れ目を越えることはありません。headings.balancing.beforeSpan(既定)のときは、囲みが抜けた帯は章の最後の帯と同じように後ろで高さをそろえて切ります。スタイルが分割を許す(keepTogether: false)ときは、高さをそろえた段の下に収まる囲みの部分がページを締めくくり、残りが次のページの先頭に来ます。beforeSpan: falseのときは、抜けたページは通常どおり段末をそろえるだけで、改ページは強制しません。ページ幅のブロックの直前の見出しは、囲みと一緒には送られません。1段のレイアウトでは、span: 'page'はただのインラインです。
  • placement: 'fixed'は囲みを流れから外します。囲みは組まれた後(width: 'auto'はタイトルに合わせて縮み、'fill'はアンカーの点の下にあるテキストの段の幅を取ります)、流れの中で現れたページの、fixed.anchor/fixed.offsetが示す位置に固定されます。既定は版面の左下の角です。囲みが覆うテキストの段は、フロートの帯とまったく同じようにその領域を明け渡します(下から削り、段がまだ空なら上から削ります)。その領域にすでにテキスト、フロート、ページ幅のブロックがあるときは、囲みを次のページへ送ります。章を締めくくる固定の囲み(次のブロックが章扉、:::part、フロートの区切りの囲み、または文書の末尾のもの)は、まず上の段の高さをそろえる(headings.balancing.trailing)ので、短い最終ページは下のバッジとそろって終わります。枠と子要素はpage.floatsに入り、どのバックエンドでも段のクリップの外に描画されます。
  • placement: 'top' | 'bottom'は囲みをリソースと同じようにフロートとして配置します。囲みは現れた位置で流れから外れ、その位置以降で最初に空いている帯(現在のページの下('bottom')、または流れが次に開くページの上か下)に、段の幅(span: 'column')または版面の全幅(span: 'page')で入ります。後に続くテキストが、囲みの抜けたページを埋めます。枠と子要素は、固定の囲みと同じくpage.floatsに入ります。新しいページの先頭に来るフロートの囲みは、そのページを待っている図より先に組まれます。前のページで引用され、その下に収まる図は、テキストが3行未満しか残らないときでも、そのページの残りを使います(図版のページ:囲みと図だけで、間にテキストはありません)。span: 'side'の囲みはフロートになりません。placementにかかわらず、テキストの横に積まれます。columnsが1より大きいとき(スタイルでもフェンスの属性でも指定でき、postext 1.18以降)、span: 'column'の囲みはその数の隣り合う段を使います。上端のそろった空の段の並びの頭か、現在の段とその後の空の段の足です。例::::callout{placement="top" columns="2"}。
  • width: 'auto'はタイトルにだけ合わせて縮み、子要素は無視します。
  • ほかの囲みの中に入れ子にした:::calloutは、独立した囲みです。自分のスタイル(背景、枠線、角の半径、内側余白、帯、タイトル、アイコン、マーカー、ラベル、文字組み)で、親の内側の全幅に組まれ、親の子要素の1つとして積まれます。marginTop/marginBottomは隣の要素と相殺されます。spanとplacement(フェンスまたはスタイル)は無視され、入れ子の囲みは常に親の中を流れます。floatBarrierとsnapToGridも無視されます。囲みは何重にでも入れ子にでき、:::columnsグループの中にも置けます(それぞれ1つの段にまるごと入ります)。親が分割されるとき、切れ目は入れ子の囲みの前後に入り、入れ子のスタイルが分割を許すときはその中にも入ります。どの断片も、切れ目が通る枠を描き直します。前の断片から続く入れ子の囲みは、トップレベルの続きと同じく、タイトルとアイコンを省きます。
  • 子要素の中の:::columns{count=N}…:::グループは、囲みの中で、その子要素を等幅のN段にcolumnGapの間隔で組みます。段の高さが最もそろうブロックや行の境界で切り(途中で切れた段落やリスト項目は、次の段の先頭で行頭記号なしに続きます)、どの段もグループの上端から始まり、グループの高さは最も高い段に合わせます。グループの後の子要素は全幅に戻ります。分割される囲み(keepTogether: false、または段より高い囲み)は、グループの中でも段と段の間で切ります。snake のグループは段を順に埋めて次の断片に続き、parallel のグループ(breaks)は流れごとに続きます(postext 1.25から。ドキュメント形式 › :::columnsを参照)。フェンスのgapはそのグループについてcolumnGapの代わりになり、ruleは各段間に罫線を引きます。要点を2段にまとめたり、幅の広い囲みで表を横に並べたりするのに使います。
  • フェンスの6つ目の属性labelは、スタイルのラベルタブに印字されます(前述のlabelを参照)。例::::callout{type="box" label="BOX 1-1" title="The octet rule"}。labelスタイルがなければこの属性は無視されます。

VDTでは、囲みはtype: 'callout'の枠ブロックになり、その装飾(背景、帯、アイコン、タイトル)はdesignOverlayに入ります。その後に、同じ段の中で子ブロックが続きます。枠とすべての子要素はフェンスのcontainerIdを持ちます。入れ子の囲みは、子要素の中の独立したtype: 'callout'の枠で、その後に自分のブロックが続きます。それらはトップレベルのフェンスのcontainerIdを保ち(配置と段末そろえからは1つの単位に見えます)、calloutPathを加えます。これは周りの入れ子のフェンスのコンテナーidを外側から順に並べたものです(入れ子の枠自身のidが最後の要素です)。タグ付きPDFは、入れ子の囲みごとに、親の囲みの中にDivを作ります。アイコンの画像はリソースの画像と同じ方法で解決されます。canvasの画像レジストリー、HTMLのresourceImageUrlオプション、PDFのresourceBytesプロバイダーです。

const resolved = resolveCalloutStylesConfig(config.calloutStyles, resolvedBodyText, resolvedHeadings, resolvedUnorderedLists, config.locale);
// => every inherited field filled from the resolved sections; the optional
//    locale picks the language of the continuation strings
 
const minimal  = stripCalloutStylesDefaults(config.calloutStyles);
// => undefined for the built-in `note` default; static defaults dropped

#番号付きの定理と証明

numberingを持つスタイルは、LaTeXのamsthmが定理環境を数えるように、その囲みを数えます(postext 1.19以降)。各囲みはラベルと番号を印字し(最初の段落の先頭に「定理2.」)、フェンスのtitleは番号の後に括弧に入れて続きます。:::callout{type="theorem" title="Bradley–Terry"}は「定理2(Bradley–Terry).」で始まります。識別子を付けて開いた囲み({#thm:main})は相互参照の対象になり、参照は「定理2」と印字し(:ref{id="thm:main"})、\ref{thm:main}やstyle=numberは2を印字します。

プロパティ型既定値説明
labelstring—番号の前に置く語です。'定理'、'Lemma'、'Definición'など。
counterstring | falseスタイルのid囲みが進めるカウンターです。同じカウンターを指定したスタイルは、\newtheorem{lemma}[theorem]と同じようにそれを共有します(定理1、補題2、定理3)。'equation'は、ラベルを付けた数式と一緒に数えます。falseは番号なしでラベルを印字します(証明の「証明.」)。
numberingTemplate / resetOn / counterFormatstring / ResourceCounterReset / ResourceCounterFormat'{n}' / 'never' / 'decimal'リソースの種類のものと同じです。'{h1}.{n}'とresetOn: 'h1'で章ごとに定理2.1、2.2…と、'{h1}.{h2}.{n}'と'h2'で節ごとに番号を付けます。複数のスタイルが共有するカウンターは、それぞれのテンプレートが何を印字するかにかかわらず数え続けます。
placement'runIn' | 'title''runIn''runIn'は囲みの最初の段落をラベルで始めます(リスト、数式、別の囲みで始まる囲みには、そのための段落を加えます)。'title'はラベルを囲みのタイトルにして、そのtitleStyleで組みます。「定理2(Bradley–Terry)」のようになります。
bold / italicbooleantrue / false段落頭のラベルとその後に付く文字の書体で、囲みの本文にかかわりません。本文がイタリック(body.italic)でも、立体のラベルは立体のままです。括弧内のタイトルは、通常のウェイトの立体で組みます。
suffixstring'.'段落頭のラベルとそのタイトルの後に置く文字です。

証明は、番号のないラベルと終わりの記号を持つスタイルです。

calloutStyles: [
  { id: 'theorem', numbering: { label: '定理' }, body: { italic: true } },
  { id: 'lemma', numbering: { label: '補題', counter: 'theorem' }, body: { italic: true } },
  { id: 'definition', numbering: { label: '定義' } },
  { id: 'proof', backgroundEnabled: false, endMark: '□',
    numbering: { label: '証明', counter: false, bold: false, italic: true } },
]

章ごとに組む本では、カウンターは前の章から続きます(LayoutContinuation.statementCounters。continuationAfterが埋めます)。本のアウトラインは番号付きの囲みのアンカーごとにそのラベルを与える(OutlineEntry.numberLabel)ので、別の章からの参照もそれを印字します。

#囲みの中の文字組み

囲みは内容を自分のbodyとlistsの文字組みで組みます。それ以外はすべて文書のスタイルのままです。

  • 段落は囲みのbodyに従います。書体、サイズ、行送り、色、強調の色、ウェイト、italic、smallCaps、行そろえ、ハイフネーション、字下げ、段落間隔です。未設定のフィールドはbodyTextを継承します。継承した強調の色はパレットとのリンクを保つので、囲みの中の太字、イタリック、:refのラベルは、囲みの外と同じくcolorPaletteに合わせて変わります。(postext 1.4までは、囲みの中の太字はメインカラーにかかわらず#295AA3のままでした。)
  • 箇条書きリストはunorderedListsより囲みのlists(行頭記号の文字、色、グリフのサイズとウェイト、字下げ、アキ、項目の間隔)を優先し、テキストは囲みの本文テキストになります。lists.bulletCharやlists.colorが文書の値(unorderedLists)と異なるときは、すべてのレベルの行頭記号や色を置き換えます。同じ値を繰り返すとき、または未設定のときは、各レベルの値(unorderedLists.levels)をそのまま残すので、入れ子のダッシュも囲みの中で保たれます。
  • 番号付きリストはlists.indent、gap、itemSpacingに従い、スタイルがlists.colorを設定していれば、文書の行頭記号の色と同じ値でもそれに従います。設定していないスタイルでは、番号はorderedLists.colorのままです。(postext 1.4までは、色がunorderedLists.colorと異なるときにしか番号に反映されなかったため、まさにその色に設定しても何も変わりませんでした。)番号そのもの(書体、サイズ、区切り)は全体のorderedListsから取ります。listsには行頭記号のフィールドしかないので、囲みの番号はそちらで設定してください。
  • 囲みの中の:::paragraphsコンテナーは、入れ子の囲みの中でも、その段落スタイルに従います。スタイルが設定しないフィールドは、囲みのbodyではなく文書のbodyTextを継承します(囲みのイタリックやスモールキャピタルも継承しません)。
  • :::columnsグループには独自のスタイルはありません。どの段も囲みの本文とリストの文字組みを共有し、columnGapが段間を決めます。
  • 引用は、囲みの本文の書体、サイズ、ウェイト(本文と同じくイタリックでグレー)と、スモールキャピタルに従います。見出しは見出しのスタイルのまま、別行立ての数式は数式の設定のままです。
  • 図と表は文書のキャプションと表のスタイルのまま、囲みの内側の幅で組まれます。通常と太字のウェイトは囲みのbodyのウェイトに従います。
  • チップはチップのスタイルのままです。emのサイズは囲みの本文のサイズを基準に読みます。
  • :::spaceの空きは囲みの本文の行で測ります(どこで省かれるかは:::spaceを参照)。
  • 入れ子の囲みは自分のスタイルにすべて従います。span、placement、floatBarrier、snapToGridは無視されます。

#分割された囲みの目印

囲みが段やページをまたいで分割されるとき(keepTogether: false、または段より高い囲み)、最初の部分の後の各部分はタイトルとアイコンなしで始まり、既定では囲みが続いていることを読者に示すものは何もありません。2つのオプションで、本や脚本で使う目印を加えられます。

  • repeatTitle: trueにすると、続きの先頭ごとにタイトルを繰り返し、その後にcontinuedSuffixを付けます。既定は「Key points (cont.)」の形です。繰り返したタイトルにはタイトルのスタイルが適用されるので、textTransform: 'uppercase'と組み合わせれば脚本の「HAMLET (CONT'D)」になります。アイコンとラベルタブは最初の部分にだけ付きます。
  • continuesMarkerEnabled: trueにすると、続きのある各部分の最終行の下、囲みの中にcontinuesMarker(「Continued」、スペイン語の文書では「Continúa」)を、囲みの本文の書体とサイズで置きます。continuesMarkerItalicがfalseでない限りイタリックで、continuesMarkerAlignが'left'か'center'でない限り右そろえです。マーカーは自分が締めくくる部分の中に場所を取り、切れ目はマーカーが収まるように選ばれます。
calloutStyles: [{
  id: 'speech',
  keepTogether: false,
  titleStyle: { textTransform: 'uppercase' },
  repeatTitle: true,
  continuedSuffix: "(CONT'D)",
  continuesMarkerEnabled: true,
  continuesMarker: '(MORE)',
  continuesMarkerAlign: 'center',
  continuesMarkerItalic: false,
}],
:::callout{type="speech" title="Hamlet"}
A speech long enough to run over the foot of the page…
:::

ページを締めくくる部分は「(MORE)」で終わり、次のページは「HAMLET (CONT'D)」で始まります。どちらもページ割りのための補助的な表示です。アクセシブルなPDFではアーティファクトになり、HTMLでは支援技術から隠されるので、タイトルは1度だけ読み上げられます。VDTでは、artifact: trueの付いたdesignOverlayのテキストブロックです。

#部

partsプロパティは、文書が:::part{number="…" title="…"}コンテナーで開く部扉のページを設定します。章のまとまりを束ねる「Part I — Foundations」のページです。部は常に独立したページを占めます。コンテナーは設定した奇偶の新しいページへ改ページし、そのページをparts.marginsで本文領域を決める1段のページに変え、部扉のデザインをページ全体に重ね、閉じるフェンスの後でもう一度改ページします。こうして次の章(自身のbreakBefore.parityを持ちます)はきれいに始まります。H1の既定の設定では、奇数ページの部扉、白の偶数ページ、次の奇数ページに章、という古典的な構成になります。

const config: PostextConfig = {
  parts: {
    breakBefore: { parity: 'odd' },
    breakAfter: { enabled: true, parity: 'any' },
    margins: { top: { value: 9, unit: 'cm' }, left: { value: 3, unit: 'cm' }, right: { value: 3, unit: 'cm' } },
    design: {
      elements: [
        {
          kind: 'text', id: 'number', content: 'Part {numberRoman}',
          fontSize: { value: 12, unit: 'pt' }, fontWeight: 600, align: 'left',
          placement: { anchor: { to: 'page', edge: 'top-left' }, offset: { x: { value: 3, unit: 'cm' }, y: { value: 5, unit: 'cm' } }, size: { width: 'auto', height: 'auto' } },
        },
        {
          kind: 'text', id: 'title', content: '{titleText}',
          fontSize: { value: 28, unit: 'pt' }, fontWeight: 700, align: 'left', overflow: 'wrap',
          placement: { anchor: { to: '#number', edge: 'below' }, size: { width: { value: 15, unit: 'cm' }, height: 'auto' } },
        },
      ],
    },
    bodyStyle: { fontSize: { value: 11, unit: 'pt' }, numberColor: { hex: '#AA0000', model: 'hex' } },
  },
};
:::part{number="I" title="Foundations"}
1. The lantern and its parts
2. Trimming the wick
3. Reading the weather
:::
 
# The lantern and its parts
プロパティ型既定値説明
pagebooleantrue:::partが部扉のページを開くかどうかです。falseではページを開かず、フェンスの本体も組みません。部の番号、タイトル、パレットは、それ自体の改ページなしに、次の内容から効力を持ちます。典型的な使い方はhtmlViewer.overrides.parts.page: falseで、部扉のない画面用の版にします。
breakBefore.parityHeadingBreakParity'odd'部が始まるページの奇偶です。値と白ページの帰属の規則は見出しのbreakBeforeと同じです。奇偶を合わせるために挿入した白ページは部に属し(そのはすでに新しい部を指します)、'always-*'の必須の区切りページは前の内容に属します。
breakAfter.enabledbooleantrue閉じるフェンスの後の内容を新しいページに送ります。falseのときは、部扉のページの1段の中で続きます。
breakAfter.parityHeadingBreakParity'any'その新しいページの奇偶です。'any'のままにして、白の偶数ページを入れるかどうかは次の章自身のbreakBefore.parityに決めさせます。改ページは次のブロックを配置するときに適用されるので、文書の最後にある部の後に空のページは残りません。
marginsPageMarginsページの余白部扉のページの本文領域で、フェンスの中のブロックが流れる1段です。各辺は、未設定ならページの余白を継承します。mirrorは、ページの余白とまったく同じように偶数ページでのどと小口を入れ替えます。
designDesignSlot空部扉のデザインです。コンテナーはページの仕上がり枠なので、コンテナーのアンカーと'page'のアンカーは一致し、トンボを表示しているときは'bleed'が裁ち落としまで届きます。装飾専用で、本文の場所を確保することはありません。本文と重ならないようにするにはmargins.topを大きくしてください。空のときは、本文領域の左上に既定ののテキストをH1の文字組みで生成し、番号とタイトルの間にH1のnumberSeparatorを入れます。
versoDesignDesignSlot空部扉のページの後に続く白の偶数ページ(部扉の丁の裏)のデザインです。コンテナーとプレースホルダーはdesignと同じです。何もない裏ページにするには空のままにします。部扉の次のページが白のまま残るときにだけ描画され、それには奇偶を指定した改ページが必要です。後述の部扉裏のデザインを参照してください。
bodyStyle.fontFamily, fontSize, lineHeight, color, textAlignbodyTextと同じbodyTextを継承フェンスの中の段落、引用、リスト項目の文字組みです。ウェイト、強調の色、ハイフネーションは本文テキストから取ります。
bodyStyle.bulletColorColorValueunorderedLists.color部の中の箇条書きリストの行頭記号の色です。
bodyStyle.numberColorColorValueorderedLists.color部の中の番号付きリストの番号の色です。番号は常に本文の太字のウェイトで組むので、章のリストは目次のように読めます。
bodyStyle.unorderedListsUnorderedListsConfig—部の中で、bulletColorの後に文書のunorderedListsに重ねて適用する部分的な上書きです。リスト全体の値は、それを継承していたレベルに伝わります。levelsの要素はそのレベルにだけ適用されます。
bodyStyle.orderedListsOrderedListsConfig—部の中で、numberColorと太字のウェイトの後に文書のorderedListsに重ねて適用する部分的な上書きです。たとえば部扉の章のリストに、独自のseparatorFontFamilyとseparatorColorを持つ'•'のseparatorを使えます。

#部扉デザインのプレースホルダー

デザインスロットは、見出しのプレースホルダーを部自身の値で解決します。{titleText}はフェンスのtitle、{number}は書いたとおりのnumberです。{numberDecimal}、{numberRoman}、{numberRomanLower}、{numberAlpha}、{numberAlphaLower}はそれを書式化し直します。番号は10進数、ローマ数字、漢数字として、それを囲む語の有無にかかわらず解析され("IV"、"iv"、"4"、"4"、"四"、"卷四"、"第四卷"はどれも{numberDecimal}=4になります)、それ以外は''になります。{partTitle}/{partNumber}、{chapterTitle}/{chapterNumber}(部の前の章)、{pageNumber}、{totalPages}、{bookTotalPages}、メタデータのプレースホルダーも使えます。{attr.<key>}は現在の章のH1の属性を読みます。

#部扉裏のデザイン

versoDesignは、部扉の直後のページに内容がないとき、そのページ、つまり部扉の丁の裏を飾ります。部そのものがそのページを白のまま残すことはありません。breakAfter.parityの既定は'any'なので、何かが奇偶を求めない限り、フェンスの後の内容はすぐ次のページから始まります。

  • 次の章の見出し。H1の既定のbreakBeforeは'always-odd'で、奇数ページの部扉の後では'odd'も同じ結果になります。章は次の奇数ページに移り、偶数ページは白のまま残ります。部扉裏のデザインが描画されます。
  • parts.breakAfter: { enabled: true, parity: 'odd' }。次の見出しの設定にかかわらず、部自身が次の奇数ページを求めます。章が左右どちらのページからでも始まるとき(breakBefore.parity: 'any'、またはbreakBefore.enabled: false)に使います。

どちらもなければ、章は偶数ページから始まり、部扉裏のデザインは描画されません。breakAfter.enabled: falseのときは、内容は部扉のページそのものに続きます。部扉裏は部のパレットに従うので、フェンスのpalette="band=#…"は部扉裏の色も変えます。

parts: {
  breakBefore: { parity: 'odd' },
  breakAfter: { enabled: true, parity: 'odd' },   // always a blank verso to paint
  versoDesign: {
    elements: [{
      kind: 'box', id: 'field',
      style: { backgroundColor: { hex: '#b07d2b', model: 'hex', paletteId: 'band' } },
      placement: { anchor: { to: 'page', edge: 'top-left' }, size: { width: 'fill', height: 'fill' } },
    }],
  },
}

章を締めくくる部。章ごとにレイアウトする本(Sandbox、buildBundle)では、:::partのフェンスはそれだけで1つの章にも、章の終わりにもなります。このとき部扉のページは章の最後のページになり、部がまだ果たしていないことを次の章が引き継ぎます。最初のブロックの前にbreakAfterを適用し、最初のページが白のまま残るときはそこにversoDesignを描画します。ページは、本全体を1つの文書で組んだときと同じになります。フェンスの後に置けるのは、何も配置しないディレクティブ(:::numbering、:::space)だけです。それ以外は章の内容となり、その場合は章自身が改ページします。部の直後の空の章は独立した1ページになり、そのページが部扉裏になります。章を自分でレイアウトするホストは、これをcontinuationAfter()から得られます。部で終わる章に対してafterPartPage: trueを返すので、それを次の章のcontinuationに渡してください。

#:::partコンテナー

:::part{number="…" title="…"}の行で部を開き、:::だけの行で閉じます。どちらの属性も省略できます(既定は'')。間のブロック(典型的には章のリスト)は、部扉のページの1段の中をbodyStyleで、margins.topから流れます。ページに収まらない本体は通常のページに続きます。このページはrole: 'part'に分類され(VDTPage.partInfoが番号とタイトルを持ちます)、ヘッダーとフッターの要素はpages: 'part'/pages: 'body'でこのページを対象にしたり除外したりできます。PDFバックエンドは、しおりの中で部をその章の上に加えます。本体が空のもの(:::part{…}の直後に:::)がよくある形で、これでもページは作られます。続けて書いた部が1ページを共有することはありません。部の中に入れ子にした:::partは外側の部にまとめられます。

3つ目の属性palette="<id>=<hex>[, <id>=<hex>…]"は、部に独自の色を与えます。部扉のページと、その後の次の部までのすべてのページで、これらのパレットidのいずれかにリンクしたデザインの色(ヘッダー、フッター、章扉の帯、部扉と部扉裏のデザイン)は、文書のパレットの値の代わりに部の値を取ります。こうして、本の各部が2つ目のデザインなしに、角のタブ、柱の点、章扉の帯の色を変えられます。例::::part{number="II" title="…" palette="band=#f6c297"}。テキストの流れも従います。同じページで、上書きしたパレットの要素の基本値と等しい流れの色はすべて部の値を取ります。対象は、見出し、太字、イタリック、参照の色、行頭記号とリストの番号、キャプションのラベルとキャプションのバー、表のテキスト、罫線、塗り(ヘッダー、本体、縞模様の行、セル自身の塗り)、囲み(背景、枠線、帯、タイトル)、チップ(塗り、輪郭、テキスト)です。そのためbandにリンクしたheadings.levels[1].colorは、各部の見出しをその部の色で組みます。インラインのスウォッチは書かれた色のままです。組は、カンマ、セミコロン、スペースで区切り、=または:でidと色をつなぎます。#は省略できます。部はフェンスが閉じた後も効力を持ち続けます。{partTitle}、{partNumber}、パレットは流れに沿ってその後の章へ引き継がれ、さらにcontinuationAfter()が返すcontinuation.partを通じて、個別にレイアウトする章にも引き継がれます。そのため、ある部の2つ目の章も、1つ目の章とまったく同じように柱にその部を表示します。

2つのパレットの要素が同じ基本値を持っていても、部が一方だけを上書きしたり、異なる色を与えたりすれば、部の中では異なる値を取ることがあります。値だけでは流れの色がどの要素から来たのかわからないので、流れの各色は、それが由来しうる設定と照合され、それらの設定がリンクする値を取ります。次のものは区別されます。

  • ブロックのテキストの色:テキストの色、太字・イタリック・参照の色、リストの記号(行頭記号または番号)、番号の後の区切り。bodyText.colorをinkに、bodyText.boldColorをaccentにリンクし、どちらも#1a1a1aのとき、palette="accent=#b8413d"の部は太字の部分の色を変え、テキストはそのままにします。代わりにunorderedLists.colorをaccentにリンクすると、行頭記号の色を変え、項目のテキストはそのままにします。
  • 見出しの各レベルと、色を設定する各見出しスタイル
  • 目次の行のテキスト、番号、ページ番号と副題
  • 各囲みスタイルの塗り(背景、帯、ラベルタブ)、枠線、罫線(マーカーとラベル)、テキスト(タイトル、アイコン、マーカーのグリフ、ラベル)
  • 各表スタイル、チップスタイル、キャプションスタイルのそれぞれの色。名前付きの表スタイルはtableStyleとは区別され、リソースの種類のキャプションスタイルはcaptionStyleとは区別されます。セル自身の塗りは、そのセル自身のリンクに従います。

1つのケースだけは、まだ値で決まります。異なる場所にある設定が、ブロックの同じ色を設定する場合です。たとえばbodyText.color、bodyText.blockquote.color、段落スタイルのcolor、囲みスタイルのbody.colorは、どれもブロックのテキストの色を設定します。そのうち2つが同じ基本値を持つ要素にリンクし、部がそれらを別の値にするとき、色は上書きを取ります(両方とも上書きされていれば、最後に書いたもの)。そうした要素には、それぞれ独自の基本値を与えてください。

const resolved = resolvePartsConfig(config.parts, resolvedPage, resolvedBodyText, resolvedUnorderedLists, resolvedOrderedLists);
// => margins filled from the page, bodyStyle from the body / list configs
 
const minimal = stripPartsDefaults(config.parts);
// => undefined when only static defaults remain

#見出しスタイル

headingStylesプロパティは、文書が# Title {style="<id>"}で見出しに適用する名前付きスタイルを宣言します。スタイルは2つのことをします。1つは、見出しのレベルの文字組み、デザイン、番号付けを上書きすることです。レベルの要素のlevel以外のすべてのフィールド(フォント、サイズ、色、breakBefore、span、advancedDesign、textTransform、hidden、numberingTemplate…)が対象です。もう1つは、見出しが開く節を制御することです。節のページ(同じかそれより上のレベルの次の見出しまで)は、スタイルの柱、ページのジオメトリー、本文の文字組み、パレットを取ります。こうして、2つ目の設定なしに、10進数で番号を振った2段組みのマニュアルの中に、本の前付け(ローマ数字のノンブルと青い帯を持つ、1段の広い段で組んだ序文)を収められます。

const config: PostextConfig = {
  headingStyles: [
    {
      id: 'front-matter',
      numbered: false,
      breakBefore: { enabled: true, parity: 'odd' },
      span: 'page',
      advancedDesign: { enabled: true, minHeight: { value: 52, unit: 'mm' }, slot: { elements: [/* bands, `{titleText}` */] } },
      header: { elements: [/* folio | rule | `{title}. {subtitle}` */] },
      margins: { left: { value: 50, unit: 'mm' }, right: { value: 17, unit: 'mm' } },
      layout: { layoutType: 'single' },
      bodyStyle: { fontSize: { value: 10.5, unit: 'pt' }, textAlign: 'justify' },
      palette: { band: '#547396' },
    },
  ],
};
# Preface {style="front-matter"}
プロパティ型既定値説明
idstring—見出しの行のから参照する識別子です。未知のidの見出しはそのままです。
namestringid人が読むための名前です(エディターのUIでのみ使います)。
numberedbooleantrue見出しを数えるかどうかです。数える見出しは、そのレベルのカウンター(numberingTemplateの番号、リソース番号の)、の元になる章の序数、目次に印字する番号を進めます。序文、執筆者一覧、索引にはfalseを使います。その後の最初の番号付きの章は章1のままで、それらのページではは空になります。
tocbooleantrue:::tocが見出しを載せるかどうかです。見出しは/で上書きできます。
runningChapterbooleantrueこのスタイルのレベル1の見出しを、柱の章にするかどうかです。柱の章とは、そのページとそれ以降のページで、、とそれらの…AtTop形が指す章です。章の中にH1として組んだ図版ページ、地図、表紙にはfalseを使います。柱はその見出しを飛ばし(その見出し自身のページでも)、割り込まれた章を指し続けます。h1のガイドワード(guide word)も設定しません。numberedなら見出しはなお数えられ(自身のデザインは自身のを読みます)、tocなら:::tocになお載ります。さらにtoc: falseにするとPDFのしおりも作られないので、章扉の前のページに置いた章の図版ページは、しおりを章に任せます。ほかのレベルの見出しはこの設定を無視します。既定のままでは、図版ページの後のページは図版ページのタイトルを印字します。numbered: falseの序文や序章は、なお独立した章なので既定のままにします。このオプションが変えるのは、プレースホルダーがどの章を指すかだけです。スタイルはすべての見出しスタイルと同じく独自の節を開くので、次のレベル1の見出しまで、ページは図版ページのスタイルの柱のスロット、余白、段組み、本文スタイル、パレット(スタイルが設定しないものは文書の値)を取ります。割り込まれた章が開いたスタイル付きの節の値ではありません。章ごとにレイアウトする本では、柱は章のファイルから次のファイルへ引き継がれないので、ファイルの先頭にある図版ページでは、そのファイルの最初の章見出しまで章のプレースホルダーは空になります。
レベルのフィールドheadings.levels[]と同じそのレベルの値fontFamily、fontSize、lineHeight、fontWeight、italic、color、marginTop、marginBottom、snapToGrid、breakBefore、span、advancedDesign、textTransform、letterSpacing、lineSpan、indent、firstLineIndent、jidori、dropCap、hidden:設定したものはそれぞれ、このスタイルの見出しについて見出しのレベルの値を置き換えます(dropCap: falseはレベルのドロップキャップを外します)。breakBeforeはレベルの値にフィールドごとにマージされます。parityだけを設定したスタイルはレベルのenabledを保ち、enabled: trueだけを設定したスタイルはレベルの奇偶を保ちます(postext 1.4までは、欠けたフィールドは改ページなしの既定値から取られていました)。
numberingTemplatestringそのレベルの値このスタイルの見出しを、レベルのテンプレートの代わりに番号付けするテンプレートです(トークンはlevels[].numberingTemplateと同じです)。カウンターはレベルのものなので、5つの章の後で'Appendix 'を使う付録のスタイルはAppendix Fと印字します。最初の付録でを付けて数え直してください。''は番号を印字しませんが、見出しはなお数えられます。テンプレートのないレベル1の見出しで目次とが表示する章の序数も印字しません。番号は、流れの中、スタイルのデザインの、目次、に表示されます。
header, footerDesignSlot文書の値節のページの柱で、そこではheader/footerを置き換えます(要素のparityとpagesのフィルターは引き続き適用されます)。空のスロットにすると柱をなくします。
marginsPageMarginsページの余白節のページの本文領域です。各辺は、未設定ならページの余白を継承します(mirrorも含みます)。効力を持つのは節が開くページなので、breakBeforeと組み合わせて使います。
layoutLayoutConfiglayout節のページの段組み(layoutType、gutterWidth…)です。2段組みの本で序文を1段の広い段で組む場合などに使います。そのcolumnRuleは節のページに描かれ、未設定のフィールドは文書のlayout.columnRuleの値を取るので、段組みだけを変える節は文書の罫線を保ちます(段間罫を参照)。
bodyStylePartsBodyStyleConfigbodyTextを継承節の中の段落、引用、リストの文字組みです。フィールドはparts.bodyStyleと同じです。
paletteRecord<string, string>節のページのパレットの上書き(id → 16進数)で、現在の部の上書きに重ねて適用します。部のpalette属性と同じしくみで、及ぶ範囲も同じです。それらのページに組まれるデザインスロット(柱、章扉の帯。上書きしたidにリンクしたすべての色)だけでなく、テキストの流れにも値で及びます。上書きした要素の基本値と等しい流れの色(見出し、太字、イタリック、参照の色、行頭記号とリストの番号、キャプションのラベルとキャプションのバー、表のテキスト、罫線、塗り、囲み(背景、枠線、帯、タイトル)、チップ(塗り、輪郭、テキスト))はすべて、部の下と同じように節の値を取ります。同じ基本値を持つ2つの要素についての規則も同じです(:::partコンテナーを参照)。インラインのスウォッチは書かれた色のままです。ページの地色も変わります。page.backgroundColorが上書きされた項目にリンクしている(またはリンクなしでその基本値を持つ)とき、節のページは節の値で塗られます。新聞の経済面がサーモンピンクの紙に刷られ、ほかの面は白のままになるのはこのためです。postext 1.18以降。

節は、同じかそれより上のレベルの次の見出しで閉じます。スタイル付きの見出しの後にあるスタイルなしの#は、文書の柱とジオメトリーに戻ります。スタイル付きの見出しは独自の節を開きます。節が奇偶を合わせるために白のまま残したページは、章のタイトルと同じく、その節に属します。

改ページは見出し自身の改ページの代わりにはなりません。スタイルはレベルのbreakBeforeを継承し(レベル1の既定値は{ enabled: true, parity: 'always-odd' })、見出しはどこにあってもそれを適用します。:::pagebreakの直後でも同じです。改ページで新しいページが開き、見出しはそれでもなお見開きの自分の側を求めます。parity: 'odd'では、偶数ページで終わる改ページの後に白ページが入り、見出しは次の奇数ページから始まります。'always-odd'では区切りの白ページも入り、改ページは何も変えません。見出しはいずれにしてもそのページを開いていたからです。タイトルページの後の目次のページのように、手動の改ページが開いたページから始めたいスタイルは、自分の改ページをオフにします。

headingStyles: [
  // Starts where the text puts it: on the page the `:::pagebreak` before it opened.
  { id: 'contents', numbered: false, toc: false, breakBefore: { enabled: false } },
],

左右を選ばずに独立したページを保つには、代わりにbreakBefore: { parity: 'any' }を設定し、:::pagebreakは省きます。

ページがどの節に属するか。柱とパレットは、見出しごとではなくページごとに選ばれます。ページは、そのページ上の最後の節の切り替わりの後に有効な節を取ります。同じページで1つの節が終わって別の節が始まるとき(たとえば辞書の短い2つの文字の項)、ページは2つ目の節の柱とパレットを持ちます。スタイル付きの節がページの途中でスタイルなしの見出しによって終わるときは、ページは文書の値に戻ります。{chapterTitle}も同じ規則に従い、2つの章が出会うページは後の章のタイトルを表示します。白ページは章のタイトルの規則に従います。奇偶を合わせる白ページ(blankForParity)はその後に開く節に属し、'always-odd'/'always-even'の改ページが加える区切り(blankForForce)はその前の節に属します。部扉は開いている節を閉じます。

# A {style="letter"}
 
Aardvark, abacus.
 
# B {style="letter"}
 
Babble, badger… (runs on to the next page)

どちらの文字もページ1から始まるので、ページ1はBの節の柱を取ります。スタイルのヘッダーに置いた爪見出しはそこで「B」になり、「A」の爪見出しを持つページはありません。どの節にも爪見出しが必要なら、各節に独立したページ(breakBefore)を与えてください。番号付きの章の後のアルファベット付きの付録と、目次とPDFのしおりには載るがページ上にはタイトルを出さない献辞のページの例です。

headingStyles: [
  { id: 'appendix', numberingTemplate: 'Appendix {1:A}' },
  { id: 'silent', hidden: true, numbered: false },
],
# Dedication {style="silent"}
 
For M., who read every draft.
 
# Method
 
…
 
# Survey instrument {style="appendix" startAt=1}
 
# Raw data {style="appendix"}

レベル1にnumberingTemplate: '{1}.'を設定すると、章は1.、2.…、付録はAppendix AとAppendix Bと印字されます。献辞は自分のページを開き(そのレベルのbreakBefore)、段落だけを印字しますが、:::toc、{chapterTitle}の柱、PDFのしおりにはDedicationとして表示されます。目次から外すには、スタイルにtoc: falseを加えます。章の途中にH1として組んだ図版ページや地図は、献辞とは逆のことを求めます。runningChapter: falseのスタイル(通常はnumbered: falseとtoc: falseも付けます)は、柱を割り込まれた章のまま保ちます。

const resolved = resolveHeadingStylesConfig(config.headingStyles, resolvedPage, resolvedBodyText, resolvedUnorderedLists, resolvedOrderedLists);
// => level overrides normalised, margins filled from the page, bodyStyle from the body
 
const minimal = stripHeadingStylesDefaults(config.headingStyles);
// => undefined when no style remains