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. 루비란?

이 하위 섹션은 규범적이지 않습니다.

루비는 본문(“베이스”라고 함) 옆에 나타나며 해당 텍스트에 대한 주석 또는 발음 가이드 역할을 하는 텍스트 구간을 일컫는 일반적인 명칭입니다.

일본어 텍스트의 각 한자 위에 히라가나 루비 주석이 표시됨
각 한자의 발음을 나타내는 음성 루비 주석이 달린 일본어 텍스트 예시.

다음 그림들은 루비의 두 가지 예시, 즉 단순한 경우와 더 복잡한 구조의 예시를 보여줍니다.

이 예시에서는 하나의 주석이 여러 문자로 이루어진 베이스 텍스트 전체에 적용되어 있습니다.
일본어 표현 위에 루비가 적용된 예시

일본어에서 사용된 루비의 예시(단순한 경우)

일본 타이포그래피에서는 이 경우를 타이고 루비(일본어: 対語ルビ, 즉 단어별 루비) 또는 그룹 루비라고 부르기도 합니다. 주석 전체가 여러 문자로 이루어진 단어(전체)에 연관되어 있기 때문입니다.

두 번째 예시에서는, 두 단계의 주석이 베이스 텍스트에 연결되어 있습니다: 위쪽의 히라가나 문자는 각 베이스 한자 문자들의 발음을 나타내며, 아래쪽의 “Keio”와 “University”는 영어 번역을 제공합니다.
베이스 문자 위아래에 주석 텍스트가 표시된 복잡한 루비 예시

베이스 문자 위와 아래에 주석 텍스트가 들어간 복잡한 루비

히라가나 문자와 해당 한자 베이스 문자 간의 올바른 연관을 반영하기 위해 베이스 수준 텍스트 내의 간격이 조정되는 점에 주목하세요. (위 그림에서 네 번째 한자 주변에, 세 글자로 된 음성 주석이 표시되어 있습니다.) 위 예시에서 베이스 텍스트의 가변 간격을 피하려면, 히라가나 주석을 병합 주석으로 스타일링할 수 있으며, 이 경우 앞서 본 그룹 루비 예시와 유사하게 보일 것입니다. 하지만 베이스-주석 짝짓기가 루비 구조 내에 기록되어 있으므로, 텍스트가 여러 줄로 나뉘어도 주석 문자는 해당 베이스 문자와 올바르게 연결된 채로 유지됩니다.

HTML에서는 루비 구조와 그 마크업에 대해 Ruby Markup Extension 명세에서 설명하며, 본 모듈은 해당 마크업의 루비 레이아웃과 관련된 CSS 렌더링 모델 및 서식 제어에 대해 다룹니다.

루비와 그 서식에 대한 더 깊이 있는 소개는 “What is Ruby” 기사 [QA-RUBY]에서 확인할 수 있습니다. 일본어에서 전통적으로 사용되는 주요 루비 서식 방식에 대한 폭넓은 정보는 JIS X-4051 [JIS4051](일본어) 및 “루비와 강조점”이 포함된 Requirements for Japanese Text Layout [JLREQ](영어/일본어)에서 참고할 수 있습니다. Rules for Simple Placement of Japanese Ruby [SIMPLE-RUBY] 또한 일본어 루비 서식에 대한 한 가지 접근법을 영어로 설명합니다. 중국어 타이포그래피에서의 관련 관행은 “Interlinear annotations”Requirements for Chinese Text Layout [CLREQ](중국어/영어)에서 설명합니다.

1.2. 모듈 간 상호작용

이 모듈은 루비 지원을 위해 CSS Level 2 [CSS2]의 인라인 박스 모델을 확장합니다.

이 모듈의 어떤 속성도 ::first-line 또는 ::first-letter 의사 요소에는 적용되지 않습니다. 단, ruby-position 속성은 ::first-line을 통해 상속되어 첫 번째 줄의 루비 주석에 영향을 줄 수 있습니다.

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 루비 마크업 모델과 XHTML 루비 주석 권고안 [RUBY]를 기반으로 합니다. 이 모델에서 루비 구조는 베이스(주석이 달린) 텍스트를 나타내는 하나 이상의 루비 베이스 요소와, 주석을 나타내는 하나 이상의 루비 주석 요소로 구성됩니다. 루비의 구조는 표(table)와 유사합니다: “행”(즉 베이스 텍스트 레벨, 각 주석 레벨), 그리고 “”(각각의 루비 베이스와 그에 대응하는 루비 주석)이 있습니다.

루비 구조가 표처럼 배치됨. 첫 번째 열에는 베이스 박스에 上이 있고, 그 아래에 주석 박스에 じょう가 중앙 정렬되어 있음. 두 번째 열에는 베이스 박스에 手, 그 아래에 ず가 중앙 정렬되어 있음.
일본어 합성어 “上手”에 발음 “じょうず”가 주석으로 달림. 각 음절이 베이스 문자와 개별적으로 연결되어 있습니다.

연속된 베이스와 연속된 주석의 집합은 루비 세그먼트로 그룹화됩니다. 루비 세그먼트 내에서, 루비 주석이 여러 루비 베이스에 걸쳐질 수도 있습니다.

루비 구조가 표처럼 배치됨. 첫 번째 열에는 베이스 박스에 旧, 그 위에 jiù, 두 번째 열에는 金, 그 위에 jīn, 세 번째 열에는 山, 그 위에 .shān, 그리고 영어 이름 San Francisco가 전체 구문 아래에 주석 박스로 중앙 정렬되어 있음.
중국 도시 이름 “旧金山”에 병음 “jiùjīnshān”과 영어 이름 “San Francisco”가 주석으로 달림. 각 병음 음절은 베이스 문자와 개별적으로 연결되지만, 영어 이름은 전체 이름에 연결되어 있습니다.

참고: HTML에서는 하나의 <ruby> 요소에 여러 루비 세그먼트가 들어갈 수 있습니다. (XHTML 루비 모델에서는 하나의 <ruby> 요소에 루비 세그먼트가 하나만 포함될 수 있습니다.)

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-base, ruby-text, ruby-base-container, ruby-text-container를 가지면 인라인 레벨 박스로 처리됩니다. (CSS Display 3 § 2.4 Layout-Internal Display Types: the table-* and ruby-* keywords 참고) 대체 요소display 값으로 ruby 또는 inline ruby를 가지면 외부 디스플레이 타입에 따라 동작합니다. (CSS Display 3 § 2.1 Outer Display Roles for Flow Layout: the block, inline, and run-in keywords 참고. § 2.1.2 인라인이 아닌 루비도 참조.)

2.1.1. 루비 포맷팅 컨텍스트

루비 컨테이너는 원자적이지 않은 인라인 레벨 박스입니다. 일반 인라인 박스와 마찬가지로(CSS Inline Layout 3 § 2 인라인 레이아웃 모델 참고), 줄을 넘어 분할될 수 있으며, 이들의 포함 블록은 가장 가까운 블록 컨테이너 상위 요소입니다. 그리고 인라인 박스의 콘텐츠가 해당 인라인 박스를 포함하는 동일한 인라인 포맷팅 컨텍스트에 참여하는 것처럼, 루비 컨테이너와 그 베이스 레벨 콘텐츠도 루비 컨테이너 자체를 포함하는 동일한 인라인 포맷팅 컨텍스트에 참여합니다.

하지만 루비 컨테이너는 또한 루비 포맷팅 컨텍스트를 생성하여, 주석을 배치하기 위해 인라인 포맷팅 컨텍스트의 자신의 구간에 추가 구조를 만듭니다. 참고: 이 포맷팅 컨텍스트독립적인 포맷팅 컨텍스트가 아닙니다. 루비 베이스, 루비 주석, 루비 베이스 컨테이너, 루비 주석 컨테이너내부 루비 박스입니다: 내부 테이블 요소와 유사하게, 루비 레이아웃에서 특정 역할을 가지며, 자신이 속한 루비 컨테이너루비 포맷팅 컨텍스트에 참여합니다. 루비 포맷팅 컨텍스트에서의 역할과 더불어, 루비 베이스는 동시에 루비 컨테이너와 동일한 베이스 레벨 인라인 포맷팅 컨텍스트에 참여하고, 루비 주석루비 컨테이너가 설정한 별도의 주석 레벨 인라인 포맷팅 컨텍스트에 참여합니다.

