CSS ルビ注釈レイアウトモジュール レベル 1

W3C 作業草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2022/WD-css-ruby-1-20221231/
最新公表バージョン:
https://www.w3.org/TR/css-ruby-1/
編集中草案:
https://drafts.csswg.org/css-ruby-1/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/css-ruby-1
テストスイート:
https://www.w3.org/International/tests/repo/results/css-ruby
フィードバック:
CSSWG イシューリポジトリ
仕様内インライン
編集者:
Elika J. Etemad / fantasai (招待専門家)
(Google)
Xidorn Quan (Mozilla)
Florian Rivoal (招待専門家)
この仕様への編集提案:
GitHub エディター

概要

「ルビ」とは、基底テキストのそばに並べて配置される短いテキストの一種であり、行間注記の形式です。 主に東アジアの文書において発音や短い注釈を示すために用いられます。 このモジュールでは、CSSでルビ注釈を表示する際のレンダリングモデルおよび書式制御について説明します。

CSSは、構造化文書(HTMLやXMLなど)の画面表示や印刷などのレンダリングを記述するための言語です。

この文書の位置付け

このセクションは、本書が発行された時点での文書の位置付けを説明します。 最新のW3C出版物の一覧や本技術レポートの最新版は、 https://www.w3.org/TR/ にあるW3C技術レポート索引で確認できます。

本書はCSS作業グループによって 作業草案として 勧告トラックに従い公開されました。 作業草案としての公開は、W3Cおよびその会員による支持を意味するものではありません。

本書はドラフト文書であり、今後随時更新・差し替え・廃止される可能性があります。 本書を進行中の作業以外のものとして引用するのは適切ではありません。

ご意見はGitHubでイシューを提出(推奨)、タイトルに「css-ruby」を含めて “[css-ruby] …コメントの要約…”の形でお送りください。 すべてのイシューやコメントはアーカイブされています。 または、(アーカイブあり) 公開メーリングリスト www-style@w3.org へご送信いただくことも可能です。

本書は2021年11月2日版W3Cプロセス文書に準拠しています。

本書はW3C特許ポリシーの下で運営されているグループによって作成されました。 W3Cは、グループの成果物に関連してなされた特許開示の公開リストを維持しています。 そのページには特許開示の方法も記載されています。 ある特許について実際に知識を有し、それが必須クレームを含むと考える個人は、W3C特許ポリシー第6節に従って情報を開示しなければなりません。

1. はじめに

1.1. ルビとは何か

この小節は規範的ではありません。

ルビとは、他のテキスト(「基底」と呼ばれる)のそばに配置され、そのテキストに関連する注釈や発音ガイドとして機能するテキスト列の一般的な名称です。

日本語テキストの各漢字の上にひらがなルビが付与されている例
日本語テキストに各漢字の発音を示すルビ(ふりがな)が付与されている例。

以下の図は、単純なケースとより複雑な構造の2つのルビの例を示しています。

この例では、1つの注釈が複数文字からなる基底テキストに付与されています。
日本語表現の上にルビが付与されている例

日本語におけるルビの例(単純なケース)

日本語組版では、このケースを「対語ルビ」(日本語: 対語ルビ、すなわち単語ごとルビ)やグループルビと呼ぶことがあります。注釈全体が複数文字の単語(全体)に対応しているためです。

2つ目の例では、基底テキストに2段階の注釈が付与されています。 上部のひらがなは各漢字の発音を示し、下部の「Keio」と「University」は英訳を示しています。
基底文字の上下に注釈テキストが付与された複雑なルビの例

基底文字の上下に注釈テキストが付与された複雑なルビ

ひらがな注釈と対応する漢字基底文字の正しい対応関係を反映するため、基底レベルテキスト内の字送りが調整されていることに注目してください。 (これは上図の4番目の漢字の周辺で発生しており、3文字のふりがなが付いています。) 上記の例のような基底テキストの可変な字送りを避けるため、ひらがな注釈をマージ注釈としてスタイル指定することができ、これにより先ほどのグループルビのような見た目になります。 ただし、基底-注釈のペアリングはルビ構造で記録されているため、テキストが行をまたいで折り返された場合でも、注釈文字は対応する基底文字と正しくペアリングされたまま保持されます。

HTMLでは、ルビ構造およびそのマークアップの表現方法がRuby Markup Extension仕様で説明されています。 本モジュールでは、そのようなマークアップに対するCSSによるレンダリングモデルとルビレイアウトに関する書式制御について説明します。

ルビやその書式指定についてさらに詳しく知りたい場合は、「What is Ruby」記事[QA-RUBY]を参照してください。 日本語における主なルビの書式手法については、JIS X-4051 [JIS4051](日本語)や 「ルビおよび圏点」日本語組版処理の要件 [JLREQ]、日本語・英語)に詳しくまとめられています。 Rules for Simple Placement of Japanese Ruby [SIMPLE-RUBY]も(英語)で日本語ルビ書式の一手法を解説しています。 「行間注記」Requirements for Chinese Text Layout [CLREQ]、中国語・英語)には中国語組版での関連手法も記載されています。

1.2. モジュール間の関係

このモジュールは、CSS Level 2 [CSS2] のインラインボックスモデルを拡張してルビをサポートします。

このモジュール内のプロパティは、::first-line::first-letter 疑似要素には適用されません。 ただし、ruby-position::first-line を継承して 1行目のルビ注釈に影響を与えることができます。

1.3. 値の定義

本仕様は、CSSプロパティ定義の規約[CSS2])および 値定義構文[CSS-VALUES-3])に従っています。 本仕様で定義されていない値型は CSS Values & Units [CSS-VALUES-3] で定義されています。 他のCSSモジュールとの組み合わせにより、これらの値型の定義が拡張される場合があります。

プロパティごとの値に加え、本仕様で定義されるすべてのプロパティは CSS全域キーワードもプロパティ値として受け付けます。 可読性のため、ここでは繰り返し記載していません。

1.4. 図の表記規則

この小節は規範的ではありません。

東アジア組版における多くの表記規則は、表示される文字が全角(CJK)か半角(非CJK)かに依存します。 本文書に登場するいくつかの図では、次の凡例が使われています:

全角グリフの象徴的表現
テキスト中のn番目に位置する全角グリフ(例:漢字)。注釈の場合は通常50%の大きさになります。
半角グリフの象徴的表現
テキスト中のn番目に位置する半角グリフ(例:ローマ字)。

上記シンボルが図中で取る向きは、実際にユーザーエージェントで描画される際のグリフの向きと対応しています。 図中の各文字間の間隔は特に意味がない場合もありますが、意図的に変えている場合もあります。

2. ルビボックスモデル

CSSルビモデルは、 W3C HTML5 Rubyマークアップモデル および XHTML Ruby Annotation 勧告 [RUBY] に基づいています。 このモデルにおいて、ルビ構造は、 基底(注釈対象)テキストを表す1つ以上のルビ基底要素と、 注釈を表す1つ以上のレベルのルビ注釈要素から構成されます。 ルビの構造はテーブルの構造と似ており、 「行」(基底テキストレベル、各注釈レベル) および「」(各ルビ基底とその対応するルビ注釈)があります。

ルビ構造がテーブル状に並ぶ例。最初の「列」は基底ボックス内の「上」と、その下に中央揃えで配置された注釈ボックス内の「じょう」。2番目の「列」は別の基底ボックス内の「手」と、その下に中央揃えで配置された注釈ボックス内の「ず」。
日本語の複合語「上手」に「じょうず」という発音ルビが付与された例。各音節が個別に基底文字と対応しています。

連続する基底とその連続する注釈のセットはルビセグメントとしてまとめられます。 ルビセグメント内では、ルビ注釈が複数のルビ基底にまたがることがあります。

ルビ構造がテーブル状に並ぶ例。最初の「列」は基底ボックス内の「旧」と、その上に中央揃えで配置された注釈ボックス内のjiù。2番目の「列」は基底ボックス内の「金」と、その上にjīn。3番目の「列」は基底ボックス内の「山」と、その上に.shān。そして英語名San Franciscoが全体の下にまたがる注釈ボックス内に中央揃えで配置されている。
中国の都市名「旧金山」にピンイン「jiùjīnshān」と英語名「San Francisco」が注釈として付与された例。各ピンイン音節は個別に基底文字と対応し、英語名は文字列全体に対応しています。

注記: HTMLでは、1つの<ruby>要素に複数のルビセグメントを含めることができます。 (XHTML Rubyモデルでは、1つの<ruby>要素には1つのルビセグメントしか含められません。)

2.1. ルビ用display

あらかじめルビ要素が定義されていない文書言語(XMLアプリケーション等)の場合は、著者が文書言語の要素をルビ要素にマッピングする必要があり、 これはdisplay プロパティで行います。

名前: display
新しい値: ruby | ruby-base | ruby-text | ruby-base-container | ruby-text-container

以下の新しいdisplay 値は、任意の要素にルビレイアウトの役割を割り当てます:

ruby
要素がルビコンテナボックスを生成することを指定します。 (HTML/XHTMLの<ruby>要素に対応します。)
ruby-base
要素がルビ基底ボックスを生成することを指定します。 (HTML/XHTMLの<rb>要素に対応します。)
ruby-text
要素がルビ注釈ボックスを生成することを指定します。 (HTML/XHTMLの<rt>要素に対応します。)
ruby-base-container
要素がルビ基底コンテナボックスを生成することを指定します。 (XHTMLの<rbc>要素に対応。HTMLでは匿名ボックスとして生成されます。)
ruby-text-container
要素がルビ注釈コンテナボックスを生成することを指定します。 (HTML/XHTMLの<rtc>要素に対応します。)

