페이징 미디어용 CSS 생성 콘텐츠 모듈

W3C 워킹 드래프트,

이 문서에 대한 추가 정보
이 버전:
https://www.w3.org/TR/2024/WD-css-gcpm-3-20240125/
최신 공개 버전:
https://www.w3.org/TR/css-gcpm-3/
에디터스 드래프트:
https://drafts.csswg.org/css-gcpm/
히스토리:
https://www.w3.org/standards/history/css-gcpm-3/
피드백:
CSSWG 이슈 저장소
명세 내 인라인
에디터:
(BFO)
(Google)
이전 에디터:
(Hachette Livre)
Håkon Wium Lie (Opera Software)
이 명세에 대한 수정 제안:
GitHub 에디터

요약

책 및 기타 페이징 미디어는 정보를 표시하기 위해 특별한 기법을 자주 사용합니다. 콘텐츠는 페이지의 러닝 헤더나 각주와 같은 특별한 영역으로 이동되거나, 해당 영역을 위해 생성될 수 있습니다. 페이지 내에 생성된 콘텐츠(예: 탭 리더, 교차 참조 등)는 독자가 페이지 내외를 탐색하는 데 도움을 줍니다.

CSS는 구조화된 문서(예: HTML, XML 등)의 렌더링을 화면, 인쇄물 등에서 기술하는 언어입니다.

이 문서의 상태

이 섹션은 이 문서가 발행된 시점에서의 상태를 설명합니다. 최신 W3C 발행물 목록과 이 기술 보고서의 최신 수정본은 https://www.w3.org/TR/에 있는 W3C 기술 보고서 색인에서 확인할 수 있습니다.

이 문서는 CSS 워킹 그룹에 의해 워킹 드래프트권고안 트랙을 사용하여 발행되었습니다. 워킹 드래프트로 발행되었다고 해서 W3C 및 회원사가 이를 승인했다는 의미는 아닙니다.

이 문서는 초안 문서이며 언제든지 다른 문서로 업데이트, 대체 또는 폐기될 수 있습니다. 진행 중인 작업 이외의 인용은 적절하지 않습니다.

피드백은 GitHub에서 이슈 등록(권장) 방식으로 보내주시고, 제목에 "css-gcpm" 명세 코드를 포함해 주세요. 예시: “[css-gcpm] …의견 요약…”. 모든 이슈 및 코멘트는 아카이브됩니다. 또는 (아카이브됨) 공개 메일링 리스트 www-style@w3.org로 피드백을 보낼 수도 있습니다.

이 문서는 2023년 11월 3일 W3C 프로세스 문서의 적용을 받습니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 제작되었습니다. W3C는 해당 그룹의 결과물과 관련해 이루어진 공개 특허 공개 목록을 유지하고 있으며; 해당 페이지에는 특허 공개를 위한 안내도 포함되어 있습니다. 특정 특허에 대해 실제로 인지하고 있으며, 그 특허가 필수 청구항을 포함한다고 생각하는 개인은 W3C 특허 정책 6항에 따라 정보를 공개해야 합니다.

소개

페이징 미디어는 오랜 인쇄 서적의 역사 속에서 발전해온 특수한 요구사항을 많이 가지고 있습니다. 러닝 헤더와 푸터는 내비게이션을 돕는 역할을 하며, 각주는 페이지 하단에 나타날 수 있습니다. 페이지 자체의 속성은 문서 내의 위치나 내용에 따라 달라질 수 있습니다. 리더(leader)는 관련된 콘텐츠를 시각적으로 연결합니다. 교차 참조는 생성된 텍스트가 필요할 수 있습니다. PDF와 같은 일부 페이징 미디어 형식에서는 북마크가 내비게이션에 사용됩니다.

이 모듈은 저자가 이러한 기법을 페이징 미디어에 적용할 수 있도록 새로운 속성과 값을 정의합니다.

값 정의

이 명세는 CSS 속성 정의 관례[CSS21]값 정의 문법을 따릅니다([CSS-VALUES-3] 참조). 이 명세에서 정의되지 않은 값 타입은 CSS Values & Units [CSS-VALUES-3]에 정의되어 있습니다. 다른 CSS 모듈과의 조합으로 이러한 값 타입의 정의가 확장될 수 있습니다.

각 속성별로 정의된 값 외에도, 이 명세에 정의된 모든 속성은 CSS-전역 키워드를 속성값으로 허용합니다. 가독성을 위해 본문에 반복적으로 기재하지 않았습니다.

1. 러닝 헤더와 푸터