인라인 박스의 콘텐츠와 마찬가지로, 포함 블록루비 컨테이너(및 모든 내부 루비 박스)의 콘텐츠에 대해 루비 컨테이너의 포함 블록입니다. 예를 들어, float는 루비 컨테이너포함 블록에 의해 제한되며, 어떤 루비 박스 타입에 의해서도 제한되지 않습니다.

2.1.2. 인라인이 아닌 루비

어떤 요소가 내부 display 타입ruby이고 외부 display 타입inline이 아닌 경우, 두 개의 박스가 생성됩니다: 요구되는 외부 display 타입의 주 박스와, 인라인 레벨 루비 컨테이너입니다. 요소에 지정된 모든 속성은 주 박스에 적용되며 (상속 가능한 경우 루비 컨테이너 박스로 상속됩니다). 이를 통해 요소를 블록처럼 스타일링하면서도, 내부 루비 구조는 올바르게 유지할 수 있습니다.

참고: 요소에 절대 위치 지정이나 float를 적용하면 해당 display 값이 블록 레벨에 해당하는 값으로 계산됩니다. ([CSS-DISPLAY-3] 또는 [CSS2] 9.7절 참고) 내부 루비 display 타입의 경우, 이로 인해 display 값이 block으로 계산됩니다.

2.2. 익명 루비 박스 생성

CSS 모델은 문서 언어에서 이러한 모든 구성 요소에 해당하는 요소를 반드시 포함할 것을 요구하지 않습니다. 누락된 구조 부분은 테이블을 정규화할 때와 유사한 익명 박스 생성 규칙에 따라 암시됩니다. [CSS2]

  1. 블록 레벨 박스 인라인화(Inlinify): 루비 컨테이너, 루비 베이스 컨테이너, 루비 주석 컨테이너, 루비 베이스 박스, 루비 주석 박스에 직접 포함된 in-flow 박스는 인라인화(inlinify)되며([CSS-DISPLAY-3] 참고), 이들의 display 값이 그에 맞게 계산되어, 오직 인라인 레벨 콘텐츠만 포함하게 됩니다. 예를 들어, displaydisplay: block인 in-flow 요소가 display: ruby-text 요소의 자식일 때는 inline-block으로 계산됩니다.
  2. 익명 루비 컨테이너 생성: 연속된 잘못 포함된 루비 베이스 컨테이너, 루비 주석 컨테이너, 루비 베이스, 루비 주석 (그리고 그 사이의 공백)은 익명 루비 컨테이너로 감싸집니다. 이 단계에서:
  3. 잘못된 부모의 인라인 레벨 콘텐츠 래핑: 루비 컨테이너 또는 루비 베이스 컨테이너의 자식인 연속된 텍스트 및 인라인 레벨 박스는 익명 루비 베이스로 감싸집니다. 마찬가지로, 루비 주석 컨테이너의 자식인 연속된 텍스트 및 인라인 레벨 박스는 익명 루비 주석으로 감싸집니다. (이 목적상, 잘못된 부모를 가진 내부 테이블 요소인라인 레벨 콘텐츠로 간주되며, 루비 박스의 자식이기 때문에 궁극적으로 인라인 레벨 테이블 래퍼 박스로 감싸집니다.)

    단, 이렇게 생성된 익명 박스가 공백만 포함할 경우, 이는 루비 내부 공백으로 간주되어, 아래에 설명된 대로 버려지거나 보존됩니다.

  4. 선/후행 공백 제거: 부모의 유일한 in-flow 자식이 아니면서, 루비 컨테이너, 루비 주석 컨테이너, 루비 베이스 컨테이너의 첫 번째 또는 마지막 in-flow 자식인 루비 내부 공백display: none처럼 제거됩니다.
  5. 레벨 간 공백 제거: 인접 in-flow 형제가 아래 패턴에 해당하는 루비 내부 공백레벨 간 공백으로 간주되어 display: none처럼 제거됩니다.
    이전 박스 다음 박스
    any 루비 주석 컨테이너
    not 루비 주석 루비 주석
  6. 레벨 내 공백 해석: 인접 in-flow 형제가 아래 패턴에 해당하는 루비 내부 공백 박스는 아래 표에 정의된 박스 타입과 서브타입이 할당됩니다:
    이전 박스 다음 박스 박스 타입 서브타입
    루비 베이스 루비 베이스 루비 베이스 베이스 간 공백
    루비 주석 루비 주석 루비 주석 주석 간 공백
    루비 주석 또는 루비 주석 컨테이너 루비 베이스 또는 루비 베이스 컨테이너 루비 베이스 세그먼트 간 공백
    루비 베이스 또는 루비 베이스 컨테이너 루비 베이스 컨테이너
    루비 베이스 컨테이너 루비 베이스 또는 루비 베이스 컨테이너
    위에서 정의된 레벨 내 공백 박스는 짝짓기 및 레이아웃에서 특별하게 취급됩니다. 아래를 참고하세요.
  7. 줄바꿈 억제: 루비 주석 내부의 모든 강제 줄바꿈은 (white-space 값과 관계없이) CSS Text Level 3 § 4.1.2에서 정의한 collapsible segment breaks로 변환됩니다.

    이것의 목적은 루비 주석 내의 줄바꿈을 억제하여 레이아웃 모델을 단순화하는 것입니다. 또는, 허용 가능한 동작을 정의할 수도 있습니다.

  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. 주석 짝짓기

주석 짝짓기루비 주석루비 베이스를 연결하는 과정입니다. 각 루비 주석은 하나 이상의 루비 베이스와 연결되며, 해당 베이스를 span한다고 표현합니다. (여러 베이스에 걸쳐 span되는 루비 주석스패닝 주석이라 부릅니다.)

루비 베이스주석 레벨마다 하나의 루비 주석만 연결될 수 있습니다. 그러나 주석 레벨이 여러 개라면, 여러 루비 주석과 연결될 수 있습니다.

짝짓기가 완료되면, 루비 열이 정의되며, 각 열은 하나의 루비 베이스와 각 인라인 주석 레벨마다 하나의 루비 주석 (비어 있거나 익명일 수도 있음)으로 구성됩니다. 이들은 모두 같은 루비 세그먼트에 속합니다.

2.3.1. 세그먼트 짝짓기와 주석 레벨

루비 구조는 루비 세그먼트로 나뉘며, 각 세그먼트는 하나의 루비 베이스 컨테이너와 그 뒤를 잇는 하나 이상의 루비 주석 컨테이너로 구성됩니다. 루비 주석 컨테이너마다 루비 세그먼트 내에서 베이스 텍스트에 대한 각각의 주석 레벨을 나타냅니다: 첫 번째 컨테이너는 첫 번째 주석 레벨, 두 번째 컨테이너는 두 번째 주석 레벨, 이런 식으로 계속됩니다. 루비 베이스 컨테이너베이스 레벨입니다. 각 세그먼트의 루비 베이스 컨테이너는 해당 세그먼트 내 모든 루비 주석 컨테이너와 짝지어집니다.

퇴행적(degenerate) 케이스를 처리하기 위해, 일부 빈 익명 컨테이너가 존재하는 것으로 간주합니다:

세그먼트 간 공백은 사실상 독립적인 루비 세그먼트로 취급됩니다.

2.3.2. 단위 짝짓기와 스패닝 주석

루비 세그먼트 내에서, 루비 베이스 컨테이너의 각 루비 베이스는 해당 세그먼트 내 각 루비 주석 컨테이너에서 하나의 루비 주석과 짝지어집니다.

만약 루비 주석 컨테이너에 익명 루비 주석이 하나만 있다면, 그 루비 주석은 해당 루비 세그먼트 내의 모든 루비 베이스와 짝지어집니다(즉, span으로 걸침).

그 외의 경우, 각 루비 주석은 문서 순서대로 해당 세그먼트 내의 루비 베이스와 짝지어집니다. 루비 주석 컨테이너 내에 루비 주석이 부족하면, 남은 루비 베이스는 주석 컨테이너의 마지막에 익명 빈 주석과 짝지어집니다. 루비 베이스가 부족하면, 남은 루비 주석은 베이스 컨테이너의 마지막에 삽입된 익명 빈 베이스와 짝지어집니다.