専用のルビマークアップをサポートする言語(HTMLなど)を使用する場合は、 任意の要素(<span>など)にルビ用display 値を適用するのではなく、正しいマークアップを使うべきです。 正しいマークアップを使うことで、スクリーンリーダーや非CSSレンダラーでもルビ構造を解釈できるようになります。

注記: 置換要素display 値として ruby-baseruby-textruby-base-containerruby-text-container を持つ場合は、 インラインレベルボックスとして扱われます。 (CSS Display 3 § 2.4 レイアウト内部displayタイプ:table-*およびruby-*キーワード参照) 置換要素display 値として ruby または inline ruby を持つ場合は、 外部displayタイプに従って動作します。 (CSS Display 3 § 2.1 フローレイアウトの外部displayロール:block、inline、run-inキーワード参照。) (§ 2.1.2 非インラインルビも参照。)

2.1.1. ルビ整形コンテキスト

ルビコンテナは非原子的な インラインレベルボックスです。 通常のインラインボックスCSS Inline Layout 3 § 2 インラインレイアウトモデル参照)と同じく、 行をまたぎ、 その包含ブロックは最も近いブロックコンテナ祖先です。 また、インラインボックスの内容がそのインラインボックス自身を含む同一のインライン整形コンテキストに参加するのと同様に、 ルビコンテナおよびその基底レベルの内容も そのルビコンテナ自身を含む同一のインライン整形コンテキストに参加します。

ただし、ルビコンテナは 注釈を格納するために、そのインライン整形コンテキストの区間に対してさらに構造を与える ルビ整形コンテキストを確立します。 注記: この整形コンテキスト独立した 整形コンテキストではありません。 ルビ基底ルビ注釈ルビ基底コンテナルビ注釈コンテナ内部ルビボックスです。 内部テーブル要素と同様に、 ルビレイアウトで特定の役割を持ち、 それぞれのルビコンテナルビ整形コンテキストに参加します。 ルビ整形コンテキストでの役割に加え、 ルビ基底は同時に ルビコンテナと同じ基底レベルのインライン整形コンテキストにも参加し、 ルビ注釈ルビコンテナによって確立される注釈レベルのインライン整形コンテキストに参加します。

インラインボックスの内容と同様に、 包含ブロックルビコンテナ(およびすべての内部ルビボックス)の内容に対して ルビコンテナの包含ブロックです。 したがって、例えばfloatはルビコンテナ包含ブロックで止められ、 ルビボックスタイプのいずれにも影響しません。

2.1.2. 非インラインルビ

要素が内部display型としてrubyを持ち、 かつ外部display型inline以外の場合、 2つのボックスが生成されます: 必要な外部display型の主ボックスと、 インラインレベルのルビコンテナです。 要素に指定されたすべてのプロパティは主ボックスに適用され (継承可能な場合はルビコンテナボックスにも継承されます)。 これにより、要素をブロックとしてスタイル指定しつつ、内部のルビ構造を正しく維持できます。

注記:要素を絶対配置またはfloatさせると、そのdisplay 値はブロックレベル同等に計算されます。 ([CSS-DISPLAY-3][CSS2] セクション9.7参照) 内部ルビdisplay型については、 そのdisplay値がblockに計算されます。

2.2. 匿名ルビボックス生成

CSSモデルでは、文書言語がこれらすべての構成要素に対応する要素を含む必要はありません。 欠落している構造部品は、テーブル正規化で使われるものと類似の匿名ボックス生成規則により補われます。[CSS2]

  1. ブロックレベルボックスのインライン化 ルビコンテナルビ基底コンテナルビ注釈コンテナルビ基底ボックスルビ注釈ボックス に直接含まれるin-flowなブロックレベルボックスは、[CSS-DISPLAY-3]に従い 「インライン化」され、そのdisplay値も適切に計算され、 インラインレベルの内容のみを含むようになります。 例えば、displayプロパティがdisplay: blockのin-flow要素が display: ruby-textの親を持つ場合、 そのdisplay値はinline-blockに計算されます。
  2. 匿名ルビコンテナの生成: 連続した 不適切に包含されたルビ基底コンテナルビ注釈コンテナルビ基底ルビ注釈 (および間の空白)のいずれかの連続列は 匿名ルビコンテナでラップされます。 このステップにおいて:
  3. 誤った親を持つインラインレベル内容のラップ: ルビコンテナまたは ルビ基底コンテナの直下に連続するテキストやインラインレベルボックスは、匿名ルビ基底でラップされます。 同様に、ルビ注釈コンテナの直下に連続するテキストやインラインレベルボックスは匿名ルビ注釈でラップされます。 (この目的のため、誤った親を持つ内部テーブル要素はインラインレベル内容と見なされます。なぜなら、ルビボックスの親を持つため、最終的にインラインレベルテーブルラッパーボックスでラップされるからです。)

    ただし、このように構築された匿名ボックスが空白のみを含む場合は、 ルビ内空白と見なされ、下記のように破棄または保持されます。

  4. 先頭/末尾空白のトリム: ルビ内空白が親の唯一のin-flow子でなく、かつ ルビコンテナルビ注釈コンテナ、または ルビ基底コンテナの 最初または最後のin-flow子である場合は、display: noneのように削除されます。
  5. レベル間空白の削除: 直前直後のin-flow兄弟ボックスが下表のパターンに一致するルビ内空白レベル間空白と見なされ、 display: noneのように削除されます。
    前のボックス 次のボックス
    任意 ルビ注釈コンテナ
    ルビ注釈以外 ルビ注釈
  6. レベル内空白の解釈: 直前直後のin-flow兄弟ボックスが下表のパターンに一致するルビ内空白ボックスには下表のボックスタイプとサブタイプが割り当てられます:
    前のボックス 次のボックス ボックスタイプ サブタイプ
    ルビ基底 ルビ基底 ルビ基底 基底間空白
    ルビ注釈 ルビ注釈 ルビ注釈 注釈間空白
    ルビ注釈 または ルビ注釈コンテナ ルビ基底 または ルビ基底コンテナ ルビ基底 セグメント間空白
    ルビ基底 または ルビ基底コンテナ ルビ基底コンテナ
    ルビ基底コンテナ ルビ基底 または ルビ基底コンテナ
    上記で定義されたレベル内空白ボックスは ペアリングやレイアウトにおいて特別に扱われます。 下記を参照してください。
  7. 改行の抑制: ルビ注釈内のすべての強制改行を (white-space値に関わらず) CSS Text Level 3 § 4.1.2で定義される セグメント分割の折り畳みに従って変換します。

    この目的は、ルビ注釈内の改行を抑制してレイアウトモデルを簡略化することです。 あるいは、許容可能な挙動を定義することも考えられます。

  8. 匿名レベルコンテナの生成: ルビ基底基底間空白(ただしセグメント間空白でないもの)の連続列で ルビ基底コンテナの親でないものは匿名ルビ基底コンテナでラップされます。 同様に、ルビ注釈注釈間空白の連続列で ルビ注釈コンテナの親でないものは匿名ルビ注釈コンテナでラップされます。

すべてのルビレイアウト構造が正しく親付けされた時点で、 UAは基底と注釈の対応付けを開始できます。

注記: UAは内部構造としてこれらの匿名ボックス (や§ 2.3 注釈ペアリングの匿名空のレベル内空白ボックス)を生成する必要はありません。 ペアリングやレイアウトの挙動が それらが存在するかのように動作していれば十分です。

以下のマークアップ図は各種ボックスを表し、 ルビ内空白がどこで保持/破棄されるかを示します:
<ruby>×<rbc>×<rb></rb><rb></rb>×</rbc><rtc>×<rt></rt><rt></rt>×</rtc><rbc>×<rb></rb></rtc>×</ruby>

ここで

2.3. 注釈ペアリング

注釈のペアリングとは、 ルビ注釈ルビ基底を対応付ける処理です。 各ルビ注釈は1つ以上のルビ基底と対応付けられ、 それらの基底をスパンするといいます。 (ルビ注釈が複数の基底をスパンする場合、 それはスパン注釈と呼ばれます。)

ルビ基底は 各注釈レベルごとに1つのルビ注釈としか対応付けられません。 ただし、注釈レベルが複数ある場合は、 複数のルビ注釈と対応付けることができます。

ペアリングが完了すると、ルビカラムが定義されます。 各カラムは1つのルビ基底と それぞれの行間注釈注釈レベルごとに1つ(場合によっては空の匿名)のルビ注釈によって表されます(同じルビセグメント内)。

2.3.1. セグメントペアリングと注釈レベル

ルビ構造はルビセグメントに分割されます。 各セグメントは1つのルビ基底コンテナと、それに続く1つ以上のルビ注釈コンテナから成ります。 各ルビ注釈コンテナは 基底テキストに対する1つの注釈レベルを表し、 最初は第1レベル、2番目は第2レベル…となります。 ルビ基底コンテナ基底レベルを表します。 各セグメントのルビ基底コンテナは そのセグメント内のすべてのルビ注釈コンテナとペアになります。

異常ケースを扱うため、いくつかの空の匿名コンテナの存在が仮定されます:

セグメント間空白は実質的に独立したルビセグメントとみなされます。

2.3.2. ユニットペアリングとスパン注釈

ルビセグメント内では、 ルビ基底コンテナ内の各ルビ基底が そのルビセグメント内の各ルビ注釈コンテナの1つのルビ注釈とペアになります。

