章 7 · 部 II · 技法
設定:東アジアの組版
cjkの設定:中国語、日本語、韓国語の行分割、約物の幅、アキ、文字グリッド、ルビ、各種の記号
かんたんな説明
このページでは、中国語、日本語、韓国語の文字の設定を説明します。行をどこで分けられるか、句読点などの記号がどれだけの幅をとるかを決めます。これらの文字とラテン文字や数字とのあいだの空きを決めます。文字の横に小さく入れる読みがなや、名前や題名のそばに引く記号も扱います。中国語の組版と日本語の組版のガイドで、これらの設定の使い方を見られます。
#東アジアの組版
cjkプロパティは、中国語・日本語・韓国語のテキストの組み方を設定します。どの地域の慣習に従うか、行をどこで分割できるか、約物をどの幅で組み、ぶら下げるかどうか、漢字と欧文の間のアキ、版面の文字グリッド、そして圏点、傍線、ルビ、割注、漢文の訓点をどう印字するかを決めます。どのフィールドも省略でき、'auto'は文書の言語(locale)の地域に従います。そのためlocale: 'zh-Hant'の本は台湾式に行を分割して約物を組み、locale: 'ja'の本は日本式に組みます。ほかに設定するものはありません。中国語の組版と日本語の組版では、これらの設定の背後にある規則を、それぞれ2つの完全な設定例とともに説明しています。日本語向けのフィールドと値はpostext 1.16から使えます。
interface CjkConfig {
region?: 'auto' | 'mainland' | 'taiwan' | 'hongkong' | 'japan'; // Regional conventions.
lineBreak?: 'auto' | 'none' | 'basic' | 'gb' | 'strict'
| 'ja-very-strict' | 'ja-strict' | 'ja-loose'; // Which marks may not open or close a line.
punctuationWidth?: 'auto' | 'fullwidth' | 'kaiming' | 'lineEndHalf' | 'halfwidth';
compressAdjacent?: 'auto' | boolean; // Two marks that meet take 1.5 em.
trimLineStart?: 'auto' | boolean; // Brackets at a line edge lose their outer half.
hangingPunctuation?: 'auto' | 'none' | 'allow' | 'force';
spaceAfterQuestion?: 'auto' | boolean; // One em after ?! inside a paragraph (Japan).
paragraphStartBracket?: 'auto' | 'indent' | 'half' | 'flush'; // A bracket opening an indented paragraph.
wordBreak?: 'normal' | 'keep-all'; // keep-all: break only at spaces (分かち書き, Korean).
titleMinChars?: number; // Characters of a book title on either side of a break; default 2.
circledNumbers?: 'cjk' | 'western'; // ① ② as Chinese characters (default) or Latin letters.
composeDesignText?: boolean; // CJK rules in design text; default true.
latinSpacing?: Dimension; // Between Han and Latin; default 0.25 em.
uprightDigits?: 0 | 2 | 3 | 4; // Vertical text: numbers in one upright cell; default 2.
grid?: { enabled?: boolean; charsPerLine?: number; linesPerPage?: number; show?: boolean };
emphasis?: 'auto' | 'italic' | 'dots'; // What *…* does to CJK characters.
emphasisMark?: { // The mark *…* and :dots[…] draw when they do not say.
style?: 'auto' | 'dot' | 'circle' | 'sesame';
fill?: 'auto' | 'filled' | 'open';
position?: 'auto' | 'over' | 'under';
};
bookTitleMark?: 'auto' | 'brackets' | 'wavy' | 'none'; // What :book[…] prints.
bookTitleBrackets?: 'auto' | { open: string; close: string }[]; // The brackets, outermost first.
annotationColor?: ColorValue; // Dots and name/title lines; default the text colour.
ruby?: {
fontFamily?: string; fontSize?: Dimension; color?: ColorValue;
position?: 'auto' | 'over' | 'under' | 'right';
overhang?: 'auto' | 'none' | 'kana' | 'any'; // How far a reading may run onto its neighbours.
align?: 'auto' | 'center' | 'jis' | 'start'; // How a reading shorter than its base is spaced.
smallKana?: 'keep' | 'full'; // Small kana in readings as written, or full size.
};
warichu?: { fontSize?: Dimension; color?: ColorValue; open?: string; close?: string };
kunten?: { fontSize?: Dimension; color?: ColorValue; placement?: 'inline' | 'interlinear' }; // Kanbun marks.
}| プロパティ | 型 | 既定値 | 説明 |
|---|---|---|---|
region | 'auto' | 'mainland' | 'taiwan' | 'hongkong' | 'japan' | 'auto' | テキストが従う慣習です。地域の区分はW3Cの中国語組版の要件(Requirements for Chinese Text Layout)(clreq)に準じます。'auto'は地域をlocaleから読み取り、localeが未設定のときはbodyText.hyphenation.localeから読み取ります。zh、zh-Hans、zh-CN、zh-SGは'mainland'、zh-Hantとzh-TWは'taiwan'、zh-HKとzh-MOは'hongkong'、jaとすべてのja-*タグは'japan'になります。この地域の慣習はW3Cの日本語組版処理の要件(JLReq)に従います。その他の言語は'mainland'になります。地域は、以下のすべての'auto'フィールドの既定値を決めます。'japan'を手動で設定すると、どの文書も日本式に組まれます。ただし組み込みの文字列と、注および索引の既定値は引き続き文書の言語に従います。 |
lineBreak | 'auto' | 'none' | 'basic' | 'gb' | 'strict' | 'ja-very-strict' | 'ja-strict' | 'ja-loose' | 'auto' | 行頭・行末に置けない記号を決めます(clreq §6.1.1とJLReq付録C.3。下の表を参照)。'auto'は中国大陸では'gb'、台湾と香港では'basic'、日本では'ja-very-strict'です。どのレベルもあらゆる文書で選べます。 |
punctuationWidth | 'auto' | 'fullwidth' | 'kaiming' | 'lineEndHalf' | 'halfwidth' | 'auto' | 全角の約物をどの幅で組むかを決めます(約物の幅を参照)。'auto'は中国大陸では'kaiming'、台湾・香港・日本では'fullwidth'です(日本では、約物の連続、行末、中点についてJLReqの規則を適用します)。 |
compressAdjacent | 'auto' | boolean | 'auto' | 連続する2つの約物(。」、》(、:“)の間の二分のアキを詰め、2つで全角2つ分ではなく1.5em分にします。'auto'は中国大陸・香港・日本ではオン、台湾ではオフです。 |
trimLineStart | 'auto' | boolean | 'auto' | 行頭に来た始め括弧・始めの引用符は前側の二分のアキを、行末に来た終わり括弧・終わりの引用符は後ろ側の二分のアキを取り除きます。'auto'は中国大陸・香港・日本ではオン、台湾ではオフです。日本では、行末の終わりの約物は行がそのアキを必要とするまで二分のアキを保ちます(約物の幅を参照)。 |
hangingPunctuation | 'auto' | 'none' | 'allow' | 'force' | 'auto' | 読点類・句点類を行末より外にぶら下げてよいかを決めます(ぶら下げを参照)。'auto'は日本では'allow'(、。,.のみ)、それ以外では'none'です。postext 1.15までは既定値が'none'で、日本以外での'auto'は現在もその値です。 |
spaceAfterQuestion | 'auto' | boolean | 'auto' | 段落の中で、全角の?や!(‼⁇⁈⁉も含み、それらに続く注の合印の後も含む)の後に全角のアキを入れます。日本語の組み方です(JLReq §3.1.6)。終わり括弧や同種の記号の前、段落の末尾では入れず、行末に来たときは取り除きます。著者がそこに入力したU+3000やスペースは、このアキに置き換わります。このアキは伸び縮みしません。'auto'は日本ではオン、それ以外ではオフです。 |
paragraphStartBracket | 'auto' | 'indent' | 'half' | 'flush' | 'auto' | 1行目を字下げした段落が始め括弧で始まるときの組み方です(JLReq §3.1.5)。'indent'は字下げを保ち、括弧の後ろに全角のアキを与えます(パターン①)。'half'は括弧のグリフの前のアキを取り除き、グリフは全角の字下げの後半に収まって、本文はほかの段落の本文と同じ位置から始まります(パターン③)。'flush'は字下げせずに括弧を行頭にそろえます(天付き)。字下げのない段落やぶら下げインデントの段落はそのままです。'auto'は日本では'half'です。それ以外では、従来どおりほかの行頭と同じように括弧を組みます。 |
wordBreak | 'normal' | 'keep-all' | 'normal' | 2つの文字の間のどこで改行するかを決めます。'keep-all'はスペース(U+0020、U+3000)と、lineBreakが許す約物の隣(、。」の後、「の前)でだけ改行し、2つの文字(かな、漢字、ハングル、ラテン文字)の間では改行しません。絵本や初等教科書のように文節の間にスペースを入れて書くかな(分かち書き)や、韓国語に向いています。行より長い文節は、'normal'と同じ位置で文節の中で分割します。段落スタイルでも個別に設定できます(wordBreak)。postext 1.16以降。 |
titleMinChars | number | 2 | 書名の途中で改行するとき、改行位置の前後にそれぞれ最低何字残すか。対象は《…》と〈…〉の中(直接入力したものもbookTitleMarkが付けたものも)、および波線付きまたは記号なしで組む:book[…]の書名。2のとき、行末が《說で次の行が文》で始まることはなく、3字以下の書名は分割しない。一般に、この値の2倍から1を引いた字数以下の書名は分割しない。ほかに改行できる位置がない行ではこの規則を譲る(行より長い書名は、lineBreakが許す位置で途中から分割する)。1にすると、レベルが許す位置ならどこでも改行する。postext 1.25より前に保存した設定(configVersionが10以下)で、本に書名があるものは1として読み込む。postext 1.25以降。 |
circledNumbers | 'cjk' | 'western' | 'cjk' | CJKの段落での丸数字・括弧付き数字・ピリオド付き数字と文字の組み方:①〜⑳、⑴〜⒇、⒈〜⒛、ⓐ〜ⓩなどU+2460〜U+24FFの文字と、装飾記号の❶〜❿、➀〜➓。'cjk':漢字として組む。1字分の枠に収め、前後に和欧間のアキを入れず、後に続く文に番号を振るものなので行末に置かない。通貨記号を行末に置かないlineBreakのレベル(noneとja-loose以外のすべて)で有効。'western':欧文字として組み、前後に和欧間のアキを入れ、行末にも置ける。縦組ではどちらでも正立させる。postext 1.25より前に保存した設定で、本にこれらの文字があるものは'western'として読み込む。postext 1.25以降。 |
composeDesignText | boolean | true | 中国語・日本語のデザインテキスト(見出しデザインと扉、柱とノンブル、ページデザイン、部扉)を本文と同じ規則で組むかどうか:lineBreakの禁則、punctuationWidthとcompressAdjacentの約物の幅、latinSpacing、hangingPunctuation、titleMinChars。テキストの1行(2つの\nの間)は、段落と同じく、CJKの文字が語間スペースより多いときにこの規則で組む。それ以外の行は従来どおりスペースで折り返す。明示的な改行、paragraphIndent、ドロップキャップ、インラインの書式はそのまま働く。行は不揃いのまま(字間に配分しない)で、ルビ、割注、圏点はプレーンテキストとして印字する。falseにすると、このテキストはスペースで折り返し、約物はフォント本来の幅のまま組む。postext 1.25より前に保存した設定で、テキストにCJKを含むものはfalseとして読み込む。postext 1.25以降。 |
latinSpacing | Dimension | { value: 0.25, unit: 'em' } | 漢字とその隣のラテン文字または数字の間のアキです。CJKテキストの文字サイズを基準とするemか、任意の長さで指定します。0でオフになります(和欧間のアキを参照)。 |
uprightDigits | 0 | 2 | 3 | 4 | 2 | 縦組みで、この桁数以下の数字を1つの正立したマスに収めます(縦中横)。ただし欧文の文中にある数字は、その文の語に合わせて横倒しになります。0でオフになります(縦組みの数字を参照)。 |
grid | { enabled?, charsPerLine?, linesPerPage?, show? } | オフ | 版面を1行の字数と1ページの行数で指定します(文字グリッドを参照)。 |
emphasis | 'auto' | 'italic' | 'dots' | 'auto' | Markdownの強調(…)が中国語・日本語の文字をどう扱うかを決めます。'dots'は:dots[…]と同じように各文字の脇に圏点を付け(形と位置はemphasisMarkに従います)、同じ強調の中のラテン文字はイタリックのままです。'italic'は文字をイタリックにしますが、CJKの書体では疑似的な斜体にしかなりません。'auto'は文書の言語が中国語か日本語なら'dots'、それ以外では'italic'です(圏点と傍線、ルビ、割注を参照)。 |
emphasisMark | { style?, fill?, position? } | いずれも'auto' | …と属性のない:dots[…]が付ける圏点です。styleは'dot'、'circle'、'sesame'(﹅)、fillは'filled'または'open'(autoでは丸は白抜き)、positionは'over'(縦組みでは右)または'under'(縦組みでは左)です。autoの場合、日本では黒ゴマ点を文字の上(縦組みでは右)に付けます(JLReq §3.3.9)。それ以外では従来どおり点を文字の下(縦組みでは右)に付けます。圏点自身の属性が優先されます。 |
bookTitleMark | 'auto' | 'brackets' | 'wavy' | 'none' | 'auto' | :book[…]が印字するものです。書名を囲む括弧(bookTitleBrackets)、書名の下の波線の書名号、または書名だけのいずれかです。'auto'は中国大陸と日本では括弧、台湾と香港では波線です。 |
bookTitleBrackets | 'auto' | { open, close }[] | 'auto' | 'brackets'のときに:book[…]が使う括弧で、外側から順に並べます。リストより深く入れ子になった書名には最後の組を使います。'auto'(または空のリスト)は、日本では『』、次に「」、それ以外では《》、次に〈〉です。 |
annotationColor | ColorValue | 本文の色 | 圏点、専名号、書名号の色です。ルビと割注の色の既定値にもなります。 |
ruby | { fontFamily?, fontSize?, color?, position?, overhang?, align?, smallKana? } | 半分のサイズ、'auto' | :ruby[…]と{紅樓|hóng|lóu}のルビです。書体(既定値は本文の書体)、サイズ(既定値は本文の{ value: 0.5, unit: 'em' }、注音符号はその60%)、色、そしてルビ自身が指定しないときの位置('auto':注音符号は各文字の右、ピンインとかなは横組みでは文字の上、縦組みでは右)を決めます。overhangは、親文字より長いルビが隣の文字にどこまで掛かってよいかです。'kana'はかな、ー、約物のアキ側にルビ1字分、始め括弧にルビ半字分掛かり、漢字には掛かりません(JLReq §3.3.8)。'any'はルビのない隣の文字ならどれにでもルビ半字分掛かります。'none'は掛かりません。autoは日本では'kana'、それ以外では従来どおりルビのない隣の文字にルビサイズの4分の1まで掛かります。alignは、親文字より短いルビの配置です。'jis'は1:2:1(両端に二分、間に全角)、'center'はベタ組みで中央、'start'は親文字の先頭から配置します。autoは日本では'jis'、それ以外では'center'です。smallKana: 'full'はルビの小書きのかなを並字にします(既定値の'keep'は書かれたとおり)。ルビ自身のmodeとalignが優先されます。 |
warichu | { fontSize?, color?, open?, close? } | 半分のサイズ。括弧は日本では()、それ以外ではなし | :warichu[…]の2行の注です。注のサイズ(既定値は二分で、2行で行の全角を埋めます)、色、そして1行目の前と最終行の後に本文サイズで組む括弧を決めます(注自身のopen/closeが優先されます)。日本では、空のopenやclose('')を指定すると、その括弧なしで注を組みます。 |
kunten | { fontSize?, color?, placement? } | 半分のサイズ、'inline' | :kunten[…]の漢文の訓点(返り点、送り仮名、竪点)です。サイズ(既定値は{ value: 0.5, unit: 'em' }、JIS X 4051 §5.5)、色(既定値はannotationColor、未設定なら本文の色)、そしてplacementを決めます。'inline'はJISと同じく返り点を親字の後に二分の幅で組みます。'interlinear'はすべての訓点を行間に置き、送り幅を取りません。どの地域でも同じです(圏点と傍線、ルビ、割注を参照)。 |
| レベル | 行頭に置かない | 行末に置かない |
|---|---|---|
none | なし。台湾や香港の新聞のように、どの2文字の間でも改行できます。 | なし。 |
basic | 読点類・句点類 、,;:。!?.‼⁇⁈⁉、終わりの引用符 ” ’ 」 』と終わり括弧 )〕]}】〗》〉、連接記号 – ~ ~ と2語の間の単独の —、中点 · ‧ ・、繰返し記号 々〻ゝゞヽヾとー、数字の単位 % ‰ ° ℃ %と単位記号 ㎡ ㎏ ㏄。 | 始めの引用符 “ ‘ 「 『と始め括弧 (〔[{【〖《〈、通貨記号 ¥ $ € £。 |
gb | basicに加え、斜線 / /(GB/T 15834—2011 §5.1.9)。 | basicに加え、斜線。 |
strict | gbに加え、2倍ダッシュ —— ⸺と省略記号 …… ⋯⋯。 | gbと同じ。 |
日本語のレベルは、JLReq付録C.3の3つの慣習に従います。どのレベルでも、始め括弧・始めの引用符で終わる行はなく、通貨記号は数字から離れず(ja-looseを除く)、斜線には規則がなく、——、――、……は行頭に来てもよいものの分割されません(〳〵も同じです)。
| レベル | 行頭に置かない |
|---|---|
ja-very-strict | 終わり括弧類と終わりの引用符、、,。.、ハイフン類 ‐ – ゠ 〜 ~、?!‼⁇⁈⁉、・:;、繰返し記号 ゝゞヽヾ〻と々、ー、小書きのかな ぁぃぅぇぉっゃゅょゎゕゖ ァィゥェォッャュョヮヵヶ ㇰ–ㇿ(とその半角形)、単位 % ℃。JIS X 4051の既定です。 |
ja-strict | ja-very-strictから小書きのかな、ー、々を除いたもの(JLReqの一般書籍)。 |
ja-loose | 終わり括弧類と終わりの引用符、、,と。.のみ(新聞)。 |
すべてのレベルに共通する規則です。
- ——と……は全角2つ分の幅の1単位として扱い、分割しません。この単位が2つ続くときは、その間で分かれてもかまいません。
- 数字は符号や単位と離れず(¥5,999、50%、50%、120㎡)、間にスペースがあっても同じです(−3 ℃、50 %)。ラテン文字の語も分割されません。CJK文字に挟まれた欧文は、行の途中で改行しないひと続きとして組みます。ただし、その欧文だけで行より長い場合は、音節でハイフンを付けて分割するか、収まる最後の文字で分割します(ウェブアドレスは区切りの位置で分割します)。単位記号 ㎡ ㎏ ㎞ ㏄(U+3371〜337A、U+3380〜33DF、U+33FF)は数字のひと続きに含まれ、欧文の段落をCJKの段落にすることはありません。
- 全角の数字やラテン文字で書いた数や語(123456、50%、¥599、3.14、12:30、ABC)も分割しません。両端そろえの行では、漢字と同じようにそれらの字間も広げます。
- 単語間のスペースは、規則が許す場所でだけ改行位置になります。次の文字が行頭に置けない場合(
参见图表 ( 第三章 )は)で始まる行を作りません)や、スペース直前の文字が行末に置けない場合は、そこで改行しません。 - 脚注の合印、
:ref、上付き文字・下付き文字は、直前の文字から離れません。 - 和字間隔U+3000は全角幅の1文字です。その後では改行できますが、その前では改行しません。伸ばされることはなく、行頭でも取り除かれません。中国語の段落の2字下げには、U+3000を2つ入力するのではなく
bodyText.firstLineIndent: { value: 2, unit: 'em' }を設定してください(段落の先頭にあるU+3000はパーサーが取り除きます)。
行に収まらない文字が次の行の行頭に置ける場合は、その文字を次の行へ送り、両端そろえの行は残りの字間を広げます。次の行の行頭に置けない場合(読点、終わり括弧、始め括弧の次の文字)は、まず行を詰めてその文字を収めようとします(追い込み、clreq §6.2.2.3)。詰められるアキ(約物の幅を参照)であふれた分をまかなえれば、その文字は(句点の後の終わりの引用符のように、一緒にとどまるべき記号とともに)その行に入り、行は行長ちょうどに組まれます。まかなえなければ、行はその文字のために文字を手放します(追い出し)。改行位置は規則が許す直前の位置まで戻り、両端そろえの行は残りの字間を広げます。数字と句点を合わせた幅より狭い行では行末に置けるものがないため、結局は句点の前で改行します。
対象となる段落は、単語間のスペースよりCJK文字(漢字、かな、注音符号、ハングル)を多く含む段落です。CJK文字が2つ続いていなくてもかまいません(第1条、第2条、价¥5,999。好)。CJK文字や約物の隣のスペースは単語間のスペースとは数えません。2026 年 9 月 28 日は2026年9月28日と同じように組まれます。これらの段落は、装飾のない経路でも書式付きの経路でも1行ずつ組まれるため、太字の語を含む段落も、太字を除いた同じテキストとまったく同じ位置で改行します。中国語の書名や人名を引用する欧文の段落は文字よりスペースが多いので、最適改行を保ちます。その段落でも、CJK文字の隣では同じ規則で改行できます。キャプション、表のセル、注、囲みも文書のレベルで改行します。辞書によるハイフネーションは、CJKの段落内の欧文の語には及びません。
両端そろえのCJKの行のうち、段落の最終行でないものは、次の順で行長まで広げます(clreq §6.2.2.4)。欧文の語間のスペースを1つあたり二分まで、次に漢字と欧文の間のアキを1つあたり二分まで、最後にすべての字間とそれらのスペースを均等に広げます。ラテン文字の語、数字、全角2つ分の記号の内側にはアキを入れず、連接記号や斜線の隣にも入れません。アキは行のセグメントごとに設定され(VDTLineSegment.tracking。各文字の後のpx数で、セグメントのwidthに含まれます)、Canvas、HTML、PDFの出力は字間として描画します。後ろにアキのあるラテン文字の語は、最後の文字が独立したセグメントになります。セグメントには欧文のひと続き1つか、同じスタイル・リンク・字間で同じように送られる文字が入ります。そのためSandboxはカーソルを置くときにセグメントの幅を文字に均等に割り振り、リンクは自分の文字だけを覆います。字間を二分より(bodyText.maxJustifyTrackingを設定している場合はその値より)広げる必要のある行は、その上限まで広げて行長に満たないまま組みます。その行にはcjkLooseとraggedのフラグが付き、ビルドは行のテキストを含むcjkLooseLineコンテンツ警告を報告します。前の行に上げられない長いラテン文字の語やウェブアドレスがよくある原因です。CJK文字を含まない行(長いウェブアドレスの先頭部分など)は、欧文の1語だけの行と同じく、警告なしで行末不ぞろいに組みます。ハイフネーションと両端そろえを参照してください。
#約物の幅
中国語の全角の約物は、二分のグリフと二分のアキでできています。設定で調整するのはアキで、グリフは変わりません(clreq §6.3.2)。アキは、始め括弧・始めの引用符ではグリフの前、終わり括弧・終わりの引用符ではグリフの後ろ、そして中国大陸の読点類・句点類 、,。.;:?!ではグリフの後ろにあります(これらはボックスの隅に置かれます)。台湾と香港で中央に置く約物(、,。.;:)と中点は、両側に四分ずつのアキを持ちます。?!は台湾と香港の横組みでは全角のままで、縦組みではどの地域でも:;?!が全角のままです。中国大陸の中点は、どのスタイルでも、どちらの書字方向でも二分幅で中央に置きます(GB/T 15834、clreq §5.1)。全角のグリフは両側のアキを取り除き、縦組みでは最初からマスが二分です。
| スタイル | 行中 | 行末 |
|---|---|---|
fullwidth(全角式) | すべての約物を全角。 | 全角。trimLineStartがあれば終わり括弧は二分。 |
kaiming(开明式) | 。.?!は全角、,、;:、括弧、引用符、中点は二分。中国大陸の本の大半。 | すべての約物を二分。 |
lineEndHalf(行末半角) | すべての約物を全角。 | すべての約物を二分(GB/T 15834—2011 §5.1.10を文字どおりに読んだもの)。 |
halfwidth(半角式) | 辞書のように、すべての約物を二分。 | 二分。 |
日本(punctuationWidth: 'fullwidth'、autoの値)では、約物は代わりにJLReq §3.1に従います。、,。.はグリフの後ろにアキを持ち、:;と・は両側に四分ずつ、?!は全角を埋めます。行末の終わりの約物は二分のアキを保ち、行にもう1文字収める必要があるときは、まず最初にそのアキを丸ごと取り除きます。。の後ろのアキは行中では詰めません。行が詰めるアキの順序はJLReq §3.8.3に従います。単語間のスペース、行末の約物のアキ、中点、括弧と、,、そして和欧間のアキの順です。行を広げるときは、始め括弧の後、終わり括弧の前、、。・:;?!とU+3000の隣にはアキを加えません(§3.1.11)。2つの漢数字に挟まれた、と・はベタ組みにし、そこでは改行しません(二、三日、三・一四)。別のpunctuationWidth(kaiming、halfwidthなど)を指定した日本語の文書は、この節のclreqの規則に従います。
compressAdjacentを設定すると、連続する2つの約物の間のアキを詰めます(clreqの以前の草案にある8つの規則)。対象は、終わり括弧に続く終わり括弧、中国大陸の読点類・句点類に続く終わり括弧(。」。台湾と香港の中央に置く約物の後は対象外)、終わり括弧に続く読点類・句点類(」,)、これらのいずれかまたは別の始め括弧に続く始め括弧(,「、》(、「『)です。また、中点とその前の終わり括弧、またはその後の始め括弧の間は四分詰めます。詰めるのは、2つで1.5em分になるまでです。開明式では。”はもともと1.5em分なのでそのまま、》(は全角1つ分になります。開明式ではcompressAdjacentの有無にかかわらず、句点の後に終わりの約物が続くと、句点のアキをその約物の後ろに置きます。2つのグリフは隣り合い、二分のアキは引用符の後ろに来ます(。␣”母ではなく。”␣母)。行末では句点のアキと同じ扱いになります。trimLineStartを設定すると、行頭の始め括弧は前側のアキを取り除き、インクが本文の端にそろいます(段落の1行目では字下げの中に二分入ります)。行末の終わり括弧は後ろ側のアキを取り除きます。中央に置く約物は、片側で二分ではなく両側で四分ずつ取り除きます。2つの約物の間で改行するときは、どちらも詰めを保たず、それぞれ行の端の約物として組みます(全角の,の後の「が次の行頭に来る場合、読点の行は全角で終わります)。
行頭に置けない文字を行に収める(追い込む)のは、まだ詰められるアキであふれた分をまかなえるときです。詰める順序はclreqに従います。単語間のスペースを四分まで、次に中点、括弧、読点類、漢字と欧文の間のアキを八分まで、最後に句点類で、各段階で均等に詰めます。kaimingが句点類を二分まで詰めるのはこの場合だけです。もう1文字分足りないだけの行は広げて組むので、。?!は行中で全角を保ちます。lineEndHalfはすべての約物を二分まで詰められます。fullwidthの約物は何も詰めず(全角式の本は字詰めの格子を保ちます)、halfwidthの約物にはもう詰めるアキがありません。
欧文と中国語で共通の約物(“ ” ‘ ’ … — ·)は、中国語のテキストの中では、フォント自体の送り幅にかかわらず中国語の約物のボックスを取ります。LXGW WenKaiは“ ”を0.35em幅で描き、Noto Serif SCはemダッシュを0.89em、·を3分の1emで描きます。これらの記号は、両側のどちらかで最も近い文字(同種の記号は飛ばします)が中国語であるか、隣に欧文が何もないときに中国語として扱います。始めの引用符のグリフは全角のボックスの末尾に、終わりの引用符のグリフは先頭に置きます。中点、省略記号、単独のダッシュは中央に置きます。2つ続く省略記号(……)は、フォントが2つを並べて組んだ形で、全角2つ分の中央に置きます。破折号(——)は途切れない1本の線です。各ダッシュを書体自体のサイドベアリングから全角いっぱいに伸ばし、2本の線を継ぎ目で重ね、文字の中央の高さまで上げます(VDTLineSegment.inkScale。描画時だけの拡大率です)。そのうえで、ほかの約物と同じようにスタイルがボックスを調整します。両側が欧文の場合(他说:He said “yes” and left.)はフォントの送り幅を保ち、もともと全角幅のグリフは何も変わりません。
レンダラーは、ブラウザー独自の約物のアキをテキストに持ち込みません。Chromeは、連続する2つの約物を1つのランとして計測・描画すると、最初の約物を半角にします(Noto Serif SCの本)》录はそのように組むと3.5em)。そのため連続する2つの約物は別々に計測・描画し、CJKテキストのHTMLの行にはtext-spacing-trim: space-allとtext-autospace: no-autospaceを付け、chws、halt、vchwの機能をオフにします。
VDTでは、アキを詰めた約物はそれだけで1つのセグメントになり、widthは残った送り幅で、inkOffset(px)が設定されます。レンダラーはそのグリフをx + inkOffsetに描画するので、グリフの前のアキを詰めた約物(行頭の始め括弧)はボックスよりその分だけ前に描かれます(負のオフセット)。中国語のボックスで組んだ共通の約物は、ボックス内のグリフの位置から前側で詰めたアキを差し引いた値を持ち、正の値になることもあります。PDFでは、そのようなグリフに文字間隔を付けて送り幅がボックスの終わりで終わるようにするため、読者には次の文字に重なって見えません。またその行を/ActualTextのスパンに入れます(和欧間のアキを参照)。約物のアキがどちら側にあるかを決めるのはフォントではなく地域です。本はその地域の書体で組んでください(中国大陸にはNoto Serif SC、台湾にはTC、香港にはHK)。中国大陸のタグで繁体字のフォントを使うと、中央に置く約物の誤った側を詰めてしまいます。
#ぶら下げ
日本でのautoの値であるhangingPunctuation: 'allow'は、、,。.のいずれか(約物がボックスの先頭側に置かれる中国大陸では;:?!も)が次の行の行頭に来てしまい、行を詰めても収められないときに、行末より外へぶら下げます。台湾と香港の横組みでは、中央に置いた約物が切れて見えるためぶら下げません(縦組みでは可能です)。縦組みでは、ぶら下げた約物は行の下端の外に置かれます。'force'は、そうした約物が行末に来たときは(段落の最終行を除き)常にぶら下げ、収まらないときはただちにぶら下げます。ほかの約物と接している約物(。」、,「)はぶら下げません。ぶら下げたセグメントにはhangsのフラグが付きます。行のbbox.width、両端そろえ、行のそろえ位置はこのセグメントを除いて計算し、CanvasとPDFは段のクリップ領域を最も広いぶら下げ約物の幅(hangingPunctuationOverhang)だけ広げるので、切れることはありません。中国語の本の多くは約物をぶら下げず、clreqがぶら下げを勧めるのは文字グリッドを使う場合だけです。日本語の本は、どちらの書字方向でも、、。,.をぶら下げ(ぶら下げ組み)、;:?!や括弧はぶら下げません。ぶら下げるのは、行を詰めてもその約物を収められないときだけです。
#和欧間のアキ
latinSpacing(既定値は四分)は、漢字(またはかな)とその隣のラテン文字・アラビア数字の間にアキを入れます。用iPhone拍照と1999年は用 iPhone 拍照と1999 年のように組まれます。行頭と行末、ラテン文字と中国語の約物の間(用iPhone,ではコンマの前に何も入れません)、中国語の括弧の内側((iPhone))、文字でも数字でもない記号の隣(为¥5,999)にはアキを入れません。著者がこうした境界に入力したスペース(多くのウェブのテキストにある用 iPhone 拍照のような書き方)は、和欧間のアキに置き換え、加算はしません。そのため2通りの書き方は同じように組まれます。ノーブレークスペースと和字間隔はそのまま残します。両端そろえの行では、文字の字間を広げる前にこのアキを二分まで広げます。行頭に置けない文字を追い込む行では八分まで詰めます。em以外の単位で指定した長さは、ページのdpiで換算します。0でオフになり、そこに入力したスペースは単語間のスペースのままです。
このアキは、autospaceのフラグが付いたkind: 'space'のセグメントで、textは空(または著者が入力したスペース)です。widthは確定値で、レンダラー独自のスペースによる両端そろえはこれを変えません。プレーンテキストには含まれないため、検索、コピー&ペースト、ソース範囲は書かれたとおりのテキストを読み取ります。PDFでは、分割して組んだ行(字間を広げた文字、和欧間のアキ、アキを詰めた約物、ぶら下げた約物を含む行)をすべて/Spanに入れ、その/ActualTextを行のテキストにします。そのためテキスト抽出では用 iPhone 拍 照ではなく用iPhone拍照と読み取られ、半角の約物を含む行も1行として読み取られます。
#縦組みの数字
縦組みでは、ラテン文字の語や長い数字は横倒しにし、短い数字は正立させて、その桁を全角1マスに横に並べます。これが縦中横です(縱中橫、clreq §2.1.3、CSS text-combine-upright)。uprightDigitsは、そうした数字の最大桁数を2(既定値)、3、4、またはなしを意味する0で設定します。2のとき、2026年9月28日の2026は横倒し、9は正立、28は1マスに正立します。
- 数字全体を縦中横にするか、まったくしないかのどちらかです。
2のとき、3桁の数字は分割されず横倒しのままです。 - ラテン文字と接する数字(
A4、mp3、3D)は語の中にとどまり、横倒しになります。小数点や桁区切りを含む数字(3.14、10,000)も同じです。 - 欧文の文中にある数字はその文に従います。両側にラテン文字の語があれば、語と一緒に横倒しになります(
printed in 49 and 32 copies、chapters 49, 32 and (7) of)。左右それぞれ、スペース、ほかの数字、注の合印、横倒しのランの約物(, . : ; ( ) ' " - /)、enダッシュとemダッシュ、カーリークォート(pages 3–5 of、the “49” copies)を飛ばし、最初のラテン文字か中国語の文字まで見ます。約物の先が中国語のテキストに続く数字は正立します(上午12:30:45开会、比分为3:2:1、见图(3)所示、他住在"12"号楼)。中国語の文字や約物の隣にある数字(スペースの有無を問いません。第 3 回、用iPhone 15拍攝、第3 copies)、正立する記号の隣の数字(a 30×40 print)、片側にしか語のない段落の先頭や末尾の数字(49 copies were printed、on page 7.。横倒しにするには:sideways[…]と書きます)も正立します。段落は改行、強調、リンクをまたいで全体として読み取ります。 - Unicodeが正立とする記号の隣では、数字はそれぞれ独自のマスを取ります。
30×40は30、×、40がすべて正立します。 - 全角1つ分に収まらない文字数のマスは、全角幅に押し縮めます。トラッキングや両端そろえはマスの内側には入らず、後ろにだけ入ります。
- 改行と両端そろえの際、マスは中国語の1文字として数え、その前後に和欧間のアキは入れません。
- 日本では、半角または全角の
!!、!?、?!、??の組も1つの正立したマスに収めます(すごい!?)。ただし、ラテン文字、数字、3つ目の約物と接している場合を除きます。全角の組は半角の約物で描画します。小書きのかな、:;、“ ”(〝〟で描画)、・は日本語の縦組み用字形を使います(日本語の組版 › 縦組み用の字形を参照)。 - 計測器とすべてのレンダラーは同じマスを見つけます。Canvasは数字を正立に戻して押し縮めて描画し、PDFも横組み用のフォントで同じように描画し、HTMLは
text-combine-upright: allで囲みます。
手動で指定する場合は、3つのインラインマークが縦組みでこの設定を上書きします。横組みでは何も変わりません(文書形式 › 縦組みでの文字の向きを参照)。
第:tcy[120]回、:upright[GDP]與:sideways[12]:tcy[…]はテキストを1つの正立したマスに収め、:upright[…]は各文字をそれぞれのマスに正立させ(ラテン文字はマスの中央)、:sideways[…]は中国語の文字も含めてラン全体を横倒しにします。VDTでは、:tcyのランはtcy: trueを持つ全角幅のセグメントになり、:uprightや:sidewaysのランはorientationを持ちます。uprightDigitsで1マスにした数字にはフラグがありません。verticalRuns(graphemes, region, uprightDigits)で見つけられます。段落内でラテン文字の語と一緒に横倒しになる短い数字は、:sideways[…]と書いた場合と同じくorientation: 'sideways'を持ちます。そのセグメントに、一緒に並ぶ語が含まれるとは限りません。
#文字グリッド
中国語の版面は文字数で指定します(clreq §7.1.1)。本文の文字サイズ×1行の字数×1ページの行数に、行間と、2段組みなら段間を加えたものです。gridは版面をこの方法で設定します。
cjk: { grid: { enabled: true, charsPerLine: 28, linesPerPage: 28, show: true } }enabledのとき、設定は何かが読み取る前に書き換えられます。各段の幅はbodyText.fontSizeのcharsPerLine字分、版面の高さはbodyText.lineHeightのlinesPerPage行分になります。layoutType: 'double'では、段間はlayout.gutterWidthを全角の整数倍(最低1字)に丸めた値です。page.marginsの余白は最小値として扱われます。版面はそれらの余白が残す領域の中央に置かれ、各余白は、その軸方向に残った余裕の半分ずつ広がります(見開きを対称にした本では、のどと小口の余白は別々の値のまま、同じ量だけ広がります)。charsPerLineとlinesPerPageを設定しない場合は、収まるだけの数になります。収まる数より大きい値は収まる数まで減らし、cjkGridClamped設定警告として報告します。フォントサイズと行の高さは書かれたとおりのままです。oneAndHalfレイアウトでは、charsPerLineは主段の字数です。サイド段は、設定した余白の内側でsideColumnPercentが与える幅に最も近い全角の整数倍(最低1字)を取り、段間は2段組みと同じように丸められ、両方の段が全角の整数倍で区切られるようにsideColumnPercentが書き換えられます。縦組み(layout.writingMode: 'vertical-rl')では、行の文字はページを上から下へ、行はページを横切って並ぶので、charsPerLineはページの高さ方向で測ります。doubleレイアウトは上下に重なった2段になり、オーバーレイのマスは文字の中心が並ぶ軸の上に置かれます。
中国の慣行から2つのレイアウトを挙げます。どちらも五号(10.5 pt)、行間6 pt(lineHeight: 16.5pt)です。
- 大32开、140×203 mm、28字×28行:行長294 pt(103.7 mm)、版面の高さ462 pt(163 mm)。
page.marginsをのど・小口16/20 mm、天・地18/20 mmにすれば収まります。 - 16开、184×260 mm、小五(9 pt、行送り13.5 pt)で23字の2段組み、段間2字:2×207 pt+18 pt。
showは版面にグリッド(稿纸、原稿用紙)を重ねて描きます。各行の文字位置ごとに薄い灰色の正方形を1つ描き(ベースラインを基準にした文字の全角ボックス)、ページの各段に描きます(oneAndHalfのサイド段は、ページの奇数・偶数で決まる側に描きます)。CanvasとHTMLに描画されます。PDFに描くのはrenderToPdfにcharacterGrid: trueを渡したときだけです。画面上の補助として使うものです。cjkGridGeometry(config)は設定が決めるグリッド(使われる数値、余白、版面)を返し、applyCjkGrid(config)は書き換えた設定を返します。
#圏点と傍線、ルビ、割注
中国語の記号、ルビ、割注のマークアップは、テキストを段落の中に残します。検索、目次、索引のアンカー、コピーしたテキストは書かれたとおりの文字を読み取り、これらの設定で変わるのは文字の周りに描くものだけです。
- 圏点(着重号、傍点。
:dots[…]と、emphasis: 'dots'のときのCJK文字に付けた*…*)は、文字1つにつき1つ、文字の中央に付きます(両端そろえで広げたアキは含みません)。約物やスペースには付きません。横組みでは文字の下、縦組みでは右に付きます(clreq §5.3.1)。styleで黒点、白丸、ゴマ点を選び、fill="open"で白抜きにし、pos="over|under"で側を決めます。圏点自身が指定しない項目はemphasisMarkが決めます(日本では、ゴマ点を文字の上、縦組みでは右に付けます)。ゴマ点はどちらの書字方向でも紙面上で同じ向きに立ち、ルビと同じ側の圏点はルビの外側に付きます。 - 傍線(
:sideline[…]{style pos})は約物やスペースも含めてテキストの脇に引きます。solid、double、wavy、dottedがあり、既定では横組みで文字の下、縦組みで文字の右に引きます。2本の線が接するときは、それぞれ八分ずつ縮めます。どの文字体系でも使えます。 - 専名号と書名号(专名号
:name[…]、bookTitleMark: 'wavy'のときの书名号:book[…])は、文字の全角ボックスの下(縦組みでは左)に、ラン内のスペースもまたいで引きます。2つのランが接するところでは、それぞれの端を八分ずつ縮めるので、:name[賈寶玉]:name[林黛玉]は2つの名前として読めます。同じテキストの同じ側に圏点と線がある場合は、線のほうがテキストに近くなります。'brackets'のときの《》は、行を分割するときにも扱われるテキストで、ほかの文字と同じように描画・コピーされます。ただしプレーンテキストやソースマップの文字は占めません(セグメントにはinsertedのフラグが付きます)。 - ルビは、親文字の全角ボックスに接して行間に置かれ、親文字に対して中央にそろいます。ラテン文字を含むルビ(ピンイン)が親文字の上に立つ場合は、書体のディセンダー(g、j、p、q、y)の深さに本文の0.04emを加えた分だけ持ち上げて親文字に重ならないようにし、行のすべてのルビは1本のベースラインを共有します。親文字より広いルビは、ルビのない隣の文字に掛けてよいルビ全角の4分の1を差し引いた分だけ親文字のボックスを広げます。2つのルビの間はルビ全角の4分の1空けます(注音符号2つの間は記号の全角の4分の1で、2つの文字の脇にそれぞれ3つの記号を並べてもマスに収まります)。モノルビ(1文字に1つのルビ)は文字の間で改行でき、グループルビは改行しません。日本では、ルビは代わりに
ruby.alignとruby.overhangに従います。親文字より短いときは1:2:1で配置し、長いときはかなには掛かっても漢字には掛からず、残りは親文字の字間を広げてまかないます。2文字以上のモノルビは熟語ルビで、各文字はそれぞれのルビを保ちます。ルビは語の次の文字に掛かってもよいものの、別のルビとは重ならず、行はその間で改行できます(JLReq §3.3)。行頭・行末では、親文字とルビを行の端にそろえます(clreq §5.5.4)。横組みの注音符号は各文字の右に縦1列で並び、文字のボックスはその列の分だけ広がります。縦組みでは同じ列が文字の右側を上から下へ並びます。声調記号は列の右に、インクの半分が最後の記号の上端より上に出るように置きます(clreq §5.5.3.3)。フォントはこうした記号を全角ボックスの高い位置に置くので、位置はインクを基準に決めます。縦組みでは、最初の記号の上に付く軽声の点と同じく、正立します。 - 割注(双行夹注)は注のサイズで2行に折り返し、行の中央に行間なしで置きます。上の行は、少なくともその部分の半分を収めるまで文字を取るので、下の行のほうが長くなることはありません。下の行が行頭に置けない約物で始まってしまう間は、さらに1文字取ります。行の残りの領域より長い注は、その行を埋めて次の行・段・ページに続きます。括弧は最初の行の前と最後の行の後にだけ付きます。縦組みでは、右の行が上の行で、先に読みます。
- 訓点(
:kunten[字]{kaeri okuri tate})は、最後の文字の返り点をその次の文字の行の下端側(縦組みでは左下)に、送り仮名を文字の中ほどから行の上端側に置きます。長い送り仮名は次の文字を押し下げます。竪点は次の文字までの短い線として引きます(JIS X 4051 §5)。コピーしたテキストとPDFの/ActualTextでは、送り仮名は文字の後に続けて読み取られ、返り点は除かれます。訓点を置くには狭すぎる行間はkuntenExceedsLeadingとして報告します。
行送りは変わりません。圏点やルビは行間に収まります。行間(行の高さから文字サイズを引いたもの)が、片側にだけ記号が付く場合は二分、両側に付く場合は8分の5em(clreq §5.6.1)を下回る段落は、cjkMarksExceedLeadingコンテンツ警告として報告します。ルビが行間より高い段落(ピンインのルビは持ち上げた分を含めて数えます)はrubyExceedsLeadingとして報告します。そうした段落には、行送りを広げた段落スタイルを指定してください。振り仮名を付ける日本語の本は、本文の行の高さを1.75em程度にするのが一般的です(JLReq §2.4.2)。
VDTでは、記号付きのセグメントはcjkMarksを持ち、レイアウトは点や線をVDTLine.marks(点、丸、ゴマ点、直線、二重線、点線、波線。行の流れの座標系で表します)としてその行に置きます。Canvas、HTML、PDFはこれをそのまま描画します(PDFではArtifact /Layout、HTMLではaria-hiddenのボックスと、圏点付きテキストの<em>)。ルビの親文字のセグメントはruby(ルビとそのラン。日本語のルビでは、熟語のほかの文字と共有する注釈のidとjukugoも)を持ち、ルビによって字間が広がった場合はtracking付きで親文字をinkOffsetの位置に描画します。訓点の付いた文字はkunten(そのランと竪点)を持ちます。行上にある割注の部分は1つのセグメントで、そのtextは上の行、次に下の行で、warichuにはレンダラーが代わりに描画する2行が入ります。タグ付きPDFは、ルビを親文字のRubyのRTに、注をWarichuに入れ、行の/ActualTextは親文字と注を1回ずつ読み取ります。圏点、ルビ、注は、本文、見出し、リスト、囲み、そしてリソースのキャプション、表のセル、注に描画され、それらの行は本文の行と同じくmarksとrubyを持ちます。デザインのテキストは、これらを付けずにテキストだけを保ちます。
設定の解決と既定値の除去は、ほかの節と同じ仕組みです。spaceAfterQuestion、paragraphStartBracket、wordBreakと、ルビのoverhang、align、smallKanaは、何かを変える場合(日本の場合、または設定した場合)にだけ解決済みの設定に含まれます。setCjkLineBreakとsetCjkCompositionは、buildDocumentの外で行う計測のために、レベルと組み方(約物の幅、ぶら下げ、和欧間のアキ。cjkCompositionOf(resolved.cjk, dpi))を設定します。ビルドの中では、設定からこれらが自動で設定されます。ビルドの外では、約物は送り幅をすべて保ち、和欧間のアキは入りません。
import { DEFAULT_CJK_CONFIG, resolveCjkConfig, stripCjkDefaults, cjkRegionOf, setCjkLineBreak, setCjkComposition, cjkCompositionOf } from 'postext';
resolveCjkConfig(undefined, 'zh-HK');
// { region: 'hongkong', lineBreak: 'basic', punctuationWidth: 'fullwidth', compressAdjacent: true,
// trimLineStart: true, hangingPunctuation: 'none', latinSpacing: { value: 0.25, unit: 'em' }, uprightDigits: 2,
// grid: { enabled: false, charsPerLine: 0, linesPerPage: 0, show: false },
// emphasis: 'dots', emphasisMark: { style: 'dot', fill: 'auto', position: 'auto' },
// bookTitleMark: 'wavy', bookTitleBrackets: [{ open: '《', close: '》' }, { open: '〈', close: '〉' }],
// ruby: { fontSize: { value: 0.5, unit: 'em' }, position: 'auto' },
// warichu: { fontSize: { value: 0.5, unit: 'em' }, open: '', close: '' }, kunten: { … } }
resolveCjkConfig(undefined, 'ja');
// { region: 'japan', lineBreak: 'ja-very-strict', punctuationWidth: 'fullwidth', compressAdjacent: true,
// trimLineStart: true, hangingPunctuation: 'allow', spaceAfterQuestion: true, paragraphStartBracket: 'half', …,
// emphasisMark: { style: 'sesame', fill: 'auto', position: 'over' }, bookTitleMark: 'brackets',
// bookTitleBrackets: [{ open: '『', close: '』' }, { open: '「', close: '」' }],
// ruby: { fontSize: { value: 0.5, unit: 'em' }, position: 'auto', overhang: 'kana', align: 'jis' },
// warichu: { fontSize: { value: 0.5, unit: 'em' }, open: '(', close: ')' }, kunten: { … } }Sandboxでは、これらの設定はデザイン › 表記体系 › 東アジアの組版にあります。