명시적 스패닝을 지원하는 루비 마크업(예: 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>

하지만 실제로 루비로 표시할 때는 "り" 주석이 숨겨져야 합니다.

Hiragana annotations for 振り仮名 appear, each pronunciation above its kanji base character.

振り仮名에 대한 히라가나 루비. 이미 히라가나인 "り" 위에는 루비 주석이 표시되지 않습니다.

이 예시의 일본어 단어는 세 개의 한자로 구성되어 있으며, 그 중 하나는 초등학교 1학년 수준이고, 나머지 두 개는 더 난이도가 높습니다. (기본-짝짓기 대응을 색상으로 구분.)
<ruby><rb><rb><rb><rt>こん</rt class=easy>ちゅう<rt></ruby>
昆虫記, with phonetic annotations on all three characters.
			     Because the middle annotation is wider than its base,
			     space has been introduced around the base character
			     to prevent its annotation from colliding with the adjacent annotations.
세 글자 전체에 주석이 달린 예시

모든 한자의 발음이 필요한 독자가 있는 반면, 다른 사용자에게는 쉬운 글자의 주석은 숨기는 것이 더 적절할 수 있습니다. visibility: collapse를 적용하면 해당 주석을 숨길 수 있습니다:

昆虫記, with phonetic annotations centered over
			          the first and last characters.
가운데 주석에 visibility: collapse 적용

숨김 동작은 visibility: collapsevisibility: hidden과 다릅니다. hidden은 보이지만 공간은 그대로 차지합니다:

昆虫記, with phonetic annotations on the first and last characters.
			     Over the second one, even though no annotation is showing,
			     space is reserved as if to hold it,
			     which pushes the base characters apart.
가운데 주석에 visibility: hidden 적용

또한 display: none과도 다릅니다. visibility: collapse는 짝짓기 관계를 유지하지만, display: none은 박스를 트리에서 완전히 제거하여 이후 주석의 짝짓기에 혼란을 일으킵니다:

昆虫記, with mispaired phonetic annotations:
			     the annotation for the second character having been removed,
			     the annotation for the third character is displayed over the second one.
가운데 주석에 display: none 적용

computed valueruby-merge이고, 주석 컨테이너에서 merge인 경우, 숨김이 비활성화됩니다. 값이 auto라면, UA가 해당 주석의 숨김 활성 여부를 결정할 수 있으나, 레이아웃 알고리즘 결과가 separate에 가까우면 숨김을 활성화하는 것이 권장됩니다.

자동 숨김을 위한 내용 비교는 white space collapsing(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>

제거되지 않은 공백이 축소 가능(collapsible)한 경우, 각 라인 박스 내 인접 박스 간에 일반 공백 처리 규칙 [CSS-TEXT-3]에 따라 축소됩니다. 서로 다른 루비 세그먼트에 있거나, 숨김 주석으로 나뉜 주석은 인접하지 않은 것으로 간주합니다. 그러나 모든 베이스 레벨 콘텐츠(여기에는 문자 간 주석도 포함되며, 이는 원자적 인라인으로 처리됩니다)는 인접한 것으로 취급합니다. 축소 가능한 공백루비 세그먼트 사이에 있을 때(세그먼트 간 공백), 세그먼트 브레이크 변환을 위한 컨텍스트 텍스트는 양쪽의 루비 베이스에 의해 결정되며, 반드시 소스 문서 내 공백 양옆의 텍스트(여기에는 인라인 주석이 포함될 수도 있음)가 아닙니다.

참고: 공백 처리 규칙에 따라, 세그먼트 브레이크(예: 줄바꿈)를 포함하는 공백 시퀀스는 한자와 가나 문자 사이에서 아무것도 없는 상태로 축소됩니다. 즉, 중국어와 일본어 루비에서는 들여쓰기를 위해 공백을 안전하게 사용할 수 있습니다. 예를 들어, 다음 마크업은 공백 없이 표시됩니다:
<ruby><rt>おく</rt><rt>ない</rt><rt>きん</rt><rt>えん</rt>
</ruby>

반면, 세그먼트 브레이크가 없는 공백은 완전히 사라지지 않으므로, 아래 마크업은 첫 번째와 두 번째 루비 쌍 사이에 공백이 표시됩니다:

<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인 경우, 각 루비 열의 크기는 해당 내에서 가장 넓은(루비 베이스 또는 루비 주석) 콘텐츠에 맞춰집니다. 스패닝 주석(실제로 span하거나 ruby-merge: merge로 span하는 척 하는 경우), 주석 내용이 span된 보다 넓으면, 그 차이는 span된 에 균등하게 분배됩니다. 루비 세그먼트에 여러 스패닝 주석이 있으면, 이 추가 공간 분배는 span 범위가 가장 적은 것부터 시작하여 순차적으로 진행합니다. 각 루비 베이스루비 주석은 정확히 자신의 열을 span하도록 크기가 맞춰집니다.

참고: 여러 레벨의 주석이 같은 수의 베이스를 span하는데, 그 범위가 겹치지만 일치하지 않는 경우, 공간 분배는 정의되지 않습니다. 이는 HTML 마크업에서는 불가능하지만, [RUBY]처럼 명시적 span을 지원하는 마크업에서는 가능할 수 있습니다.

어떤 루비 주석이라도 주석 컨테이너에서 ruby-merge: auto이고 자신의 베이스보다 넓으면, 해당 루비 주석주석 컨테이너을 넘어 확장될 수 있습니다. 이렇게 확장될 경우, 해당 루비 세그먼트가 모든 콘텐츠를 포함할 만큼 충분히 넓게 만들어지면 열의 크기에 미치는 영향은 UA에 맡깁니다.

문자 간 주석은 열 사이에 끼워집니다: 양쪽 열을 모두 span하는 주석의 치수 계산에는 포함되지만, 어느 열에도 포함되지 않고, 인라인(줄간) 주석의 크기나 위치 결정에도 영향을 받지 않습니다.

베이스주석 박스 내부에서, 콘텐츠가 박스 크기보다 좁을 때의 여분 공간 배분 방식은 해당 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]|

스패닝 주석이 span된 베이스들보다 짧으면, 이 베이스에 분배할 여분 공간이 없습니다. 스패닝 주석 내부의 여분 공간은 해당 ruby-align 값에 따라, 일반 주석과 동일하게 분배됩니다.

스패닝(긴 경우):
|[  a1  ]|[spanning annotation]|
|[base 1]|[ base 2 ]|[ base 3 ]|

스패닝 주석이 span된 베이스 박스보다 길면, 여분 공간이 이들 사이에 균등하게 분배됩니다.

병합(짧은 경우):
|[merged        annotation]|
|[base 1]|[base 2]|[base 3]|

병합 주석스패닝과 유사하게 동작하지만, 내부 여분 공간 분배는 각 ruby-align이 아니라 주석 컨테이너의 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 ]|

여러 레벨이 있는 이 두 예시에서는, 각 의 크기는 가장 긴 콘텐츠에 맞춰지고, 스패닝 주석이 span하는 의 합보다 더 길면 각 열에 균등하게 추가됩니다.

여러 레벨, 다중 스패닝 주석:
|[   xx   ]|[  annotation spanning bases  ]|
|[   a1   ]|[  annotation-2  ]|[    a3    ]|
|[lengthy annotation spanning base content]|
|[ base 1 ]|[     base 2     ]|[  base 3  ]|

여러 스패닝 주석이 있을 때, span하는 베이스 수가 가장 적은 것부터 처리합니다. 이 예시에서는 초록색 주석이(두 개 베이스를 span) 오렌지색(세 개 베이스 span)보다 먼저 처리됩니다. 처리 순서를 바꾸면 공간 분배도 달라집니다.

스패닝 주석이 추가 공간에 어떻게 영향을 주는지 구분하기 위해, 이 다이어그램에서는 각 스패닝 주석의 텍스트 색상이 그가 다른 박스에 추가하는 공간의 배경색과 일치합니다.

3.1.2. 블록 축 인라인(줄간) 레이아웃

vertical-align이 이러한 루비 박스에 얼마나 영향을 미치는지 정의해야 합니다. 이슈 4987 참고.

베이스 컨테이너는 자신의 모든 루비 베이스의 마진 박스—그리고 연관된 모든 문자 간 루비 주석 마진 박스(해당되는 경우)—뿐만 아니라, 이 루비 컨테이너에 함께 참여하는 모든 하위 베이스주석 컨테이너를 정확히 포함하도록 크기가 정해지고 위치가 결정됩니다. (만약 베이스 컨테이너in-flow 콘텐츠가 없다면, 빈 루비 베이스 하나를 포함하는 것처럼 크기와 위치가 결정됩니다.)