[CSS3PAGE] 는 러닝 헤더와 푸터에 사용할 수 있는 16개의 페이지 여백 박스를 설명하지만, 이 박스에 콘텐츠를 삽입하는 메커니즘은 설명하지 않습니다. 이 모듈은 이를 위한 두 가지 방법을 제공합니다. 명명된 문자열은 마진 박스에서 재사용할 수 있도록 텍스트를 복사합니다. 러닝 요소는 요소(스타일과 구조 포함)를 문서에서 마진 박스로 이동시킵니다.

1.1. 명명된 문자열

string-set 속성은 요소의 텍스트 콘텐츠를 명명된 문자열로 복사하며, 이는 변수처럼 동작합니다. 이 명명된 문자열의 텍스트 콘텐츠는 string() 함수를 사용해 가져올 수 있습니다. 이러한 변수는 특정 페이지에서 변경될 수 있으므로, string() 함수의 두 번째 인자를 통해 저자가 어떤 값을 사용할지 선택할 수 있습니다.

1.1.1. string-set 속성

Name: string-set
Value: [ <custom-ident> <content-list> ]# | none
Initial: none
Applies to: all elements, but not pseudo-elements
Inherited: no
Percentages: N/A
Computed value: specified value
Canonical order: per grammar
Animation type: discrete

사용자 에이전트는 비시각적 미디어를 포함한 모든 미디어에서 이 속성을 지원해야 합니다.

string-set 속성은 하나 이상의 쌍으로 구성되며, 각각은 사용자 지정 식별자(명명된 문자열의 이름)와 <content-list> 값(명명된 문자열의 값을 생성하는 방법을 설명)을 포함합니다.

<content-list> 는 아래의 값 중 하나 이상(순서 무관)으로 확장됩니다.

<content-list> = [ <string> | <counter()> | <counters()> | <content()> | <attr()> ]+
<string>
문자열(string). [CSS21] 참고
<counter()>
counter() 함수. [CSS21] 참고
<counters()>
counters() 함수. [CSS21] 참고
<content()>
아래에 설명된 content() 함수
<attr()>
attr() 함수. [CSS-VALUES-3] 참고
1.1.1.1. content() 함수
content() = content([text | before | after | first-letter ])

이 함수의 기본값을 어떻게 정의할 것인가?

text
요소의 문자열 값. white-space: normal이 설정된 것처럼 결정됩니다(기본값).
before
::before 의사 요소의 문자열 값. white-space: normal이 적용된 것처럼 결정됨.
after
::after 의사 요소의 문자열 값. white-space: normal이 적용된 것처럼 결정됨.
first-letter
요소의 첫 번째 문자. ::first-letter 의사 요소 정의에 따름

명명된 문자열의 콘텐츠 값은 요소의 콘텐츠 박스가 처음 생성될 때(또는 display 값이 none이라면 생성될 수 있었던 시점)에 할당됩니다. 한 페이지의 entry value는 이전 페이지 끝에서의 할당입니다. exit value는 현재 페이지 끝에서의 할당입니다.

요소 값이 변경될 때마다 명명된 문자열의 값도 갱신됩니다. 사용자 에이전트는 string() 함수가 과거, 현재, 미래의 할당 값을 반환할 수 있으므로 여러 값을 기억할 수 있어야 합니다.

HTML:

<h1>Loomings</h1>

CSS:

h1::before { content: 'Chapter ' counter(chapter); }
h1 { string-set: header content(before) ':' content(text); }
h1::after { content: '.'; }

명명된 문자열 “header”의 값은 “Chapter 1: Loomings”가 됩니다.

HTML:
<section title="Loomings">

CSS:

section { string-set: header attr(title) }

“header” 문자열의 값은 “Loomings”가 됩니다.

1.1.2. string() 함수

string() 함수는 content 속성을 통해 명명된 문자열의 값을 문서 안에 복사하는 데 사용됩니다. 이 함수에는 반드시 명명된 문자열의 이름이 첫 번째 인자로 들어가야 합니다. 명명된 문자열의 값이 페이지 내에서 여러 번 변경될 수 있으므로(해당 문자열을 정의하는 요소가 새로 나타날 때마다), 두 번째 인자로 어떤 값을 사용할지 지정할 수 있습니다.

string() 함수의 두 번째 인자는 다음 키워드 중 하나입니다:

first
페이지에서 첫 번째 할당 값을 사용합니다. 해당 페이지에 할당이 없다면 entry value를 사용합니다. first가 기본값입니다.
start
해당 요소가 페이지의 첫 번째 요소일 경우 첫 번째 할당 값을 사용합니다. 그렇지 않으면 entry value를 사용합니다. entry value는 요소가 아직 등장하지 않았다면 비어 있을 수 있습니다.
last
명명된 문자열의 exit value를 사용합니다.
first-except
이는 first와 같으나, 값이 할당되는 페이지에서는 빈 문자열을 사용합니다.
CSS:
@page {
   size: 15cm 10cm;
   margin: 1.5cm;

   @top-left {
   content: "first: " string(heading, first);
   }
   @top-center {
   content: "start: " string(heading, start);
   }
    @top-right {
    content: "last: " string(heading, last);
   }
  }

h2 { string-set: heading content() }

아래 그림은 여러 페이지에서 “heading” 문자열의 first, start, last 할당 값을 보여줍니다.

start 값은, 페이지 시작 시 문자열이 아직 설정되지 않았기 때문에 비어 있습니다.
페이지가 h2로 시작하므로 start 값이 해당 제목의 값이 됩니다.
이 페이지 상단에는 h2가 없으므로 start 값은 이전 페이지의 exit value입니다.

1.2. 러닝 요소

많은 헤더와 푸터는 단순한 텍스트만으로는 표현할 수 없습니다. 예를 들어, 러닝 헤드로 사용되는 책 제목에는 이탤릭체 단어가 포함될 수 있습니다. 요소를 마진 박스로 이동 또는 복사하는 메커니즘이 필요합니다. 이를 위해 running() 값을 position 속성에, element() 값을 content 속성에 추가합니다.
@page {
  @top { content: element(header); }
}

h1 { position: running(header); }

이 예시에서 h1 요소는 @top 마진 박스에 배치되며, 서식과 하위 요소를 포함한 전체가 이동합니다. 일반 문서 흐름에는 표시되지 않습니다.

1.2.1. running()

position: running(custom-ident)는 요소(및 관련된 ::before, ::after 의사 요소)를 일반 플로우에서 제거하고, element()를 사용해 페이지 마진 박스에 배치할 수 있게 만듭니다. 요소는 문서 내 원래 위치의 속성을 상속하지만, 그 위치엔 표시되지 않습니다.

Name: position
New values: <running()>
running() = running( <custom-ident> )

HTML:

<p class="rh"><i>Miranda v. Arizona</i> in Context</p>
<h2><i>Miranda v. Arizona</i> in Context</h2>

CSS:

@top-center {
  content: element(heading);
  }

p.rh {
  position: running(heading);
  }

p.rh::before {
  content: counter(page) ' / ';
  }

running header using running elements

페이지 마진 박스에 배치된 러닝 요소

value() 요소는 오직 페이지 마진 박스에서만 사용할 수 있습니다. 그리고 content 속성의 다른 값과 함께 쓸 수 없습니다.

이 아이디어는 요소를 이동시키는 것뿐만 아니라 복사할 수도 있다면 훨씬 더 유용할 것입니다. 위 예시처럼 HTML 중복을 피할 수 있습니다.

Bert Bos는 러닝 헤드로 요소를 이동과 복사 모두 할 수 있도록 대체 문법을 제안했습니다. 아래 예시에서는 h2 요소가 문서의 정상 위치에도 나타나고 러닝 헤드로도 복사됩니다.

h2 {
display: block;
running: chapter;
font-size: 18pt;
font-weight: bold;
}

h2:running {
display: inline;
font-size: 11pt;
font-weight: normal;
font-variant: small-caps;
letter-spacing: 1pt;
}

@page {
  @top-center {
    content: element(chapter);
    }
  }
Name: running
Value: <custom-ident>
Initial: none
Applies to: elements
Inherited: no
Percentages: N/A
Computed value: specified value
Canonical order: per grammar
Animation type: discrete

사용자 에이전트는 비시각적 미디어를 포함한 모든 미디어에서 이 속성을 지원해야 합니다.

1.2.2. element()

element() 값은 content 속성에서 사용되며, running() 을 통해 일반 플로우에서 제거된 요소를 페이지의 마진 박스에 배치합니다. 요소의 값이 변경될 때마다 element()의 값도 업데이트됩니다.

string()과 마찬가지로, element()도 한 페이지에 여러 번 할당된 경우 어떤 값을 사용할지 설명하는 선택적 키워드를 받을 수 있습니다. element()는 과거, 현재, 미래의 할당 값을 반환할 수 있으므로, 사용자 에이전트는 여러 값을 기억할 수 있어야 합니다.

Name: content
New values: <element()>
element() = element( <custom-ident> , [ first | start | last | first-except ]? )

2. 각주

부가적인 콘텐츠는 페이지의 하단이나 측면으로 이동할 수 있습니다. 그러한 콘텐츠가 페이지 하단으로 이동하여 참조 표시를 남기면 각주가 생성됩니다.

2.1. 용어 정의

