章 6 · 部 II · 技法
中国語の組版
Postextが中国語を横組みと縦組みで組む方法。地域、禁則処理、約物の幅、字間による両端そろえ、文字グリッド、右綴じの本、縦中横、符号、ルビ、割注、漢数字、フォント
かんたんな説明
このページでは、Postextが中国語の文章をどう並べるかを説明します。中国語は、文字を横に並べて上から下へ行を重ねることも、縦に並べて右から左へ行を進めることもできます。中国大陸、台湾、香港では、句読点の置き方や行の区切り方の決まりが少しずつ違い、Postextはそれぞれの決まりに従います。縦書きの中の数字、文字の横に小さく付ける読み方、小さな文字で入れる注、使うフォントについても説明します。最後に2つの完全な例と、まだできないことを挙げます。
中国語のページは正方形のマス目でできていて、それを埋める規則は本が印刷される場所によって変わります。
Postextは、1つのMarkdownソースと1つの設定から、中国語を横組みでも縦組みでも組みます。同じエンジンが、中国大陸の小説ではGB/T 15834が定める位置に、台湾の版では教育部の手引きが定める位置に約物を置き、それぞれの地域の規則で行を分割し、約物の内側のアキを調整し、両端そろえの行では字間を広げ、縦の行では短い数字を立て、右から開くように見開きの向きを変えます。このページでは、エンジンが何をするのか、どの設定がそれを制御するのかを説明します。各キーと既定値は設定リファレンスに、マークアップは文書形式にあります。
規則はW3CのRequirements for Chinese Text Layout(clreq)と、それが依拠する国家規格に従います。以下ではclreqを節番号で引用します。参考資料はページの最後に挙げます。
#マス目、グリッド、地域
漢字は幅1em・高さ1emの正方形(全角)を占めます。全角の約物も同じで、字形が二分、アキが二分です。ベタ組みにすると、文字は行の方向だけでなく、行と直交する方向にもそろいます。そのため中国語の版面は、ミリメートルではなく字数と行数で指定します。本文の文字サイズ、1行の字数、1ページの行数、行間、2段組みなら段間です(clreq §7.1.1)。10.5 ptで28字の行は幅294 ptになり、本の両端そろえの行はどれも同じマスで終わります。
横組みのページでは、行は左から右へ進み、上から下へ重なります。綴じは欧文の本と同じく左綴じです。縦組みのページでは、文字は上から下へ、行は右端から左へ進みます。本は右綴じになるため、1ページ目は左ページで、見開きは右から左へ読みます(clreq §7.1.1.1)。
#字体より地域
簡体字か繁体字かは字体(綴り)の問題です。組版の規則は印刷される場所で決まります。北京で印刷される繁体字の古典は中国大陸の規格に、台湾の小説は台湾の規格に従います。clreqはソフトウェアに対し、組版規則を「繁体字か簡体字か」ではなく「地域」で区別するよう勧めており(§1.2)、Postextは字体と地域の両方を文書の言語config.localeから読み取ります。
- 字体は組み込みの語句を決めます。図には图または圖、続く表のキャプションの後には(续)または(續)、索引には见または見を使い、見出しテンプレートが書く数字も字体で決まります。
zh、zh-Hans、zh-CN、zh-SGは簡体字、zh-Hant、zh-TW、zh-HK、zh-MOは繁体字です。 - 地域は
cjkキーの組版上の既定値を決めます。CN、SG、MYは中国大陸、TWは台湾、HKとMOは香港として扱います。地域のないタグは字体に従い、zh-Hantは台湾、zhとzh-Hansは中国大陸とみなします。cjk.regionで上書きできます。
タグは省略せずに書いてください。zh-Hansまたはzh-Hantに加え、地域がわかっていればそれも含めます(zh-Hans-CN、zh-Hant-TW、zh-Hant-HK)。同じタグがHTML(文書のlang)とPDF(/Lang)に宣言され、ブラウザーとPDFビューアーはそれを使って地域の字形を選びます。Unicodeでは骨は1つのコードポイントですが、中国大陸のフォントと台湾のフォントでは字形が異なります。中国語の文書では、欧文の単語のために有効にしない限り、ハイフネーションは無効です。
| 既定値 | 中国大陸(zh-Hans、zh-CN) | 台湾(zh-Hant、zh-TW) | 香港(zh-HK、zh-MO) |
|---|---|---|---|
禁則処理(lineBreak) | gb | basic | basic |
約物の幅(punctuationWidth) | kaiming | fullwidth | fullwidth |
隣り合う2つの約物を全角1.5字分にする(compressAdjacent) | する | しない | する |
行頭・行末の括弧のアキを削る(trimLineStart) | する | しない | する |
| 横組みの 、,。 | マスの左下 | 中央 | 中央 |
| 縦組みの 、,。 | マスの右上 | 中央 | 中央 |
| 中黒 · | 二分 | 全角 | 全角 |
hangingPunctuation有効時にぶら下げられる約物 | 、,。.;:?! | 、,。.(横組みでは'force'のときのみ) | 、,。.(横組みでは'force'のときのみ) |
:book[…](bookTitleMark) | 書名を《》で囲む | 波線 | 波線 |
中国語の文字に付けた*…*(emphasis) | 圏点 | 圏点 | 圏点 |
| 図、表の続き、参照 | 图, (续), 见 | 圖, (續), 見 | 圖, (續), 見 |
索引の見出し分け(index.groupBy) | ピンインの頭文字 | 画数 | 画数 |
最後の2行は地域ではなく字体に従います。北京で印刷される繁体字の古典(zh-Hant-CN)は、中国大陸の禁則処理と約物に加えて、圖、(續)、見と画数による見出し分けを使います。香港向けのタグを付けた簡体字の本(zh-Hans-HK)は、图とピンインによる見出し分けを使います。
日本語の文書には、postext 1.16から独自の地域japanがあります。日本語の組版を参照してください。韓国語の文書にはハイフネーションなしの規則とCJKコンポーザーが適用されますが、独自の規則はまだありません。中国大陸の既定値で組まれ、ハングルの段落ではフォント本来の引用符とダッシュがそのまま使われます。
#中国語の章のMarkdown
中国語のテキストも、ほかの言語と同じMarkdownで書きます。次の点を押さえると書きやすくなります。
- どこで改行してもかまいません。中国語の2文字の間の改行は、CSSと同じく削除されるため、80桁で折り返すエディターを使ってもテキストに空白は入りません。2つの約物の間(
”⏎“)では、その外側の文字によって決まります。行の途中で入力した空白は残ります。 - 字下げは設定で指定します。2字分の段落字下げは
bodyText.firstLineIndent: { value: 2, unit: 'em' }です。パーサーは段落の先頭にある全角スペース(U+3000)を削除します。 - マークアップはASCIIで入力します。中国語の入力メソッドでは
:::、#、[^1]、{…}、**が入力されますが、これらはテキストとして印字されます。ビルドは該当する行ごとにfullwidthMarkupを報告し、入力すべきASCIIの形を示します。属性値は“…”または「…」で囲んでもよく、=も使えます。見出しの属性は空白を空けずにタイトルの直後に書けます(# 第一回{style="hui"})。キーはASCIIで書きます。中国語のキー(作者=曹雪芹)はattributeKeyInvalid警告とともに無視されます。 - 強調と範囲。
_と__は中国語の文字の間でも機能します(中文_斜体_中文)。2つの数字または2つの中国語の語の間の~は範囲を表し、入力したまま残ります(3~5天、周一~周五)。 - IDとファイル名には中国語の文字がそのまま残ります。第一回という題の章は
chapters/001-第一回.mdとして保存されます。
中国語の符号、ルビ、割注、文字の向きのためのディレクティブは、後述の節と文書形式で説明します。
#横組み
語間の空白よりも中国語・日本語・韓国語の文字が多い段落は、CJKコンポーザーで組まれます。語間の空白とみなされるのは、欧文の単語、数字、記号どうしの間の空白だけです。Webのテキストで欧文の単語や数字の前後に入力される空白(2026 年 9 月 28 日、安装 Node.js 和 Git)は数えないため、こうした文は空白のない表記と同じように組まれます。コンポーザーはテキストを単位に分け(1文字に1つ、欧文の単語や数字に1つ、二倍ダーシや二倍三点リーダーに1つ)、それぞれを1度だけ計測し、行を順に埋めていきます。Knuth–Plassのような最適化探索で比べる対象はありません。2文字の間のほぼすべてが改行できる位置で、そうでない少数の箇所は以下の規則が取り除くからです。中国語の題名を引用する欧文の段落はKnuth–Plassのまま組まれ、中国語の文字の隣では同じ規則に従って改行できます。キャプション、表のセル、脚注、囲みも、文書と同じレベルの規則で改行します。
#禁則処理
禁則処理は、行頭に置けない約物と行末に置けない約物を定めます。cjk.lineBreakはclreq §6.1.1の4つのレベルから1つを選びます。
| レベル | 行頭に置かないもの | 行末に置かないもの |
|---|---|---|
none | なし。台湾と香港の新聞はどこでも改行します。 | なし。 |
basic | 句読点類 、,;:。!?、終わり引用符と終わり括弧 ”’」』)〕]》〉、連結符 ~ と単独の —、中黒 ·‧・、繰返し符号 々、単位 % ‰ ° ℃。 | 始め引用符と始め括弧 “‘「『(〔[《〈、通貨記号 ¥ $ €。 |
gb | basicの対象に加えて斜線 /(GB/T 15834—2011 §5.1.9)。 | basicの対象に加えて斜線。 |
strict | gbの対象に加えて全角2字分の約物 —— ⸺ …… ⋯⋯。 | gbと同じ。 |
どのレベルでも、二倍ダーシ ——、二倍三点リーダー ……、数字とその記号・単位(¥5,999、50%、120㎡、−3 ℃)、欧文の単語、全角数字で書かれた数字(12:30)は行で分割されません。脚注の合印、:ref、上付き文字は直前の文字と離れず、全角スペースの前で改行することもありません。唯一の例外は行長より広い欧文の単語やWebアドレスで、単語は音節で、アドレスは区切りの箇所で分割されます。
次の文字が行に収まらないとき、コンポーザーはその文字を調べます。行頭に置ける文字なら次の行へ送り、残った行は字間を広げて両端をそろえます。行頭に置けない文字(読点、終わり括弧、始め括弧の次の文字)なら、まず約物のアキを詰めてその文字を行に収めようとします。これがclreq §6.2.2.3の追い込みです。アキを詰めてもはみ出しが解消しない場合に限り、行を手前で終え、直前の文字をその約物と一緒に次の行へ送ります。追い込みを優先するのは行の文字をまとめておけるからで、追い出しは代替手段です。
#約物の幅
全角の約物は字形が二分、アキが二分で、設定で調整するのはアキだけです。字形は変わりません(clreq §6.3.2)。アキの位置は地域によって異なります。中国大陸では句読点類をマスの隅に置くため、アキは字形の後ろに来ます。台湾と香港では中央に置き、両側に四分ずつアキがあります。始め括弧と始め引用符は字形の前に、終わり括弧と終わり引用符は字形の後ろにアキを持ちます。これはどの地域でも同じです。
cjk.punctuationWidthは約物に残すアキの量を選びます。
| スタイル | 行中 | 行末 | 使われる場面 |
|---|---|---|---|
fullwidth全角式 | すべての約物が全角。 | 全角。 | 台湾と香港の本。多くのWebテキスト。 |
kaiming「开明式」 | 。.?!は全角。,、;:と括弧、引用符、中黒は二分。 | すべての約物が二分。 | 中国大陸の多くの本。方正书版の既定。 |
lineEndHalf行末半角 | すべての約物が全角。 | すべての約物が二分。 | GB/T 15834—2011 §5.1.10を文字どおりに解釈したもの。 |
halfwidth半角式 | すべての約物が二分。 | 二分。 | 辞書。 |
ほかに2つの設定が、どのスタイルの約物にも作用します。compressAdjacentを有効にすると、隣り合う2つの約物はその間のアキを詰め、。」、》(、,「は全角2字分ではなく1.5字分になります。台湾と香港のように中央に置いた。や,は、終わり括弧の前でも全角をすべて保つため、そこでは。」は全角2字分のままです。》(、」,、,「は詰まります。trimLineStartを有効にすると、行頭の始め括弧は前側の二分を削って字面を本文の端にそろえ、行末の終わり括弧は後ろ側の二分を削ります。どちらも中国大陸と香港では有効、台湾では無効です。台湾の本はすべての約物をマスの中に収めます。
引用符、省略記号、ダッシュ、中黒は欧文と共通の文字で、欧文フォントでは幅が狭く描かれます。中国語のテキストの中(前後のいちばん近い文字が中国語)では、フォントの送り幅にかかわらず中国語の約物の枠を使います。“と”はそれぞれ全角(「开明式」では二分)、……は全角2字分で中央、·は中国大陸では二分、それ以外では全角です。二倍ダーシ(——)は、全角2字分にわたる途切れのない1本の線として、文字の中央の高さに印字されます。欧文の単語の隣では同じ約物もフォントの幅を保つため、他说:He said “yes” and left.の英語の引用符は英語として組まれます。
本はその地域向けの書体で組んでください。中国大陸ならNoto Serif SCまたはSource Han Serif SC、台湾ならTC、香港ならHKです。約物のどちら側にアキがあるかは、フォントではなく地域で決まります。中国大陸のタグで繁体字の書体を使うと、中央に置かれた約物の誤った側を詰めてしまいます。
#ぶら下げ
hangingPunctuation: 'allow'を指定すると、そのままでは次の行頭に来てしまい、追い込みでも収められない読点や句点を、行末の外へぶら下げられます(clreq §6.1.3)。'force'では、そうした約物が行末に来るときは常にぶら下げます。ぶら下げるのは1つの約物だけで、ほかの約物と接しているもの(。」)はぶら下げません。'allow'では、横組みの台湾・香港のテキストではぶら下げません。中央に置かれた約物が切れて見えるためです。'force'ではそこでもぶら下げます。中国語の本の多くはぶら下げを使いませんが、clreqは文字グリッドと組み合わせる場合に勧めています。既定値は'none'です。
#字間による両端そろえ
中国語の本文は両端そろえで組み、両端そろえの行は字間を広げて行長に合わせます。段落の最終行以外の行は、clreq §6.2.2.4の順で埋めます。
- 欧文の語間。それぞれ最大二分まで。
- 漢字と欧文の間のアキ(次節)。それぞれ最大二分まで。
- すべての字間を均等に。漢字どうし、文字と約物の間、漢字と欧文の単語の間です。欧文の単語、数字、全角2字分の約物の内部や、連結符(~、単独の —)や斜線の隣は広げません。
字間に二分(設定されていればbodyText.maxJustifyTracking)を超えるアキが必要になる行は、その上限まで広げて行長より短く終わります。ビルドはこれをcjkLooseLineというコンテンツの警告として報告し、Sandbox(ブラウザーで動く編集環境)では行長に満たないCJKの行と表示します。前の行に上げられない長い欧文の単語やWebアドレスがよくある原因です。段落の最終行はベタ組みです。詳しくはハイフネーションと両端そろえを参照してください。ゆるい行の強調でCJKの行がどう数えられるか、段末そろえで中国語の段落を1行長く組む仕組みも説明しています。
段落は、1文字だけ(またはそれを閉じる約物と一緒に)の行では終わりません。中国語ではこれを「孤字」と呼びます(後。のような行)。前の行が最後の1文字を、離せない約物と一緒に次の行へ送り、行長まで字間を広げます。それに字間の上限を超えるアキが必要な場合は、1文字の行がそのまま残ります。この動作はbodyText.avoidRunts(既定で有効)に従い、横組みと縦組みのどちらにも適用されます。段末そろえがこうした行を作ることもありません。
#漢字と欧文の間のアキ
cjk.latinSpacingは、漢字と隣り合う欧文の文字や数字との間に四分のアキを入れます(clreq §6.3.3)。1999年的iPhone 15售价为¥5,999。では、1999の後ろとiPhone 15の前後にアキが入り、記号である¥の前には入りません。行頭と行末、欧文の単語と中国語の約物の間(用iPhone,)、中国語の括弧の内側((iPhone))にもアキは入りません。Webのテキストによくあるように、著者がこうした境界に空白を入力していれば、その空白は漢字と欧文の間のアキに置き換えられます。そのため用 iPhone 拍照と用iPhone拍照は同じように組まれます。両端そろえの行では、字間を広げる前にこのアキを二分まで広げ、1文字多く追い込む行では八分まで詰めます。このアキはテキストではありません。コピー、検索、PDFから抽出したテキストでは、用iPhone拍照と書いたとおりに読み取られます。0で無効になります。
#文字グリッド
cjk.gridは、中国語の方式で、1行の字数と1ページの行数によって版面を指定します。
cjk: { grid: { enabled: true, charsPerLine: 28, linesPerPage: 28, show: true } }各段の長さは本文サイズでcharsPerLine字分、版面は本文の行送りでlinesPerPage行分になります。設定したpage.marginsは最小値として働きます。版面は余白を取った残りの領域の中央に置かれ、各余白は差の半分ずつ広がります。2段組みでは段間を全角の整数倍に丸めます。収まらない大きな数を指定すると数を減らして報告し(cjkGridClamped)、未指定なら収まるだけの数を使います。showは画面にグリッド(原稿用紙のマス目)を、文字位置1つにつき1マスとして描きます。PDFには、renderToPdfにcharacterGrid: trueを渡さない限り描かれません。
五号(10.5 pt)、行間6 pt、行送り16.5 ptの一般的な本の例です。
- 大32开、140 × 203 mm、28字 × 28行。行長103.7 mm、版面の高さ163 mm。
- 16开、184 × 260 mm、小五(9 pt、行送り13.5 pt)で23字の2段組み、段間は2字分。
clreqは、1行を17〜40字(横組みで最大48字、縦組みで最大55字)、行間を半字から1字分とするよう勧めています(clreq §7.1.1.5)。中国語の文字サイズには名前があります。五号(10.5 pt)は書籍の本文、小五(9 pt)は新聞と注に使い、小四は12 pt、四号は14 pt、三号は16 pt、二号は22 ptです。Postextはサイズをポイントで受け取るため、号数のサイズはポイント値に換算して指定してください。
#番号付け
番号付けの設定はどれも、CSS Counter Stylesの中国語の数字スタイルを使えます。ノンブル、番号付きリスト、図の番号、見出しテンプレート、部、PDFのページラベルです。simp-chinese-informalは一、十二、一百零一と書き、trad-chinese-informalは同じ数を萬と億を使って書きます。cjk-decimalは二〇二六、simp-chinese-formalとtrad-chinese-formalは大字(壹贰叁)、circled-decimalは①です。ほかに十干(甲乙丙)と十二支(子丑寅)もあります。テンプレートでは一が文書の字体の通常の漢数字を表すため、1つのテンプレートで両方の版に対応できます。
headings: {
levels: [{ level: 1, numberingTemplate: '第{1:一}回', numberSeparator: ' ' }],
},これで第一回から第一百二十回までが付き、題の前に全角スペースが入ります。「回目」(章回小説で各回の題となる対句)は、見出しの中に改行を入れて書きます(# 甄士隱夢幻識通靈 \\ 賈雨村風塵懷閨秀)。見出しのデザインは{titleText}を2行に分け、1行に半分ずつ印字します。章扉の帯、またはレベルや見出しスタイルに設定した段内のadvancedDesignがこれに当たります(幅と詳細デザインを参照)。それ以外の場所では、前半と後半を全角スペースでつなぎます。目次、柱、PDFのしおり、それにデザインなしで段内に組む見出しです。段内の見出しでは、つないだ題が行長の終わる位置で折り返され、多くの場合は後半の途中で改行されます。中国語の文字と数字または欧文の単語の間の改行(# 示例市出版协会关于举办 \\ 2026年中文排版实务培训班的通知)は、段内、目次、柱では漢字と欧文の間のアキとして組まれ、PDFのしおりと文書のタイトルでは何も挟まずにつながります。以下の2つの例にはどちらもデザインがないため、対句を2行に分けて立てたい場合は見出しにデザインを付けてください。{1:words}は中国語の文書では数を漢数字の語(十二)で、{1:ordinal}は第を付けて(第十二)書きます。:::part{number="卷三"}と番号を付けた部は、数値が必要なプレースホルダーでは3として扱われます。
番号の前にprefixを置くと、番号付きリストをGB/T 15834—2011の階層(一、 (一) 1. (1) ①)に従わせることができます。
orderedLists: {
levels: [
{ level: 1, numberFormat: 'simp-chinese-informal', separator: '、' },
{ level: 2, numberFormat: 'simp-chinese-informal', prefix: '(', separator: ')' },
{ level: 3, numberFormat: 'arabic', separator: '.' },
{ level: 4, numberFormat: 'arabic', prefix: '(', separator: ')' },
{ level: 5, numberFormat: 'circled-decimal', separator: '' },
],
},組み込みの中国語の図と表の種類は、章ごとにハイフンで番号を付けます(图1-1、表3-2)。中国語のキャプションでは、ラベルと番号の間に空白を入れず、キャプションの本文の前に全角スペースを置きます。captionStyle: { labelNumberGap: '', labelSeparator: ' ' }で图1-1 大观园图となり、:refは图1-1と表示されます。PDFには中国語のページラベルが書き込まれるため、ページに一、二、三と印字されている箇所では、PDFビューアーのページ番号欄にも一、二、三と表示されます。
中国語の本の索引は、照合器(collator)自身のデータを使い、項目をピンインの頭文字(簡体字)または画数(繁体字)で見出し分けします(index.groupBy、既定値は'auto')。複数の読みを持つ文字は、照合器が通常使う読みで分類されます。そうした項目には、意図した読みになる文字でsortキーを指定してください(:index[重阳]{sort="崇阳"})。索引を参照してください。
#脚注
中国大陸の本では、脚注にページごとに振り直す丸数字の番号を付けます。各ページの最初の注は①で、本文中でも注の冒頭でもベースライン上に組みます。台湾と香港の本の多くも同じです。
footnotes: { numberFormat: 'circled-decimal', numbering: 'page' },circled-decimalでは、合印は既定で行内に組まれます(markerPosition: 'auto')。markerSize: { value: 0.75, unit: 'em' }で本文より小さくできます。50を超える数には丸数字がないため、アラビア数字で書きます。注の番号は注が置かれるページで決まるため、ページごとに番号を振る文書は、まず章単位でレイアウトし、注が置かれた位置で番号を振ってから、もう一度レイアウトします。丸数字の合印は番号によらず幅が同じなので、2回目のビルドで動く行はありません。numbering: 'column'は段ごとに番号を振り直すもので、注を段ごとに組む本に使います。合印は上付き文字と同じく直前の文字と離れず、行頭に来ることはありません。縦組みでは独立したマスに正立します。Sandboxの中国語の既定設定は、変更点の一覧にこれらの設定を含めます。脚注を参照してください。
#縦組み
layout.writingMode: 'vertical-rl'で本を縦組みにします。ここまでの組版処理は、横ではなく縦の行に沿ってそのまま適用されます。変わるのは周りのページと、各文字の向きです。
#90度回転したページ
縦組みのページは、横組みのページを時計回りに90度回したものとしてレイアウトされます。行は右から読む縦組みの行で、エンジンが行に対して行う処理(改行、両端そろえ、フロート、脚注、分割禁止の規則、段末そろえ)はすべて、この回転した座標系で動作します。紙面上では次のようになります。
- レイアウト上の段は、紙面では上下に重なる段(中国語では「栏」)になります。
layoutType: 'double'では2つの段が上から下へ重なって右上から埋められ、段間の罫線は段と段の間の水平な線になります。章末で段の長さはそろえません(clreq §7.1.3.4)。 - 流れの先頭は紙面の右端です。章扉はページの右側を縦に走る帯になり、上部のフロートは右に、下部のフロートは左に置かれ、脚注は各段の左端に入ります。
page.marginsは紙面上の名前のままです。柱、ノンブル、トンボ、背景も紙面の座標に置かれます。- 見出しスタイルごとに書字方向を設定できるため、縦組みの本の後に横組みの付録や索引を続けられます。
レイアウトを読み取るホストは、縦組みのページでVDTPage.flowを参照でき、流れと紙面の間で座標を変換するヘルパー(flowToPage、pageToFlow、flowRectToPage)も使えます。設定リファレンスの縦組みを参照してください。
#右綴じ
page.bindingの既定値は'auto'で、縦組みの本では右綴じになります。1ページ目は奇数ページのままなので、奇偶の設定、:::pagebreak{parity="odd"}、ページ数の意味は変わりません。変わるのは奇数ページが置かれる側で、見開きの左ページになります(clreq §7.1.3.3)。左右対称の余白では、奇数ページののどは右側になります。Sandboxは見開きを3 | 2の順に表示し、1ページ目は背の左に単独で置かれます。HTMLビューアーもページを右から左へ進めます。PDFもビューアーに同じ表示を求めます(/Direction /R2Lと/PageLayout /TwoPageRight)。AcrobatとFoxitはこれに従いますが、Chromeの組み込みビューアーは従いません。横組みの本も右綴じにできます。綴じを参照してください。
#文字の向き
どの文字を正立させ、どの文字を回転させるかは、Unicodeの縦書き方向プロパティ(UAX #50)に従い、その上にclreq付録Aの中国語の慣習を適用します。
- 漢字、仮名、注音符号、全角の英字は正立し、それぞれ全角を占めます。
- 正立の上限(次節)より長い欧文の単語と数字は時計回りに90度回転し、横組みのときの幅を保ちます。
- 括弧と引用符は縦組み用の字形(﹁﹂﹃﹄︵︶)になります。中国大陸のテキストでは、GB/T 15834—2011 §5.2.3の定めどおり、“ ” ‘ ’ は『』「」として組まれます。
- 句読点類は回転させません。UAX #50は日本語向けに:;を回転させますが、ここでは回転しません。中国大陸のフォントは「、,。.」をマスの右上に、「!?:;」をマスの右半分に置きます(GB/T 15834—2011 §5.2.1)。台湾と香港のフォントは中央に置きます。
- ダッシュ、省略記号、波ダッシュは行に沿って縦に走ります。二倍ダーシは文字の中心軸に沿った1本の線になります。
- Unicodeが正立とする記号(× © ± § ℃ ①)は、数字の中にあっても独立したマスに正立します。
30×40は30、×、40がすべて正立します。
約物の幅、詰め、ぶら下げ、漢字と欧文の間のアキは、横組みと同じように縦の行でも働きます。「开明式」の「、」は半マス、」「は1.5マスを占め、:;?!はどの地域でも1マス分を保ちます。
#正立する数字
短い数字は、横に寝かせるより1つのマスに立てたほうが読みやすくなります。これが縦中横です(clreq §2.1.3)。cjk.uprightDigitsは、立てる数字の最大桁数を指定します。既定値は2で、3、4、または無効にする0を指定できます。数字は全体がマスに立つか、まったく立たないかのどちらかです。そのため既定値では、2026年9月28日の2026は横倒し、9は正立、28は1つのマスに横に並べて組まれます。A4、3.14、10,000は英字や区切り記号と一緒に横倒しのままです。英語の文の中の数字は、その文と一緒に横倒しになります。chapters 49 and 32ではどちらの数字も周りの単語と一緒に組まれます。一方、中国語の文字の隣の数字は立ちます(第 3 回、用iPhone 15拍攝)。中国語のテキスト中の時刻、得点、日付の数字も、コロンやハイフンの先が中国語の文字に続くため立ちます(上午12:30开会、比分3:2)。次の3つのマークで、設定を手動で上書きできます。
第:tcy[120]回,:upright[GDP]增長:sideways[12]倍。:tcy[…]はテキストを1つの正立したマスに組み、全角より広ければ全角幅に縮めます。:upright[…]は1文字ずつ独立したマスに立て、1文字ずつ読む略語に使います。:sideways[…]はその範囲を回転させます。横組みでは何も変わりません。文学作品では数字をふつう漢数字で書くため、これらは必要ありません。
#図、表、キャプション
縦組みの本でも図と表は正立します。図はキャプションが許す範囲で段の高さいっぱいに広がり、紙面上で占める幅が流れの中で使う量になります。キャプションは図の下に横組みで組まれ、表のセルも横組みです(clreqは、キャプション、表、ノンブルは通常横組みのままだと述べています。§2.1.1)。段より高い表は、行単位で複数の段に分割されます。縦組みのテキストで初めて参照される図ではplacement.rotateは無視され、rotateIgnoredVertical警告が出ます。
#柱とノンブル
柱とノンブルは紙面に置かれ、多くの縦組みの本と同じく横組みで組まれます(clreq §7.2)。ほかに2つの慣習もよく見られます。テキスト要素を縦組みにし(writingMode: 'vertical-rl')、ページの小口側の余白に固定すれば(anchor.to: 'outer')、これらにも対応できます。
- 小口の柱:章の題を小口側の余白に縦に組み、版面の天から約4字下がった位置から始めます。ノンブルは漢数字で、版面の地から約5字上の位置で終わるように組みます。どちらも本文の約80%の大きさです。Sandboxでは1回の操作で追加できます(ヘッダー › 小口の柱(縦組み))。
- 地の小口側の隅に置くノンブル:台湾の縦組みの本の規則が求める形式です。右綴じの本の奇数ページでは左下、偶数ページでは右下に、フッターの横組みの要素として置きます。
テンプレートは設定リファレンスの縦組みのテキスト要素にあります。
#出力形式ごとの縦組み
Canvasは縦組みのページを独自に描画し、正立する各文字をマスの中心を軸に回転し戻して描きます。フォント自身の縦組み用の約物を使うため、ブラウザーのホストは各ファミリーについて、OpenTypeのvert機能を有効にした複製を読み込みます(loadVerticalAlternates)。Sandboxは縦組みの本のすべてのファミリーでこれを行い、複製がない場合はエンジンが約物を自分で回転・移動します。PDFは、同じ埋め込みファイルに対する2つ目の縦書きモード(Identity-V)のフォント辞書を介し、vertで整形した正立文字を表示します。そのためPDFビューアーでは縦の1行を1行として選択・コピーでき、フォントが二重に埋め込まれることもありません。タグ付きPDFはWritingMode /TbRlを宣言します。HTMLは各行をwriting-mode: vertical-rlのボックスとして組み、1つのマスに収める数字にはtext-combine-uprightを使います。3つの出力はいずれも、すべての文字をHarfBuzzの縦組みレイアウトとの差が数百分の1em以内の位置に置きます。
#符号と注記
中国語の版では、イタリックや下線ではなく行間に符号を付けてテキストを示し、文字に読みを添え、注釈を行の中に組みます。これらを5つのディレクティブで扱います。どれもテキストを段落の中に残すため、検索、目次、索引のアンカー、コピーしたテキストでは書いたとおりの文字が読み取られ、周りに描かれるものだけが設定によって変わります。
此事:dots[不可]輕忽。:name[賈寶玉]與:name[林黛玉]讀:book[西廂記]。
{滿紙|mǎn|zhǐ}荒唐言,:ruby[一把]{rt="yì bǎ"}辛酸淚!
寶玉:warichu[甲戌側批:此是第一首標題詩。]{open="〔" close="〕"}道:#圏点
:dots[…]は、横組みでは各文字の下に、縦組みでは右に圏点を1つずつ付け、約物には付けません(clreq §5.3.1、GB/T 15834—2011 §4.12、縦組みは§5.2.5)。styleで黒点、白丸、ゴマ点を選びます。中国語の文書ではMarkdownの強調も同じ働きをします。cjk.emphasisの既定値が'dots'なので、*不可*は圏点付きで印字されます。中国語の書体には代わりに使えるイタリックがないためです。同じ強調の中の欧文の文字はイタリックのままです。
#固有名詞と書名の符号
:name[…]は、固有名詞を示す線「专名号」を、横組みではテキストの下に、縦組みでは左に引きます。:book[…]は、書名を示す符号「书名号」をcjk.bookTitleMarkの指定どおりに印字します。現代の中国大陸の本のように書名を《》で囲む(書名の中の書名は〈〉)か、古典や台湾の版のように下に波線を引くか、何も付けないかです。そのため1つのソースで現代の中国大陸の版にも古典の版にも対応できます。2つの名前や2つの書名が接する箇所では、それぞれの線が接合部で八分ずつ短くなるため、:name[賈寶玉]:name[林黛玉]は2つの名前として読めます。
#ルビ:ピンインと注音
:ruby[紅樓]{rt="hóng lóu"}は各文字の上に読みを付けます。読みの数が文字数と同じなら文字の間で改行でき、groupを指定すると語全体に1つの読みを付けます。簡略形{紅樓|hóng|lóu}は、親文字が中国語の文字のときだけ同じ意味になるため、欧文の文中の{x|x>0}はテキストのまま残ります。注音符号(ボポモフォ)の読みは各文字の右に縦に並び、声調記号はその列の横に、字面の半分が最後の符号より上に出る位置に置かれます(clreq §5.5.3.3)。ピンインは横組みではテキストの上に、縦組みでは右に付きます。親文字より広い読みは親文字の枠を広げますが、読みのない隣の文字にはルビのサイズの4分の1まで掛けられるため、その分だけ広がりが小さくなります。cjk.rubyは書体、サイズ(既定は本文の半分)、色、既定の側を設定します。
#割注
:warichu[…]は、注を本文の半分のサイズで2行に分け、行の中に組みます。古典の版で注釈を組む形式です。上の行は各部分の半分以上を取るため、下の行が長くなることはなく、行頭に置けない約物が下の行の先頭に来ることもありません。長い注は行の残りを埋め、次の行、段、ページへ続きます。括弧は最初の部分の前と最後の部分の後ろにだけ付きます。縦組みでは右側の行から読みます。cjk.warichuはサイズ、色、既定の括弧を設定します。
#行間のアキ
行送りは変わりません。圏点、線、読みは行間に収まります。段落の行間が付けるものに対して狭すぎると、ビルドは警告を出します。片側に符号がある場合は二分未満、両側にある場合は8分の5em未満で(clreq §5.6.1)、cjkMarksExceedLeadingとして報告されます。読みが行間より高い場合はrubyExceedsLeadingです。注記を付ける段落には、行送りの大きい段落スタイルを設定してください。符号と読みは、段落、見出し、リスト項目、引用、囲みのほか、キャプション、表のセル、注にも描かれ、それらの行間も同じように検査されます。柱では符号や読みを付けずにテキストだけを印字します。
#フォント
Postextは各スタイルを1つのファミリーで組み、ない文字を別のファミリーで補うフォールバックは行いません。Noto Serif TCがNoto Serif SCから文字を借りることはありません。書体は、約物も含め、本で印字するすべての文字を収録している必要があります。
- ブラウザーとSandboxでは、中国語のファミリーはFontsourceから1ウェイトあたり約100個のファイルとして提供されます。各ファイルは文字の一部を収めて
unicode-range付きで宣言され、ブラウザーはテキストが使うファイルだけを読み込みます。SandboxのPDFタブも同じで、フォントプロバイダーがファミリーのスタイルシートを読み、ページが使う分割ファイルをrenderToPdfに渡し、それぞれをサブセットとして埋め込みます。Fontsourceの名前付きサブセットは不完全なため(Noto Serif TCのchinese-traditionalには全角の,!?がありません)、番号付きの分割ファイルを使ってください。 - バンドルでは、約物や縦組み用の字形を含め、本で使う文字だけにサブセット化した書体を同梱してください。可変フォントからはウェイトごとに静的なファイルを切り出します。pdf-libは可変フォントの既定インスタンスを埋め込むため、太字の見出しが既定のウェイトで印字されてしまいます(
variableFontDefaultInstance)。CFFの.otfファイルよりTrueType版(Google Fonts、Fontsource)を選んでください。postext-pdfはCFFフォントを丸ごと、1ウェイトあたり最大25 MB埋め込みます(cffEmbeddedWhole)。サブセット化する際は、レイアウト機能(vert、vrt2)と縦組みのメトリクス(vhea、vmtx)を残してください。縦組みの約物はこれらから得られます。 - 欠けたグリフはフォントの空の四角として印字されます。
renderToPdfは書体ごとに報告し(missingGlyph)、SandboxはPDFを生成するたびに検査パネルに一覧表示します。 - 地域の書体。Noto Serif SC、TC、HKは、同じコードポイントをそれぞれの地域の字形で描き、句読点類もその地域の位置に置きます。本の書体とロケールは一致させてください。
- イタリックはありません。中国語の書体にはイタリックがなく、ブラウザーやPDFでは字形を斜めに変形することになります。強調には圏点、楷書体(「楷体」、LXGW WenKaiなど)、太字を使ってください。
中国語の本の伝統的な書体の使い分けは、次のようにファミリーに対応させます。本文には明朝体に当たる「宋体」(Noto Serif)、見出しとラベルにはゴシック体に当たる「黑体」(Noto Sans)、引用、韻文、序文には楷書体(「楷体」)、公文書には宋朝体に当たる「仿宋」です。フォントプロバイダーのコードは、設定リファレンスの中国語・日本語・韓国語のフォントにあります。
#2つの完全な設定例
#横組みの中国大陸の小説
大32开の本です。Noto Serif SCの10.5 ptで28字 × 28行、章番号は第一章、注はページごとに①から番号を振ります。「开明式」の約物とGBの禁則処理はロケールから決まります。
import type { PostextConfig } from 'postext';
const pt = (value: number) => ({ value, unit: 'pt' as const });
const mm = (value: number) => ({ value, unit: 'mm' as const });
const ink = { hex: '#1a1a1a', model: 'hex' as const };
const config: PostextConfig = {
locale: 'zh-Hans-CN',
page: {
sizePreset: 'custom', width: mm(140), height: mm(203),
margins: { top: mm(18), bottom: mm(20), left: mm(16), right: mm(20), mirror: true },
},
layout: { layoutType: 'single' },
bodyText: {
fontFamily: 'Noto Serif SC', fontSize: pt(10.5), lineHeight: pt(16.5),
textAlign: 'justify', firstLineIndent: { value: 2, unit: 'em' },
color: ink, boldColor: ink, italicColor: ink,
},
headings: {
fontFamily: 'Noto Sans SC', color: ink,
levels: [
{ level: 1, fontSize: pt(16), numberingTemplate: '第{1:一}章', numberSeparator: ' ',
breakBefore: { enabled: true, parity: 'any' } },
],
},
captionStyle: { labelNumberGap: '', labelSeparator: ' ' },
footnotes: { numberFormat: 'circled-decimal', numbering: 'page' },
cjk: { grid: { enabled: true, charsPerLine: 28, linesPerPage: 28 } },
header: { elements: [] },
footer: { elements: [
{ kind: 'text', id: 'folio', content: '{pageNumber}', fontFamily: 'Noto Serif SC', fontSize: pt(9),
overflow: 'clip', color: ink, placement: { anchor: { to: 'container', edge: 'center' } } },
] },
};cjkキーで設定するのはグリッドだけです。地域、禁則処理、約物の幅、詰め、漢字と欧文の間のアキはzh-Hans-CNに従います。章は、中国大陸の多くの小説と同じく、左右どちらのページからでも始まります(改ページ)。
#縦組み・右綴じの台湾の小説
25開(148 × 210 mm)の本です。書体はNoto Serif TC、1行38字、章番号は第一回で、小口の柱と漢数字のノンブルを付けます。台湾式の中央に置く全角の約物と基本レベルの禁則処理はzh-Hant-TWから、右綴じは書字方向から決まります。
const config: PostextConfig = {
locale: 'zh-Hant-TW',
page: {
sizePreset: 'custom', width: mm(148), height: mm(210),
margins: { top: mm(24), bottom: mm(18), left: mm(16), right: mm(22), mirror: true },
pageNumbering: { format: 'trad-chinese-informal' },
},
layout: { layoutType: 'single', writingMode: 'vertical-rl' },
bodyText: {
fontFamily: 'Noto Serif TC', fontSize: pt(10.5), lineHeight: pt(18),
textAlign: 'justify', firstLineIndent: { value: 2, unit: 'em' },
color: ink, boldColor: ink, italicColor: ink,
},
headings: {
fontFamily: 'Noto Serif TC', color: ink,
levels: [
{ level: 1, fontSize: pt(14), numberingTemplate: '第{1:一}回', numberSeparator: ' ',
breakBefore: { enabled: true, parity: 'odd' } },
],
},
cjk: { grid: { enabled: true, charsPerLine: 38 } },
header: { elements: [
{ kind: 'text', id: 'head', content: '{chapterTitle}', writingMode: 'vertical-rl', pages: 'body',
fontFamily: 'Noto Serif TC', fontSize: pt(8.4), overflow: 'clip', align: 'left', color: ink,
placement: { anchor: { to: 'outer', edge: 'top' }, offset: { y: { value: 4, unit: 'em' } } } },
{ kind: 'text', id: 'folio', content: '{pageNumber}', writingMode: 'vertical-rl',
fontFamily: 'Noto Serif TC', fontSize: pt(8.4), overflow: 'clip', align: 'left', color: ink,
placement: { anchor: { to: 'outer', edge: 'bottom' }, offset: { y: { value: -5, unit: 'em' } } } },
] },
footer: { elements: [] },
};parity: 'odd'は各章を奇数ページから始めます。この本では奇数ページは左ページです。linesPerPageを省略しているため、ページには幅に収まるだけの行が入ります。小口の柱は奇数ページでは左の余白、偶数ページでは右の余白を縦に走り、{pageNumber}は103ページに一百零三と印字します。
#Sandboxとレシピ集
Sandboxでは、デザイン › 表記体系に文書の言語、書字方向、綴じ、すべてのcjk設定がまとまっています。中国語の既定設定 › 確認…(先に各変更点を一覧表示します)を使うと、本を1回の操作で中国語向けに設定できます(Sandboxを参照)。見本の本には『紅楼夢』(紅樓夢、1792年の程乙本)が3つの版でそろっています。繁体字・縦組み・右綴じ、簡体字・横組み、そしてH. Bencraft Jolyによる英訳の最初の56回です。Sandbox自身のガイドにも、同じ方式で組んだ中国語版があります。縦組み・右綴じの2段組みで、章の帯が右端を縦に走り、柱は小口に沿って縦に組まれ、ノンブルは漢数字です。レシピ集の「中国語の組版」コレクションには中国語のレシピが集められており、どれも1ページまたは見開きと、それを組むスクリプトで構成されています。
#既知の制限
- 韓国語は中国大陸の既定値で組まれ、韓国語独自の規則(KLREQ)は実装されていません。日本語はpostext 1.16から独自の規則に従います(日本語の組版)。
- デザイン要素のテキスト(柱、章扉、囲みのタイトル)では、中国語は任意の2文字の間で改行され、禁則処理も約物の幅も適用されません。こうしたタイトルは手作業で調整してください。
- 1ページに1つの書字方向。縦組みのページの中の横組みの囲み、見出し行が右にある縦組み本来の表、正立した図の横に置くキャプションは使えません。行内の数式、チップ、色見本は縦の行では横倒しになります。
- サイズはポイント単位。号数やQ(級)の単位はありません。
- 縦組みのメトリクス。正立する文字はどれも全角ずつ送られます。プロポーショナルな縦組みメトリクス(
vpal)と縦組みのカーニングは使われません。 - ルビと割注:両側ルビ、読みの自動付与、1行の注はありません。デザイン要素のテキスト中の注と読みは通常のテキストとして印字されます。
- フォント:ファミリー間のフォールバックはなく、中国語の書体にイタリックはなく、CFFフォントは丸ごと埋め込まれます。
- 索引:複数の読みを持つ文字は、項目に
sortキーがない限り照合器が通常使う読みで分類されます。部首順は使えません。
#参考資料
- W3C、Requirements for Chinese Text Layout (clreq)、Group Note Draft、2026年。
- W3C、Requirements for Japanese Text Layout (JLREQ)(縦組みの本の柱について)。
- Unicode Standard Annex #50、Unicode Vertical Text Layout。
- W3C、CSS Writing Modes Level 4およびCSS Text Level 4。
- W3C、CSS Counter Styles Level 3(中国語の数字スタイルについて)。
- GB/T 15834—2011 《标点符号用法》(本文)。
- GB/T 15835—2011 《出版物上数字用法》。
- 台湾教育部、《重訂標點符號手冊》、修訂版、2008年。