인라인(줄간) 주석 컨테이너는 자신의 모든 루비 주석의 마진 박스와, 이 루비 컨테이너에 함께 참여하는 모든 하위 베이스주석 컨테이너를 정확히 포함하도록 크기와 위치가 정해집니다. (만약 주석 컨테이너in-flow 콘텐츠가 없다면, 빈 루비 주석 하나를 포함하는 것처럼 크기와 위치가 결정됩니다.) 이렇게 정해진 주석 컨테이너들은 해당 베이스 컨테이너의 위나 아래( ruby-position 값에 따라)에 중첩되어 쌓이며, 그 사이에는 공간을 두지 않습니다. 이렇게 해서 루비 주석루비 베이스와 블록 축에서 어떻게 위치하는지 결정됩니다.

블록 축 마진은 합쳐져야 할까요? 이렇게 하면 레이아웃이 더 견고해지지만, 인라인 축에서 인라인과는 다르게 동작한다는 점과 일관되지 않을 수 있습니다.

3.2. 문자 간 루비 레이아웃

문자 간 주석은 특별한 레이아웃을 가집니다. 문자 간 루비 주석 박스베이스 레벨의 레이아웃 일부로 삽입되고 측정됩니다. 각 루비 주석은 짝지어진 루비 베이스의 오른쪽에 삽입되며, 스패닝 문자 간 주석은 자신이 span하는 가장 오른쪽 베이스 뒤에 배치됩니다. 문자 간 루비 주석은 아래에 설명된 부분을 제외하고는 정확히 인라인 블록처럼 레이아웃됩니다.

참고: inter-character 정의에 따라, 문자 간 주석은 항상 vertical-rl writing-mode를 가지며, 수평 루비 컨테이너에서만 존재합니다.

루비 주석은 해당 루비 베이스의 바로 오른쪽, 그리고 베이스 간 공백 또는 세그먼트 간 공백 앞에 배치됩니다. 동일한 루비 베이스에 여러 개의 문자 간 루비 주석 박스가 붙는 경우, 그들의 마진 박스는 공간 없이 오른쪽으로 순서대로(레벨 순서대로) 쌓입니다.

만약 자동 높이루비 주석 박스content area가, 해당 위치에 배치되는 content box를 가진 루비 베이스보다 낮다면, 그 content box의 높이가 정확히 맞춰서 늘어납니다.

루비 주석 박스의 정렬은 해당 루비 주석ruby-align 속성에 따라 달라집니다:

문자 간 루비 주석 컨테이너 박스는 해당 루비 베이스 컨테이너 박스의 content box와 정확히 일치하도록 크기가 맞춰지고 위치가 결정됩니다.

참고: 문자 간 루비 주석 컨테이너 박스의 크기와 위치는 레이아웃에 아무런 영향을 주지 않습니다. 위 정의는 단지 프로그래밍적으로 질의할 때 결정적인 결과를 내도록 하기 위함입니다.

정렬 및 열 크기 산정을 위해(§ 3 루비 레이아웃 참고), 문자 간 루비 주석은 자신이 붙는 베이스와 같은 에 속하지 않으며, 실질적으로 자신만의 을 형성합니다.

3.3. 루비 박스 스타일링

루비 베이스루비 컨테이너인라인 박스로 취급되며, (별도 명시가 없다면) 인라인 박스에 적용되는 모든 속성은 동일하게 이들에게도 적용됩니다. 단, line-relative shift 값 (vertical-aligntop, bottom)은 무시해야 하며(0으로 처리), 적용되지 않습니다.

별도 명시가 없다면 인라인 박스에 적용되는 모든 속성은 루비 주석에도 동일하게 적용됩니다. 단, line-height는 적용되지 않습니다. 그리고 line-relative shift 값(vertical-aligntop, bottom)도 무시(0 처리)해야 합니다.

margin, padding, border 속성이나, 인라인 박스에 적용되지 않는 속성들은 베이스 컨테이너주석 컨테이너에 적용되지 않습니다. 또한 line-height주석 컨테이너에는 적용되지 않습니다.

UA는 루비 베이스 컨테이너 박스루비 주석 컨테이너 박스에 대해 배경(background) 또는 outline 속성, 혹은 박스의 경계선을 시각화하는 어떤 속성도 지원할 필요가 없습니다. UA는 이 박스들을 단순히 상속 및 내부 레이아웃 제어를 위한 추상체로만 구현할 수도 있습니다.

3.4. 줄바꿈

전체 루비 컨테이너가 한 줄에 들어갈 공간이 부족할 때, 루비는 모든 레벨이 동시에 줄바꿈을 허용하는 위치에서 나눌 수 있습니다. (줄바꿈에 대한 상세 내용은 CSS Text 3 § 5 줄바꿈 및 단어 경계 참고.) 루비는 주로 베이스-주석 세트 사이에서 나뉘지만, 줄바꿈 규칙이 허용하는 경우 루비 베이스 내부(및 그와 평행한 루비 주석 박스 내부)에서도 나눌 수 있습니다.

루비가 여러 줄에 나뉘어 표시될 경우, 루비 주석은 반드시 자신이 속한 루비 베이스와 함께 있어야 합니다. 루비 베이스와 그 주석 사이에서는, 줄바꿈이 허용되지 않습니다. 문자 간 주석의 경우도 마찬가지입니다.

Diagram showing the line breaking opportunity in a "Bopomofo" ruby

문자 간 루비 줄바꿈 기회

줄바꿈 이후에는, 각 조각이 독립적으로 레이아웃되고, 루비 정렬도 각 조각에서 별도로 적용됩니다.

3.4.1. 베이스 사이 줄바꿈

일반적으로 루비 베이스 박스루비 주석 박스는 내부 줄바꿈을 금지하는 스타일이 적용되어 있으며, 강제 줄바꿈이 포함되어 있지 않습니다. (자세한 내용은 부록 A 참고.) 이런 경우 루비 컨테이너는 인접한 루비 베이스 사이에서만 줄을 나눌 수 있고, 두 루비 베이스를 span하는 루비 주석이 없는 경우에만 가능합니다.

Diagram showing the line breaking opportunity in a complex ruby

루비 줄바꿈 기회

두 인접한 루비 베이스 사이에서 루비가 줄을 나눌 수 있는지는, 해당 베이스 텍스트에 대한 일반 줄바꿈 규칙에 의해 결정되며, 이는 루비 베이스가 인접한 인라인 박스인 것처럼 처리됩니다. (줄바꿈 기회 판단 시, 주석은 무시되고 베이스 레벨만 고려됩니다.)

예를 들어, 두 인접한 루비 베이스가 “蝴”와 “蝶”라면, 한자 사이에서는 줄바꿈이 일반적으로 허용되므로 그 사이에서 줄을 나눌 수 있습니다. 하지만 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는 임의의 기회에서 끊을 수 있습니다. 하지만 각 조각 내의 콘텐츠 양이 비슷하도록 비율 맞추기를 UA가 시도하는 것이 권장됩니다.

문자 간 주석 내부에는 줄바꿈 기회가 없습니다.

3.5. 양방향(Bidi) 재정렬

유니코드 양방향 알고리즘은 서로 반대 방향성을 가진 스크립트의 문자가 한 문단에 혼합될 때, 시각적 프레젠테이션을 위해 논리적으로 저장된 텍스트의 순서를 재배열합니다.

루비 주석과 해당 루비 베이스의 일치 관계를 보존하기 위해, 몇 가지 제한이 필요합니다:

이를 위해,

다른 인라인 레벨 콘텐츠와 마찬가지로, 내부 루비 박스의 bidi 재정렬은 줄바꿈 이후에 발생하여, 콘텐츠가 논리 순서에 따라 여러 줄로 나뉘게 됩니다.

참고: 만약 ruby-merge가 특정 merge주석 컨테이너에 적용된 경우, 개별 주석에 bidi isolation을 강제하지 않아 함께 처리할 수 있게 하면 유용할 수 있습니다. 하지만 이는 구현 복잡성을 높이므로, 수요가 없으면 굳이 권장하지 않습니다. 이런 처리가 필요한 경우 CSS 워킹 그룹에 연락 바랍니다.