각주는 복잡한 객체입니다(각주 섹션 참조, [dpub-latinreq]). 따라서 진행하기 전에 몇 가지 용어를 정의하는 것이 도움이 됩니다.

page with footnotes

각주 용어
각주 요소
각주 내용을 포함하는 요소로, 플로우에서 제거되어 각주로 표시됩니다.
각주 마커(각주 번호라고도 함)
각주 본문 옆에 위치한 숫자나 기호로, 특정 각주를 구분합니다. 각주 마커는 해당 각주 호출과 동일한 번호나 기호를 사용해야 하며, 추가 기호가 포함될 수 있습니다.
각주 본문
각주 마커는 각주 요소 앞에 위치하며, 이 둘이 합쳐져 각주 본문을 구성하고, 각주 영역에 배치됩니다.
각주 호출(각주 참조라고도 함)
본문에서 각주 본문을 가리키는 숫자나 기호입니다.
각주 영역
각주를 표시하는 페이지 영역입니다.
각주 구분선(각주 분리선이라고도 함)
가로줄로 각주 영역을 페이지의 나머지 부분과 구분하는 데 자주 사용됩니다. 분리선(및 전체 각주 영역)은 각주가 없는 페이지에서는 렌더링되지 않습니다.

2.2. 각주 생성

요소에 float: footnote를 적용하면 해당 요소가 각주가 됩니다. 이때 다음과 같은 동작이 발생합니다:
  1. 각주 요소가 플로우에서 제거되고, 그 자리에 ::footnote-call 의사 요소가 삽입되어 각주 참조 역할을 합니다.
  2. 각주를 식별하는 ::footnote-marker 의사 요소가 각주 요소의 시작 부분에 배치됩니다. 이 두 요소가 합쳐져 각주 본문이 됩니다.
  3. footnote counter가 증가합니다.
  4. 각주 본문이 페이지 하단의 각주 영역에 배치됩니다. 한 페이지의 각주 요소들은 문서 순서대로 그 페이지의 각주 영역에 배치됩니다.
HTML:
<p>Though the body was erect, the head was thrown back so that the closed eyes were pointed towards the needle of the tell-tale that swung from a beam in the ceiling.<span class="footnote">The cabin-compass is called the tell-tale, because without going to the compass at the helm, the Captain, while below, can inform himself of the course of the ship.</span></p>

CSS:

@page {
  @footnote {
    float: bottom;
  }
}

span.footnote { float: footnote; }

왜 footnote 영역에 float:bottom이 사용되는가? 각주를 footnote 영역으로 플로팅하고, footnote 영역 자체도 플로팅하는 것은 구현체들이 footnote 영역을 다른 곳으로 플로팅하지 않는 점을 생각하면 너무 복잡해보입니다. 일부 구현체는 footnote 영역을 절대 위치로 배치하게 할 수도 있습니다.

2.3. 각주 유형

float 속성의 다음 새로운 값이 각주 요소를 생성합니다:
Name: float
New values: footnote
footnote
각주 요소는 해당 페이지의 footnote 영역에 배치됩니다.

footnote-display 속성은 각주가 블록 요소로 표시될지, 인라인 요소로 표시될지 결정합니다.

Name: footnote-display
Value: block | inline | compact
Initial: block
Applies to: elements
Inherited: no
Percentages: N/A
Computed value: specified value
Canonical order: per grammar
Animation type: discrete
block
각주 요소가 블록 요소로 footnote 영역에 배치됨
inline
각주 요소가 인라인 요소로 footnote 영역에 배치됨
compact
사용자 에이전트가 주어진 각주 요소를 블록 또는 인라인 요소로 배치할지 결정합니다. footnote 영역에 두 개 이상의 각주가 한 줄에 들어갈 수 있다면 인라인 배치되어야 합니다.

2.4. 각주 영역

페이지 영역 중 footnote를 표시하기 위한 영역은 페이지 컨텍스트에서 @footnote 규칙을 사용해 정의됩니다. 이 규칙은 사용될 경우 해당 페이지에 나타나는 모든 각주 요소를 담는 상자를 정의합니다.

이 부분을 CSS3-Page 문법으로 어떻게 설명해야 할까?

2.4.1. 각주 영역의 위치

각주 영역의 하단 마진 에지는 페이지 영역의 하단과 맞닿게 위치합니다. 각주 영역에는 각주만 포함될 수 있습니다.

여러 컬럼 텍스트에서 각주는 어떻게 동작하는가? Prince는 float: prince-column-footnote를 사용해 컬럼 하단에 각주를 생성합니다.