もしルビ注釈コンテナが ただ1つだけの匿名ルビ注釈を含む場合、 そのルビ注釈は、そのルビセグメント内の すべてのルビ基底とペアリングされ(すなわちスパンする)ことになります。

それ以外の場合、各ルビ注釈は 文書順でそのセグメント内対応するルビ基底とペアになります。 ルビ注釈コンテナ内のルビ注釈数が足りない場合は、 残りのルビ基底ルビ注釈コンテナの末尾に挿入された匿名空注釈とペアになります。 ルビ基底が足りない場合は、 残りのルビ注釈ルビ基底コンテナの末尾に挿入された匿名空基底とペアになります。

実装が明示的スパン付きルビマークアップ(例:XHTML Complex Ruby Annotations)をサポートする場合は、 スパン注釈と基底のペアリング規則を適切に調整する必要があります。

レベル内空白は 標準の注釈ペアリングには参加しません。 ただし、直近のルビ基底ルビ注釈がペアリングされている場合:

下図は通常の基底注釈ボックスのペアリング、 さらにwsで表されるルビ内空白のペアリングを示します:
|[  s p a n n i n g   a n n o t a t i o n ]|
|[ a1 ]|[ws]|[ a2 ]|[  ]|[ a3 ]|[ws]|[ a4 ]|
|[ b1 ]|[ws]|[ b2 ]|[ws]|[ b3 ]|[  ]|[ b4 ]|

青い括弧([ ])は基底ボックス、 赤い括弧([ ])は注釈ボックス、 灰色の縦棒(|)はルビカラムの区切り、 [ws]ルビ内空白[]は空の匿名基底または注釈(他レベルのレベル内空白に対応して自動生成されるもの)を表します。 ルビコンテナ基底コンテナ注釈コンテナは省略しています。

2.4. 注釈の非表示:visibility: collapse と自動非表示ルビ

ルビ注釈visibilitycollapse の場合、その注釈は非表示注釈となります。 さらに、ルビ注釈のテキスト内容が基底と完全に一致する場合、 UAによって自動的に非表示自動非表示)になります。

非表示となったルビ注釈は、 注釈ペアリングに影響しません。 ただし、非表示注釈は表示されず、レイアウトにも影響を与えませんが、 同じレベル内で隣接するルビ注釈ボックスの区切りとして作用し、 まるで異なるセグメントに属しているかのように、 非表示注釈の基底がルビ基底でなく途中のインライン要素であるかのように扱われます。

自動非表示は漢字とひらがなが混在する日本語単語に対して、注釈を正しくインライン表示するのに役立ちます。 例えば、振り仮名 という単語は次のようにインライン表示されるべきです:

振り仮名(ふりがな)

したがって、次のようにマークアップされます:

<ruby>
  <rb></rb><rb></rb><rb></rb><rb></rb>
  <rp>(</rp><rt></rt><rt></rt><rt></rt><rt></rt><rp>)</rp>
</ruby>

しかしルビ表示時には「り」の注釈は非表示となるべきです。

振り仮名の各基底文字の上にひらがな注釈が表示されている。りの上には注釈がない。

振り仮名のひらがなルビ。「り」の上には注釈がありません(すでにひらがなだから)。

この例の日本語単語は三つの漢字で構成されており、 そのうち一つは小学校一年生で習うもので、他の二つはより上級です。 (基底と注釈の対応を色分けで示しています。)
<ruby><rb></rb></rb><rt>こん</rt class=easy>ちゅう</rt></ruby>
昆虫記、3文字すべてに発音注釈。真ん中の注釈が基底より広いので隣と重ならないようスペースが追加されている。
3文字すべてに注釈が付いた例

すべての文字に発音ガイドが必要な読者もいれば、 一部の読者には簡単な文字の注釈は非表示にした方が適切です。 visibility: collapse を適用すると非表示にできます:

昆虫記、1文字目と3文字目だけ注釈が中央に残る。
真ん中の注釈を visibility: collapse にした例

非表示visibility: collapse の挙動は、 visibility: hiddenとは異なります。 hiddenは注釈を不可視にしますが、その分のスペースはレイアウト上残ります:

昆虫記、2文字目の注釈は表示されていないが、その分のスペースが確保されて基底文字が離れている。
真ん中の注釈を visibility: hidden にした例

また、display: none とも異なります。visibility: collapse はペアリング関係を維持しますが、 display: none はボックスをツリーから完全に削除し、 以降の注釈のペアリングが崩れてしまいます:

昆虫記、2文字目の注釈が削除されたため、3文字目の注釈が2文字目に誤ってペアリングされて表示されている。
真ん中の注釈を display: none にした例

computed valueruby-merge注釈コンテナにおいて merge の場合、非表示は無効化されます。 値が auto の場合は、 ユーザーエージェントが非表示の可否を判断できますが、UAのレイアウトアルゴリズムが separate と同様の結果を生成する場合は 非表示を有効化することを推奨します。

自動非表示の内容比較は、空白の折り畳み(white-space)やテキスト変換(text-transform)の前に行われ、 要素は無視され(ボックスの textContent のみを見る)、比較されます。

注記:将来のCSS Rubyレベルでは自動非表示の制御が追加される可能性がありますが、 本レベルでは常に強制されます。

2.5. 空白の折り畳み

§ 2.2 匿名ルビボックス生成で説明した通り、 ルビ構造内の空白は破棄されます:

例えば、次のマークアップは空白なしで表示されます:
<ruby>
  <rb></rb><rb></rb>
  <rt>とう</rt><rt>きょう</rt>
  <rtc><rt></rt><rt>kyō</rt></rtc>
</ruby>

ルビセグメント間、 ルビ基底間、 ルビ注釈間では 空白は破棄されず、 基底間空白注釈間空白セグメント間空白としてレンダリングで保持されます。 (上記レベル内空白の解釈参照)

空白保持のルールにより、ルビはラテン語など空白区切りのスクリプトにも利用できます。 例えば、
<ruby>
  <rb>W</rb><rb>W</rb><rb>W</rb>
  <rt>World</rt> <rt>Wide</rt> <rt>Web</rt>
</ruby>

また、注釈付き空白も保持されます。例えば、

<ruby>
  <rb>Aerith</rb><rb> </rb><rb>Gainsborough</rb>
  <rt>エアリス</rt><rt></rt><rt>ゲインズブール</rt>
</ruby>

破棄されなかった空白が折り畳み可能な場合は、 各行ボックス内で隣接するボックス間で 標準の空白処理ルール [CSS-TEXT-3]に従い折り畳まれます。 異なるルビセグメント非表示注釈で区切られた注釈は隣接しているとはみなされません。 ただし、基底レベルの内容( 字間注釈を含む、これらは アトミックインラインとして扱われます)では隣接扱いとなります。 折り畳み可能空白ルビセグメント間(セグメント間空白)に存在する場合、 文脈テキストは両側のルビ基底によって決まります。 (ソース文書上の空白両側のテキストではなく、間に行間注釈があっても基底が基準となります。)

注記: 空白処理ルールにより、 セグメント分割 (改行など)を含む空白列は、漢字や仮名間では何も表示されなくなるように折り畳まれます。 これにより、中国語や日本語のルビでは空白による字下げを安全に利用できます。 たとえば次のマークアップも空白なしで表示されます:
<ruby><rt>おく</rt><rt>ない</rt><rt>きん</rt><rt>えん</rt>
</ruby>

ただし、セグメント分割を含まない空白は完全には消えず、 次の例では1組目と2組目のルビの間に空白が表示されます:

<ruby><rt>おく</rt><rt>ない</rt><rt>きん</rt><rt>えん</rt>
</ruby>

3. ルビのレイアウト

ルビ構造をレイアウトする際、 まず基底レベルは そのルビ基底が通常の インラインボックスであるかのように、 ルビコンテナを そのままインラインボックスとして包み込む形で行上に配置されます。

ルビコンテナ内に 字間注釈がある場合は、 基底レベル内に § 3.2 字間ルビレイアウトで詳細に述べる方法で配置されます。 その後、基底コンテナのサイズが決まり、 行間注釈§ 3.1 行間ルビレイアウトで説明される方法で配置されます。

他のCSSレイアウトモデルと同様、 相対位置指定や変形、その他のグラフィカル効果はボックスのレイアウト後に適用されます。

3.1. 行間ルビレイアウト

行間ルビ注釈は まず同じインラインボックスであるかのように 同じインライン整形コンテキストに参加して配置され、 実質的に行ボックスをその注釈レベルごとに ルビコンテナ内で確立します。 注釈基底は以下の説明に従って間隔を調整して互いに揃えられます。

3.1.1. インライン軸行間レイアウト

インライン軸において、行間ルビ注釈は、 ルビ基底ボックスに対して、 それぞれの注釈コンテナruby-merge値に従い揃えられます。

ruby-mergeseparateの場合、 各ルビカラムは そのカラム内で最も幅の広い内容(ルビ基底または ルビ注釈)に合わせて幅が決まります。 スパン注釈(実際にスパンする場合も ruby-merge: mergeでスパン扱いの場合も)において、 スパン注釈の内容がスパン先のカラム合計幅より広い場合は、 差分がスパンしたカラムに均等配分されます。 ルビセグメント内に 複数のスパン注釈がある場合は、 より少ない基底をスパンする注釈から順に追加スペースの分配を行い、 スパン数が多い注釈ほど後から分配されます。 各ルビ基底ルビ注釈は それぞれ自分のカラム幅にちょうど合うようにサイズ調整されます。