CSS에서 양방향 텍스트에 대한 더 자세한 논의는 [CSS3-WRITING-MODES]를 참고하세요.

3.6. 줄 간격

line-height 속성은 CSS에서 줄 간의 간격을 제어합니다. 한 줄의 인라인 콘텐츠가 line-height보다 짧을 때, 콘텐츠 양쪽에 half-leading이 추가됩니다. 자세한 내용은 CSS Inline Layout 3 § 5 논리 높이 및 줄 간격을 참고하세요.

줄 간격의 일관성을 보장하기 위해, 루비가 포함된 문서는 보통 line-height가 텍스트 줄 사이에 루비가 들어갈 수 있을 정도로 충분히 크도록 설정합니다. 따라서 일반적으로 루비 주석 컨테이너루비 주석 박스는 줄의 인라인 콘텐츠의 측정된 높이에 영향을 주지 않습니다. 모든 정렬(관련 내용은 vertical-align 참고)과 line-height 계산은 루비 베이스 컨테이너만을 사용해, 일반 인라인처럼 처리합니다.

하지만 line-height루비 컨테이너에 지정된 값이 최상단 루비 주석 컨테이너의 위쪽과 최하단 루비 주석 컨테이너의 아래쪽 사이 거리보다 작은 경우, 루비 베이스 컨테이너의 적절한 쪽에 추가 leading이 삽입되어, 만약 블록이 동일한 루비를 가진 3개의 줄로 구성된다면 루비 컨테이너들이 겹치지 않도록 합니다.

참고: 이것은 루비 주석이 반드시 라인 박스 내에 남는다는 것을 보장하지 않습니다. 단지 모든 줄의 간격이 같고 루비 주석의 수와 위치가 동일하다면 겹치지 않을 공간이 확보된다는 것만 보장합니다.

작성자는 루비가 들어갈 수 있도록 적절한 line-heightpadding을 설정해야 하며, 블록의 시작과 끝, 그리고 한 줄에 인라인 레벨 콘텐츠(이미지, 인라인 블록, vertical-align으로 이동된 요소 등) 단락 기본 글꼴 크기보다 큰 요소가 포함될 때 특히 주의해야 합니다.

각 줄의 콘텐츠는 line-height의 중앙에 위치하며, 양쪽의 추가 공간은 half-leading이라 부른다. 루비가 2배 half-leading보다 작으면 줄 사이에 들어가지만, 이는 루비가 이전 줄의 half-leading 공간을 차지하게 됨을 의미한다.

루비 주석은 종종 라인을 넘칠 수 있습니다. 작성자는 루비가 달린 줄의 위/아래에 충분한 공간이 있도록 콘텐츠 배치를 고려해야 합니다.

참고: 루비가 정렬 및 줄 레이아웃에 미치는 영향에 대한 더 많은 제어는 CSS Line Layout Module Level 3에 포함될 예정입니다. 현재는 탐색적 개발 단계이므로, 신규 기능에 대한 설명은 아직 신뢰하면 안 됩니다.

4. 루비 서식 속성

다음 속성들은 루비의 위치 지정, 텍스트 분배, 정렬을 제어하기 위해 도입되었습니다.

4.1. 루비 위치 지정: ruby-position 속성

이름: ruby-position
값: [ alternate || [ over | under ] ] | inter-character
초기값: alternate
적용 대상: 루비 주석 컨테이너
상속됨: yes
백분율: 해당 없음
계산값: 지정된 키워드
정규 순서: 문법에 따름
애니메이션 타입: 불연속(discrete)

이 속성은 루비 주석이 베이스에 대해 어디에 위치할지 제어합니다. 값의 의미는 다음과 같습니다:

alternate
서로 다른 주석 레벨overunder를 번갈아가며 사용합니다.

만약 주석 컨테이너첫 번째 주석 레벨이거나, 앞선 레벨이 모두 inter-character일 때, alternate는 단독 또는 over와 함께 쓰일 때 over와 동일하게 동작합니다. alternateunder와 함께 쓰일 때는 under와 동일하게 동작합니다.

그 외에는, 앞선 인라인(줄간) 주석 레벨이 over였다면, alternateunder처럼 동작하고, 그 반대도 마찬가지입니다. (이 경우에는 alternate가 단독이든, overunder와 함께 쓰이든 차이가 없습니다.)

over
루비 주석이 베이스의 위(라인 오버)에 표시됩니다.
가로 모드에서 루비 주석이 베이스 위에 표시된 다이어그램

가로 레이아웃에서 일본어 베이스 텍스트 위의 루비

세로 모드에서 루비 주석이 베이스 오른쪽에 수직으로 표시된 다이어그램

세로 레이아웃에서 일본어 베이스 텍스트 오른쪽의 루비

under
루비 주석이 베이스의 아래(라인 언더)에 위치합니다. 이 설정은 동아시아 한자 문화권에서 상대적으로 드물게 사용되며, 주로 교육용 텍스트에서 볼 수 있습니다.
가로 모드에서 루비 주석이 베이스 아래에 표시된 다이어그램

가로 레이아웃에서 일본어 베이스 텍스트 아래의 루비

세로 모드에서 루비 주석이 베이스 왼쪽에 수직으로 표시된 다이어그램

세로 레이아웃에서 일본어 베이스 텍스트 왼쪽의 루비

inter-character
포함하는 writing mode루비 컨테이너에서 vertical인 경우, 이 값은 over와 동일하게 동작합니다.

그렇지 않으면, 루비 주석이 문자 간 주석이 됩니다. 주석은 가로 텍스트에서 베이스의 오른쪽에 표시됩니다. 이때 해당 writing-mode의 계산값은 vertical-rl로 강제됩니다.

참고: writing-mode의 계산값은 루비 주석 컨테이너 자체에는 영향이 없습니다. 동일 요소의 writing-mode, display, ruby-position 간의 순환 의존을 방지하기 위함입니다.

이 값은 특히 대만 등에서 사용되는 전통 중국어에서 특수하게 사용됩니다: 그 문맥에서 루비(주로 보포모포 문자가 사용됨)는 베이스 문자가 가로로 배치되어 있어도 베이스의 오른쪽에 수직으로 나타납니다:

대만식 루비 예시

전통 중국어의 “보포모포” 루비(더 잘 보이도록 파란색 표시) 가로 레이아웃

참고: 상속은 루비 레이아웃을 위해 생성된 익명 박스를 고려하지 않고 요소 트리 상에서만 동작하므로, 문자 간 주석을 사용할 때, 작성자는 요소 기반 루비 주석 컨테이너, 익명 루비 주석과 추가 하위 요소가 결합된 마크업 패턴을 피해야 합니다. 해당 하위 요소는 루비 주석 컨테이너에서 writing-mode를 상속받으며, 실제로 루비 주석writing-modevertical-rl로 바뀌어도 하위 요소에는 영향을 주지 않습니다.
ruby { ruby-position: inter-character; }
<ruby>base<rtc><em>problematic</em> annotation</ruby>

위 마크업에서는 <rtc> 요소의 자식으로 익명 루비 주석 박스가 생성되어 전체 "problematic annotation"을 감쌉니다. 이 박스는 주석 컨테이너의 자식이므로 ruby-positioninter-character일 때 writing-modevertical-rl이 되는 것이 기대됩니다. 하지만 <em> 요소는 <rtc> 요소(즉, writing-mode가 강제되지 않은 곳)에서 writing-mode를 상속받습니다.

이 예시에서는 명시적 루비 주석 컨테이너 요소가 필요 없으므로, 루비 주석 요소를 사용하는 것이 문제를 피하는 방법입니다:

<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
백분율: 해당 없음
계산값: 지정된 키워드
정규 순서: 문법에 따름
애니메이션 타입: 계산값 타입별

이 속성은 하나의 루비 컨테이너 박스에 여러 개의 루비 주석 박스가 있을 때 각각을 분리해서 표시할지, 병합 주석으로 묶어 그룹으로 표시할지, 혹은 공간에 따라 자동으로 결정할지 제어합니다.

참고: 문자 간 주석은 항상 분리되며, 이 속성은 적용되지 않습니다.

가능한 값:

separate
각 루비 주석 박스는 자신의 내(즉, 양옆의 인접 베이스와 겹치지 않게) 표시됩니다. 이 스타일은 [JLREQ]에서 “모노 루비”라고 부릅니다.
쌍 중 한쪽이 더 길 때 베이스 혹은 주석 쪽에 추가 공간이 들어가 인접 주석과 겹치지 않게 함. 예를 들어 '上手'의 경우 첫 글자 주석 'じょう'가 더 길어 여백이 들어가고, 두 번째 글자 'ず'는 해당 베이스에 맞춰 정렬.
ruby-merge: separate와 center 정렬
예를 들어, 아래 두 줄은 동일하게 렌더링됩니다:
<p><ruby><rt></ruby><ruby></rt>じょう</ruby>
<p><ruby style="ruby-merge:separate"><rb><rb></rt></rt>じょう</ruby>
merge
동일 루비 세그먼트 내의 모든 루비 주석 박스인라인 박스로 연결하여, 하나의 익명 루비 주석 박스로 합쳐 해당 루비 베이스 박스 전체를 span합니다. 한 줄에 레이아웃될 때, 이 스타일은 [JLREQ]의 “그룹 루비”와 유사하게 렌더링됩니다. 그러나 줄이 나뉠 때는 루비 주석이 해당 루비 베이스와 함께 유지됩니다.
합쳐진 주석은 전체 베이스에 대해 중앙 정렬됨. 이로 인해 '上手'의 예시에서 첫 글자 주석의 'う'와 두 번째 글자 주석의 'ず'가 두 번째 베이스 위에서 겹쳐 보일 수 있음.
ruby-merge: merge와 center 정렬
아래 두 줄은, 두 글자가 한 줄에 들어가면 동일하게 렌더링됩니다:
<p><ruby>無常</rt>むじょう</ruby>
<p><ruby style="ruby-merge:merge"><rb><rb></rt></rt>じょう</ruby>

하지만 두 베이스가 줄을 나눠 갖게 되면 두 번째 예시는 ruby-position: separate과 동일하게 렌더링됩니다.

auto
UA는 각 루비 주석 박스를 어떤 베이스 박스에 어떻게 렌더링할지 임의의 알고리즘을 사용할 수 있습니다. 모든 주석이 각 베이스 안에 들어가면 separate처럼, 일부 주석이 베이스보다 넓으면 베이스 간 공백을 만들지 않고 공간을 공유하는 방식으로 처리합니다.
공간이 충분하면 주석이 각 베이스에 맞춰 정렬되지만, 부족하면 인접 주석과 공간을 공유할 수 있음. '上手'는 두 번째 베이스 위에서 병합처럼, '下手'는 separate처럼 렌더링된다.
ruby-merge: auto와 center 정렬
참고: 이 동작은 복합어(숙어) 루비를 위한 것입니다. 자세한 렌더링 관례는 “What is ruby?”의 Jukugo Ruby [QA-RUBY], Placement of Jukugo-ruby [SIMPLE-RUBY], JLREQ의 Positioning of Jukugo-ruby, 4.12.3(c) 熟語ルビの処理 [JISX4051] 등을 참고하세요.

가장 단순한 방식은, 모든 루비 주석 박스가 해당 베이스 안에 들어가면 separate로, 그렇지 않으면 merge로 처리하는 것입니다.

참고: 텍스트는 루비 주석이나 베이스에 걸쳐(병합된 경우도 포함) 형태 변화나 합자(ligature)가 일어나지 않습니다. 이는 bidi isolation 때문입니다. § 3.5 양방향(Bidi) 재정렬CSS Text 3 § 7.3 Element Boundaries에서의 형태 변화를 참고하세요.

4.3. 루비 텍스트 분배: ruby-align 속성

이름: ruby-align
값: start | center | space-between | space-around
초기값: space-around
적용 대상: 루비 베이스, 루비 주석, 루비 베이스 컨테이너, 루비 주석 컨테이너
상속됨: yes
백분율: 해당 없음
계산값: 지정된 키워드
정규 순서: 문법 순서
애니메이션 타입: 계산값 타입별

이 속성은 루비 박스의 내용이 해당 박스를 정확히 채우지 않을 때, 텍스트가 박스 내에서 어떻게 분배되는지를 지정합니다. ruby-align에 의해 분배되는 공간은 정렬(justification)에 의해 분배되는 공간과 무관하며, 독립적으로 동작합니다.

문자 간 주석의 경우, 이 속성은 박스 자체의 정렬에도 영향을 줄 수 있습니다 (§ 3.2 문자 간 루비 레이아웃 참고). 그 외의 경우에는 박스 내부 콘텐츠의 정렬에만 영향을 주며, 박스의 크기나 위치에는 영향을 주지 않습니다.

값의 의미는 다음과 같습니다:

start
루비 콘텐츠가 박스의 시작 가장자리에 정렬됩니다.
루비 텍스트가 베이스보다 짧을 때 좌측 정렬된 루비의 글리프 레이아웃 다이어그램 루비 텍스트가 베이스보다 길 때 좌측 정렬된 루비의 글리프 레이아웃 다이어그램

start 루비 분배

"Katatsuki ruby" (肩付き루비)는 이 start 값과 비슷하지만 완전히 동일하지는 않습니다. 특히 베이스를 넘어설 때의 동작이 주변 맥락에 따라 start 정렬과 다를 수 있습니다. 자세한 내용은 JLREQ 참고. 또한 이 방식은 세로쓰기에서만 사용되며, JLTF에서는 그다지 중요하지 않다고 간주하므로, 이 값을 katatsuki ruby까지 똑똑하게 처리하도록 할 필요가 없을 수도 있습니다. start가 다른 용도로 필요하다면 남겨두고, 아니라면 삭제하는 것도 고려할 수 있습니다.

center
루비 콘텐츠가 박스 내 중앙에 정렬됩니다.
루비 텍스트가 베이스보다 짧을 때 중앙 정렬된 루비의 글리프 레이아웃 다이어그램 루비 텍스트가 베이스보다 길 때 중앙 정렬된 루비의 글리프 레이아웃 다이어그램

center 루비 분배

space-between
루비 콘텐츠가 일반 텍스트 정렬(text-justify 참고)에 따라 확장됩니다. 단, 정렬 기회가 없으면 내용이 중앙 정렬됩니다.
루비 텍스트가 베이스보다 짧을 때 distribute-letter 정렬 루비의 글리프 레이아웃 다이어그램 루비 텍스트가 베이스보다 길 때 distribute-letter 정렬 루비의 글리프 레이아웃 다이어그램

space-between 루비 분배

space-around
space-between과 유사하지만, 추가 정렬 기회가 존재하며 이 공간이 루비 콘텐츠 앞뒤로 반씩 분배됩니다.
루비 텍스트가 베이스보다 짧을 때 auto 정렬 루비의 글리프 레이아웃 다이어그램 루비 텍스트가 베이스보다 길 때 auto 정렬 루비의 글리프 레이아웃 다이어그램

space-around 루비 분배

기본 UA 스타일시트text-justify: ruby루비 주석에 적용하여, CJK 문자의 인접 쌍 사이에는 정렬 기회를 두지만, 라틴 문자나 보포모포 문자의 인접 쌍 사이에는 두지 않습니다. 따라서 space-aroundspace-between 값을 사용해도 라틴이나 보포모포 문자는 중앙 정렬됩니다:
반폭 루비 텍스트가 베이스보다 짧을 때 auto 정렬 루비의 글리프 레이아웃 다이어그램 반폭 베이스보다 루비 텍스트가 긴 경우의 auto 정렬 루비 글리프 레이아웃

비 CJK 루비 텍스트에서 space-aroundspace-between은 중앙 정렬됨

공간 분배는 text-justify로 제어할 수 있습니다. [CSS-TEXT-3]

루비 베이스루비 주석의 콘텐츠는, ruby-merge: merge로 인해 span되는 경우를 제외하면, 해당 박스의 ruby-align 값에 따라 정렬됩니다. 병합 주석의 콘텐츠는 루비 주석 컨테이너ruby-align 값에 따라 정렬되며, 개별 ruby-align 값은 무시됩니다.

만약 병합 주석루비 세그먼트를 더 넓게 만들면? 현재 명세처럼 각 베이스가 span되는 것처럼 커지게 해야 할까? 만약 베이스 컨테이너가 여러 베이스를 가지는데 병합 주석이 더 길면 중앙 정렬을 못 하게 된다. 차라리 ruby-merge를 베이스 컨테이너에도 적용하고, 베이스가 병합된 경우 모든 주석 레벨이 병합되어야 한다고 강제하는 식이 나을 수도 있다.