각주를 지원하는 구현체는 일반적으로 float: bottom 같은 페이지 플로트도 지원합니다. 페이지 플로트는 각주 영역 위에 배치되어야 합니다. 이를 어떻게 명세할 수 있을까요?

2.4.2. 각주 영역의 크기

max-height 속성은 footnote 영역의 크기를 제한합니다. 단, 페이지에 각주만 있을 경우(문서의 마지막 페이지 등)에는 제한되지 않을 수 있습니다.

페이지 전체가 각주로만 이루어지는 것은 바람직하지 않으므로, 사용자 에이전트는 footnote 영역에 대해 기본 max-height 값을 설정할 수 있습니다.

2.5. 각주 카운터

footnote counter는 각주 요소와 연결된 미리 정의된 카운터입니다. 이 값은 각주를 식별하는 데 쓰이는 숫자 또는 기호이며, 각주 호출과 각주 마커 모두에서 사용됩니다. 각주마다 값이 증가해야 합니다.

2.5.1. 각주 카운터의 값

각주 카운터는 다른 카운터와 마찬가지로 어떤 카운터 스타일도 사용할 수 있습니다. 각주에서는 흔히 기호의 연속을 사용합니다.

::footnote-call { content: counter(footnote, symbols('*', '†', '‡', '§')); }

::footnote-marker { content: counter(footnote, symbols('*', '†', '‡', '§')) '. '; }

2.5.2. 각주 카운터 리셋

각주 카운터는 각 페이지마다 리셋될 수 있습니다.

@page {
  counter-reset: footnote;
  @footnote { … }
}

각주 카운터의 값은 각주 요소가 문서 트리 내에서 위치한 순서에 따라 결정되어야 하며, 실제로 어디에 배치되는지와는 무관함에 유의하세요. 각주 요소가 때때로 각주 호출 뒤의 페이지에 배치될 수 있지만, 두 곳 모두에서 동일한 카운터 값을 사용해야 합니다.

2.6. footnote-call 의사 요소

::footnote-call 의사 요소는 각주 요소가 플로우에서 제거될 때 그 자리에 삽입됩니다. 기본적으로 이 의사 요소의 content는 각주 카운터의 값이며, 위첨자 숫자로 스타일링됩니다.
::footnote-call {
content: counter(footnote);
vertical-align: baseline;
font-size: 100%;
line-height: inherit;
font-variant-position: super;
}

2.7. footnote-marker 의사 요소

::footnote-marker 의사 요소는 각주 요소의 마커, 즉 각주를 식별하는 숫자나 기호를 나타냅니다. 이 의사 요소는 [CSS3LIST]의 정의처럼 ::marker 의사 요소와 동일하게 동작합니다. 상위 요소의 콘텐츠 시작 부분에 배치되며, 기본적으로 인라인입니다. ::footnote-marker는 다른 ::marker 요소들처럼 스타일링할 수 있습니다. 기본 스타일에는 list-style-position: inside가 포함되어야 합니다.
::footnote-marker {
content: counter(footnote);
}

::footnote-marker::after {
content: '. ';
}

2.8. 각주 렌더링과 footnote policy

각주 렌더링은 복잡할 수 있습니다. 각주가 페이지 하단 근처에 위치할 경우, 각주 본문을 배치할 공간이 부족할 수 있습니다. footnote-policy 속성은 저자가 난이도 있는 페이지의 렌더링에 영향을 줄 수 있게 합니다.

Name: footnote-policy
Value: auto | line | block
Initial: auto
Applies to: elements
Inherited: no
Percentages: N/A
Computed value: specified value
Canonical order: per grammar
Animation type: discrete
auto
사용자 에이전트가 각주를 렌더링하는 방법을 결정하며, 각주 본문을 각주 참조보다 나중 페이지에 배치할 수도 있습니다. 각주 본문은 각주 참조보다 앞 페이지에 배치되어서는 안 됩니다.
line
해당 각주 본문을 현재 페이지에 배치할 공간이 없으면, 사용자 에이전트는 각주 참조가 포함된 줄의 시작 부분에 강제 페이지 나누기를 삽입하여 참조와 각주 본문이 모두 다음 페이지에 위치하도록 합니다. 이때 widow와 orphan 설정도 준수해야 하므로, 더 앞줄에 페이지 나누기를 삽입할 수도 있습니다.
block
line과 동일하지만, 각주를 포함하는 문단 앞에서 강제 페이지 나누기가 일어납니다.

각주 배치 알고리즘이 필요합니다

2.9. 향후 방향

다음 레벨에서는 사이드노트, 컬럼 각주, 다중 각주 영역 등이 포함될 예정입니다.

3. 페이지 선택