注記: 異なるレベルの複数注釈が同数の基底をスパンしつつ スパン範囲が重なってもぴったり一致しない場合、 追加スペースの分配は未定義です。 これはHTMLマークアップでは発生しませんが、 [RUBY]のように明示的スパンができるマークアップ言語では起こり得ます。

注釈コンテナruby-merge: auto の場合に いずれかのルビ注釈が 対応する基底より広い場合は、 そのルビ注釈注釈コンテナ内で 自分のカラムをはみ出してもよいです。 この場合、はみ出し部分がどのようにカラム幅へ影響するかはUAに委ねられますが、 ルビセグメント全体が すべての内容を収める幅になることが条件です。

字間注釈はカラム間に挿入されます: これは両隣のカラムをスパンする注釈の計測には含まれますが、 いずれのカラムにも含まれず、 行間注釈の サイズや配置の影響は一切受けません。

基底注釈ボックス内で、 内容がボックス幅より狭い場合の余白の分配方法は ruby-alignプロパティによって決まります。

以下の図は、これらのルールを典型例と複雑な例で示したものです。 各例では基底ボックス注釈ボックスruby-align: center注釈コンテナruby-align: space-betweenが指定されているものとします。

青い括弧([ ])は基底ボックス、 赤い括弧([ ])は注釈ボックス、 灰色の縦棒(|)はルビカラムの区切りです。 ルビコンテナ基底コンテナ注釈コンテナは省略しています。

分離/非スパン:
|[  a1  ]|[  a2  ]|[annotation-3]|
|[base 1]|[base 2]|[   base 3   ]|

カラム内のボックスは、そのカラムで最も幅の広い ボックスに合わせて幅が決まります。 各ruby-align値に従い 基底ボックス注釈ボックス内の余白が分配されます。

スパン(短い):
|[  a1  ]|[   short span  ]|
|[base 1]|[base 2]|[base 3]|

スパン注釈がスパンする 基底の合計幅より短い場合は、 追加スペースの分配はありません。 スパン注釈内の余白は そのruby-align値に従い分配されます(非スパンと同様)。

スパン(長い):
|[  a1  ]|[spanning annotation]|
|[base 1]|[ base 2 ]|[ base 3 ]|

スパン注釈がスパンする基底ボックスより長い場合、 余白は均等に分配されます。

マージ(短い):
|[merged        annotation]|
|[base 1]|[base 2]|[base 3]|

マージ注釈スパン注釈と似ていますが、 余白の分配はruby-align値が 注釈コンテナに効きます(個々の注釈ボックスではなく)。

複数レベル+スパン注釈:
|[   a1   ]|[ annotation-2 ]|[   a3   ]|
|[long annotation spanning all content]|
|[ base 1 ]|[    base 2    ]|[ base 3 ]|
|[  xx  ]|[annotation spanning bases]|
|[  a1  ]|[ annotation-2 ]|[   a3   ]|
|[base 1]|[    base 2    ]|[ base 3 ]|

複数の注釈レベルにまたがる2例では、 各カラムは その中で最も長い内容に合わせて幅が決まります。 スパン注釈がさらに長い場合は スパン先のカラム合計幅をさらに広げ、各カラムに均等に加算します。

複数レベル+複数スパン注釈:
|[   xx   ]|[  annotation spanning bases  ]|
|[   a1   ]|[  annotation-2  ]|[    a3    ]|
|[lengthy annotation spanning base content]|
|[ base 1 ]|[     base 2     ]|[  base 3  ]|

複数のスパン注釈がある場合、 より少ない基底をスパンする注釈から先に処理します。 この例では緑の注釈(2基底スパン)が橙の注釈(3基底スパン)より先に処理されます。 順序が変わればスペース分配も変わります。

どのスパン注釈が どの余白に関与しているか分かりやすいよう、 各スパン注釈のテキスト色を、 追加スペースの背景色と合わせています。

3.1.2. ブロック軸行間レイアウト

これらのルビボックスに対して vertical-alignがどの程度影響するか定義する必要があります。 Issue 4987 を参照。

基底コンテナは次の内容すべてを ちょうど収めるようにサイズと位置が決まります: そのルビ基底の margin ボックス全体、対応する字間注釈ルビ注釈 margin ボックス(存在する場合)、およびこのルビコンテナに従属して同じインライン整形コンテキストに参加する子孫の基底注釈コンテナ。 (基底コンテナin-flow内容がない場合は、 空のルビ基底が1つ入っているとしてサイズ・位置決定されます。)

行間注釈コンテナは そのルビ注釈の margin ボックス全体および、 このルビコンテナに従属して同じ注釈レベルインライン整形コンテキストに参加する 基底注釈コンテナをちょうど収めるようにサイズ・位置決定されます。 (注釈コンテナin-flow内容がない場合は、空のルビ注釈1つ入っているとしてサイズ・位置決定されます。) これらの注釈コンテナruby-positionに応じて 対応する基底コンテナの上下どちらかにスペース無しで積み重なり、 ルビ注釈の基底とのブロック軸方向配置が決まります。

ブロック軸マージンは折り畳むべきか? そうすればレイアウトが堅牢になるが、インライン軸での挙動とは矛盾する。

3.2. 字間ルビレイアウト

字間注釈は特殊なレイアウトとなります。字間ルビ注釈ボックス基底レベルのレイアウトの一部として挿入・測定されます。 各ルビ注釈は、ペアとなるルビ基底の右側に挿入されます。 スパンする字間注釈は、スパンする基底の一番右の後ろに配置されます。 字間ルビ注釈は、以下に述べる例外を除き インラインブロックと同じようにレイアウトされます。

注記: inter-character の定義通り、 字間注釈は常に vertical-rlwriting-mode となり、 横書きルビコンテナでのみ存在します。

ルビ注釈は 対象となるルビ基底の直後、 (基底間空白セグメント間空白の前)に配置されます。 もし同じルビ基底に複数の 字間ルビ注釈ボックスが並ぶ場合は、 それらのmargin ボックスは、スペースなしで右方向に(レベル順で)積み重ねられます。

もし自動高さルビ注釈ボックス内容領域が、直後の内容ボックスルビ基底の)より低い場合、 注釈ボックスの内容ボックス高さは正確に基底と一致するよう拡大されます。

ルビ注釈ボックスの揃え方は、 ruby-alignプロパティによって決まります:

字間注釈ルビ注釈コンテナボックスは、 その内容ボックスがルビ基底コンテナボックスと ちょうど一致するようにサイズ・配置されます。

注記: 字間ルビ注釈コンテナボックスの サイズや位置はレイアウトに一切影響しません。 上記定義はプログラムによる問い合わせで決定的な結果を得るためのものです。

揃えやカラム幅決定(§ 3 ルビのレイアウト参照)の目的では、 字間ルビ注釈は、 紐付く基底と同じカラムの一部とみなされず、 独自のカラムを形成するものとします。

3.3. ルビボックスのスタイル付け

ルビ基底ルビコンテナインラインボックスとして扱われ、 特に規定がない限り、インラインボックスに適用可能なすべてのプロパティも同様に適用されます。 ただし、行基準シフト値 vertical-aligntopbottom)は無視され(ゼロとして扱う)必要があります。

特に規定がない限り、 インラインボックスに適用可能なすべてのプロパティは、 ルビ注釈にも同様に適用されますが、 line-heightは適用されません。 また、行基準シフト値 vertical-aligntopbottom)も無視され(ゼロとして扱う)必要があります。

marginpaddingborderプロパティ およびインラインボックスに適用されないプロパティは 基底コンテナ注釈コンテナには適用されません。 さらに、line-height注釈コンテナには適用されません。

UAは ルビ基底コンテナボックスルビ注釈コンテナボックスに対し、 backgroundプロパティやoutlineプロパティなど ボックスの範囲を描画するプロパティをサポートする必要はありません。 UAはこれらのボックスを継承や内容レイアウト制御のための抽象概念として実装してもかまいません。

3.4. 行の折り返し

ルビコンテナ全体が行に収まらない場合、 すべてのレベルで同時に改行が許可されている箇所でルビを折り返してもよいです。 (行の折り返し詳細は CSS Text 3 § 5 行の折り返しと単語境界を参照。) ルビは通常、基底-注釈セットの間で折り返されますが、 行折り返し規則が許す場合、ルビ基底(および対応するルビ注釈ボックス)内部でも折り返されることがあります。

ルビが行をまたぐときは、ルビ注釈は必ず 対応するルビ基底と一緒に動きます。 ルビ基底注釈の間、 あるいは字間注釈の場合であっても、 行途中で分断してはなりません

Bopomofoルビの行折り返し位置の図

字間ルビの行折り返し位置

行折り返し後、 各断片は独立してレイアウトされ、 ルビ揃えも断片ごとに行われます。

3.4.1. 基底間の折り返し

通常、ルビ基底ボックスルビ注釈ボックスは 内部での改行を禁止するスタイルとなっており、強制改行も含みません。 (付録Aを参照。) この場合、ルビコンテナは 隣接するルビ基底間でのみ折り返すことができ、 そのルビ基底にスパンするルビ注釈が存在しない場合のみです。

複雑なルビの行折り返し位置の図

ルビの行折り返し位置

2つの隣接するルビ基底間でルビが折り返せるかどうかは、 基底テキストの通常の行折り返し規則で制御されます。 これはルビ基底が隣接するインラインボックスであるかのように判定されます。 (注釈は基底レベルの ソフトラップ判定時には無視されます。)