ruby-mergeauto일 때의 정렬 방식은 UA가 결정하지만, 모든 주석이 각 베이스 위에 들어가는 경우 그 결과는 ruby-merge: separate와 동일해야 합니다.

4.4. 루비 텍스트 장식

텍스트 장식(text decoration)은 베이스 텍스트에서 주석으로 전파되지 않습니다.

루비의 상위 요소에 텍스트 장식이 지정된 경우, 장식은 루비 베이스 컨테이너 전체 콘텐츠 영역(길이가 긴 주석을 위해 추가된 여백 포함)에 그려집니다. 루비 베이스 자체에 텍스트 장식을 지정하면, 이 추가 공간에는 장식이 적용되지 않습니다. 이는 박스에 직접 텍스트 장식을 지정할 때, 해당 박스의 padding에는 장식이 적용되지 않는 것과 유사합니다. [CSS3-TEXT-DECOR]

텍스트 장식은 루비 베이스 컨테이너와 루비 주석 컨테이너에 직접 지정될 수도 있습니다: 이 경우 컨테이너의 모든 베이스 또는 주석에 장식이 전파되며, 장식은 요소 사이에도 연속적으로 그려집니다.

루비 주석의 위치는 베이스 텍스트에 적용된 overline, underline 장식과 충돌하지 않도록 조정될 수 있습니다. 폰트 크기와 기준선 정렬이 일관된 기본적인 경우에는 밑줄이나 윗줄이 베이스 레벨과 해당 쪽의 주석 사이에 그려집니다.

인접 베이스/주석의 콘텐츠 사이 장식 그리기에 대한 명확한 설명이 필요함. 해당 박스가 크기만큼 넓은지 여부에 따라 달라질 수 있음.

5. 엣지 효과

5.1. 돌출 루비: ruby-overhang 속성

이름: ruby-overhang
값: auto | none
초기값: auto
적용 대상: 루비 주석 컨테이너
상속됨: yes
백분율: 해당 없음
계산값: 지정된 키워드
정규 순서: 문법 순서
애니메이션 타입: 계산값 타입별

ruby-overhang 속성은 루비 주석루비 컨테이너 바깥의 인접 텍스트와 겹칠 수 있는지 제어합니다. 값의 의미는 다음과 같습니다:

auto
루비 주석 컨테이너가 해당 루비 베이스 컨테이너보다 길면, 루비 주석 컨테이너가 인접 박스와 일부 겹칠 수 있습니다.

얼마나, 어떤 조건에서 겹칠지는 UA가 결정합니다.

none
루비 주석 컨테이너는 절대 자신의 루비 주석 컨테이너 밖으로 나갈 수 없습니다.

루비 주석이 돌출(overhang)을 허용하지 않을 때, 루비 컨테이너는 전통적인 인라인 박스처럼 동작합니다. 즉, 자신의 콘텐츠만 경계 내에 렌더링되고 인접 요소는 경계를 넘지 않습니다:

루비 박스가 인접 텍스트와 상호작용하는 다이어그램

텍스트가 인접 텍스트를 침범하지 않는 단순 루비

반면, 루비 주석 컨테이너가 돌출을 허용하면, 인접 콘텐츠가 루비 컨테이너 박스와 겹칠 수 있어, 루비 주석이 주변 인라인 레벨 콘텐츠 위/아래로 일부 렌더링될 수 있습니다. 돌출은 인접 콘텐츠와 루비 컨테이너의 주석 박스 또는 해당 베이스의 내용을 침범하지 않는 범위 내에서만 허용됩니다.

루비 박스가 인접 텍스트와 상호작용하는 다이어그램

텍스트가 인접 텍스트를 침범할 수 있는 단순 루비

참고:루비 베이스와 연결된 루비 주석이 다른 루비 베이스를 침범할 수 있는지는 ruby-merge로 제어됩니다.

일반적으로 베이스나 주석의 내용 정렬은 돌출 동작에 영향을 받지 않습니다: 정렬 및 공간 분배(관련 내용은 ruby-align 참고)는 돌출 허용 여부와 관계없이 동일하게 처리되며, 겹칠 수 있는 공간 계산 전에 실행됩니다. 단, UA는 허용된 돌출을 공간 분배 또는 정렬에 참고할 수도 있습니다.

돌출이 정렬과 상호작용하는 경우가 있을 것 같으니 추후 확인 필요.

UA는 주석 폰트의 0.5ic(전각 문자의 절반)만큼을 최대 돌출 길이로 사용하는 [JIS4051] 권고를 따를 수 있습니다. 일본어의 경우 루비 텍스트가 인접 문자 위로 돌출될 수 있는 상세 규칙은 [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: ")("; }

반복적으로 교차되는 마크업(즉, <ruby>A<rt>a</rt>B<rt>b</rt>C<rt>c</rt><ruby>) 방식으로 마크업이 사용되어 인접한 루비 주석이 없다는 것이 보장된다면, 아래 규칙으로 각 주석에 괄호를 추가할 수 있습니다:

/* 각 <rt> 주위 괄호 */
rt::before { content: "("; }
rt::after  { content: ")"; }

6. 용어집

보포모포 또는 주음부호 (중국어: ㄅㄆㄇㄈ, 注音符號, 또는 注音符号)

중국어(특히 표준 중국어) 발음 표기를 위해 개발된 문자와 성조 기호. 이들은 종종(항상은 아님) 루비 주석에 사용됩니다.

파란색 보포모포 문자가 가로 텍스트의 각 한자 오른쪽에 수직으로 붙어 있음.

중국어에서 보포모포가 문자 간 발음 표기로 사용된 예시

보포모포 성조 기호는 각 보포모포 음절 끝에 (메모리상으로) 등장하는 공백 문자입니다. 보통 다른 보포모포 문자 오른쪽이나 위쪽의 별도 트랙에 표시되며, 성조 기호의 위치는 음절 내 글자 수에 따라 달라집니다. 단, 경성 기호는 보포모포 앞(그리고 같은 줄)에 오며, 나란히 표시되지 않습니다.

참고: 루비 주석이든 일반 인라인 콘텐츠이든, 텍스트를 표시할 때 보포모포 성조 기호를 포함한 글리프의 상대적 정렬과 위치 지정은 UA와 폰트 서브시스템의 책임입니다. 이러한 글리프 배치는 CSS 루비 레이아웃의 기능이 아닙니다.