페이지로 분할된 문서는 일련의 페이지로 구성됩니다. [CSS3PAGE]페이지 선택자를 정의하며, 이를 통해 문서의 첫 페이지, 왼쪽/오른쪽 페이지, 빈 페이지를 선택할 수 있습니다. 여기서는 임의의 문서 페이지를 선택할 수 있도록 페이지 선택자의 개념을 확장합니다.

3.1. 페이지 선택자

:nth() 페이지 의사 클래스는 임의의 문서 페이지를 선택할 수 있도록 해줍니다. 이 의사 클래스는 An + B 형태의 인자를 받으며, [CSS3SYN]에 정의되어 있습니다. 기본 @page 규칙에 적용될 때, :nth()는 인자와 일치하는 인덱스의 문서 페이지를 선택합니다.
:nth() = :nth( <an+b> [of <custom-ident>]? )

:nth()는 페이지 카운터와 관련이 없으며, 페이지 카운터는 리셋될 수 있고 다양한 번호 체계를 사용할 수 있습니다.

:nth() 선택자가 명명된 페이지에 적용되고, 해당 명명된 페이지가 아래의 page-group의 일부라면, 그 page-group 내에서 n번째 페이지를 선택합니다.

@page :nth(1)

문서의 첫 페이지를 선택합니다.

@page :nth(2n)
짝수 문서 페이지를 모두 선택합니다.

3.2. 페이지 그룹

많은 페이징 문서는 챕터, 섹션, 기사 등 반복 구조를 가집니다. 각 하위 구분의 첫 페이지는 종종 특별한 처리가 필요하지만, [CSS3PAGE]는 각 챕터의 첫 페이지(문서 전체의 첫 페이지와 구분)를 선택하는 방법을 정의하지 않습니다.

page 속성이 강제 분할 속성과 함께 요소에 적용될 경우, page group이 생성됩니다. page group은 해당 요소 인스턴스에 의해 생성된 모든 페이지의 모음입니다. 새 인스턴스가 렌더링되면 새로운 page group이 시작됩니다.

한 페이지는 여러 page group의 일부가 될 수 있으며, 한 page group에 상위나 하위 그룹이 포함될 수 있습니다.

CSS:
div { 
  page: A;
  break-before: page;
}
child { 
  page: B;
  break-before: page;
}
한 페이지가 여러 page group의 일부일 수 있습니다.
page 5는 다음 세 가지 방법으로 선택할 수 있습니다:
@page :nth(5 of A) /* 모든 <div>의 5번째 페이지 선택 */
@page :nth(1 of B) /* 모든 <child>의 첫 번째 페이지 선택 */
@page :nth(5)   /* 문서의 5번째 페이지 선택 */

다음 HTML을 고려해보세요:

<div class="chapter">
<h1>Chapter One</h1>
<p>some text</p>
<table class="broadside">
...
</table>
...
</div>
<div class="chapter">
<h1>Chapter Two</h1>
<p>some text</p>
...
<table class="broadside">
...
</table>
...
</div>

그리고 CSS:

div.chapter {
  page: body;
  break-before: page;
}

table.broadside {
  page: broadside;
  break-before: page;
}

이 경우, 각 챕터는 별도의 page group을 형성합니다. @page:nth(3 of body)는 각 챕터의 세 번째 페이지를 선택하며, 그 페이지가 “broadside” 명명 페이지를 사용하더라도 마찬가지입니다. @page:nth(1)은 문서의 첫 번째 페이지만, @page:first와 동일하게 선택합니다.

4. 리더(이동됨)

이제 [CSS3-CONTENT]에서 설명됩니다.

5. 교차 참조(이동됨)

이제 [CSS3-CONTENT]에서 설명됩니다.

6. 북마크(이동됨)

이제 [CSS3-CONTENT]에서 설명됩니다.

부록 A: 이전 항목의 위치

2011년 11월 29일 워킹드래프트에 있던 많은 섹션이 다른 명세로 이동하였습니다. 아래는 이동 내역에 대한 안내입니다.

페이지 마크 및 블리드 영역

이 섹션은 CSS Paged Media Module Level 3로 이동되었습니다.

CMYK 색상

이 섹션은 CSS Color Module Level 5로 이동되었습니다.

빈 페이지 스타일링

이 섹션은 CSS Paged Media Module Level 3로 이동되었습니다.

페이징 프레젠테이션

이 섹션은 CSS Overflow Module Level 4로 이동되었습니다.

이는 WHATWG CSS Books에서 논의되었습니다.

페이지 플로트

이 섹션은 CSS Page Floats로 이동되었습니다.

컬럼 및 페이지 선택