例:2つの隣接ルビ基底が「蝴」と「蝶」の場合、 通常、2つの漢字の間で行を折り返せます。 ただし、word-breakkeep-allのときは、その箇所での行折り返しは禁止されます。
<ruby><rt></rt><rt>dié</rt>

基底間空白は、ルビ基底間での行折り返し機会を評価する際に意味を持ちます。 インライン間の空白と同様に、 そこで行が折り返されると空白は折り畳まれます。 詳細はCSS Text 3 § 4.1 空白処理ルール参照。 同様に、注釈の空白も行折り返し時にトリムされます。

例:次のマークアップを考えます。
<ruby><rb>one</rb> <rb>two</rb> <rt>1</rt> <rt>2</rt></ruby>

この場合、空白があるため "one" と "two" の間で行が折り返せます。 そこで行が折り返されると、その空白や "1" と "2" の間の空白は標準CSS空白処理規則により消えます。

3.4.2. 基底内での折り返し

長い基底テキストの場合、基底-注釈ペアの内部で行を折り返し可能にするのが適切なこともあります。 例えば、英文に日本語訳注釈を付けた場合、テキストの折り返しを許すことで段落内の行折り返しが自然になります。

仕様執筆者の妄想ではなく実際例であることを示すため、スキャン例を挿入すること。

ルビ基底内での行折り返しは、 white-spaceプロパティが ルビ基底とすべての並列注釈で許可されており、 かつ各基底/注釈ボックス内容内(先頭・末尾以外)に ソフトラップ機会がある場合のみです。 ルビ基底注釈の断片間には構造的対応関係が無いため、 UAは任意の機会で改行してよいですが、 断片ごとの内容量を比例的に均等化するのが推奨されます。

字間注釈内では 行折り返し機会はありません。

3.5. 双方向(Bidi)並べ替え

Unicode双方向アルゴリズムは、異なる方向性の文字が同一段落内に混在した場合、 視覚的表示のため論理順テキストを並べ替えます。

ルビ注釈と対応するルビ基底の対応関係を保つため、 いくつかの制約を課す必要があります:

これを実現するために、

他のインラインレベル内容と同じく、 内部ルビボックスのBidi並べ替えは 行折り返し後に行われ、論理順に従って内容が行に分割されます。

注記: もしruby-mergeが対象注釈コンテナmerge の場合に限り、 個々の注釈へのBidiアイソレーションを適用しないことで 一括処理できるようにしてもよいかもしれません。 ただし、この状況をサポートする需要がない限り 実装複雑化の正当性が薄いため、必要な事例がある方はCSS WGまでご連絡ください。

CSSにおける双方向テキストについてさらに詳しくは [CSS3-WRITING-MODES]を参照してください。

3.6. 行間隔

line-heightプロパティは、CSSにおける行間の間隔を制御します。 行内のインライン内容がline-heightより短い場合は、 内容の上下にハーフリーディングが追加されます(CSS Inline Layout 3 § 5 論理的高さと行間隔参照)。

行間の一貫した間隔を確保するため、 ルビ付き文書では通常、line-heightが ルビをテキスト行間に収めるのに十分な大きさになるようにします。 そのため、通常はルビ注釈コンテナルビ注釈ボックスは 行内内容の高さの計測には寄与せず、 揃え(vertical-align参照)やline-heightの計算は ルビ基底コンテナのみを用いて行われます。これはあたかも通常のインラインであるかのように動作します。

ただし、line-heightルビコンテナで指定されており、その値が 一番上のルビ注釈コンテナの上端と 一番下のルビ注釈コンテナの下端の間の距離よりも小さい場合は、 ルビ基底コンテナの適切な側に追加リーディングが加えられます。これにより、もし3行すべてに同じルビがあったとしても ルビコンテナ同士が重ならないようになります。

注記: これはルビ注釈が 行ボックス内に必ず収まることを保証するものではありません。 あくまですべての行の間隔が等しくかつルビ注釈の量や位置が等しい場合に オーバーラップを防ぐのに十分な余白が確保されるのみです。

著者は、ルビを考慮したline-heightpaddingの指定に注意し、 特にブロックの先頭や末尾、または行内に 画像・インラインブロック・vertical-alignでシフトされた パラグラフのデフォルトフォントサイズより高いインライン要素がある場合には十分配慮してください。

各行の内容はline-heightの中央に配置され、両側の追加スペースがハーフリーディングと呼ばれる。ルビが2倍のハーフリーディングより小さい場合は行間に収まるが、これは前の行のハーフリーディング部分にルビがはみ出していることを意味する。

ルビ注釈はしばしば行からはみ出します。ルビ付き行の上や下の内容には ルビのための十分なスペースを確保してください。

注記: ルビが整列や行レイアウトにどう影響するかについての より詳細な制御はCSS Line Layout Module Level 3で導入予定です。 ただし現時点では探究段階であり、新機能の記述はまだ信頼性がありません。

4. ルビ書式プロパティ

以下のプロパティはルビの配置テキスト分布揃えを制御するために導入されています。

4.1. ルビの配置:ruby-positionプロパティ

名前: ruby-position
値: [ alternate || [ over | under ] ] | inter-character
初期値: alternate
適用対象: ルビ注釈コンテナ
継承: yes
百分率: n/a
算出値: 指定キーワード
正規順序: 文法順
アニメーション型: 離散

このプロパティはルビ注釈が基底に対してどこに配置されるかを制御します。 各値の意味は以下の通りです:

alternate
複数の注釈レベルoverunder で交互になります。

もし注釈コンテナがその注釈レベルで最初である場合や、 それ以前のすべてのレベル字間の場合は、 alternate単独または overとの組み合わせは overと同様に動作し、 alternateunderの組み合わせは underと同様に動作します。

それ以外の場合、 直前の行間注釈が overであれば alternateunderと同じ動作をし、 逆も同様です。 (この場合、alternateを単独指定しても overまたは underと組み合わせても違いはありません。)

over
ルビ注釈は基底の上側に表示されます。
横書きモードで基底の上にルビが表示されている図

横書き日本語の基底の上にルビ

縦書きモードで基底の右にルビが表示されている図

縦書き日本語の基底の右にルビ

under
ルビ注釈は基底の下側に表示されます。 この設定は表意東アジア系文字の組版では比較的珍しく、教育用テキストなどで見られます。
横書きモードで基底の下にルビが表示されている図

横書き日本語の基底の下にルビ

縦書きモードで基底の左にルビが表示されている図

縦書き日本語の基底の左にルビ

inter-character
writing modeルビコンテナ縦書きの場合は、 overと同じ動作になります。

それ以外の場合、ルビ注釈は字間注釈となります。 注釈は横書きテキストの場合、基底の右側に表示されます。 このとき、このルビ注釈コンテナの 子ルビ注釈writing-modeの算出値は vertical-rl となります。

注記: writing-modeの算出値は ルビ注釈コンテナ自身には影響しません。 これは、同一要素上の writing-modedisplayruby-position の算出値間で循環依存を避けるためです。

この値は台湾などで使われる伝統的な中国語の特殊ケース向けです。 その文脈では(注音符号ルビ)は、 横組みでも基底文字の右側に縦に現れます:

台湾式ルビの例

伝統的中国語の“注音符号”ルビ(分かりやすく青で表示)横組みの場合

注記: 継承は要素ツリーに沿って行われるため ルビレイアウトで生成される匿名ボックスは考慮されません。 字間注釈を使う場合、 要素ベースのルビ注釈コンテナ・ 匿名ルビ注釈・ さらにその子孫要素を含む マークアップパターンは避ける必要があります。なぜなら、 その子孫はルビ注釈コンテナから writing-modeを継承し、 ルビ注釈writing-mode 変更の影響を受けません。
ruby { ruby-position: inter-character; }
<ruby>base<rtc><em>problematic</em> annotation</ruby>

上記のマークアップでは、“problematic annotation”全体をラップする匿名ルビ注釈ボックスが <rtc> 要素の子として生成されます。 それは注釈コンテナruby-positioninter-character のため、 その writing-modevertical-rl となり、期待通りです。 しかし<em>要素は <rtc>writing-modeを直接継承し、 それはvertical-rlに強制されていません。

この例では明示的なルビ注釈コンテナ要素は不要なので ルビ注釈要素を使えば問題は避けられます:

<ruby>base<rt><em>problematic</em> annotation</ruby>

明示的なルビ注釈コンテナ要素が必要な場合でも ルビ注釈要素を合わせて使えば解決します:

<ruby>base<rtc><rt><em>problematic</em> annotation</ruby>

注釈コンテナ字間注釈でないものは 行間注釈と呼ばれます。

複数のルビ注釈コンテナが 同じruby-positionを持つ場合、 それらは基底テキストから外側に積み重なります。

4.2. 注釈スペースの共有:ruby-mergeプロパティ

名前: ruby-merge
値: separate | merge | auto
初期値: separate
適用対象: 行間ルビ注釈コンテナ
継承: yes
百分率: n/a
算出値: 指定キーワード
正規順序: 文法順
アニメーション型: 算出値型による

このプロパティは、1つのルビコンテナボックス内に複数のルビ注釈ボックスがある場合、 各ペアを分離して表示するか、 注釈をマージしてグループとして表示するか、 または空間状況に応じて分離/合体のどちらにするかを制御します。

注記: 字間注釈は常に分離され、このプロパティは適用されません。

値の意味:

separate
各ルビ注釈ボックスは 対応するカラム内(基底ボックスと同じ)で表示され、 隣接する基底と重ならないように配置されます。 このスタイルは[JLREQ]で「モノルビ」と呼ばれます。
対になる基底と注釈のどちらかが長い場合、そのペアだけのために基底または注釈側に余白が追加される。例:上手の注釈では、じょうの方が長いので1文字目の周囲に余白が追加され、2文字目のずは単純に基底に合わせて配置・揃えされる。
ruby-merge: separate(中央揃え)
例:下記2行は同じように表示されます。
<p><ruby><rt></ruby><ruby><rt>じょう</ruby>
<p><ruby style="ruby-merge:separate"><rb><rb><rt><rt>じょう</ruby>
merge
同じ行・同じルビセグメント内の全ルビ注釈ボックスインラインボックスとして 注釈コンテナ内に連結し、 それらすべての基底ボックスにまたがる 単一の匿名ルビ注釈ボックスにまとめてレイアウトします。 1行で表示される場合、このスタイルは[JLREQ]における「グループルビ」と似ています。 ただし行をまたぐ場合は、ルビ注釈は必ず 対応するルビ基底と一緒に処理されます。
結合された注釈は結合基底全体に対して中央揃えで配置される。例:上手の場合、1文字目の注釈のうと2文字目のずが2文字目の上に重なって表示される。
ruby-merge: merge(中央揃え)
2行とも両文字が同じ行内に収まる場合、 下記2行は同じように表示されます。
<p><ruby>無常<rt>むじょう</ruby>
<p><ruby style="ruby-merge:merge"><rb><rb><rt><rt>じょう</ruby>

ただし2つの基底が行をまたぐ場合は、2例目はruby-position: separateと同じように表示されます。

auto
UAは任意のアルゴリズムで各ルビ注釈ボックスを対応する基底と合わせてレンダリングしてよいですが、 すべての注釈が基底上に収まる場合は separateと同じになるようにし、 一部注釈が基底より広い場合は 基底間スペースを挿入しない形で 何らかの方法でスペースを共有させます。
十分なスペースがある場合、注釈は基底ごとに揃うが、スペースが不足すると注釈同士が隣の注釈とスペースを共有する。例:上手の注釈は合体表示、下手の注釈はseparateスタイル。
ruby-merge: auto(中央揃え)
注記: この挙動は複合語(熟語)ルビ向けです。 “What is ruby?”のJukugo Ruby参照。[QA-RUBY]

この種のルビの表示には様々な慣習があります。 Simple Ruby PlacementのJukugo-ruby配置JLREQの熟語ルビの配置JISX4051の4.12.3(c) 熟語ルビの処理 など参照。

最も単純なものは、 すべての注釈が基底幅内に収まる場合はseparate、 そうでなければmergeで表示する方法です。

注記: テキストは、たとえマージされた場合でも ルビ注釈基底をまたいで 字形結合やリガチャを形成しません。 これはbidiアイソレーションによるものです。 § 3.5 双方向並べ替えおよび CSS Text 3 § 7.3 要素境界をまたぐ字形処理も参照。

4.3. ルビテキスト分布: ruby-align プロパティ

名前: ruby-align
値: start | center | space-between | space-around
初期値: space-around
適用対象: ルビ基底、ルビ注釈、ルビ基底コンテナ、ルビ注釈コンテナ
継承: yes
百分率: n/a
算出値: 指定キーワード
正規順序: 文法順
アニメーション型: 算出値型による

このプロパティは、各種ルビボックスの内容がそのボックスを正確に満たさない場合に、テキストをどのように分布させるかを指定します。 ruby-alignによって分配される空白は、字詰め(ジャスティフィケーション)による空白とは無関係かつ独立しています。

字間注釈の場合、このプロパティはボックス自体の配置にも影響します (§ 3.2 字間ルビレイアウト参照)。 それ以外の場合は、ボックス内の内容の配置のみに影響し、ボックス自体の大きさや位置には影響しません。

各値の意味は以下の通りです:

start
ルビ内容がボックスの開始端に揃います。
ルビテキストが基底より短い時の左揃えルビの図 ルビテキストが基底より長い時の左揃えルビの図

start ルビ分布

「肩付きルビ」はこの start値に近いが、厳密には同じではありません。 特に基底をはみ出す場合の挙動は文脈によって異なることがあります。JLREQ参照。 また、これは縦書きでのみ使われ、JLTFでも特に重要とはされていません。 したがって、この値を肩付きルビに合わせて高度に調整する必要はないかもしれません。 startが他用途で必要なら残し、そうでなければ削除も検討?

center
ルビ内容がボックス内で中央揃えされます。
ルビテキストが基底より短い時の中央揃えルビの図 ルビテキストが基底より長い時の中央揃えルビの図

center ルビ分布

space-between
ルビ内容は通常のテキストジャスティフィケーション(text-justifyで定義)に従い分布しますが、 ジャスティフィケーション機会justification opportunitiesが無い場合は中央揃えされます。
ルビテキストが基底より短い時の両端分布ルビの図 ルビテキストが基底より長い時の両端分布ルビの図

space-between ルビ分布

space-around
space-betweenと同様ですが、 追加のjustification opportunityが存在し、 その空白がルビ内容の前後に半分ずつ分配されます。
ルビテキストが基底より短い時のauto分布ルビの図 ルビテキストが基底より長い時のauto分布ルビの図

space-around ルビ分布

デフォルトUAスタイルシートtext-justify: rubyルビ注釈に適用しており、 CJK文字の隣接ペア間にはジャスティフィケーション機会justification opportunitiesが発生しますが、 ラテン文字や注音符号(Bopomofo)文字間には発生しません。 そのため、space-aroundspace-between でも、ラテン文字や注音符号は中央揃えされます:
半角ルビが基底より短い時のauto分布ルビの図 半角基底より長いルビのauto分布の例

非CJKルビテキストはspace-aroundspace-betweenでも中央揃え

空白分布はtext-justifyで制御できます。[CSS-TEXT-3]

ルビ基底ルビ注釈内の内容は、 ruby-merge: mergeによるスパンを除き、 そのボックス上のruby-alignの値で揃えられます。 マージ注釈内の内容は、 ルビ注釈コンテナ上の ruby-alignの値によって揃えられ、 個々のruby-alignルビ注釈上の値は無視されます。

マージ注釈によって ルビセグメント全体が広がった場合どうするか? 現仕様ではすべての基底がスパン扱いで広がるが、例えば複数基底を持つ基底コンテナ内テキストを中央揃えしたい場合に不都合。 代わりにruby-mergeを基底コンテナにも適用できるようにするか? ただしその場合、基底が複数注釈をスパンし得る(基底側がマージで注釈レベルがマージでない場合)・ あるいは基底をマージにしたら注釈レベルすべてマージ必須……など追加仕様要検討。

ruby-mergeautoの場合の内容の揃え方はUA依存ですが、 すべての注釈が対応基底に収まる場合は ruby-merge: separateと同じでなければなりません。

4.4. ルビテキストの装飾

テキスト装飾は基底テキストから注釈へは伝播しません。

ルビの祖先にテキスト装飾が指定された場合、 ルビ基底コンテナ全体の内容領域に装飾が描画されます。 これには、長い注釈のために基底内容の両端に追加されたスペースも含まれます。 ルビ基底自身に装飾が指定された場合、 この追加スペースは装飾されません。これはボックス自体のpaddingが装飾対象外になるのと同様です。 [CSS3-TEXT-DECOR]

テキスト装飾はルビ基底コンテナやルビ注釈コンテナに直接指定することもできます。 その場合はコンテナ内のすべての基底または注釈に伝播し、またその間も装飾を連続して描画します。

ルビ注釈の位置は、基底テキストにオーバーラインやアンダーライン装飾が適用された際の衝突を回避するために 調整される場合があります。 フォントサイズやベースライン配置が一貫している基本的な場合は、 アンダーラインやオーバーラインは 基底レベルとその側の注釈の間に配置されます。

隣接する基底/注釈内容間での装飾描画 について要明確化。ボックスがカラム幅いっぱいか否かで変わる。

5. エッジ効果

5.1. ルビのはみ出し: ruby-overhangプロパティ

名前: ruby-overhang
値: auto | none
初期値: auto
適用対象: ルビ注釈コンテナ
継承: yes
百分率: n/a
算出値: 指定キーワード
正規順序: 文法順
アニメーション型: 算出値型による

ruby-overhangプロパティは ルビ注釈ルビコンテナの外側の隣接テキストにはみ出して重なることを許可するかどうかを制御します。 各値の意味は以下の通りです:

auto
ルビ注釈コンテナが対応するルビ基底コンテナより長い場合、 ルビ注釈コンテナは隣接ボックスにはみ出して重なることができます。

どの程度・どんな条件ではみ出すかはUAが決定します。

none
ルビ注釈コンテナは絶対にはみ出してはなりません。

ルビ注釈がはみ出し不可の場合、 ルビコンテナは 従来のインラインボックスのように振る舞い、 つまり自分自身の内容のみが境界内に描画され、隣接要素はボックス境界をまたぎません:

ルビボックスが隣接テキストと相互作用する図

隣接テキストにはみ出し不可のシンプルなルビ

一方、ルビ注釈コンテナがはみ出し可の場合、 隣接内容はルビコンテナボックスと重なり、 ルビ注釈が 周囲のインラインレベル内容に部分的に重なることも許されます。 はみ出しは、隣接内容と ルビコンテナの注釈ボックスや 重なった基底内容との衝突を 起こさない範囲に限られます。

ルビボックスが隣接テキストと相互作用する図

隣接テキストにはみ出し可のシンプルなルビ