보포모포 글자Bopomofo 유니코드 스크립트에 속하며(현재 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.

이전 편집자들에게 특별히 감사드립니다: Microsoft의 Michel Suignard와 Marcin Sawicki, 그리고 W3C의 Richard Ishida.

변경 이력

이 섹션은 이전 발행 이후의 변경 사항을 기록합니다.

2021년 12월 2일 WD 이후 변경점

2020년 4월 29일 WD 이후 변경점

참고: 여전히 많은 오픈 이슈가 남아 있습니다. Disposition of CommentsGitHub의 최신 이슈를 참고하세요.

2014년 8월 5일 WD 이후 변경점

2013년 9월 19일 WD 이후 변경점

2011년 6월 30일 WD 이후 변경점

ruby-spanrbspan 언급 삭제
HTML 루비에서는 명시적 span 대신 암시적 span 방식을 사용합니다. 이 방식은 일부 특이한 양면 스패닝 케이스는 처리하지 못하지만, 현재로서는 그런 요구가 없는 듯합니다. (복잡한 XHTML Ruby 전체를 지원하는 구현체의 경우, 테이블의 셀 스패닝과 유사하게 마크업에서 스패닝을 암시적으로 추론할 수 있습니다. Level 1에서 이를 직접 제어할 필요는 없어 보입니다.)
ruby-overhangruby-align: line-end를 2단계로 이월
다소 복잡하고 고급 기능입니다. 이 동작을 UA 정의로 두고, 허용 가능한 옵션 예시만 제시하는 것이 제안되었습니다.
display: rp 관련 이슈 종료: display: none 사용
Internationalization WG에서 rp 요소의 display 값을 요청하는 이슈를 제기했습니다. ruby 가 루비로 표시될 때는 rp가 숨겨져야 하지만, 이미 display: none으로 쉽게 처리할 수 있습니다.
ruby-position 값을 text-emphasis-position과 일치하도록 변경
inter-character만 예외로 두고, 루비 위치를 text-emphasis-position과 맞추는 게 가로/세로 조합을 제대로 처리하는 데 더 합리적입니다.
ruby-align의 미사용 값 삭제
left, right, end 값은 필요하지 않습니다.
ruby-alignauto, distribute-letter, distribute-space 값을 space-betweenspace-around로 대체
auto 값은 내용을 검사하여 동작을 결정하므로, 표준 정렬 규칙과 space-around 조합으로 충분합니다 (CJK 사이에는 공백을 주고, 라틴 사이에는 공백을 주지 않음). distribute-letterdistribute-spacespace-betweenspace-around로 일관적으로 변경. [CSS-FLEXBOX-1][CSS-ALIGN-3]의 분배 키워드와 일치시키고, text-justify: distribute 정의와 연결을 피함.
ruby-merge 속성 추가로 숙어(jukugo) 렌더링 제어
이는 구조적이 아닌 스타일 효과입니다. 이전 모델은 구조적 효과로 가정하고 마크업 변경을 제안했으나, 실제로는 그렇지 않습니다.
ruby-position에서 inline 값 삭제
모든 ruby 관련 요소에 display: inline을 지정하면 충분합니다. 부록 A 참고.
기본 스타일 규칙 추가
Internationalization WG의 요청에 따라 추가.
익명 박스 생성 규칙 작성
베이스와 주석의 짝짓기(pairing)를 정의. 이제 HTML 루비 마크업의 모든 복잡한 조합도 처리 가능해야 합니다.
루비 레이아웃 정의
공간 분배, 공백 처리, 줄바꿈, 줄 쌓기 등 상세 동작 정의. bidi 관련 오픈 이슈는 남겨둠.

적합성

문서 규약

적합성 요구 사항은 설명적 진술과 RFC 2119 용어의 조합으로 표현됩니다. “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” 등의 핵심 용어는 RFC 2119에서 설명된 대로 해석해야 합니다. 그러나 가독성을 위해 이 명세에서는 항상 대문자가 아닌 소문자로 표기됩니다.

이 명세의 모든 본문은 명시적으로 비규범(example, note 등)으로 표시된 부분을 제외하고 규범적입니다. [RFC2119]

이 명세서의 예제는 “for example”라는 말로 시작되거나, class="example"와 같이 규범 본문과 구분되어 제시됩니다:

이것은 참고용 예시입니다.

참고용 주석은 “Note”로 시작하며 class="note"로 구분됩니다:

참고, 이것은 참고용 노트입니다.

권고(advisement)는 규범적 문단 중에 특별한 주의를 촉구하는 부분으로 <strong class="advisement">로 스타일링되며, 예시는 다음과 같습니다: UA는 반드시 접근 가능한 대체 수단을 제공해야 합니다.

적합성 클래스

이 명세의 적합성은 다음 세 가지 클래스에 대해 정의됩니다:

스타일시트
CSS 스타일시트.
렌더러
UA로, 스타일시트의 의미를 해석하고 이를 사용하는 문서를 렌더링하는 소프트웨어.
저작 도구
UA로, 스타일시트를 작성하는 도구.

이 모듈에서 정의한 문법을 사용하는 모든 선언이 일반 CSS 문법과 각 기능별 문법에 따라 유효하다면, 스타일시트는 이 명세에 적합합니다.

렌더러는 적절한 명세에서 정의한 대로 스타일시트를 해석함과 동시에, 이 명세에서 정의한 모든 기능을 올바르게 파싱 및 렌더링할 수 있다면 적합합니다. 하지만, 장치의 한계로 인해 UA가 문서를 제대로 렌더링하지 못하는 경우, UA가 적합하지 않다고 보지 않습니다. (예: 흑백 모니터에서 색상을 렌더링하지 않아도 됨.)

저작 도구는 일반 CSS 문법과 각 기능별 문법에 따라 구문적으로 올바른 스타일시트를 작성하고, 이 모듈에 설명된 모든 스타일시트 적합성 요건을 충족한다면 이 명세에 적합합니다.

부분 구현

작성자가 포워드 호환 파싱 규칙을 활용하여 폴백 값을 지정할 수 있도록, CSS 렌더러는 반드시 지원 불가능한 at-rule/속성/값/키워드/구문 등은 무효로 처리(및 적절히 무시)해야 합니다. 특히, UA는 지원하지 않는 값만 골라서 무시하고 지원하는 값만 적용해서는 안 됩니다: 어떤 값이라도 무효(지원 불가)이면 전체 선언을 무시해야 합니다.

불안정 및 독점 기능의 구현

향후 안정적인 CSS 기능과 충돌을 피하기 위해, CSSWG는 베스트 프랙티스에 따라 불안정 기능 및 독점 확장을 구현할 것을 권장합니다.

비실험적 구현

명세가 Candidate Recommendation(CR) 단계에 도달하면, 비실험적 구현이 가능하며, 구현자는 명세대로 올바르게 구현했음을 입증할 수 있는 CR 레벨 기능에 대해 접두어 없는 구현을 공개해야 합니다.

CSS의 상호운용성 유지를 위해, CSS 워킹 그룹은 비실험적 CSS 렌더러가 W3C에 구현 보고서(필요시 테스트케이스 포함)를 제출한 후 접두어 없는 구현을 출시할 것을 요청합니다. 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; 외. 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.; 외. 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; 외. 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; 외. 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/

속성 인덱스

이름 초기값 적용 대상 상속 % 적용 애니메이션 타입 정규 순서 계산값
ruby-align start | center | space-between | space-around space-around ruby bases, ruby annotations, ruby base containers, ruby annotation containers yes n/a by computed value type 문법 순서 지정된 키워드
ruby-merge separate | merge | auto separate interlinear ruby annotation containers yes n/a by computed value type 문법 순서 지정된 키워드
ruby-overhang auto | none auto ruby annotation containers yes n/a by computed value type 문법 순서 지정된 키워드
ruby-position [ alternate || [ over | under ] ] | inter-character alternate ruby annotation containers yes n/a discrete 문법 순서 지정된 키워드

이슈 인덱스

이 목표는 루비 주석 내 줄바꿈을 억제하여 레이아웃 모델을 단순화하는 것입니다. 또는, 이러한 경우에 허용 가능한 동작을 정의할 수도 있습니다.
vertical-align이 이러한 루비 박스에 얼마나 영향을 미치는지 정의해야 합니다. 이슈 4987 참고.
블록 축 마진이 합쳐져야 할까요? 이렇게 하면 레이아웃이 더 견고해지지만, 인라인 축의 인라인 동작과 일관되지 않을 수 있습니다.
사람들이 이게 미친 스펙 저자의 헛소리가 아님을 알 수 있도록 스캔된 예시를 삽입할 것.
"Katatsuki ruby" (肩付き루비)는 이 start 값과 비슷하지만 완전히 동일하진 않습니다. 특히 베이스를 침범(overhang)할 때의 동작이 주변 맥락에 따라 start 정렬과 다를 수 있습니다. 자세한 내용은 JLREQ 참고. 또한 이 방식은 세로쓰기에서만 사용되며, JLTF에서는 그다지 중요하지 않다고 간주하므로, 이 값을 katatsuki ruby까지 똑똑하게 처리할 가치가 없을 수 있습니다. start가 다른 용도로 필요하면 남겨두고, 아니라면 삭제하는 것도 고려할 수 있습니다.
병합 주석루비 세그먼트를 더 넓게 만든다면? 현재 명세처럼 각 베이스가 span되는 것처럼 커지게 되는가? 만약 베이스 컨테이너가 여러 베이스를 가지는데 병합 주석이 더 길면 중앙 정렬을 못 하게 된다. 차라리 ruby-merge를 베이스 컨테이너에도 적용하게 하고, 베이스가 병합된 경우 모든 주석 레벨이 병합되어야 한다고 강제하는 식이 나을 수도 있다.
이 섹션은 인접 베이스/주석 사이의 콘텐츠에 장식을 그릴 때 명확한 설명이 필요함. 해당 박스가 만큼 넓은지 여부에 따라 달라질 수 있습니다.
돌출(overhang)이 정렬과 상호작용하는 경우가 있을 것 같으니 추후 확인 필요.