컬럼 선택에 대한 짧은 언급은 WHATWG CSS Books에서 찾을 수 있습니다.

부록 B: 기본 UA 스타일시트

이 부록은 참고용이며 UA 개발자가 HTML용 기본 스타일시트를 구현하는 데 도움이 되도록 작성되었습니다. 하지만 UA 개발자는 필요에 따라 무시하거나 수정할 수 있습니다.

@page {
  counter-reset: footnote;
  @footnote {
    counter-increment: footnote;
    float: bottom;
    column-span: all;
    height: auto;
  }
}

::footnote-marker {
  content: counter(footnote);
  list-style-position: inside;
}

::footnote-marker::after {
  content: '. ';
}

::footnote-call {
  content: counter(footnote);
  vertical-align: super;
  font-size: 65%;
}

@supports ( font-variant-position: super ) {
  ::footnote-call {
    content: counter(footnote);
    vertical-align: baseline;
    font-size: 100%;
    line-height: inherit;
    font-variant-position: super;
  }
}

h1 { bookmark-level: 1 }
h2 { bookmark-level: 2 }
h3 { bookmark-level: 3 }
h4 { bookmark-level: 4 }
h5 { bookmark-level: 5 }
h6 { bookmark-level: 6 }

부록 C: 변경사항

2014년 5월 13일 워킹드래프트 이후의 변경점:

2013년 9월 24일 에디터스 드래프트 이후의 변경점:

2011년 11월 29일 워킹드래프트 이후의 변경점:

WHATWG CSS Books 명세와의 차이점:

프라이버시 고려 사항

이 명세에 대해 보고된 새로운 프라이버시 고려 사항은 없습니다.

보안 고려 사항

이 명세에 대해 보고된 새로운 보안 고려 사항은 없습니다.

감사의 글

이 작업은 Håkon Wium Lie의 엄청난 기여 없이는 불가능했을 것입니다.

Chris Lilley, Elika J. Etemad, Alan Stearns, L. David Baron, Bert Bos, Florian Rivoal, [$your_name, ", " ]+ 그리고 Liam Quin이 귀중한 피드백을 제공하였습니다.

적합성

문서 관례

적합성 요구사항은 설명적인 단언과 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는 접근 가능한 대안을 반드시 제공해야 합니다.

적합성 클래스

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

스타일시트
CSS 스타일시트.
렌더러
스타일시트의 의미를 해석하여 문서를 렌더링하는 UA.
저작 도구
스타일시트를 작성하는 UA.

해당 모듈에 정의된 구문을 사용하는 모든 구문이 일반 CSS 문법 및 각 기능의 개별 문법에 따라 유효하다면, 스타일시트는 본 명세에 적합합니다.

렌더러는 스타일시트를 관련 명세에 따라 해석할 뿐만 아니라, 본 명세에 정의된 모든 기능을 올바르게 파싱하고 문서에 맞게 렌더링해야 적합합니다. 단, 장치의 한계로 인해 UA가 문서를 올바르게 렌더링하지 못하는 경우, UA가 비적합하다고 간주되지 않습니다. (예: 흑백 모니터에서 색상을 렌더링할 필요 없음)

저작 도구는 일반 CSS 문법과 본 모듈의 각 기능별 개별 문법에 맞게 구문적으로 올바른 스타일시트를 작성하고, 본 모듈에 명시된 스타일시트의 다른 모든 적합성 요구사항을 충족하면 적합합니다.

부분 구현

작성자가 전방 호환 파싱 규칙을 활용해 대체 값을 지정할 수 있도록, CSS 렌더러는 지원하지 않는 at-규칙, 속성, 속성값, 키워드, 기타 구문적 구조를 반드시 무효(그리고 적절히 무시)로 처리해야 합니다. 특히, UA는 하나의 다중 값 속성 선언에서 지원되지 않는 구성 값만 무시하고 지원되는 값은 적용하는 선택적 무시는 금지해야 합니다. 어떤 값이 무효(지원되지 않는 값은 반드시 무효)로 간주되면 CSS는 전체 선언을 무시해야 합니다.

불안정 및 독점 기능 구현

향후 안정적인 CSS 기능과의 충돌을 피하기 위해, CSSWG는 모범 사례 준수와 CSS의 불안정 기능, 독점 확장 구현 시 모범 사례를 따를 것을 권장합니다.

비실험적 구현

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

CSS의 상호 운용성을 확보 및 유지하기 위해 CSS 워킹 그룹은 비실험적 CSS 렌더러가 접두어 없는 구현을 공개하기 전에 구현 보고서(필요시 테스트케이스 포함)를 W3C에 제출할 것을 요청합니다. W3C에 제출된 테스트케이스는 CSS 워킹 그룹의 검토 및 수정 대상이 됩니다.

