章 3.2 · 部 II · 技法
設定:柱とノンブル
各ページの上と下に印刷するもの:プレースホルダーを含むテキスト、罫線、ボックス、画像、奇偶ページごとの指定、各要素の配置
かんたんな説明
このページでは、各ページの上と下に印刷するものを説明します。柱やノンブルには、ページ番号、本や章の題名、線、枠、小さな画像を入れられます。左右のページで違うものを見せることもできます。それぞれの要素は左、中央、右のどこかに置くか、本文の横の余白に置けます。柱とノンブルは余白の中に入るので、本文の場所が狭くなることはありません。
#柱とノンブル
headerとfooterプロパティは、ページごとのヘッダーとフッターのスロットを制御します。ヘッダーとフッターは既存のページ余白の内側に描画されます。追加のスペースを確保することはなく、本文領域を狭めることもありません。
コンテナーの枠。'container'にアンカーした要素は、本文と仕上がり線のあいだの余白の帯に置かれ、本文領域の幅に広がります。ヘッダーのコンテナーは仕上がりの天から本文の上端まで、フッターのコンテナーは本文の下端から仕上がりの地までです。そのため、ヘッダーのtop-*アンカーとフッターのbottom-*アンカーは仕上がり線から測り、ヘッダーのbottom-*アンカーとフッターのtop-*アンカーは本文の端から測ります。コンテナーに裁ち落としやトンボの帯が含まれることはないため、page.cutLinesのオン・オフにかかわらず、ヘッダーやフッターは断裁後のページの同じ位置に来ます。本文領域の幅を超えて、または裁ち落としまで要素を広げるには、'page'(トリムボックス)か'bleed'にアンカーします。
スロットは統一されたデザインスロットモデルを使います。どの要素もplacementを持ち、そこにanchor(コンテナー、または#idで指定する別の要素へのアンカー)、省略可能なoffset、省略可能なsizeを指定します。従来のフラットなフィールドalign、marginFromBody、marginFromEdge、width: 'full'も入力としては引き続き受け付け、新しい形へ自動的に移行します。新しい形での同等の記述は以下で説明します。
各スロットはテキスト、罫線、ボックスの要素のリストを持ちます。配列の順序が描画順です(最初の要素が最初に描かれ、最後の要素がいちばん上に描かれます)。これはアンカーの指定にかかわらず変わりません。要素はリストで後に来る要素にもアンカーできる(anchor.to: '#ttl')ため、背景のボックスを先頭に置いたまま、その前面に来るテキストを基準に位置を決められます。
組み込みの既定値。headerまたはfooterがundefinedのとき、postextは空のスロットではなく、適切な組み込みの既定値を適用します。
- 既定のヘッダー:奇数ページでは
{title}を右そろえ、偶数ページでは{chapterTitle}を左そろえにし、全幅の罫線を引きます。いずれもパレットのメインカラー、Open Sans 8pt/600で、marginFromBodyは16pt(テキスト)/13pt(罫線)です。 - 既定のフッター:すべてのページで
{pageNumber}を中央に置きます。パレットのメインカラー、Open Sans 8pt/600で、marginFromBodyは16ptです。
組み込みの既定値を使わないようにするには、header: { elements: [] }(またはfooter: { elements: [] })と指定します。明示的な空のelements配列は「要素なし」としてそのまま保持され、既定値が適用されるのはundefinedのときだけです。
| プロパティ | 型 | 既定値 | 説明 |
|---|---|---|---|
elements | HeaderFooterElement[] | undefinedのときは組み込みの既定値、[]で無効 | テキスト要素と罫線要素の順序付きリスト。 |
#テキスト要素
テキスト要素は、プレースホルダーを置き換えたテンプレート文字列を描画します。プレースホルダーは{name}の構文で書き、{{と}}は波かっこそのものを出力します。
以下の表の既定値は、自分で追加したテキスト要素のものです。上の組み込みの既定値で説明した組み込みのヘッダーとフッターは、独自の値(パレットのメインカラーのOpen Sans 8pt/600)を持つ既製の要素であり、要素の既定値ではありません。
| プロパティ | 型 | 既定値 | 説明 |
|---|---|---|---|
kind | 'text' | — | 判別子。 |
id | string | — | スロット内で一意の固定ID。ほかの要素はanchor.to: '#id'でこの要素にアンカーします。Sandboxは作成時にIDを割り当てます。 |
content | string | '' | テンプレート文字列。以下のプレースホルダーに加えてが使えます。これは現在の章のH1の行に書いた属性です(# Title )。存在しない属性は警告なしに空文字列になります。改行、またはテンプレートや属性値に書いた2文字の\nは、overflowの値にかかわらず常に新しい行を始めます。プレースホルダーが文書からコピーするテキスト(タイトル、フロントマターのフィールド)は書かれたとおりに出力されます。そこで新しい行を始めるのは、タイトル内の改行のような実際の改行だけです。 |
align | 'left' | 'center' | 'right' | 'justify' | 'start' | 'end' | 'center' | 要素のボックス内での行の水平方向のそろえ。'justify'は、各段落の最終行を除いて折り返したすべての行の語間を広げ、行がボックスを満たすようにします。ドロップキャップの横の行は、その横の領域を満たします。hyphenateを指定すると、両端そろえの行の残りに収まらない単語も音節で分割して行を満たします。段落の最終行、広げるスペースのない行、折り返さないテキストは左そろえになります。両端そろえのテキストは段落ごとに組まれるため、段落間の空行は1つとして数えます。canvasとPDFはレイアウトが決めた位置にすべての単語を置き、HTMLはword-spacingでスペースを広げます。'start'と'end'はテキストのdirectionに従い、右から左のテキストではそれぞれ右と左になります。'left'と'right'はボックス自身の辺です。右から左のページの流れの中に組まれるデザイン(章扉の帯、見出しのデザイン)では流れが左右反転するため、本文と同じく、これらは開始側と終了側を指します。 |
direction | 'ltr' | 'rtl' | 'auto' | 文書の値 | テキストの基本方向。中立的な文字が置かれる位置、行内でのランの順序、'start'と'end'がどちらの辺を指すかを決めます。'auto'は解決後のテキストで方向性の強い最初の文字を読み取り、見つからなければ文書のdirectionに従います。アラビア語とヘブライ語のランは、基本方向にかかわらず右から左に読みます。アラビア文字を含むテキストには字間を付けず(テキスト全体でletterSpacingを無視します)、折り返しや省略の際にも単語を分割しません。ボックスより幅の広い単語ははみ出し、unbreakableWordOverflowとして報告されます。 |
parity | 'all' | 'odd' | 'even' | 'all' | 要素を表示するページ(ページ番号の奇偶。1ページ目は奇数)。 |
pages | 'all' | 'body' | 'opener' | 'part' | 'blank' | 'all' | 要素を表示するページの役割。parityと組み合わせて使います。配置が終わると、各ページは'blank'(奇偶合わせや区切りのための埋め、または内容なし)、'part'(部扉のページ)、'opener'(最初のブロックが、ページ全幅にわたる、または直前で改ページを強制するレベルの見出しであるページ。章の最初のページ)、'body'(それ以外すべて)のいずれかに分類されます。pages: 'body'は章扉で柱を隠し、pages: 'opener'はそこにだけノンブルを表示します。 |
fontFamily | string | 'EB Garamond' | フォントファミリー。 |
fontSize | Dimension | 8 pt | 文字サイズ。 |
fontWeight | number | 400 | フォントのウェイト(100〜900)。 |
italic | boolean | false | イタリックで描画するかどうか。 |
color | ColorValue | #000000 | テキストの色。 |
overflow | 'wrap' | 'ellipsis-start' | 'ellipsis-middle' | 'ellipsis-end' | 'clip' | 見出しと部のデザインでは'wrap'、それ以外は'ellipsis-end' | 要素で使える幅を超えるテキストを、エンジンがどう扱うか。'wrap'は行を複数行に折り返します。省略記号の各モードは各行を1行に保ち、先頭、中央、末尾のいずれかを…で省略します。'clip'は文字を挿入せずに、要素のバウンディングボックスで切り取ります。内容中の改行はどのモードでも有効で、省略と切り取りのモードは各行を個別に省略または切り取ります。overflowを省略した要素は配置先の既定値に従います。見出しのデザイン(advancedDesign.slot)と部扉(parts.design、parts.versoDesign)では折り返し、柱・ノンブル・目次の部の行(toc.parts.design、高さ固定の行)では…で終わります。複数行になりうる柱(住所など)には'wrap'を、章扉で1行に収めたいリードには省略記号を指定してください。省略記号で切り詰められた行や、'clip'でボックスの外にはみ出した部分を切り取られた行は、内容の警告designTextTruncatedとして要素とページごとに1回(柱とノンブルは要素と章ごとに1回)報告されます。postext 1.24より前に保存した構成(configVersionが9以前)は、overflowを設定していない見出しと部のテキストを'ellipsis-end'として読み込むので、ページは動きません。dropCapを持つテキストは、この値にかかわらず折り返します。'clip'の場合も、高さ固定のボックスの端で行は切り取られます。'ellipsis-end'と'ellipsis-start'は単語の境界で切り(The history of th…ではなくThe history of…)、省略記号にスペースやつなぎの約物(コンマ、コロン、ダッシュ、スラッシュ、始め括弧)が接することはありません。単語の途中で切るのは、それが避けられない場合、つまりその約物を除いた境界で切ると収まる分の半分未満しか残らない場合だけです。長い1語やURLがこれに当たります(http…ではなくhttp://exampl…)。ノーブレークスペースとノーブレークハイフン(U+2011。MS‑DOSなど)は単語の境界になりません。'ellipsis-middle'はどこででも切りますが、その両側のスペースは取り除きます。postext 1.4までは、どのモードもスペースを含め、収まる最後の文字で切っていました。 |
verticalAlign | 'top' | 'middle' | 'bottom' | 'middle' | 行より高いボックス(固定のplacement.size.height、またはアンカーした隣の要素によって引き伸ばされたボックス)の中で、テキストを置く位置。行がボックスより高い場合(高さ固定のボックスに入れた大きな数字、詰めたlineHeight)は、CSSのflexのそろえと同じく、そろえで空く側へはみ出します。'bottom'は最終行の行ボックスの下端をボックスの下端に合わせて上へはみ出し、'middle'は上下に均等にはみ出し、'top'は下へはみ出します。postext 1.4までは、そろえにかかわらず、こうした行は常に上端から下がっていました。dropCapは行と一緒に動きます(postext 1.4までは、'middle'や'bottom'で行が下へ移動したボックスでも、上端にとどまっていました)。 |
lineHeight | number | Dimension | 1.2 | 要素の行の行送り。数値はfontSizeの倍数です。設定内のほかの行送りと同じ書き方で、Dimensionも受け付けます。em/remは同じ倍数、絶対長(pt、mm、px…)はベースライン間の距離です。は、サイズにかかわらず15.5 ptの行送りにします。それ以外(ゼロ、負の数、不正なDimension)は既定値になります。postext 1.4までは、ここにDimensionを指定するとデザインの高さが測れなくなり、章扉はminHeightさえ確保せず、本文がタイトルに重なって組まれていました。 |
letterSpacing | Dimension | 0 | トラッキング。CSSのletter-spacingとまったく同じく、スペースを含むすべての文字の後に追加の送りを加えます。測定される幅もそのぶん増えるため、自動幅のボックスはぴったりのままです。トラッキングでグリフが変わることはありません。フォントの合字はCanvas、HTML、EPUB、PDFのどれでも保たれます(postext 1.27までは、字間を付けたデザインのテキストでCanvasとHTMLが合字を外し、測定より幅が広くなっていました)。ヘブライ文字の部分にはラテン文字と同じく字間が付き、付かないのはアラビア文字を含むテキストだけです。行の最後の文字の後のトラッキングは、行のそろえと自動幅のボックスの計算から除外されます。そのため、字間を付けた中央そろえのタイトルは文字そのものを基準に中央に置かれ、右そろえのタイトルは端で終わり、両端そろえの行の最後の文字は端に届きます(postext 1.4までは、トラッキング単位の半分または1つ分だけ左にずれ、字間を付けた要素の右にアンカーした要素はトラッキング単位1つ分だけ離れていました)。負の値は字間を詰め(36 ptのディスプレイ用タイトルでは{ value: -0.がよく使われます)、幅も同じように縮みます。canvas、HTML、PDFは同じように描画します(postext 1.4までは、負の値は警告なしに0として扱われていました)。 |
textTransform | 'none' | 'uppercase' | 'none' | 解決後のテキストに、プレースホルダーも含めて適用する大文字・小文字の変換。目次で部のタイトルを大文字で組む場合などに使います。 |
box | ElementBoxStyle | — | テキストの背後に描く背景と枠線(省略可)。backgroundColor、borderColor、borderWidth、borderRadiusと、テキストの外側へボックスを広げる辺ごとのpaddingを指定します(各フィールドはボックス要素を参照)。 |
dropCap | { lines, fontFamily, fontWeight, fontSize, color, gap } | — | ドロップキャップ。最初の文字を、最初のlines行(既定は2)の横に大きく組みます。書体、ウェイト、色は独自に指定でき、テキストとの間隔はgapです。この文字は、またがる最後の行のベースラインに立ちます。fontSizeの既定値は、文字の上端が1行目の大文字の高さとそろうサイズで、テキストのサイズにlines − 1行分の行送りを足したものです。大文字の高さは文字サイズの0.72とみなします(大文字がこれよりかなり高い、または低い書体では、独自のfontSizeを指定してください)。ドロップキャップを持つテキストは、overflowにかかわらず折り返します。'clip'の場合も、高さ固定のボックスの端で行は切り取られます。パレットにリンクしたcolorは、デザインのほかの部分と同じく部と節のパレットに従います。見出しのデザインでは、この文字はテキストの下にスペースを確保しません。ベースラインより下にある行ボックスの部分は本文を押し下げません。そのため、ベースラインより下に伸びる文字(多くの書体のQやJ)は、デザインの下のスペースに入り込むことがあります。その場合は見出しにmarginBottomを指定してください。postext 1.4までは、既定のサイズでは文字がまたがる行ボックス全体と同じ高さになったため、文字の上端が1行目より上に出ていました。また、'wrap'以外のoverflowでは警告なしに文字が消え、節や部のパレットでも色は変わらず、横のテキストと同じ深さまで下がる文字が本文をグリッド1行分押し下げることがありました。それより前に保存された設定は、1.4のサイズをfontSizeとして書き出した形で保持します(postext 1.4以前で書き出したバンドルを参照)。本文中のドロップキャップは、代わりに段落スタイルと見出しスタイルで設定し(ドロップキャップを参照)、大文字の高さは書体から計測します。 |
paragraphIndent | Dimension | 0 | 最初の段落以外の各段落の1行目の字下げ。内容中の改行、または属性値から来るテキストでは2文字の\nが段落を区切ります。連続する改行は1つとして数えます。 |
hyphenate | boolean | false | trueでテキストが折り返す場合(overflow: 'wrap'、または常に折り返すdropCapがある場合)、通常の改行の後もはみ出す長い単語を、文書で有効なハイフネーションのロケールを使って音節の境界で分割し、分割位置にソフトハイフンを入れます。両端そろえのテキスト(align: 'justify')では、行の残りに収まらない単語も、収まる最後の音節の切れ目で分割して行を満たします。 |
inlineMarks | boolean | false | 解決後のテキストを、プレースホルダーの値も含めてインラインのMarkdownとして読みます。bold、italic、^superscript^、~subscript~が使えます。オフのときは記号が書かれたとおりに出力されます。見出しのデザインでは、このときが見出し自身の太字・イタリック・上付き・下付きの範囲(Pneumocystis、CO~2~)を保ち、そのほかの文字はエスケープされて書かれたとおりに出力されます(postext 1.19から)。インラインの書式記号と輪郭線を参照してください。 |
stroke | { width, color?, hollow? } | — | 文字の周りに描く輪郭線。width(Dimension。字形の縁を中心に描きます)、color(既定はテキストの色。ドロップキャップは自身の色を使います)、hollow(trueで輪郭線だけを描きます)を指定します。インラインの書式記号と輪郭線を参照してください。 |
writingMode | 'horizontal-tb' | 'vertical-rl' | 'horizontal-tb' | 'vertical-rl'は、文字を立てたまま、テキストを上から下へ、行を右から左へ組みます。小口に沿って縦に置く柱や、横組みの章の脇に置く縦書きのタイトルに使います。縦組みのテキスト要素を参照してください。 |
reserve | boolean | true | 見出しのデザイン専用。見出しがテキストの流れの中に確保する高さに、要素を含めるかどうか。テキストの下に重なってもよい装飾(ページ下部の印章、枠、側面の帯)にはfalseを指定します。確保する高さを参照してください。ヘッダー、フッター、部のデザインはこの値を無視します。 |
marginFromBody | Dimension | 6 pt | 要素の本文側の辺と本文の端との絶対距離。ほかの要素からは独立しています。placement.offset.yに移行されます。 |
marginFromEdge | Dimension | 0 pt | そろえた側の本文領域の端からの水平方向のインセット。alignが'left'または'right'のときだけ有効です。placement.offset.xに移行されます。 |
placement | ElementPlacement | align + marginFromBody + marginFromEdgeから導出 | 詳細な配置(下記参照)。指定すると、従来のフラットなフィールドより優先されます。 |
使えるプレースホルダー:
{pageNumber}— 現在のページの、1から始まるページ番号。{totalPages}— 文書の総ページ数。章ごとにレイアウトする本(Sandbox、buildBundle)では各章が1つの文書になるため、これはその章自身のページ数です。{bookTotalPages}— 本全体の総ページ数。すべての章と白ページを含みます。単独でレイアウトする文書では{totalPages}と同じです。下の本全体のページ数を参照してください。{title}、{subtitle}、{author}、{publishDate}—content.metadataから読む値。不明または空のメタデータは空文字列になります(Sandboxでは警告も出ます)。{chapterTitle}— 現在のページまで(そのページを含む)で最後に現れたH1のテキスト。見出しスタイルでrunningChapter: falseを指定したH1(図版、地図)は飛ばします。{chapterTitleAtTop}、{chapterNumberAtTop}— ページ上端の時点で有効な章のタイトルと番号。ほかのテキストの下で新しい章が始まるページでは、{chapterTitle}や{chapterNumber}と異なります。下のページ上端の章を参照してください。{partTitle}、{partNumber}— 現在の部のタイトルと番号(現在のページまでで最後の:::partページ。部扉の直前にある奇偶合わせの白ページは、すでにその部に属します)。最初の部より前では空です。{firstMark.<key>}、{lastMark.<key>}— ページの最初と最後の柱の見出し語。あるレベル(h1〜h6)の見出し、または段落スタイルの項目です。下の柱の見出し語:最初と最後のマークを参照してください。
本全体のページ数
{bookTotalPages}は本全体のページ数、つまり「12ページ/全348ページ」のように読者が目にする数を出力します。{totalPages}と同じく白ページを含めて物理的なページを数えますが、すべての章にわたって数えます。
- 単独でレイアウトする文書(
continuationなしのbuildDocument)は、それ自体が本全体です。{bookTotalPages}は{totalPages}と等しくなります。 buildBundleの場合、本をレイアウトして全章のページ数を合計し、その合計を使ってもう一度レイアウトするため、どの章も同じ数を出力します。この数が改ページの位置を動かすことはないので、1回の追加ラウンドで確定します。{bookTotalPages}を出力しない設定には追加のコストはかかりません。- Sandboxは、すべての章のページ数がわかった時点で各章に合計を渡します。それまでは、各章はその章の終わりまでのページ数を出力します。PDFタブの本全体の書き出しは、自身がレイアウトしたページを数えます。ページ数がまだわかっていなかったために別の数を出力した章があれば、各章から得た数でもう一度本をレイアウトします。
- 章を自分でレイアウトするホストは、合計を
continuation.bookPageCountとして渡します(最初の章にも渡します)。渡さない場合、{bookTotalPages}は文書の終わりまでのページ(continuation.pageIndexOffsetと自身のページ数の和)を数えます。これが正しいのは最後の章だけです。
footer: {
elements: [{
kind: 'text', id: 'folio', content: '{pageNumber} / {bookTotalPages}',
fontSize: { value: 8, unit: 'pt' },
placement: { anchor: { to: 'container', edge: 'top' }, size: { width: 'auto', height: 'auto' } },
}],
}configUsesPlaceholder(config, 'bookTotalPages')を使うと、ホストはこの数を計算する価値があるかどうかを判断できます。
柱の見出し語:最初と最後のマーク
辞書は各ページの柱に、そのページの最初と最後の見出し語を掲げます(「Aback – Anchor」)。参考図書なら最初と最後の節を掲げます。{firstMark.<key>}と{lastMark.<key>}はこれを出力します。キーは、何がページのマークになるかを指定します。
h1〜h6:そのレベルの見出し。マークは番号を除いた見出しのテキストです。- 段落スタイルのID(
entry)::::paragraphs{style="entry"}コンテナーの段落。マークは段落冒頭の太字の部分、つまり見出し語で、末尾の約物は除きます。**Aback.** Said of…はAbackをマークにします。太字で始まらない段落はマークを設定しません。
{firstMark.<key>}はページ内で始まる最初のマーク、{lastMark.<key>}は最後のマークです。マークが始まらないページ(長い項目が続いているページ)では、どちらもその時点で有効なマーク、つまりそれより前の最後のマークを出力します。最初のマークより前のページには何も出力されません。章ごとにレイアウトする本では、マークは次の章へ引き継がれないため、これはその章の最初のマークより前のページを指します。ページをまたいで分割された見出しや段落は、始まるページだけをマークします。キーはドットの後に英字、数字、_、-で書き、英字か_で始めます。不明なキーは何も出力しません。
:::paragraphs{style="entry"}
**Aback.** Said of the sails when pressed back against the mast.
**Abaft.** Towards the stern, or behind a given point.
:::header: {
elements: [{
kind: 'text', id: 'guide', content: '{firstMark.entry} – {lastMark.entry}',
fontSize: { value: 8, unit: 'pt' },
placement: { anchor: { to: 'container', edge: 'bottom' }, size: { width: 'auto', height: 'auto' } },
}],
}柱の見出し語は柱として扱われます。ヘッダーとフッターのスロット(見出しスタイルのheaderとfooterを含む)で解決され、見出し、部、目次のデザインでは何も出力しません。見出しと部のデザインでは、検査パネルが不明なプレースホルダーとして警告します。偶数ページに最初の見出し語、奇数ページに最後の見出し語を出すには、2つの要素にparity: 'even'とparity: 'odd'を指定します。見出しスタイルでrunningChapter: falseを指定したH1は、h1のマークを設定しません。
ページ上端の章
{chapterTitle}と{chapterNumber}は、そのページまでに始まった最後の章を指します。章のあいだで改ページせずに続けて組む本では、ある章を終えてページの下のほうで次の章を始めるページに、まだ前の章に属するテキストの上に新しい章のタイトルが載ってしまいます。{chapterTitleAtTop}と{chapterNumberAtTop}は、代わりにページ上端の時点で有効な章を指します。章を続けて組む小説や、多くの参考図書がこの方式です。
- 最初のブロックが章のH1であるページは、その章を指します。
- それ以外のページは、新しい章がページの下のほうで始まる場合でも、前から続いている章を指します。
- 奇偶合わせのために追加された白ページは次のページに、
always-*モードの区切りページは前のページに従います(白ページの帰属を参照)。奇偶合わせの白ページの次のページが章のH1ではなく章の終わりで始まる場合、その白ページもその章のままです。 runningChapter: falseのH1は飛ばします。
header: {
elements: [{
kind: 'text', id: 'chapter', content: '{chapterTitleAtTop}', parity: 'odd', pages: 'body',
fontSize: { value: 8, unit: 'pt' },
placement: { anchor: { to: 'container', edge: 'bottom-right' }, size: { width: 'auto', height: 'auto' } },
}],
}柱の見出し語と同じく、どちらも柱として扱われます。ヘッダーとフッターのスロットで解決され、見出し、部、目次のデザインでは何も出力しません。{attr.<key>}は常に最後に始まった章を読みます。
基準辺から決まるそろえ
テキスト要素のplacement.anchor.toが#idで別の要素を参照するとき、アンカーの基準辺によって、折り返した行の既定のそろえが決まります。
right-ofとalign-leftはテキストのalign: 'left'を意味します。折り返した行はアンカーから右へ流れます。left-ofとalign-rightはalign: 'right'を意味します。折り返した行はアンカー先に最も近い側に寄ります。
Sandboxの見出しエディターは、アンカーの基準辺や対象を変更すると、これらのそろえを自動的に適用します。これにより、複数行に折り返したテキストが、関連する要素に視覚的に結び付いたままになります(たとえば、折り返した「Postext」の「P」が「Introduction」の「I」の真下にそろいます)。
インラインの書式記号と輪郭線
テキスト要素は既定では1つの書体でテキストを組み、**、^などのMarkdownの記号は書かれたとおりに出力されます。inlineMarks: trueを指定すると、解決後のテキストをインラインのMarkdownとして読み、本文と同じ書式記号が使えます(文書形式 → インライン書式を参照)。
**bold**はウェイトを700にします(要素自身のfontWeightのほうが太ければそれを使います)。*italic*は要素の傾きを反転するため、イタリックの要素の中の強調は立体になります。***both***は両方を適用します。アンダースコアの形(__bold__、_italic_)も使えます。^superscript^と~subscript~はサイズの58%で組み、上付きはサイズの3分の1だけ上げ、下付きは0.15だけ下げます。接する下付きと上付き(T~0~^2^)は、本文と同じく上下に重ねて組みます。- バックスラッシュを付けると記号の文字そのものを組みます(
\*、\_、\^、\~)。リンクはテキストを残し、コードのバッククォートは取り除きます。
書式記号はプレースホルダーを埋めた後で読むため、値に書式記号を含めることができます。たとえば見出しの属性に書いた著者の行で、所属の番号を上付きにできます。折り返し、両端そろえ、省略記号のモード、dropCap、paragraphIndentは、いずれも書式付きのテキストで動作します。どのランも要素の色を保ちます。
{ "kind": "text", "id": "authors", "content": "{attr.authors}", "inlineMarks": true, "overflow": "wrap",
"fontSize": { "value": 11, "unit": "pt" },
"placement": { "anchor": { "to": "#title", "edge": "below" }, "offset": { "y": { "value": 6, "unit": "pt" } } } }# Snow cover and river flow {authors="Ana Ruiz^1^, Luis Gil^2^ and Marta Sanz^1,3^"}strokeは文字の周りに輪郭線を描きます。widthは線幅で、字形の縁を中心に描きます(半分が文字の内側、半分が外側に入り、測定されるテキストの幅は変わりません)。colorの既定はテキストの色です。hollow: trueは文字を塗らずに輪郭線だけを見せます。袋文字のディスプレイ数字や、写真の上で浮き立たせたいタイトルに使います。輪郭線は塗りの上に描かれ、canvas、HTML(-webkit-text-stroke)、PDF(テキスト描画モード2、hollowのときは1)で同じように描画されます。
{ "kind": "text", "id": "year", "content": "1863", "fontFamily": "Bitter", "fontSize": { "value": 120, "unit": "pt" }, "fontWeight": 700,
"color": { "hex": "#1d3557", "model": "hex" },
"stroke": { "width": { "value": 1.5, "unit": "pt" }, "hollow": true },
"placement": { "anchor": { "to": "page", "edge": "bottom-right" }, "offset": { "x": { "value": -15, "unit": "mm" }, "y": { "value": -20, "unit": "mm" } } } }PDFでは、太字とイタリックのランに要素のファミリーの対応する書体を埋め込むため、フォントプロバイダーがそれらを提供する必要があります。
テキストの既定値とアンカーの落とし穴
自分で書いたテキスト要素は次の値から始まります。意外に思えるものもあります。
overflowは配置先で決まる。見出しのデザインと部扉では長い題が複数行に折り返し、柱・ノンブル・目次の部の行では幅に収まらないテキストが…付きの1行に切り詰められます。長くなりうる柱(住所、著者名の行)にはoverflow: 'wrap'を指定し、切り詰められたテキストについてはdesignTextTruncated警告を確認してください。内容中の改行(改行文字、またはテンプレートや属性値に書いた\n)はどのモードでも新しい行を始め、省略記号のモードは各行を個別に切り詰めます。alignは'center'、verticalAlignは'middle'。自動幅の要素は最も長い行に合わせて縮むため、各行は互いに中央そろえになります。左そろえのブロックにするにはalign: 'left'を指定します(別の要素にアンカーした自動幅の要素は、アンカー側に自動的に行をそろえます。前述)。- 書体はEB Garamond 8 pt、黒、
lineHeightは1.2。本文が何を使っていても変わりません。設定内のほかの行送りと異なり、デザインのテキストのlineHeightは通常は単純な倍数(1.2)で書きます。Dimensionも使えます(前述)。
placement.size.widthを指定しない(または'auto'の)要素はテキストに合わせて自身のサイズを決めますが、その範囲は、アンカー点から、要素が伸びていく方向のコンテナーの端までの領域に限られます。topまたはbottomのアンカーでは、近いほうの端までの距離の2倍です。offsetも計算に入ります。その端から離れる方向のオフセットは領域を減らしません。top-leftにアンカーし、負のxで左の余白にはみ出させた柱は右へ伸びるため、領域は減りません。その端に向かうオフセットは、同じだけ領域を減らします(topまたはbottomのアンカーでは2倍)。アンカー点を端の外へ押し出すオフセットでは、領域がなくなります。xがコンテナー幅のマイナス値より小さいtop-rightのアンカーや、幅の半分を超えて横にずらしたtopのアンカーがこれに当たります。領域がなくなると、省略記号のモードは何も出力せず、'wrap'は1行に1文字ずつ積み重ねます。回避策は3つあります。
- 要素に固定の
size.widthを指定する。固定幅は切り詰められません。 'page'または'bleed'にアンカーし、ページ(または裁ち落とし)の枠を領域にする。- コンテナーの反対側の端にアンカーする。
ヘッダーのコンテナーは仕上がりの天から本文まで、フッターのコンテナーは本文から仕上がりの地までです。ヘッダーではtop-*アンカーは仕上がり線から、bottom-*アンカーは本文から測り、フッターではその逆です(上のコンテナーの枠を参照)。ヘッダーとフッターは本文のテキストを動かさず、その上に描画されるため、本文領域に押し出された要素はテキストを覆い隠します。一方、章扉の帯は本文のテキストの下に描画されます。それが流れの中でどれだけの領域を占めるかは確保する高さで説明しています。
#縦組みのテキスト要素
writingMode: 'vertical-rl'を指定したテキスト要素は、テキストが横組みのスロットの中で縦に組まれます。対象は、どの本でも紙面上の向きが変わらない柱とノンブル、そして横組みのページのあらゆるデザインです。要素は、時計回りに90度回した独自の枠の中で横組みのテキストとしてレイアウトされ、ページの向きに戻されます。
- ボックスは配置で指定した位置にとどまります。高さは1行の長さで、
size.heightで指定します('auto'ならテキストの長さ、'fill'ならコンテナーの端まで)。size.widthは横方向に何行収まるかを決め、size.maxWidthは1行の長さの上限を決めます。 alignはボックスに沿った行の位置('left'は上端)、verticalAlignはボックスを横切る方向の位置('top'は最初の行が立つ右端)を決めます。ボックスのパディングは、指定した辺に残ります。- 文字は縦組みのページと同じく測定・描画されます。漢字は1字ずつ全角で正立し、約物は縦組み用の字形になり、欧文の単語は横倒しになり、短い数字は1字分に収まります(
cjk.uprightDigits)。canvas、PDF、HTMLは同じ矩形の位置に配置します。 inlineMarks: trueを指定すると、本文と同じく向きの記号でランを区別できます。第:tcy[3.0]回は3.0を1字分に組み、:upright[GDP]は文字を正立させて縦に並べ、:sideways[…]はランを横倒しにします。これらの内部で行が分割されることはありません。横組みの要素はこれらを無視します。- 縦組みの要素にはドロップキャップを組みません。
- 縦組みのページの流れの中(章扉、部扉、囲みのタイトル)では、テキストはもともと縦に組まれるため、
writingModeは何も変えません。
縦組みの中国語の本では、柱とノンブルを次の3か所のいずれかに置きます(clreq §7.2。日本語についてはJLREQ §2.6)。
| 方式 | 位置 | 設定方法 |
|---|---|---|
| 横組みの柱とノンブル | 横組みの本と同じく、版面の上と下。最も一般的です。 | ヘッダーとフッターをそのまま使います。 |
| 小口(中缝式、台湾では邊峰) | 外側の余白に沿って縦に置きます。章名または書名は版面の天から約4字下から始め、ノンブルは版面の地から約5字上で終わるように置き、漢数字で、本文の約80%のサイズで組みます。 | 下に示す、'outer'にアンカーした2つの縦組みの要素。 |
| 小口側の地の角 | ページの地の、小口側の角に置くノンブル(台湾の中式の本の規則)。 | 右綴じの本では、フッターに'bottom-left'でparity: 'odd'の横組みの要素と、'bottom-right'でparity: 'even'の要素を置きます(左綴じの本では逆)。 |
Sandboxが追加する小口の柱(ヘッダー › 小口の柱(縦組み))を、本文が10 ptの場合で示します(Sandboxは本文サイズの80%で組みます)。
{
"page": { "pageNumbering": { "format": "trad-chinese-informal" } },
"header": { "elements": [
{ "kind": "text", "id": "head", "content": "{chapterTitle}", "writingMode": "vertical-rl",
"fontSize": { "value": 8, "unit": "pt" }, "overflow": "clip", "align": "left",
"placement": { "anchor": { "to": "outer", "edge": "top" }, "offset": { "y": { "value": 4, "unit": "em" } } } },
{ "kind": "text", "id": "folio", "content": "{pageNumber}", "writingMode": "vertical-rl",
"fontSize": { "value": 8, "unit": "pt" }, "overflow": "clip", "align": "left",
"placement": { "anchor": { "to": "outer", "edge": "bottom" }, "offset": { "y": { "value": -5, "unit": "em" } } } }
] }
}anchor.to: 'outer'(要素の配置を参照)は各ページの外側の余白を指すため、右綴じの本(page.binding)では、2つの要素は奇数ページの左端と偶数ページの右端に沿って縦に並びます。{pageNumber}はノンブルの書式で出力されます。103ページは、trad-chinese-informalでは一百零三、cjk-decimalでは一〇三になります。スロットごとの規則はここでも有効で、pages: 'body'を指定すると章扉には柱を出しません。柱とノンブルのあいだに置く短い飾り(魚尾︻、罫線)は、同じ枠にアンカーした通常の要素です。
VDTでは、縦組みのブロックはverticalを持ちます(VDTDesignTextBlock.vertical:領域、正立させる数字、各ファミリーの中心軸)。行はブロック自身の回転した枠の中にあり、xOffsetはボックスの上端から下向き、baselineYは右端から左向きに測ります。書式記号付きの行のランは、本文のセグメントと同じくtcyまたはorientationを持ちます。
#罫線要素
罫線要素は線を描画します。スロットを横切る水平線、またはスロットを縦に走る垂直線です。
| プロパティ | 型 | 既定値 | 説明 |
|---|---|---|---|
kind | 'rule' | — | 判別子。 |
id | string | — | スロット内で一意の固定ID。anchor.to: '#id'での参照に使います。 |
direction | 'horizontal' | 'vertical' | 'horizontal' | 水平の罫線はplacement.size.widthに沿って伸び('fill'はコンテナーの端まで)、高さはthicknessです。垂直の罫線はplacement.size.heightに沿って下へ伸び('fill'または未指定はコンテナーの端まで)、幅はthicknessです。柱とノンブルのあいだの区切り線などに使います。 |
color | ColorValue | #000000 | 線の色。 |
thickness | Dimension | 0.5 pt | 線の太さ。省略した罫線は既定値で描かれます(postext 1.4までは何も描かれませんでした)。 |
width | Dimension | 'full' | 'full' | 'full'は本文領域の幅に広がります。Dimensionを指定すると、alignで位置を決める固定長の線になります。 |
align | 'left' | 'center' | 'right' | 'center' | widthが'full'でないときのそろえ。 |
marginFromBody | Dimension | 6 pt | 罫線の本文側の辺と本文の端との絶対距離。ほかの要素からは独立しています。 |
marginFromEdge | Dimension | 0 pt | そろえた側の本文領域の端からの水平方向のインセット。widthが固定のDimensionで、alignが'left'または'right'のときだけ有効です。 |
parity | 'all' | 'odd' | 'even' | 'all' | 罫線を表示するページ。 |
pages | 'all' | 'body' | 'opener' | 'part' | 'blank' | 'all' | 罫線を表示するページの役割(テキスト要素のpagesフィールドを参照)。 |
reserve | boolean | true | 見出しのデザイン専用。見出しがテキストの流れの中に確保する高さに、罫線を含めるかどうか(確保する高さを参照)。 |
placement | ElementPlacement | align + marginFromBody + marginFromEdgeから導出 | 詳細な配置(要素の配置を参照)。size.width/size.heightで罫線の長さを指定します。width: 'fill'は従来の'full'に当たります。 |
#ボックス要素
ボックス要素はスロットの中に角丸の矩形を描きます。章扉、サイドバー、フッターでテキストの背景にするのに便利です。ボックス要素の位置はplacementフィールドだけで決まり、従来のフラットな省略形はありません。塗り、線、角の半径は、「要素の配置」のJSONの例のように、入れ子のstyleオブジェクト(ElementBoxStyle)に指定します。
| プロパティ | 型 | 既定値 | 説明 |
|---|---|---|---|
kind | 'box' | — | 判別子。 |
id | string | — | スロット内で一意の固定ID。同じスロットの要素はanchor.to: '#id'でこの要素にアンカーします。Sandboxは作成時にIDを割り当てます。 |
style.backgroundColor | ColorValue | transparent | 塗りの色。輪郭だけのボックスにするにはtransparentを指定します。 |
style.borderColor | ColorValue | transparent | 線の色。 |
style.borderWidth | Dimension | 0 pt | 線の太さ。線はボックスのバウンディング矩形の内側に描かれるため、外形の寸法は変わりません。線の外縁はボックスの縁に沿い、角丸のボックスは外側の半径を保ちます。ボックスと同じ太さの線はボックスを塗りつぶします。canvas、HTML、PDFは同じように描きます(postext 1.4までは、canvasとPDFは線を縁の中心に描いたため、半分がボックスの外に出ていました)。 |
style.borderRadius | Dimension | 0 pt | 角の半径。描画時に、短いほうの辺の半分までに制限されます。 |
placement | ElementPlacement | — | 必須。下の「要素の配置」を参照してください。 |
parity | 'all' | 'odd' | 'even' | 'all' | ボックスを表示するページ。 |
pages | 'all' | 'body' | 'opener' | 'part' | 'blank' | 'all' | ボックスを表示するページの役割(テキスト要素のpagesフィールドを参照)。 |
reserve | boolean | true | 見出しのデザイン専用。見出しがテキストの流れの中に確保する高さに、ボックスを含めるかどうか(確保する高さを参照)。 |
#画像要素
image要素は、文書のビットマップまたはSVGのリソースを描きます。扉ページの出版社のロゴや、柱に添えるマークなどです。サイズはplacement.sizeで決まります。width/heightの一方を'auto'(既定)のままにすると、もう一方は画像の縦横比に従います。両方を指定すると、画像はボックスに収まるように合わせて中央に置かれます。存在しないリソースや画像でないリソースは何も描きません。
{
kind: 'image', id: 'logo', resourceId: 'logo-publisher',
placement: { anchor: { to: 'page', edge: 'top-left' }, offset: { x: { value: 64, unit: 'mm' }, y: { value: 233, unit: 'mm' } }, size: { width: { value: 83, unit: 'mm' }, height: 'auto' } },
}resourceIdには、テキスト要素のcontentと同じプレースホルダーが使えるため、1つのデザインで見出しごとに異なる画像を描けます。見出しスタイルにresourceId: '{attr.vignette}'を指定すると、# Chapter I {style="opener" vignette="log"}はリソースlogを、# Chapter II {style="opener" vignette="wig"}はwigを描きます。画像ごとにスタイルを複製しなくても、各章で同じスタイルを共有できます。ヘッダーとフッターは、柱の{attr.<key>}と同じくページの章の属性を読み、ほかのプレースホルダーも使えます('map-{chapterNumber}')。見出しに属性がない場合など、空になったIDは何も描きません。postext 1.8から使えます。
| プロパティ | 型 | 既定値 | 説明 |
|---|---|---|---|
id | string | — | 固定の識別子。ほかの要素は#idとしてこれにアンカーできます。 |
resourceId | string | — | 文書のビットマップまたはSVGのResourceのID。{attr.<key>}をはじめとするプレースホルダーを含めることができ、見出し、部、ページごとに埋められます。 |
decorative | boolean | false | 画像は装飾専用です(飾り、帯)。リソースに代替テキストがあっても、出力に代替テキストを渡しません(下記参照)。 |
placement | ElementPlacement | — | アンカー、オフセット、サイズ(要素の配置を参照)。'fill'の辺はコンテナーの端まで伸びます。 |
parity、pages | 上と同じ | 'all' | 画像を表示するページ。 |
reserve | boolean | true | 見出しのデザイン専用。見出しがテキストの流れの中に確保する高さに、画像を含めるかどうか(確保する高さを参照)。 |
PDFバックエンドはリソースを図と同じように埋め込み(印刷用マスターを持つSVGはそれを使います)、HTMLビューアーはresourceImageUrlで解決します。
リソースが画像を説明している場合、デザインが描く画像はコンテンツになります。リソースのaltText、なければプレーンテキストにしたキャプション(チップはラベルで、:refはtextがあればそれで読みます)がVDTに入り(VDTDesignImageBlock.altText)、HTMLでは<img>のalt、タグ付きPDFでは/Altを持つFigureになり、そのデザインのテキストの直後に読まれます(章の図版は章の見出しの後)。リソースにどちらもない画像と、decorativeを指定した画像は装飾になり、HTMLではrole="presentation"付きのalt=""、PDFではアーティファクトになります。柱やフッターの画像はすべてのページで繰り返されるため、リソースの内容にかかわらず紙面の付属物として扱われます。VDTにはaltTextがなく、HTMLではrole="presentation"付きのalt=""、PDFではページのアーティファクトになります。
#要素の配置
ElementPlacementは、あらゆるデザインスロット(ページのヘッダー、ページのフッター、見出しレベルの詳細デザインのスロット)の中で、すべての種類の要素(テキスト、罫線、ボックス)が使う統一された配置モデルです。配置は3つの状態で記述します。
interface ElementPlacement {
/** What this element anchors to and which edge of that target. */
anchor: {
to: 'container' | 'page' | 'bleed' | 'outer' | `#${string}`; // container = the slot; page = trim box; bleed = trim box + bleed; outer = the outer margin (header, footer); #id = another element
edge: AnchorEdge;
};
/** Distance from the anchor point. */
offset?: { x?: Dimension; y?: Dimension };
/** Optional fixed width / height. Width also accepts 'fill' (span the slot).
* `maxWidth` caps an 'auto' width (text): the element still shrink-wraps its
* content, so elements anchored to it stay attached, but a long text wraps or
* ellipsizes there — a running head can reserve room for the label hanging
* off it instead of squeezing that label out. */
size?: { width?: Dimension | 'fill' | 'auto'; height?: Dimension | 'fill' | 'auto'; maxWidth?: Dimension };
}AnchorEdgeには次の値を指定できます。
- コンテナーの辺(
anchor.toが'container'、'page'、'bleed'のとき):top、top-left、top-right、bottom、bottom-left、bottom-right、left、right。 - 要素基準の辺(
anchor.to === '#someId'のとき):right-of、left-of、below、above、align-top、align-bottom、align-left、align-right。
要素基準の各辺は、要素の角の1つをアンカー先の要素の角に合わせ、offsetでそこから移動します。
right-of:要素の左上の角を対象の右上の角に合わせます(横に並び、上端がそろいます)。left-of:要素の右上の角を対象の左上の角に合わせます。below:要素の左上の角を対象の左下の角に合わせます(下に置き、左端がそろいます)。above:要素の左下の角を対象の左上の角に合わせます。align-topとalign-left:要素の左上の角を対象の左上の角に合わせます。2つの名前は同じ配置になり、上端と左端の両方がそろいます。align-bottom:要素の左下の角を対象の左下の角に合わせます。align-right:要素の右上の角を対象の右上の角に合わせます。
'container'、'page'、'bleed'とともに使った要素基準の辺、および'#id'とともに使ったコンテナーの辺は、左上の角として扱われます。
anchor.to: 'page'は要素をトリムボックス(断裁後の物理的なページ)に、'bleed'は各辺をcutLines.bleedだけ広げたトリムボックスにアンカーします(トンボが無効な間はトリムボックスと同じです)。どちらの枠もsize: 'fill'と自動幅の制限の基準にもなるため、ページの余白にかかわらず、色の帯を端から端まで伸ばせます。
{ "kind": "box", "id": "band", "placement": { "anchor": { "to": "bleed", "edge": "top-left" }, "size": { "width": "fill", "height": { "value": 6, "unit": "cm" } } }, "style": { "backgroundColor": { "hex": "#1d3557", "model": "hex" } } }トンボを有効にすると、要素が裁ち落としの枠の外に描いた部分は切り取られます(トンボを参照)。
anchor.to: 'outer'(ヘッダーとフッターのスロット)は、要素をページの外側の余白にアンカーします。これは、背と反対側で版面の端から仕上がり線までの範囲、かつ版面の天から地までの範囲です。左綴じの本では奇数ページの右側と偶数ページの左側、右綴じの本ではその逆になる(page.binding)ため、1つの要素で見開きの両ページに対応できます。小口に沿って縦に置く柱がその例です(縦組みのテキスト要素を参照)。ほかのスロットでは'container'として扱われます。テキスト要素のoffsetは、要素自身のfontSizeを単位とするemで書けます。版面の天から4字下は{ "y": { "value": 4, "unit": "em" } }です。
見出しの詳細デザインのスロットの中では、ページや裁ち落としにアンカーした要素は、見出しの上端より下に伸びない限り、見出しのために確保する高さを増やしません(ページ上部を横切る帯は章扉の背後に置かれ、見出しより下まで伸びる帯は本文のテキストを押し下げます)。章扉の高さをどんな場合でも固定で確保するにはadvancedDesign.minHeightを使い、テキストをまったく押し下げてはいけない要素にはreserve: falseを指定します。詳しい規則は確保する高さにあります。
各要素は固定のidを持ちます(Sandboxが自動で割り当てますが、手で設定することもできます)。ほかの要素にアンカーした要素は小さな依存グラフを作り、エンジンは測定の前にそれを解決します。そのため、手作業で座標を指定しなくても、要素を別の要素に連ねて配置できます。
従来のalign + marginFromBody + marginFromEdgeの形は入力時に解析され、設定の解決時にplacementへ書き換えられるため、既存の設定は変更なしでそのまま動作します。