注記: あるルビ基底に関するルビ注釈が別のルビ基底をはみ出してよいかは ruby-mergeで制御されます。

通常、基底や注釈の内容自体の揃え方は、はみ出しの許可有無に影響されません。 揃えや空白分布(ruby-align参照)は はみ出し許可と無関係に同じ方法で行われ、 はみ出し可能スペースの計算前に決定されます。 ただし、UAは空白分布や揃え決定時に許容されるはみ出しを考慮しても構いません。

はみ出しと揃えの相互作用については 場合によってはさらなる検討が必要かもしれません。

UAは [JIS4051]の 注釈フォントの全角0.5字(0.5ic) をはみ出し最大長とする推奨に従ってもよいです。 日本語でルビテキストが隣接文字にはみ出す詳細仕様は[JLREQ]参照。

5.2. 行端揃え

行頭や行末に、ルビ基底より長いルビ注釈ボックスがある場合、 UAはそのルビ注釈の端を 基底の対応端に強制的に揃えてもよいです。 この種の揃えは[JLREQ]で説明されています。

本仕様レベルではこの挙動を制御する仕組みは提供しません。

ルビテキストが基底より短い時の行端揃えルビの図 ルビテキストが基底より長い時の行端揃えルビの図

行端揃え

付録A: サンプルスタイルシート

このセクションは参考情報です。

A.1 デフォルトUAスタイルシート

以下はHTMLおよびXHTMLルビマークアップをルビレイアウトとして描画するための、デフォルトUAスタイルシートの例です:

ruby { display: ruby; }
rp   { display: none; }
rbc  { display: ruby-base-container; }
rtc  { display: ruby-text-container; }
rb   { display: ruby-base; white-space: nowrap; }
rt   { display: ruby-text; }
ruby, rb, rt, rbc, rtc { unicode-bidi: isolate; }

rtc, rt {
  font-variant-east-asian: ruby;  /* See [[CSS-FONTS-3]] */
  text-justify: ruby;             /* See [[CSS-TEXT-4]] */
  text-emphasis: none;            /* See [[CSS-TEXT-DECOR-3]] */
  white-space: nowrap;
  line-height: 1; }

rtc, :not(rtc) > rt {
  font-size: 50%; }
rtc:lang(zh-TW), :not(rtc) > rt:lang(zh-TW),
rtc:lang(zh-Hanb), :not(rtc) > rt:lang(zh-Hanb), {
  font-size: 30%; }               /* bopomofo */

注記: 著者は上記のルールを使用しないでください。 ルビレイアウトをサポートするUAはこのスタイルをデフォルトで提供すべきです。

ユーザー制御の「最小フォントサイズ」機能を実装するUAは、ルビ注釈に対してはその最小値を縮小して適用することを検討してください。

A.2 ルビ注釈のインライン化

以下はHTMLおよびXHTMLルビマークアップをインライン注釈として描画するためのサンプルスタイルシートです:

ruby, rb, rt, rbc, rtc, rp {
  display: inline; white-space: inherit;
  font: inherit; text-emphasis: inherit; }

A.3 括弧の自動生成

残念ながら、セレクタはテキストノードにマッチできないため、 CSSだけではHTML内の全てのルビマークアップパターンに対し 未括弧化ルビ注釈へ自動的かつ正確に括弧を追加することはできません。 (これはHTMLルビが、対応要素なしで生テキストからルビ基底を暗黙的に扱えるためです。)

しかし、<rb><rtc>が厳格に使われている場合は、以下のルールで 各注釈シーケンスの前後に括弧を追加できます:

/* <rtc> の前後に括弧 */
rtc::before { content: "("; }
rtc::after  { content: ")"; }

/* <rtc>でない最初の<rt>の前に括弧 */
rb  + rt::before,
rtc + rt::before { content: "("; }

/* <rtc>でない<rt>の後ろに括弧 */
rb ~ rt:last-child::after,
rt + rb::before  { content: ")"; }
rt + rtc::before { content: ")("; }

また、完全に交互型(adjacentなルビ注釈がない) <ruby>A<rt>a</rt>B<rt>b</rt>C<rt>c</rt><ruby> であることが分かっている場合、下記ルールで各注釈の前後に括弧が付与されます:

/* 各<rt>の前後に括弧 */
rt::before { content: "("; }
rt::after  { content: ")"; }

6. 用語集