테스트케이스 및 구현 보고서 제출에 대한 자세한 정보는 CSS 워킹 그룹 웹사이트 https://www.w3.org/Style/CSS/Test/에서 확인할 수 있습니다. 문의 사항은 public-css-testsuite@w3.org 메일링 리스트로 보내주세요.

색인

이 명세에서 정의된 용어

참조로 정의된 용어

참고문헌

표준 참고문헌

[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS Positioned Layout Module Level 3. 2023년 4월 3일. WD. URL: https://www.w3.org/TR/css-position-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. 2023년 12월 18일. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-VALUES-5]
CSS Values and Units Module Level 5. Editor's Draft. URL: https://drafts.csswg.org/css-values-5/
[CSS21]
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/
[CSS22]
Bert Bos. Cascading Style Sheets Level 2 Revision 2 (CSS 2.2) Specification. 2016년 4월 12일. WD. URL: https://www.w3.org/TR/CSS22/
[CSS3-CONTENT]
Elika Etemad; Dave Cramer. CSS Generated Content Module Level 3. 2019년 8월 2일. WD. URL: https://www.w3.org/TR/css-content-3/
[CSS3LIST]
Elika Etemad; Tab Atkins Jr.. CSS Lists and Counters Module Level 3. 2020년 11월 17일. WD. URL: https://www.w3.org/TR/css-lists-3/
[CSS3PAGE]
Elika Etemad. CSS Paged Media Module Level 3. 2023년 9월 14일. WD. URL: https://www.w3.org/TR/css-page-3/
[CSS3SYN]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2021년 12월 24일. CR. URL: https://www.w3.org/TR/css-syntax-3/
[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

참고용 참고문헌

[DPUB-LATINREQ]
Dave Cramer. Requirements for Latin Text Layout and Pagination. FPWD. URL: https://www.w3.org/TR/dpub-latinreq/

속성 색인

이름 초기값 적용 대상 상속 % 비율 애니메이션 타입 정식 순서 계산된 값
footnote-display block | inline | compact block elements no N/A discrete per grammar specified value
footnote-policy auto | line | block auto elements no N/A discrete per grammar specified value
running <custom-ident> none elements no N/A discrete per grammar specified value
string-set [ <custom-ident> <content-list> ]# | none none all elements, but not pseudo-elements no N/A discrete per grammar specified value

이슈 색인

이 함수의 기본값을 어떻게 정의할 것인가?

요소를 이동하는 것뿐만 아니라 복사할 수도 있으면 훨씬 더 유용할 것입니다. 위의 예시처럼 HTML 중복을 피할 수 있습니다.

Bert Bos는 이동과 복사 모두를 허용하는 대체 구문을 제안했습니다. 아래 예시에서는 h2 요소가 문서의 원래 위치에도 나타나고 러닝 헤드에도 복사됩니다.

h2 {
display: block;
running: chapter;
font-size: 18pt;
font-weight: bold;
}

h2:running {
display: inline;
font-size: 11pt;
font-weight: normal;
font-variant: small-caps;
letter-spacing: 1pt;
}

@page {
  @top-center {
    content: element(chapter);
    }
  }
이름 running
값: <custom-ident>
초기값: none
적용 대상: elements
상속: no
퍼센트: N/A
계산값: specified value
정식 순서: per grammar
애니메이션 타입: discrete

사용자 에이전트는 비시각적 미디어를 포함한 모든 미디어에서 이 속성을 지원해야 합니다.

왜 footnote 영역에 float:bottom이 사용되는가? 각주를 footnote 영역으로 플로팅하고 footnote 영역 자체도 플로팅하는 것은 구현체들이 footnote 영역을 다른 곳에 플로팅하지 않는 점을 생각하면 너무 복잡합니다. 일부 구현체에서는 footnote 영역을 절대 위치로 둘 수도 있습니다.
이 부분을 CSS3-Page 문법으로 어떻게 설명할까?
여러 컬럼 텍스트에서 각주는 어떻게 동작하는가? Prince는 float: prince-column-footnote를 사용해 컬럼 하단에 각주를 생성합니다.
각주를 지원하는 구현체는 일반적으로 float: bottom 같은 페이지 플로트도 지원합니다. 페이지 플로트는 각주 영역 위에 배치되어야 합니다. 이를 어떻게 명세할 수 있을까요?
각주 배치 알고리즘이 필요합니다
이제 [CSS3-CONTENT]에서 설명됩니다.
이제 [CSS3-CONTENT]에서 설명됩니다.
이제 [CSS3-CONTENT]에서 설명됩니다.