ボポモフォ または 注音符号 (中国語: ㄅㄆㄇㄈ, 注音符號, 注音符号

主に標準中国語(普通話)の発音記号として使われるために開発された文字および声調記号。 これらはルビ注釈(振り仮名)として用いられることが多いですが、必ずしもそれだけではありません。

ボポモフォ文字(青色)が横書きテキストの各漢字の右側に縦に並んでいる。

中国語で音声補助の字間注釈として使われるボポモフォの例

ボポモフォ声調記号は、各ボポモフォ音節の末尾(メモリ上)に現れるスペース文字です。 通常は他のボポモフォ文字の右側や上側の別軌道に表示され、記号の位置は音節内の文字数によって異なります。 ただし、軽声記号(ニュートラルトーン)は、右側や上側ではなく、ボポモフォの前(同じ行)に配置されます。

注記: テキスト表示時の字形の相対配置や位置決め(ボポモフォ声調記号含む)はユーザーエージェントやフォントシステムの責任であり、ルビ注釈や通常のインライン内容であってもCSSルビレイアウトの役割ではありません。

ボポモフォ文字Bopomofo Unicode スクリプト(U+3100–312F, U+31A0–31BFブロック)に属します。 ボポモフォ声調記号は U+02C9 (ˉ), U+02CA (ˊ), U+02C7 (ˇ), U+02CB (ˋ), U+02EA (˪), U+02EB (˫), U+02D9 (˙) です。 これらはCSS上「ボポモフォ文字」として扱います。

漢字(ハンジャ、韓国語: 漢字
中国文字体系から借用・改変された表意文字を用いる韓国語表記体系の一部。 漢字(かんじ)も参照。
ひらがな(日本語: 平仮名
日本語の音節文字またはその一文字。 丸みを帯びた書体が特徴。 日本語表記体系の一部であり、 漢字やカタカナとともに使われる。 近年では、主に漢字が使えない・ふさわしくない場合の日本語単語や語尾・助詞の表記に用いられる。 カタカナも参照。
表意文字
アルファベットや音節文字とは異なり、意味・語・語要素を表すための文字。 最も有名な表意文字体系は東アジア(中国・日本・韓国など)で用いられている。
かな(日本語: 仮名
ひらがなとカタカナをまとめて指す総称。
漢字(日本語: 漢字
日本語で使われる表意文字を指す日本語の用語。 日本語表記体系の一部であり、 ひらがな・カタカナとともに使われる。 ハンジャ(韓国漢字)も参照。
カタカナ(日本語: 片仮名
日本語の音節文字またはその一文字。 角ばった書体が特徴。 日本語表記体系の一部であり、 漢字やひらがなとともに使われる。 近年では主に外来語の表記に用いられる。 ひらがなも参照。

謝辞

この仕様の作成には、以下の方々のご協力が不可欠でした:

David Baron、 Robin Berjon、 Susanna Bowen、 Stephen Deach、 Martin Dürst、 Hideki Hiura (樋浦 秀樹)、 Masayasu Ishikawa (石川雅康)、 Taichi Kawabata、 Chris Pratley、 Xidorn Quan、 Takao Suzuki (鈴木 孝雄)、 Frank Yung-Fong Tang、 Chris Thrasher、 Masafumi Yabe (家辺勝文)、 Boris Zbarsky、 Steve Zilles。

特に、以前の編集者である Michel Suignard氏、Marcin Sawicki氏(Microsoft)、 Richard Ishida氏(W3C)に感謝します。

変更点

本節は過去の公開以降の変更点を記録しています。

2021年12月2日WD以降の変更点

2020年4月29日WD以降の変更点

注記: 多数の未解決の課題が残っています。Disposition of Comments および GitHub上の新しい課題を参照。

2014年8月5日WD以降の変更点

2013年9月19日WD以降の変更点

2011年6月30日WD以降の変更点

ruby-spanおよびrbspanへの言及を削除。
HTMLルビでは明示的スパンではなく暗黙的スパンを採用。 これにより、複雑な両側スパンの病的ケースは扱えませんが、現時点で要件はありません。 (XHTML複雑ルビをフルサポートする実装では、テーブルのセルスパンと同様 マークアップからスパンを暗黙的に推定可能です。 この制御をLevel 1で入れる必要はなさそうです。)
ruby-overhangruby-align: line-endはLevel 2に持ち越し。
複雑で高度な機能のため。UA定義挙動とし、許容例を示す形とする提案。
display: rpリクエストへの対応: display: noneを使用。
Internationalization WGで rp 要素のdisplay値リクエストがあったが、ルビ表示時に非表示にするにはdisplay: noneで十分。
ruby-position値を text-emphasis-positionに合わせた。
ただしinter-characterは維持。 ルビ位置をtext-emphasis-positionと揃える方が 横書き・縦書きの組み合わせに柔軟に対応できる。
ruby-alignの未使用値を削除。
leftrightendは不要。
autodistribute-letterdistribute-spaceruby-alignから削除し、 space-betweenspace-around で統一。
autoは内容調査型だったが、 space-around と 標準ジャスティフィケーション規則だけで十分。 distribute-letter/distribute-spaceは space-betweenspace-aroundとした方が [CSS-FLEXBOX-1][CSS-ALIGN-3]等の分布キーワードと一貫し、 text-justify: distributeとの関連も避けられる。
ruby-mergeプロパティ追加、熟語ルビ制御用。
これは構造的効果ではなくスタイル効果。 旧モデルは構造的でマークアップ変更による対応を想定していたが、誤りだった。
inlineruby-position から削除。
これは各種要素に display: inlineを適用すればAppendix Aのように実現可能。
デフォルトスタイルルール追加
Internationalization WGの要望による。
匿名ボックス生成規則を策定
基底・注釈ペアリング明確化。 HTMLルビ全マークアップの組み合わせも扱えるはず。
ルビのレイアウト定義
空間分布・空白処理・改行・行積み上げ等を詳細に規定。 bidiについてはopen issue。

適合性

文書上の規約

適合要件は、記述的な断定とRFC 2119の用語の組み合わせで表現されます。規範的な部分における「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「MAY」「OPTIONAL」はRFC 2119で定義される意味で解釈してください。 ただし可読性のため、本仕様書ではこれらの単語は必ずしもすべて大文字で記載されていません。

この仕様の本文は、特に非規範的、例、注記と明記された部分を除き、すべて規範的です。[RFC2119]

本仕様の例は「for example」で始まるか、下記のようにclass="example"で規範テキストから区別されます:

これは情報的な例です。

情報的な注記は「Note」で始まり、class="note"で規範テキストから区別されます:

注記: これは情報的な注記です。

助言(advisement)は規範的な強調部分であり、下記のように<strong class="advisement">で区別されます: UAはアクセシブルな代替手段を必ず提供しなければなりません。

適合クラス

本仕様への適合は、以下の3つの適合クラスについて定義されます:

スタイルシート
CSSスタイルシート
レンダラー
UA(利用者エージェント)で、スタイルシートの意味を解釈し、それを使って文書を描画するもの。
オーサリングツール
UAのうち、スタイルシートを作成するもの。

スタイルシートは、本モジュールで定義された構文を使うすべての記述が、一般CSS文法および各機能ごとの個別文法に従い正当であれば、本仕様に適合します。

レンダラーは、スタイルシートを仕様通りに解釈することに加え、本仕様で定義されたすべての機能を正しくパース・描画することで適合となります。ただし、デバイスの制限で文書を正しく描画できない場合でもUAが非適合となるわけではありません(例:モノクロ画面で色を描画できなくても問題なし)。

オーサリングツールは、一般CSS文法と本モジュール内各機能の個別文法に合致し、本モジュールで定義されるその他の適合要件を満たすスタイルシートを出力すれば適合となります。

部分実装

著者がフォールバック値を指定できるようにするため、CSSレンダラーは、未サポートの@ルール・プロパティ・値・キーワード・その他構文要素については必ず(必要に応じて無視)無効として扱うべきです。特にUAは、未サポート値を含む複数値プロパティ宣言で、サポートされている値だけを選択的に適用してはなりません。いずれか一つでも値が無効とされた場合、CSSでは宣言全体を無視しなければなりません。

不安定・独自拡張機能の実装

将来のCSS標準機能との衝突を防ぐため、CSSWGは将来互換性のベストプラクティス不安定機能・独自拡張の実装に関する推奨事項に従うことを提案します。

非実験的実装

仕様がCandidate Recommendation段階に達すると、非実験的な実装が可能となります。実装者は仕様に従って正しく動作することが実証できるCRレベルの機能については、プリフィックス無しでリリースすべきです。

CSSの実装間での相互運用性を確保するため、CSSワーキンググループでは非実験的CSSレンダラーが実装レポート(および必要に応じて、そのためのテストケース)をW3Cに提出することを推奨しています。テストケースはCSSワーキンググループで審査・修正されることがあります。

テストケースや実装レポートの提出方法などの詳細は、CSSワーキンググループのウェブサイト https://www.w3.org/Style/CSS/Test/ を参照してください。 質問は public-css-testsuite@w3.org メーリングリストまで。

索引

本仕様で定義されている用語

参照による定義用語

参考文献

規範的参照

[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4. 2022年11月3日. WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022年1月13日. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS Display Module Level 3. 2022年11月18日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-FONTS-5]
Myles Maxfield; Chris Lilley. CSS Fonts Module Level 5. 2021年12月21日. WD. URL: https://www.w3.org/TR/css-fonts-5/
[CSS-GRID-2]
Tab Atkins Jr.; Elika Etemad; Rossen Atanassov. CSS Grid Layout Module Level 2. 2020年12月18日. CR. URL: https://www.w3.org/TR/css-grid-2/
[CSS-INLINE-3]
Dave Cramer; Elika Etemad. CSS Inline Layout Module Level 3. 2022年11月14日. WD. URL: https://www.w3.org/TR/css-inline-3/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS Pseudo-Elements Module Level 4. 2022年12月30日. WD. URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 2021年12月17日. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2021年12月24日. CR. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-TABLES-3]
François Remy; Greg Whitworth; David Baron. CSS Table Module Level 3. 2019年7月27日. WD. URL: https://www.w3.org/TR/css-tables-3/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS Text Module Level 3. 2022年5月5日. CR. URL: https://www.w3.org/TR/css-text-3/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2022年12月1日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2022年10月19日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2019年7月30日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[CSS3-TEXT-DECOR]
Elika Etemad; Koji Ishii. CSS Text Decoration Module Level 3. 2022年5月5日. CR. URL: https://www.w3.org/TR/css-text-decor-3/
[CSS3-WRITING-MODES]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3. 2019年12月10日. REC. URL: https://www.w3.org/TR/css-writing-modes-3/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119

参考情報のある参照

[CLREQ]
Bobby Tung; et al. Requirements for Chinese Text Layout - 中文排版需求. 2022年10月9日. NOTE. URL: https://www.w3.org/TR/clreq/
[CSS-ALIGN-3]
Elika Etemad; Tab Atkins Jr.. CSS Box Alignment Module Level 3. 2021年12月24日. WD. URL: https://www.w3.org/TR/css-align-3/
[CSS-FLEXBOX-1]
Tab Atkins Jr.; et al. CSS Flexible Box Layout Module Level 1. 2018年11月19日. CR. URL: https://www.w3.org/TR/css-flexbox-1/
[JIS4051]
Formatting rules for Japanese documents (『日本語文書の組版方法』). 日本規格協会. 2004年. JIS X 4051:2004. 日本語
[JISX4051]
Line composition rules for Japanese documents. 日本規格協会. 1995年. JIS X 4051-1995. 日本語
[JLREQ]
Hiroyuki Chiba; et al. Requirements for Japanese Text Layout 日本語組版処理の要件(日本語版). 2020年8月11日. NOTE. URL: https://www.w3.org/TR/jlreq/
[QA-RUBY]
Richard Ishida. What is ruby?. URL: https://www.w3.org/International/questions/qa-ruby
[RUBY]
Marcin Sawicki; et al. Ruby Annotation. 2001年5月31日. REC. URL: https://www.w3.org/TR/ruby/
[SIMPLE-RUBY]
Florian Rivoal; Atsushi Shimono; Richard Ishida. Rules for Simple Placement of Japanese Ruby. 2020年6月9日. WD. URL: https://www.w3.org/TR/simple-ruby/

プロパティ索引

名前 初期値 適用対象 継承 %ages アニメーション型 正規順序 算出値
ruby-align start | center | space-between | space-around space-around ruby基底, ruby注釈, ruby基底コンテナ, ruby注釈コンテナ yes n/a 算出値型による 文法順 指定キーワード
ruby-merge separate | merge | auto separate 行間ルビ注釈コンテナ yes n/a 算出値型による 文法順 指定キーワード
ruby-overhang auto | none auto ruby注釈コンテナ yes n/a 算出値型による 文法順 指定キーワード
ruby-position [ alternate || [ over | under ] ] | inter-character alternate ruby注釈コンテナ yes n/a 離散 文法順 指定キーワード

課題索引

この目的は、ルビ注釈内での改行を抑制することでレイアウトモデルを単純化することです。 あるいは、許容可能な挙動を何らか定義することも考えられます。
vertical-align がこれらのルビボックスにどの程度影響するかを定義する必要があります。 Issue 4987 を参照。
ブロック軸マージンは折り畳むべきか? そうすればレイアウトが堅牢になるが、インライン軸の挙動とは矛盾する。
仕様執筆者の妄想ではなく実際例であることを示すため、スキャン例を挿入すること。
「肩付きルビ」はこの start値に近いが、厳密には同じではありません。 特に基底をはみ出す場合の挙動は文脈によって異なることがあります。JLREQ参照。 また、これは縦書きでのみ使われ、JLTFでも特に重要とはされていません。 したがって、この値を肩付きルビに合わせて高度に調整する必要はないかもしれません。 startが他用途で必要なら残し、そうでなければ削除も検討?
マージ注釈によって ルビセグメント全体が広がった場合どうするか? 現仕様ではすべての基底がスパン扱いで広がるが、例えば複数基底を持つ基底コンテナ内テキストを中央揃えしたい場合に不都合。 代わりにruby-mergeを基底コンテナにも適用できるようにするか? ただしその場合、基底が複数注釈をスパンし得る(基底側がマージで注釈レベルがマージでない場合)・ あるいは基底をマージにしたら注釈レベルすべてマージ必須……など追加仕様要検討。
隣接する基底/注釈内容間での装飾描画 について要明確化。ボックスがカラム幅いっぱいか否かで変わる。
はみ出しと揃えの相互作用については 場合によってはさらなる検討が必要かもしれません。