CSSカウンタースタイル レベル3

W3C 候補勧告スナップショット、

このバージョン:
https://www.w3.org/TR/2021/CR-css-counter-styles-3-20210727/
最新の公開バージョン:
https://www.w3.org/TR/css-counter-styles-3/
編集者草案:
https://drafts.csswg.org/css-counter-styles/
以前のバージョン:
実装レポート:
https://test.csswg.org/harness/results/css-counter-styles-3_dev/grouped/
テストスイート:
http://test.csswg.org/suites/css-counter-styles-3_dev/nightly-unstable
課題追跡:
CSSWG 課題リポジトリ
編集者:
Tab Atkins Jr. (Google)
この仕様への編集提案:
GitHub 編集者

概要

このモジュールは、著者がCSSのリストマーカーや生成コンテンツカウンターで使用するための独自のカウンタースタイルを定義できる@counter-style規則を導入します。また、CSS2およびCSS2.1で提供されているものを含む、一般的なカウンタースタイルのセットもあらかじめ定義されています。

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

この文書のステータス

このセクションは、公開時点でのこの文書のステータスについて説明します。 他の文書が本文書に取って代わる可能性があります。 現在のW3C出版物のリストや、本技術報告書の最新バージョンは、W3C技術報告書インデックス https://www.w3.org/TR/で確認できます。

この文書はCSS作業グループによって候補勧告スナップショットとして公開されました。 候補勧告として公開されても、W3C会員による承認を意味するものではありません。 候補勧告スナップショットは幅広いレビューを受けており、実装経験を集めるためのものです。 本文書はW3C勧告になる予定です。 追加のフィードバックを集めるため、少なくともまでは候補勧告のままとなります。

フィードバックは、GitHubで課題を提出(推奨)、タイトルに仕様コード「css-counter-styles」を含めてください(例:“[css-counter-styles] …コメント概要…”)。 すべての課題とコメントはアーカイブされています。 または、(アーカイブあり) 公開メーリングリストwww-style@w3.orgへ送信することも可能です。

この文書は、2020年9月15日W3Cプロセス文書に従って管理されています。

この文書は、W3C特許ポリシーのもとで運営されているグループによって作成されました。 W3Cは、グループの成果物に関連してなされた公開特許開示リストを管理しています。 そのページには、特許開示の手順も記載されています。 個人が特許の実際の知識を持ち、その特許が必須クレームを含むと考える場合は、W3C特許ポリシー第6節に従って情報を開示する必要があります。

以下の機能は現時点で「危険あり」とされており、CR期間中に削除される可能性があります:

「危険あり」とはW3Cプロセス用語であり、必ずしも機能が削除または遅延される危険があることを意味するものではありません。WGがその機能の相互運用可能な実装に困難があると考えた場合、そのようにマークすることで、提案勧告段階への移行時に機能を削除できるようになります(先に機能を削除した候補勧告を公開する必要がありません)。

1. はじめに

CSS 1は、HTMLが伝統的に順序付きリストや順序なしリストで許可してきたスタイルに基づいた、いくつかの便利なカウンタースタイルを定義しました。 CSS2.1で多少拡張されたものの、 世界中のタイポグラフィのニーズには対応できていませんでした。

このモジュールは、CSSがこの課題にオープンな形で対応できるようにする@counter-style規則を導入します。 著者が独自のカウンタースタイルを定義できるようになります。 これらのスタイルはlist-style-typeプロパティや、 counter()およびcounters() 関数で使用できます。 また、特に一般的だが@counter-styleだけでは表現が複雑な、追加の定義済みカウンタースタイルも定義しています。

2. カウンタースタイル

カウンタースタイルは、カウンター値を文字列に変換する方法を定義します。 カウンタースタイルは以下の要素で構成されます:

特定のカウンタースタイルで特定のカウンター値のカウンター表現を生成するよう要求された場合、以下の手順に従います:

  1. カウンタースタイルが未知の場合、 このアルゴリズムを終了し、代わりにカウンター表現を生成し、decimalスタイルと同じカウンター値で処理します。
  2. カウンター値がカウンタースタイルのrange外の場合、 このアルゴリズムを終了し、フォールバックスタイルと同じカウンター値でカウンター表現を生成します。
  3. カウンター値とカウンタースタイルのカウンターアルゴリズムを用いて、 カウンター値の初期表現を生成します。 カウンター値が負で、 カウンタースタイルが負符号を使う場合は、 代わりに絶対値で初期表現を生成します。
  4. pad記述子で指定された通り、表現に記号を先頭に付加します。
  5. カウンター値が負で、 カウンタースタイルが負符号を使う場合、 表現をカウンタースタイルの負符号(negative記述子で指定)で囲みます。
  6. 表現を返します。

注: prefixsuffixはこのアルゴリズムには関与しません。 これは仕様によるもので、 prefixとsuffixはcounter()やcounters()関数が返す文字列には含まれません。 代わりに、prefixとsuffixはcontentプロパティの値を構築するアルゴリズムによって追加されます。 これは::marker疑似要素用です。 また、実際の表現がフォールバックスタイルによって構築された場合でも、prefixとsuffixは指定されたカウンタースタイルから必ず取得されることを意味します。

systemsymbolicadditive)の一部の値や、 pad記述子など一部の記述子は、 著者が指定した数値に比例した長さの表現を生成できます。 これは、非常に大きな表現を生成してユーザーのメモリを過度に消費したり、ブラウザをフリーズさせたりする悪用につながる可能性があります。 ユーザーエージェントは少なくとも60ユニコードコードポイント分の表現をサポートしなければなりませんが、 60コードポイントを超える表現についてはフォールバックスタイルを使うことも選択できます。

3. カスタムカウンタースタイルの定義:@counter-style 規則

@counter-style規則は、著者がカスタムのカウンタースタイルを定義することを可能にします。 カウンタースタイルの構成要素は、@counter-style規則内の記述子によって指定します。 アルゴリズムは、systemsymbolsadditive-symbolsプロパティの組み合わせで暗黙的に指定されます。

@counter-style規則の一般形式は以下の通りです:

@counter-style <counter-style-name> { <declaration-list> }

<counter-style-name>は、<custom-ident>であり、ASCII 大文字・小文字を区別しない一致でnoneにならないものです。 <counter-style-name>ツリー単位の名前です。

キーワードdecimaldiscsquarecircledisclosure-opendisclosure-closedは有効な<counter-style-name>ですが、 ここでカウンタースタイル名として使うと無効になります。 (他の文脈、例えばextendシステムでは使用可能です。)

注: <custom-ident>CSS全体キーワードも自動的に除外します。 さらに、insideのように、 カウンタースタイル名としては有効でも、 list-styleなど既存プロパティ値と競合するものは、 その場所では使えません。

カウンタースタイル名は大文字・小文字を区別します。 ただし、本仕様で定義されている名前は、カウンタースタイルとして使う場合はすべてASCII小文字化してパースされます。 例:list-style関連プロパティ群、 @counter-style規則、 counter()関数など。

@counter-style規則は、すべてのカウンタースタイル記述子の値を明示的または暗黙的に指定します。 規則内で明示的に値を指定しない記述子は、仕様に記載された初期値を取ります。 これらの記述子は、定義された@counter-style規則の文脈内でのみ適用され、 文書言語の要素には適用されません。 記述子がどの要素に適用されるかや、値が子要素に継承されるかの概念はありません。 規則内で同じ記述子が複数回出現した場合は、最後に指定された有効な値のみが使用され、 それ以前の値はすべて無視されます。

@counter-styleを定義すると、その文書全体で使用可能になります。 同じ名前の@counter-style規則が複数定義された場合は、 標準のカスケードルールに従って、ひとつだけが勝ちます。@counter-style規則は「原子性」でカスケードされ、 ひとつが他と同じ名前の場合は完全に置き換えられ、 指定している記述子だけでなく、規則全体が置き換わります。

注: 定義済みカウンタースタイルでさえ上書き可能です。 UAスタイルシートは他のスタイルシートより先に読み込まれるため、 定義済みスタイルは常にカスケードでは負けることになります。

このat規則はCSSの前方互換パース要件に準拠しています。 この規則を理解できない準拠パーサーは、エラーなく無視します。 各ユーザーエージェントで認識されない、または実装されていない記述子、 あるいはこの仕様や将来のバージョンで示される文法と一致しない値の記述子は、 すべて完全に無視しなければならず、 @counter-style規則自体を無効にしません。

3.1. カウンターアルゴリズム: system 記述子

名前: system
対象: @counter-style
値: cyclic | numeric | alphabetic | symbolic | additive | [fixed <integer>?] | [ extends <counter-style-name> ]
初期値: symbolic

system記述子は、カウンター値に基づいてカウンター表現を構築するために使用するアルゴリズムを指定します。例えば、cyclic カウンタースタイルはシンボルを繰り返し循環させますが、 numericカウンタースタイルはシンボルを数字として解釈し、 それに応じて表現を構築します。 各システムの詳細は以下の小節で定義されています。

system値は、symbolsまたはadditive-symbols記述子と関連付けられており、 対応する記述子が持つべき最小長があります。 下記の各項目でそれぞれ定義されています。 @counter-style規則がこの要件を満たさない場合、 カウンタースタイルを定義しません。 (規則自体は構文的に有効ですが、効果はありません。)

3.1.1. 循環シンボル: cyclicシステム

cyclicカウンターシステムは、指定されたシンボルを繰り返し循環し、 リストの末尾に到達すると先頭に戻ります。 シンプルな箇条書き(シンボルが1つだけの場合)や、複数のシンボルを循環させる用途に使えます。 最初のカウンターシンボルは値1の表現に、 2番目のカウンターシンボル(存在する場合)は値2の表現に使われます。

systemがcyclicの場合、 symbols記述子には1つ以上のカウンターシンボルが必要です。 このシステムはすべてのカウンター値について定義されます。

「三角形の箇条書き」カウンタースタイルは以下のように定義できます:
@counter-style triangle {
  system: cyclic;
  symbols: ‣;
  suffix: " ";
}

これにより、次のようなリストが生成されます:

‣  One
‣  Two
‣  Three

N個のカウンターシンボルがあり、整数valueの表現を構築する場合、 表現はリスト内の(value-1) mod N番目(0始まり)のカウンターシンボルとなります。

3.1.2. 消尽可能なシンボル: fixed システム

fixedカウンターシステムは、カウンターシンボルのリストを一度だけ走査し、 その後はフォールバックになります。 表現の種類が有限なカウンタースタイルに便利です。 例えば、Unicodeにはリスト用の特殊文字が限定数だけ定義されているものがあります(例:囲み数字など)。

systemがfixedの場合、 symbols記述子には1つ以上のカウンターシンボルが必要です。 このシステムは有限範囲のカウンター値に対して定義され、 first symbol valueから始まり、 カウンターシンボルリストの長さ分の値を持ちます。

このシステムを指定する際、後ろに整数を付与することもでき、 これがfirst symbol valueとなります。 省略した場合、first symbol valueは1になります。

「角ボックス」カウンタースタイルは以下のように定義できます:
@counter-style box-corner {
  system: fixed;
  symbols: ◰ ◳ ◲ ◱;
  suffix: ': ';
}

これにより、次のようなリストが生成されます:

◰:  One
◳:  Two
◲:  Three
◱:  Four
5:  Five
6:  Six

最初のカウンターシンボルfirst symbol valueの表現となり、 以降のカウンター値は後続のカウンターシンボルで表現されます。 カウンターシンボルリストが尽きた場合、 それ以降の値はこのカウンタースタイルで表現できなくなり、 フォールバックカウンタースタイルで表現されます。

3.1.3. 繰り返しシンボル: symbolicシステム

symbolicカウンターシステムは、指定されたシンボルを繰り返し循環し、 リストの各周回ごとに2倍、3倍…とシンボルを繰り返して表現します。 例えば、元のシンボルが「*」と「†」の場合、 2周目は「**」と「††」、 3周目は「***」と「†††」などとなります。 脚注スタイルのマーカーや、alphabeticシステムとは少し異なる表現のアルファベット型リストなどに使えます。

systemがsymbolicの場合、 symbols記述子には1つ以上のカウンターシンボルが必要です。 このシステムは正のカウンター値のみについて定義されます。

「脚注」カウンタースタイルは以下のように定義できます:
@counter-style footnote {
  system: symbolic;
  symbols: '*' ⁑ † ‡;
  suffix: " ";
}

これにより、次のようなリストが生成されます:

*   One
⁑   Two
†   Three
‡   Four
**  Five
⁑⁑  Six
一部のスタイルガイドでは、upper-alphaに似た番号付けを求められますが、 最初の26値の後で繰り返し方式が異なり、"AA"、"BB"、"CC"のように続きます。 これはsymbolic systemで実現できます:
@counter-style upper-alpha-legal {
  system: symbolic;
  symbols: A B C D E F G H I J K L M
           N O P Q R S T U V W X Y Z;
}

このスタイルは最初の27値まではupper-alphaと同じですが、 それ以降は「AB」「AC」「AD」などと分かれます。 53番目以降では、upper-alphaは「BA」「BB」「BC」などとなりますが、 このスタイルでは「AAA」「BBB」「CCC」のような3文字表現になります。

表現の構築アルゴリズムは以下の通りです:

Nカウンターシンボルリストの長さ、valueをカウンター値、 Sを空文字列とし、 symbol(n)をリスト内n番目(0始まり)のカウンターシンボルとします。

  1. chosen symbolsymbol( (value - 1) mod N)とする。
  2. representation lengthceil( value / N )とする。
  3. chosen symbolrepresentation lengthSへ追加する。

最後にSを返します。

3.1.4. 一対一対応記数法:alphabeticシステム

alphabeticカウンターシステムは、counter symbolsのリストを alphabetic記数法の「数字」として解釈します。 これはデフォルトのlower-alphaカウンタースタイルに似ており、 "a", "b", "c" から "aa", "ab", "ac" へと繰り返します。 アルファベット式の記数法には0を表す数字がなく、 桁数が増えた場合は最初の数字のみで構成されます。 アルファベット記数法はリストによく使われ、 多くの表計算ソフトで列番号にも現れます。 リスト内の最初のcounter symbolは「1」として、 2番目は「2」として、 以下同様に解釈されます。

systemがalphabeticの場合、 symbols記述子には少なくとも2つのcounter symbolsが必要です。 このシステムは正のカウンター値のみ定義されます。

囲碁石を使ったカウンタースタイルは次のように定義できます:
@counter-style go {
  system: alphabetic;
  symbols: url(white.svg) url(black.svg);
  suffix: " ";
}

これにより次のようなリストが生成されます:

One
Two
Three
Four
Five
Six
Seven

注: この例を正しく表示するにはSVG画像のサポートが必要です。

N個のcounter symbolsがある場合、 表現はcounter symbolsを数字としたN進のアルファベット記数法となります。 表現を構築するには、次のアルゴリズムを実行します:

Ncounter symbolsリストの長さ、valueをカウンター値、 Sを空文字列とし、 symbol(n)をリスト内n番目(0始まり)のcounter symbolとします。

valueが0でない間:

  1. valuevalue - 1にセットする。
  2. symbol( value mod N )Sの先頭に追加する。
  3. valuefloor( value / N )にセットする。

最後にSを返します。

3.1.5. 位取り記数法:numericシステム

numericカウンターシステムは、counter symbolsリストを 「位取り記数法」の「数字」として解釈します。 これはデフォルトのdecimalカウンタースタイルに似ています。 リストの最初のcounter symbolは「0」、 2番目は「1」、 以下同様に解釈されます。

systemがnumericの場合、 symbols記述子には少なくとも2つのcounter symbolsが必要です。 このシステムはすべてのカウンター値に定義されます。

「三進法」カウンタースタイルは次のように定義できます:
@counter-style trinary {
  system: numeric;
  symbols: '0' '1' '2';
}

これにより次のようなリストが生成されます:

1.   One
2.   Two
10.  Three
11.  Four
12.  Five
20.  Six

N個のcounter symbolsがある場合、 表現はcounter symbolsを数字としたN進法の数となります。 表現を構築するには、次のアルゴリズムを実行します:

Ncounter symbolsリストの長さ、valueをカウンター値、 Sを空文字列とし、 symbol(n)をリスト内n番目(0始まり)のcounter symbolとします。

  1. valueが0なら、symbol(0)Sに追加してSを返す。
  2. valueが0でない間:
    1. symbol( value mod N )Sの先頭に追加する。
    2. valuefloor( value / N )にセットする。
  3. Sを返す。

3.1.6. 加算的記数法:additiveシステム

additiveカウンターシステムは、「符号-値」記数法の表現に使われます。 これは、桁位置によって数字の値を変えるのではなく、 より大きな値を持つ追加の数字を定義し、 全ての数字の値を合計することで数値が得られる仕組みです。 ローマ数字や世界各地の記数法で使われています。

systemがadditiveの場合、 additive-symbols記述子には少なくとも1つのadditive tupleが必要です。 このシステムは名目上すべてのカウンター値に定義されます (詳細は下記アルゴリズムを参照)。

「サイコロ」カウンタースタイルは次のように定義できます:
@counter-style dice {
  system: additive;
  additive-symbols: 6 ⚅, 5 ⚄, 4 ⚃, 3 ⚂, 2 ⚁, 1 ⚀;
  suffix: " ";
}

これにより次のようなリストが生成されます:

  ⚀  One
  ⚁  Two
  ⚂  Three
...
 ⚅⚄  Eleven
 ⚅⚅  Twelve
⚅⚅⚀  Thirteen
表現構築アルゴリズム:
  1. valueをカウンター値、Sを空文字列、 symbol listadditive tuplesリストとする。

  2. valueがゼロの場合:

    1. symbol listに重みゼロのタプルがあれば、 そのタプルのcounter symbolSに追加しSを返す。

    2. なければ、このカウンタースタイルでは表現できないので、 フォールバックカウンタースタイルで表現する。

  3. symbol list内の各tupleについて:

    1. symbolweighttuplecounter symbolと重みとする。

    2. weightがゼロ、またはvalueより大きい場合、continue

    3. repsfloor( value / weight )とする。

    4. symbolSreps回追加する。

    5. valueweight * reps分だけ減算する。

    6. valueがゼロならSを返す。

  4. アサーション:valueはまだゼロでない。

    このカウンター値はこのカウンタースタイルでは表現できないので、 フォールバックカウンタースタイルで表現する。

注: この仕様で定義される全ての定義済み加算型@counter-style規則は、範囲内の全ての値に表現を生成しますが、 additive-symbolsの値によっては、上記アルゴリズムで表現が見つからない場合があります。 理論上は表現できても、アルゴリズム上見つからないことがあります。 例えば、@counter-styleadditive-symbols: 3 "a", 2 "b";のように定義した場合、 上記アルゴリズムではカウンター値4で表現が見つかりませんが、 理論上は"bb"で表現可能です。 これはアルゴリズムの線形時間性を保つために必要です。

3.1.7. 既存カウンタースタイルから構築:extendsシステム

extendsシステムは、他のカウンタースタイルのアルゴリズムを利用しつつ、 負符号やサフィックスなど他の側面を変更することができます。 カウンタースタイルがextendsシステムを使う場合、 未指定の記述子は初期値ではなく、指定した拡張元カウンタースタイルから取得します。

@counter-styleextendsシステムを使う場合、 symbolsadditive-symbols記述子を含んではいけません。 そうすると@counter-style規則は無効となります。

指定された<counter-style-name>ASCII大文字・小文字を区別しない一致で、 disccirclesquaredisclosure-opendisclosure-closed(定義済みsymbolicカウンタースタイル)なら、 extendは規範スタイルシートで提供される「標準」定義から拡張します (ユーザーエージェント独自描画の例外ではなく)。

指定したカウンタースタイル名が定義済みのカウンタースタイル名でない場合、 decimalカウンタースタイルを拡張したものとして扱います。 1つ以上の@counter-style規則がextends値で循環関係を形成する場合、 その循環に関与する全てのカウンタースタイルはdecimalカウンタースタイルを拡張したものとして扱います。

例えばdecimalと同じだが、後ろがピリオドではなく括弧になるカウンタースタイルを作る場合:
1) first item
2) second item
3) third item

新しいカウンタースタイルを一から書くのではなく、 decimalを拡張するだけで実現できます:

@counter-style decimal-paren {
  system: extends decimal;
  suffix: ") ";
}

3.2. 負の値の書式設定:negative 記述子

名前: negative
対象: @counter-style
値: <symbol> <symbol>?
初期値: "\2D"("-" ハイフンマイナス)

negative記述子は、 カウンター値が負の場合に表現をどのように変更するかを定義します。

値の最初の<symbol>は、カウンター値が負の場合に表現の前に追加されます。2番目の<symbol>(指定されていれば)は、カウンター値が負の場合に表現の後ろに追加されます。

例えば、negative: "(" ")";と指定すると、 負の値が括弧で囲まれるようになり、これは金融分野などでよく使われます(例:"(2) (1) 0 1 2 3...")。

すべてのsystem値が負符号を使うわけではありません。 特に、カウンタースタイルは、そのsystem値がsymbolicalphabeticnumericadditive、 または拡張されたカウンタースタイル自体が負符号を使う場合はextends負符号を使うことになります。 カウンタースタイルが負符号を使わない場合は、 カウンター表現生成時に負符号を無視します。

3.3. マーカーの前の記号:prefix 記述子

名前: prefix
対象: @counter-style
値: <symbol>
初期値: ""(空文字列)

prefix記述子は、マーカー表現の前に追加される<symbol>を指定します。 プレフィックスは負符号よりも前に追加されます。

注: プレフィックスは::marker疑似要素のデフォルト内容を構築するアルゴリズムによってのみ追加されます。counter()counters()関数使用時には自動的に追加されません。

3.4. マーカーの後の記号:suffix 記述子

名前: suffix
対象: @counter-style
値: <symbol>
初期値: "\2E\20"("." ピリオド+スペース)

suffix記述子は、マーカー表現の末尾に追加される<symbol>を指定します。 サフィックスは負符号の後ろに追加されます。

注: サフィックスは::marker疑似要素のデフォルト内容を構築するアルゴリズムによってのみ追加されます。counter()やcounters()関数使用時には自動的に追加されません。

3.5. カウンターの範囲制限:range 記述子

名前: range
対象: @counter-style
値: [ [ <integer> | infinite ]{2} ]# | auto
初期値: auto

range記述子は、そのカウンタースタイルが定義される範囲を定義します。 カウンタースタイルが範囲外の値を表現しようとすると、 フォールバックカウンタースタイルに切り替わります。

auto
範囲はカウンターシステムによって異なります:
  • cyclicnumericfixedシステムの場合、 範囲は負の無限大から正の無限大までです。
  • alphabeticおよびsymbolicシステムの場合、 範囲は1から正の無限大までです。
  • additiveシステムの場合、 範囲は0から正の無限大までです。
  • extendsシステムの場合、 拡張元のシステムに対してautoが生成する範囲となります。 複雑な定義済みスタイル(§ 7 複雑な定義済みカウンタースタイル)を拡張する場合は、 そのスタイルで定義された範囲になります。
[ [ <integer> | infinite ]{2} ]#
これはカンマ区切りの範囲リストを定義します。 個々の範囲では、 最初の値が下限、 2番目の値が上限です。 この範囲は両端を含みます。 infiniteが範囲の最初の値として使われる場合は負の無限大、 2番目の値として使われる場合は正の無限大を表します。 カウンタースタイルの範囲は、リストで定義された全範囲の和集合です。

どれかの範囲で下限が上限より大きい場合は、 記述子全体が無効となり無視されます。

実装は最低でも下限が-215、上限が215-1(符号付き2バイト整数の範囲)の範囲をサポートしなければなりません。 より広い範囲をサポートしても構いません。 指定した値が実装のサポート範囲外の場合は、 実装がサポートする最も近い値として扱います。

3.6. ゼロパディングと固定幅表現:pad記述子

名前: pad
対象: @counter-style
値: <integer [0,∞]> && <symbol>
初期値: 0 ""

pad記述子は、著者が「固定幅」カウンタースタイルを指定できるようにします。 表現がpad値より短い場合は、指定した<symbol>でパディングされます。 指定値より長い表現は通常通り構築されます。

<integer [0,∞]> && <symbol>
<integer>は、すべてのカウンター表現が到達すべき最小長を指定します。

differenceを、指定された<integer>から書記素クラスタ数を引いた値とします(カウンター表現生成アルゴリズムに従い、これはprefix/suffix/negative追加前に行われることに注意)。 カウンター値が負で、カウンタースタイルが負符号を使う場合は、さらにカウンタースタイルのnegative 記述子の<symbol>(複数可)の書記素クラスタ数だけ減算します。

differenceが0より大きい場合は、 指定した<symbol>difference回、表現の前に追加します。

負の<integer>値は許可されません。

「固定幅」番号付けの最も一般的な例はゼロパディングされたdecimal番号です。 例えば著者が使用する数値が千未満であることが分かっていれば、pad: 3 "0";記述子でゼロパディングし、 すべての表現を3桁幅に揃えられます。

例えば、 1は"001"、 20は"020"、 300は"300"、 4000は"4000"、 -5は"-05"となります。

注: pad記述子は表現の書記素クラスタ数でカウントしますが、 パディングには<symbol>を使います。 指定したpad<symbol>が複数文字の場合、 意図した効果にならない可能性があります。 残念ながら、書記素クラスタ数でパディングを調整する方法は有用な制約との両立ができません。 著者は<symbol>に1書記素クラスタのみを指定することが推奨されます。

3.7. フォールバックの定義:fallback 記述子

名前: fallback
対象: @counter-style
値: <counter-style-name>
初期値: decimal

fallback記述子は、現在のカウンタースタイルが特定のカウンター値の表現を作成できない場合に使用されるフォールバックカウンタースタイルを指定します。例えば、1~10の範囲で定義されたカウンタースタイルに11の値を表現させようとした場合、その値の表現はフォールバックカウンタースタイル(あるいはさらにそのフォールバック、というように)で構築されます。

fallback記述子の値が定義済みのカウンタースタイル名でない場合は、fallback記述子の使用値はdecimalとなります。 同様に、フォールバックをたどって表現可能なカウンタースタイルを探す際にループが検出された場合、decimalスタイルが代わりに使用されます。

フォールバックのループ指定は必ずしもエラーではありません。例えば、偶数・奇数で大きく異なる表現を持たせたい場合、偶数のみ表現できるスタイルと奇数のみ表現できるスタイルをそれぞれ相互にフォールバック指定することで実現できます。フォールバックグラフ自体は循環ですが、実際に値ごとにたどる際にはループが発生せず、各値はどちらかのスタイルで表現されます。

3.8. マーカー文字:symbolsおよびadditive-symbols記述子

名前: symbols
対象: @counter-style
値: <symbol>+
初期値: n/a
名前: additive-symbols
対象: @counter-style
値: [ <integer [0,∞]> && <symbol> ]#
初期値: n/a
<symbol> = <string> | <image> | <custom-ident>

symbolsおよびadditive-symbols記述子は、system記述子で指定されたマーカー構築アルゴリズムで使用される記号を指定します。 @counter-style規則は、counter systemがcyclicnumericalphabeticsymbolic、 またはfixedの場合は有効なsymbols記述子を、 counter systemがadditiveの場合は有効なadditive-symbols記述子を持たなければなりません。 それ以外の場合、@counter-styleカウンタースタイルを定義しません(ただし有効なat-ruleではあります)。

一部のカウンターシステムは、symbols記述子に2つ以上の項目が必要です。 システムがそれに該当し、symbols記述子が1つしか項目を持たない場合、@counter-style規則はカウンタースタイルを定義しません。

symbols記述子の各項目はカウンターシンボルを定義し、システムによって解釈が異なります。 additive-symbols記述子の各項目は加算タプルを定義し、カウンターシンボルと整数の重みから成ります。 重みは非負整数でなければならず、加算タプルは重みが厳密に降順となるよう指定しなければなりません。そうでない場合は宣言が無効となり無視されます。

カウンターシンボルは文字列・画像・識別子であり、1つの記述子内で混在できます。 カウンター表現はカウンターシンボルを連結して構築されます。 識別子は同じ文字列として表示され、画像はインライン置換要素として表示されます。 画像カウンターシンボルデフォルトオブジェクトサイズは1em×1emの正方形です。

注: <image> 構文(<symbol>内)は現在「危険あり」です。 現時点で実装予定はなく、counter()の利用を複雑にする要素もあり、十分に検討されていません。

注: 記号定義に文字列ではなく識別子を使う場合、識別子の構文に注意してください。 特に"*"のようなASCII非英字は識別子ではなく、文字列として引用する必要があります。 いくつかのカウンタースタイルで使われる16進エスケープは後続のスペースを「食べる」ため(数字が曖昧なく後続できるように)、 2つのエスケープを分けるには間にスペース2つ必要です。そうでないと隣接して同一識別子扱いになります。 例えばsymbols: \660 \661;はU+0660とU+0661文字からなる1つの記号定義となり、意図した2つにはなりません。 エスケープを文字列で囲む(symbols: "\660" "\661")か、間にスペース2つ入れてください。

3.9. 音声合成:speak-as 記述子

名前: speak-as
対象: @counter-style
値: auto | bullets | numbers | words | spell-out | <counter-style-name>
初期値: auto

カウンタースタイルは、見た目では意味が明らかでも、音声合成や非視覚的手段では意味のある表現ができない場合や、そのまま読み上げると意味不明となる場合があります。 speak-as記述子は、そのカウンタースタイルで整形されたカウンターの音声表現をどのように合成するかを指定します。 支援技術はこの音声表現を読み上げる際に利用し、speak-as値を音声以外の出力変換にも活用してよいです。 各値の意味は次の通りです:

auto
カウンタースタイルのsystemalphabeticなら、spell-outと同じ。 systemcyclicなら、bulletsと同じ。 systemextendsなら、拡張元スタイルに対するautoと同じ。 それ以外はnumbersと同じ。
bullets
UAが、順序なしリスト項目の読み上げを表すUA定義のフレーズや音を出します。
numbers
カウンターの数値はコンテンツ言語で数字として読み上げられます。
words
通常通りカウンター表現を生成し、 コンテンツ言語で普通のテキストとして読み上げます。 カウンター表現に画像が含まれる場合は、numbersと同じ扱いになります。
spell-out
通常通りカウンター表現を生成し、 コンテンツ言語で一文字ずつ読み上げます。 UAが記号の発音方法を知らない場合(または画像を含む場合)は、numbersと同じ扱いになります。

例えば、英語でlower-greekは "alpha", "beta", "gamma"などと読み上げます。 逆に、フランス語でupper-latinは(発音記号で)/a/, /be/, /se/などとなります。

<counter-style-name>
カウンター値は指定したスタイルで読み上げられます(fallback記述子で値の表現を生成する挙動と似ています)。 指定スタイルが存在しない場合、この値はautoと同じ扱いになります。 speak-as参照をたどる際にループが検出された場合は、 そのループに参加するカウンタースタイルに対してこの値はautoとして扱われます。
発音を他のカウンタースタイルに委譲できることで、使っている記号が実際は文字でない場合にも対応できます。 例えば、Unicodeの特殊文字を使ったcircled-lower-latinカウンタースタイルの定義例です:
@counter-style circled-lower-latin {
  system: alphabetic;
  speak-as: lower-latin;
  symbols: ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ;
  suffix: " ";
}

systemalphabeticにすると、通常はUAが文字名を読み上げようとしますが、 この場合は「Circled Letter A」のようになり、意味が通じません。 代わりに明示的にspeak-aslower-latinに設定することで、意図通りラテン文字として読み上げられます。

4. 匿名カウンタースタイルの定義:symbols()関数

symbols()関数は、カウンタースタイルをプロパティ値の中でインライン定義できるようにします。 スタイルがスタイルシート内で一度だけ使われる場合など、完全な@counter-style規則を定義するのが大げさな場合に便利です。 @counter-style規則ほどの全機能はありませんが、十分に実用的なサブセットを提供します。 symbols()規則の構文は以下です:

symbols() = symbols( <symbols-type>? [ <string> | <image> ]+ )
<symbols-type> = cyclic | numeric | alphabetic | symbolic | fixed

symbols()関数は、名前なしの匿名カウンタースタイルを定義します。 prefix""(空文字列)、 suffix" "(U+0020 スペース)、 rangeautofallbackdecimalnegative"\2D"("-" ハイフンマイナス)、 pad0 ""speak-asautoです。 カウンタースタイルのアルゴリズムは、指定されたsystem(省略時はsymbolic)と、与えられた<string><image>symbolsプロパティの値として使い、前章に従って構築されます。 systemがfixedの場合、first symbol value1です。

systemがalphabeticまたはnumericの場合は、<string>または<image>が2つ以上必要です。そうでない場合は関数が無効となります。

このコード:
ol { list-style: symbols("*" "\2020" "\2021" "\A7"); }

は次のようなリストを生成します:

*   One
†   Two
‡   Three
§   Four
**  Five
††  Six
‡‡  Seven

一方、counterのsystemを指定すると、次のようになります:

ol { list-style: symbols(cyclic "*" "\2020" "\2021" "\A7"); }

この場合、リストは以下のようになります:

*   One
†   Two
‡   Three
§   Four
*   Five
†   Six
‡   Seven

注: symbols()関数は文字列と画像のみ使用可能ですが、symbols記述子は識別子も使えます。

5. list-style-typecounter()counters()の拡張

CSS Level 2 [CSS21]では、list-style-typeプロパティやcounter()counters() 記法はさまざまな定義済みキーワードを受け付け、各キーワードがカウンタースタイルを識別します。 このモジュールでは、これらの機能が下記定義の<counter-style>型を受け取れるように拡張されています:

<counter-style> = <counter-style-name> | <symbols()>

<counter-style-name> が未定義のカウンタースタイル名の場合は、decimalカウンタースタイルと同じ動作をしなければなりません (ただし算出値としてdecimalになるわけではありません)。

これらの文脈で使われる場合、<counter-style-name>ツリー単位参照です。

6. 単純な定義済みカウンタースタイル

以下のスタイルシートは、@counter-style規則を使用して、CSS 2およびCSS 2.1で定義されているすべてのカウンタースタイルを再定義しています。 このスタイルシートは規範的です—UAはUAスタイルシートにこれを含めるか(少なくともこのレベルでこれらの規則が定義されているものとして動作する必要があります)。

6.1. 数値型:decimaldecimal-leading-zeroarabic-indicarmenianupper-armenianlower-armenianbengalicambodiankhmercjk-decimaldevanagarigeorgiangujaratigurmukhihebrewkannadalaomalayalammongolianmyanmaroriyapersianlower-romanupper-romantamilteluguthaitibetan

decimal
西洋の十進数 (例:1, 2, 3, ..., 98, 99, 100)。
decimal-leading-zero
先頭にゼロを付加した十進数 (例:01, 02, 03, ..., 98, 99, 100)。
arabic-indic
アラビア-インディック記数法 (例:١‎, ٢‎, ٣‎, ٤‎, ..., ٩٨‎, ٩٩‎, ١٠٠‎)。
armenian
upper-armenian
伝統的なアルメニア大文字記数法 (例:Ա, Բ, Գ, ..., ՂԸ, ՂԹ, Ճ)。
lower-armenian
アルメニア小文字記数法 (例:ա, բ, գ, ..., ղը, ղթ, ճ)。
bengali
ベンガル記数法 (例:১, ২, ৩, ..., ৯৮, ৯৯, ১০০)。
cambodian
khmer
カンボジア/クメール記数法 (例:១, ២, ៣, ..., ៩៨, ៩៩, ១០០)。
cjk-decimal
漢字十進記数法 (例:一, 二, 三, ..., 九八, 九九, 一〇〇)。
devanagari
デーヴァナーガリー記数法 (例:१, २, ३, ..., ९८, ९९, १००)。
georgian
伝統的なグルジア記数法 (例:ა, ბ, გ, ..., ჟჱ, ჟთ, რ)。
gujarati
グジャラート記数法 (例:૧, ૨, ૩, ..., ૯૮, ૯૯, ૧૦૦)。
gurmukhi
グルムキー記数法 (例:੧, ੨, ੩, ..., ੯੮, ੯੯, ੧੦੦)。
hebrew
伝統的なヘブライ記数法 (例:א‎, ב‎, ג‎, ..., צח‎, צט‎, ק‎)。
kannada
カンナダ記数法 (例:೧, ೨, ೩, ..., ೯೮, ೯೯, ೧೦೦)。
lao
ラオス記数法 (例:໑, ໒, ໓, ..., ໙໘, ໙໙, ໑໐໐)。
malayalam
マラヤーラム記数法 (例:൧, ൨, ൩, ..., ൯൮, ൯൯, ൧൦൦)。
mongolian
モンゴル記数法 (例:᠑, ᠒, ᠓, ..., ᠙᠘, ᠙᠙, ᠑᠐᠐)。
myanmar
ミャンマー(ビルマ)記数法 (例:၁, ၂, ၃, ..., ၉၈, ၉၉, ၁၀၀)。
oriya
オリヤー記数法 (例:୧, ୨, ୩, ..., ୯୮, ୯୯, ୧୦୦)。
persian
ペルシア記数法 (例:۱, ۲, ۳, ۴, ..., ۹۸, ۹۹, ۱۰۰)。
lower-roman
小文字ASCIIローマ数字 (例:i, ii, iii, ..., xcviii, xcix, c)。
upper-roman
大文字ASCIIローマ数字 (例:I, II, III, ..., XCVIII, XCIX, C)。
tamil
タミル記数法 (例:௧, ௨, ௩, ..., ௯௮, ௯௯, ௧௦௦)。
telugu
テルグ記数法 (例:౧, ౨, ౩, ..., ౯౮, ౯౯, ౧౦౦)。
thai
タイ(シャム)記数法 (例:๑, ๒, ๓, ..., ๙๘, ๙๙, ๑๐๐)。
tibetan
チベット記数法 (例:༡, ༢, ༣, ..., ༩༨, ༩༩, ༡༠༠)。

以下のスタイルシート断片は、これらの定義済みカウンタースタイルの規範的定義を示します:

@counter-style decimal {
  system: numeric;
  symbols: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9';
}

@counter-style decimal-leading-zero {
  system: extends decimal;
  pad: 2 '0';
}

@counter-style arabic-indic {
  system: numeric;
  symbols: "\660" "\661" "\662" "\663" "\664" "\665" "\666" "\667" "\668" "\669";
  /* ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ */
}

@counter-style armenian {
  system: additive;
  range: 1 9999;
  additive-symbols: 9000 \554, 8000 \553, 7000 \552, 6000 \551, 5000 \550, 4000 \54F, 3000 \54E, 2000 \54D, 1000 \54C, 900 \54B, 800 \54A, 700 \549, 600 \548, 500 \547, 400 \546, 300 \545, 200 \544, 100 \543, 90 \542, 80 \541, 70 \540, 60 \53F, 50 \53E, 40 \53D, 30 \53C, 20 \53B, 10 \53A, 9 \539, 8 \538, 7 \537, 6 \536, 5 \535, 4 \534, 3 \533, 2 \532, 1 \531;
  /* 9000 Ք, 8000 Փ, 7000 Ւ, 6000 Ց, 5000 Ր, 4000 Տ, 3000 Վ, 2000 Ս, 1000 Ռ, 900 Ջ, 800 Պ, 700 Չ, 600 Ո, 500 Շ, 400 Ն, 300 Յ, 200 Մ, 100 Ճ, 90 Ղ, 80 Ձ, 70 Հ, 60 Կ, 50 Ծ, 40 Խ, 30 Լ, 20 Ի, 10 Ժ, 9 Թ, 8 Ը, 7 Է, 6 Զ, 5 Ե, 4 Դ, 3 Գ, 2 Բ, 1 Ա */
}

@counter-style upper-armenian {
  system: extends armenian;
}

@counter-style lower-armenian {
  system: additive;
  range: 1 9999;
  additive-symbols: 9000 "\584", 8000 "\583", 7000 "\582", 6000 "\581", 5000 "\580", 4000 "\57F", 3000 "\57E", 2000 "\57D", 1000 "\57C", 900 "\57B", 800 "\57A", 700 "\579", 600 "\578", 500 "\577", 400 "\576", 300 "\575", 200 "\574", 100 "\573", 90 "\572", 80 "\571", 70 "\570", 60 "\56F", 50 "\56E", 40 "\56D", 30 "\56C", 20 "\56B", 10 "\56A", 9 "\569", 8 "\568", 7 "\567", 6 "\566", 5 "\565", 4 "\564", 3 "\563", 2 "\562", 1 "\561";
  /* 9000 ք, 8000 փ, 7000 ւ, 6000 ց, 5000 ր, 4000 տ, 3000 վ, 2000 ս, 1000 ռ, 900 ջ, 800 պ, 700 չ, 600 ո, 500 շ, 400 ն, 300 յ, 200 մ, 100 ճ, 90 ղ, 80 ձ, 70 հ, 60 կ, 50 ծ, 40 խ, 30 լ, 20 ի, 10 ժ, 9 թ, 8 ը, 7 է, 6 զ, 5 ե, 4 դ, 3 գ, 2 բ, 1 ա */
}

@counter-style bengali {
  system: numeric;
  symbols: "\9E6" "\9E7" "\9E8" "\9E9" "\9EA" "\9EB" "\9EC" "\9ED" "\9EE" "\9EF";
  /* ০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯ */
}

@counter-style cambodian {
  system: numeric;
  symbols: "\17E0" "\17E1" "\17E2" "\17E3" "\17E4" "\17E5" "\17E6" "\17E7" "\17E8" "\17E9";
  /* ០ ១ ២ ៣ ៤ ៥ ៦ ៧ ៨ ៩ */
}

@counter-style khmer {
  system: extends cambodian;
}

@counter-style cjk-decimal {
  system: numeric;
  range: 0 infinite;
  symbols: \3007  \4E00  \4E8C  \4E09  \56DB  \4E94  \516D  \4E03  \516B  \4E5D;
  /* 〇 一 二 三 四 五 六 七 八 九 */
  suffix: "\3001";
  /* "、" */
}

@counter-style devanagari {
  system: numeric;
  symbols: "\966" "\967" "\968" "\969" "\96A" "\96B" "\96C" "\96D" "\96E" "\96F";
  /* ० १ २ ३ ४ ५ ६ ७ ८ ९ */
}

@counter-style georgian {
  system: additive;
  range: 1 19999;
  additive-symbols: 10000 \10F5, 9000 \10F0, 8000 \10EF, 7000 \10F4, 6000 \10EE, 5000 \10ED, 4000 \10EC, 3000 \10EB, 2000 \10EA, 1000 \10E9, 900 \10E8, 800 \10E7, 700 \10E6, 600 \10E5, 500 \10E4, 400 \10F3, 300 \10E2, 200 \10E1, 100 \10E0, 90 \10DF, 80 \10DE, 70 \10DD, 60 \10F2, 50 \10DC, 40 \10DB, 30 \10DA, 20 \10D9, 10 \10D8, 9 \10D7, 8 \10F1, 7 \10D6, 6 \10D5, 5 \10D4, 4 \10D3, 3 \10D2, 2 \10D1, 1 \10D0;
  /* 10000 ჵ, 9000 ჰ, 8000 ჯ, 7000 ჴ, 6000 ხ, 5000 ჭ, 4000 წ, 3000 ძ, 2000 ც, 1000 ჩ, 900 შ, 800 ყ, 700 ღ, 600 ქ, 500 ფ, 400 ჳ, 300 ტ, 200 ს, 100 რ, 90 ჟ, 80 პ, 70 ო, 60 ჲ, 50 ნ, 40 მ, 30 ლ, 20 კ, 10 ი, 9 თ, 8 ჱ, 7 ზ, 6 ვ, 5 ე, 4 დ, 3 გ, 2 ბ, 1 ა */
}

@counter-style gujarati {
  system: numeric;
  symbols: "\AE6" "\AE7" "\AE8" "\AE9" "\AEA" "\AEB" "\AEC" "\AED" "\AEE" "\AEF";
  /* ૦ ૧ ૨ ૩ ૪ ૫ ૬ ૭ ૮ ૯ */
}

@counter-style gurmukhi {
  system: numeric;
  symbols: "\A66" "\A67" "\A68" "\A69" "\A6A" "\A6B" "\A6C" "\A6D" "\A6E" "\A6F";
  /* ੦ ੧ ੨ ੩ ੪ ੫ ੬ ੭ ੮ ੯ */
}

@counter-style hebrew {
  system: additive;
  range: 1 10999;
  additive-symbols: 10000 \5D9\5F3, 9000 \5D8\5F3, 8000 \5D7\5F3, 7000 \5D6\5F3, 6000 \5D5\5F3, 5000 \5D4\5F3, 4000 \5D3\5F3, 3000 \5D2\5F3, 2000 \5D1\5F3, 1000 \5D0\5F3, 400 \5EA, 300 \5E9, 200 \5E8, 100 \5E7, 90 \5E6, 80 \5E4, 70 \5E2, 60 \5E1, 50 \5E0, 40 \5DE, 30 \5DC, 20 \5DB, 19 \5D9\5D8, 18 \5D9\5D7, 17 \5D9\5D6, 16 \5D8\5D6, 15 \5D8\5D5, 10 \5D9, 9 \5D8, 8 \5D7, 7 \5D6, 6 \5D5, 5 \5D4, 4 \5D3, 3 \5D2, 2 \5D1, 1 \5D0;
  /* 10000 י׳, 9000 ט׳, 8000 ח׳, 7000 ז׳, 6000 ו׳, 5000 ה׳, 4000 ד׳, 3000 ג׳, 2000 ב׳, 1000 א׳, 400 ת, 300 ש, 200 ר, 100 ק, 90 צ, 80 פ, 70 ע, 60 ס, 50 נ, 40 מ, 30 ל, 20 כ, 19 יט, 18 יח, 17 יז, 16 טז, 15 טו, 10 י, 9 ט, 8 ח, 7 ז, 6 ו, 5 ה, 4 ד, 3 ג, 2 ב, 1 א */
  /* このシステムでは、15と16がテトラグラマトンに類似するのを避けるため、19~15の値を手動で指定しています。 */
  /* 実装は、より広い範囲に対して手動実装しても構いません。詳細は下記参照。 */
}

@counter-style kannada {
  system: numeric;
  symbols: "\CE6" "\CE7" "\CE8" "\CE9" "\CEA" "\CEB" "\CEC" "\CED" "\CEE" "\CEF";
  /* ೦ ೧ ೨ ೩ ೪ ೫ ೬ ೭ ೮ ೯ */
}

@counter-style lao {
  system: numeric;
  symbols: "\ED0" "\ED1" "\ED2" "\ED3" "\ED4" "\ED5" "\ED6" "\ED7" "\ED8" "\ED9";
  /* ໐ ໑ ໒ ໓ ໔ ໕ ໖ ໗ ໘ ໙ */
}

@counter-style malayalam {
  system: numeric;
  symbols: "\D66" "\D67" "\D68" "\D69" "\D6A" "\D6B" "\D6C" "\D6D" "\D6E" "\D6F";
  /* ൦ ൧ ൨ ൩ ൪ ൫ ൬ ൭ ൮ ൯ */
}

@counter-style mongolian {
  system: numeric;
  symbols: "\1810" "\1811" "\1812" "\1813" "\1814" "\1815" "\1816" "\1817" "\1818" "\1819";
  /* ᠐ ᠑ ᠒ ᠓ ᠔ ᠕ ᠖ ᠗ ᠘ ᠙ */
}

@counter-style myanmar {
  system: numeric;
  symbols: "\1040" "\1041" "\1042" "\1043" "\1044" "\1045" "\1046" "\1047" "\1048" "\1049";
  /* ၀ ၁ ၂ ၃ ၄ ၅ ၆ ၇ ၈ ၉ */
}

@counter-style oriya {
  system: numeric;
  symbols: "\B66" "\B67" "\B68" "\B69" "\B6A" "\B6B" "\B6C" "\B6D" "\B6E" "\B6F";
  /* ୦ ୧ ୨ ୩ ୪ ୫ ୬ ୭ ୮ ୯ */
}

@counter-style persian {
  system: numeric;
  symbols: "\6F0" "\6F1" "\6F2" "\6F3" "\6F4" "\6F5" "\6F6" "\6F7" "\6F8" "\6F9";
  /* ۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ */
}

@counter-style lower-roman {
  system: additive;
  range: 1 3999;
  additive-symbols: 1000 m, 900 cm, 500 d, 400 cd, 100 c, 90 xc, 50 l, 40 xl, 10 x, 9 ix, 5 v, 4 iv, 1 i;
}

@counter-style upper-roman {
  system: additive;
  range: 1 3999;
  additive-symbols: 1000 M, 900 CM, 500 D, 400 CD, 100 C, 90 XC, 50 L, 40 XL, 10 X, 9 IX, 5 V, 4 IV, 1 I;
}

@counter-style tamil {
  system: numeric;
  symbols: "\BE6" "\BE7" "\BE8" "\BE9" "\BEA" "\BEB" "\BEC" "\BED" "\BEE" "\BEF";
  /* ௦ ௧ ௨ ௩ ௪ ௫ ௬ ௭ ௮ ௯ */
}

@counter-style telugu {
  system: numeric;
  symbols: "\C66" "\C67" "\C68" "\C69" "\C6A" "\C6B" "\C6C" "\C6D" "\C6E" "\C6F";
  /* ౦ ౧ ౨ ౩ ౪ ౫ ౬ ౭ ౮ ౯ */
}

@counter-style thai {
  system: numeric;
  symbols: "\E50" "\E51" "\E52" "\E53" "\E54" "\E55" "\E56" "\E57" "\E58" "\E59";
  /* ๐ ๑ ๒ ๓ ๔ ๕ ๖ ๗ ๘ ๙ */
}

@counter-style tibetan {
  system: numeric;
  symbols: "\F20" "\F21" "\F22" "\F23" "\F24" "\F25" "\F26" "\F27" "\F28" "\F29";
  /* ༠ ༡ ༢ ༣ ༤ ༥ ༦ ༧ ༨ ༩ */
}

実装は、hebrewを上記@counter-style規則で指定された範囲まで最低限実装しなければなりませんが、より広い範囲まで実装しても構いません。 その場合は、対応するrange記述子が実装した範囲を反映している必要があります。

6.2. アルファベット型:lower-alphalower-latinupper-alphaupper-latinlower-greekhiraganahiragana-irohakatakanakatakana-iroha

lower-alpha
lower-latin
小文字ASCII英字 (例:a, b, c, ..., z, aa, ab)。
upper-alpha
upper-latin
大文字ASCII英字 (例:A, B, C, ..., Z, AA, AB)。
lower-greek
ギリシャ語小文字 (例:α, β, γ, ..., ω, αα, αβ)。
hiragana
五十音順ひらがな (例:あ, い, う, ..., ん, ああ, あい)。
hiragana-iroha
いろは順ひらがな (例:い, ろ, は, ..., す, いい, いろ)。
katakana
五十音順カタカナ (例:ア, イ, ウ, ..., ン, アア, アイ)。
katakana-iroha
いろは順カタカナ (例:イ, ロ, ハ, ..., ス, イイ, イロ)

以下のスタイルシート断片は、これらの定義済みカウンタースタイルの規範定義です:

@counter-style lower-alpha {
  system: alphabetic;
  symbols: a b c d e f g h i j k l m n o p q r s t u v w x y z;
}

@counter-style lower-latin {
  system: extends lower-alpha;
}

@counter-style upper-alpha {
  system: alphabetic;
  symbols: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z;
}

@counter-style upper-latin {
  system: extends upper-alpha;
}

@counter-style lower-greek {
  system: alphabetic;
  symbols: "\3B1" "\3B2" "\3B3" "\3B4" "\3B5" "\3B6" "\3B7" "\3B8" "\3B9" "\3BA" "\3BB" "\3BC" "\3BD" "\3BE" "\3BF" "\3C0" "\3C1" "\3C3" "\3C4" "\3C5" "\3C6" "\3C7" "\3C8" "\3C9";
  /* α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ σ τ υ φ χ ψ ω */
}

@counter-style hiragana {
  system: alphabetic;
  symbols: "\3042" "\3044" "\3046" "\3048" "\304A" "\304B" "\304D" "\304F" "\3051" "\3053" "\3055" "\3057" "\3059" "\305B" "\305D" "\305F" "\3061" "\3064" "\3066" "\3068" "\306A" "\306B" "\306C" "\306D" "\306E" "\306F" "\3072" "\3075" "\3078" "\307B" "\307E" "\307F" "\3080" "\3081" "\3082" "\3084" "\3086" "\3088" "\3089" "\308A" "\308B" "\308C" "\308D" "\308F" "\3090" "\3091" "\3092" "\3093";
  /* あ い う え お か き く け こ さ し す せ そ た ち つ て と な に ぬ ね の は ひ ふ へ ほ ま み む め も や ゆ よ ら り る れ ろ わ ゐ ゑ を ん */
  suffix: "、";
}

@counter-style hiragana-iroha {
  system: alphabetic;
  symbols: "\3044" "\308D" "\306F" "\306B" "\307B" "\3078" "\3068" "\3061" "\308A" "\306C" "\308B" "\3092" "\308F" "\304B" "\3088" "\305F" "\308C" "\305D" "\3064" "\306D" "\306A" "\3089" "\3080" "\3046" "\3090" "\306E" "\304A" "\304F" "\3084" "\307E" "\3051" "\3075" "\3053" "\3048" "\3066" "\3042" "\3055" "\304D" "\3086" "\3081" "\307F" "\3057" "\3091" "\3072" "\3082" "\305B" "\3059";
  /* い ろ は に ほ へ と ち り ぬ る を わ か よ た れ そ つ ね な ら む う ゐ の お く や ま け ふ こ え て あ さ き ゆ め み し ゑ ひ も せ す */
  suffix: "、";
}

@counter-style katakana {
  system: alphabetic;
  symbols: "\30A2" "\30A4" "\30A6" "\30A8" "\30AA" "\30AB" "\30AD" "\30AF" "\30B1" "\30B3" "\30B5" "\30B7" "\30B9" "\30BB" "\30BD" "\30BF" "\30C1" "\30C4" "\30C6" "\30C8" "\30CA" "\30CB" "\30CC" "\30CD" "\30CE" "\30CF" "\30D2" "\30D5" "\30D8" "\30DB" "\30DE" "\30DF" "\30E0" "\30E1" "\30E2" "\30E4" "\30E6" "\30E8" "\30E9" "\30EA" "\30EB" "\30EC" "\30ED" "\30EF" "\30F0" "\30F1" "\30F2" "\30F3";
  /* ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヰ ヱ ヲ ン */
  suffix: "、";
}

@counter-style katakana-iroha {
  system: alphabetic;
  symbols: "\30A4" "\30ED" "\30CF" "\30CB" "\30DB" "\30D8" "\30C8" "\30C1" "\30EA" "\30CC" "\30EB" "\30F2" "\30EF" "\30AB" "\30E8" "\30BF" "\30EC" "\30BD" "\30C4" "\30CD" "\30CA" "\30E9" "\30E0" "\30A6" "\30F0" "\30CE" "\30AA" "\30AF" "\30E4" "\30DE" "\30B1" "\30D5" "\30B3" "\30A8" "\30C6" "\30A2" "\30B5" "\30AD" "\30E6" "\30E1" "\30DF" "\30B7" "\30F1" "\30D2" "\30E2" "\30BB" "\30B9";
  /* イ ロ ハ ニ ホ ヘ ト チ リ ヌ ル ヲ ワ カ ヨ タ レ ソ ツ ネ ナ ラ ム ウ ヰ ノ オ ク ヤ マ ケ フ コ エ テ ア サ キ ユ メ ミ シ ヱ ヒ モ セ ス */
  suffix: "、";
}

6.3. 記号型:disccirclesquaredisclosure-opendisclosure-closed

disc
塗りつぶし円(• U+2022 BULLETに類似)。
circle
空心円(◦ U+25E6 WHITE BULLETに類似)。
square
塗りつぶし四角(▪ U+25AA BLACK SMALL SQUAREに類似)。
disclosure-open
disclosure-closed
開閉型ウィジェット(HTMLdetails要素など)に適した記号。

以下のスタイルシート断片は、これらの定義済みカウンタースタイルの規範定義です:

@counter-style disc {
  system: cyclic;
  symbols: \2022;
  /* • */
  suffix: " ";
}

@counter-style circle {
  system: cyclic;
  symbols: \25E6;
  /* ◦ */
  suffix: " ";
}

@counter-style square {
  system: cyclic;
  symbols: \25AA;
  /* ▪ */
  suffix: " ";
}

@counter-style disclosure-open {
  system: cyclic;
  suffix: " ";
  /* symbolsは規範テキストを参照 */
}

@counter-style disclosure-closed {
  system: cyclic;
  suffix: " ";
  /* symbolsは規範テキストを参照 */
}

list-style-typeで使う場合、UAは指定された文字の代わりにUA生成画像やUA選択フォントでこれらを描画してもよいです。 画像を使う場合は、指定文字に似ていて、1em×1em四方に適切に収まる必要があります。

disclosure-openおよびdisclosure-closedカウンタースタイルでは、 マーカーはHTMLのdetails要素などの開閉状態を示す画像や文字でなければなりません。 画像が方向性を持つ場合は、要素の書字モードに応じて切り替わる必要があります(Images 4のbidi-sensitive images機能に類似)。 例えばdisclosure-closedスタイルはU+25B8 BLACK RIGHT-POINTING SMALL TRIANGLE(▸)やU+25C2 BLACK LEFT-POINTING SMALL TRIANGLE(◂)を使い、disclosure-openスタイルはU+25BE BLACK DOWN-POINTING SMALL TRIANGLE(▾)を使う場合があります。

6.4. 固定型:cjk-earthly-branchcjk-heavenly-stem

cjk-earthly-branch
漢字「十二支」序数詞 (例:子、丑、寅、..., 亥)。
cjk-heavenly-stem
漢字「十干」序数詞 (例:甲、乙、丙、..., 癸)

以下のスタイルシート断片は、これらの定義済みカウンタースタイルの規範定義です:

@counter-style cjk-earthly-branch {
  system: fixed;
  symbols: "\5B50" "\4E11" "\5BC5" "\536F" "\8FB0" "\5DF3" "\5348" "\672A" "\7533" "\9149" "\620C" "\4EA5";
  /* 子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥 */
  suffix: "、";
}

@counter-style cjk-heavenly-stem {
  system: fixed;
  symbols: "\7532" "\4E59" "\4E19" "\4E01" "\620A" "\5DF1" "\5E9A" "\8F9B" "\58EC" "\7678";
  /* 甲 乙 丙 丁 戊 己 庚 辛 壬 癸 */
  suffix: "、";
}

7. 複雑な定義済みカウンタースタイル

著者は@counter-style規則で独自のカウンタースタイルを定義するか、定義済みカウンタースタイル群に依拠することができますが、一部のカウンタースタイルは規定アルゴリズムでは捉えきれないほど複雑です。 これらのカウンタースタイルは本節で説明します。

この節で規定されるカウンタースタイルの一部は、カウンター値生成のための独自アルゴリズムを持ちますが、それ以外は@counter-style規則で定義されるカウンタースタイルと同じです。 例えば、著者はextendsシステムextendsでこれらのスタイルを参照し、アルゴリズムは流用しつつ他の記述子を変更することができます。

この節で定義される全てのカウンタースタイルは、音声表現numbersであり、負符号を使います

7.1. 長形式東アジアカウンタースタイル

中国語、日本語、韓国語には、「一万三千百二十三」のような英語の「thirteen thousand one hundred and twenty-three」に似た「長形式」カウンタースタイルがあります。 それぞれに正式・略式の両方のバリエーションがあります。 正式スタイルは金融・法律文書でよく使われ、文字改変が困難なため改ざん防止効果があります。

次の表はこれらのスタイルの例を示し、特に異なる部分も示しています。
カウンタースタイル 0 1 2 3 10 11 99 100 101 6001
japanese-informal 十一 九十九 百一 六千一
japanese-formal 壱拾 壱拾壱 九拾九 壱百 壱百壱 六阡壱
korean-hangul-formal 일십 일십일 구십구 일백 일백일 육천일
korean-hanja-informal 十一 九十九 百一 六千一
korean-hanja-formal 壹拾 壹拾壹 九拾九 壹百 壹百壹 六仟壹
simp-chinese-informal 十一 九十九 一百 一百零一 六千零一
simp-chinese-formal 壹拾 壹拾壹 玖拾玖 壹佰 壹佰零壹 陆仟零壹
trad-chinese-informal 十一 九十九 一百 一百零一 六千零一
trad-chinese-formal 壹拾 壹拾壹 玖拾玖 壹佰 壹佰零壹 陸仟零壹

10,000以上の数の長形式CJKスタイル表現方法については意見が分かれるため、 この節で定義されるすべてのカウンタースタイルは-9999~9999の範囲で定義されていますが、実装はより広い範囲をサポートしても構いません。 実装がサポートする範囲外では、フォールバックとしてcjk-decimalを使用します。

注: 実装は1万以上の表現について調査・実装し、一般的な解答が得られた際はCSSワーキンググループに報告することが推奨されています。 このテーマに関する過去の調査は、過去の草案に含まれています。

7.1.1. 日本語:japanese-informal および japanese-formal

japanese-informal
日本語漢数字(略式) (例:千百十一)
japanese-formal
日本語漢数字(正式) (例:壱阡壱百壱拾壱)
@counter-style japanese-informal {
  system: additive;
  range: -9999 9999;
  additive-symbols: 9000 \4E5D\5343, 8000 \516B\5343, 7000 \4E03\5343, 6000 \516D\5343, 5000 \4E94\5343, 4000 \56DB\5343, 3000 \4E09\5343, 2000 \4E8C\5343, 1000 \5343, 900 \4E5D\767E, 800 \516B\767E, 700 \4E03\767E, 600 \516D\767E, 500 \4E94\767E, 400 \56DB\767E, 300 \4E09\767E, 200 \4E8C\767E, 100 \767E, 90 \4E5D\5341, 80 \516B\5341, 70 \4E03\5341, 60 \516D\5341, 50 \4E94\5341, 40 \56DB\5341, 30 \4E09\5341, 20 \4E8C\5341, 10 \5341, 9 \4E5D, 8 \516B, 7 \4E03, 6 \516D, 5 \4E94, 4 \56DB, 3 \4E09, 2 \4E8C, 1 \4E00, 0 \3007;
  /* 9000 九千, 8000 八千, 7000 七千, 6000 六千, 5000 五千, 4000 四千, 3000 三千, 2000 二千, 1000 千, 900 九百, 800 八百, 700 七百, 600 六百, 500 五百, 400 四百, 300 三百, 200 二百, 100 百, 90 九十, 80 八十, 70 七十, 60 六十, 50 五十, 40 四十, 30 三十, 20 二十, 10 十, 9 九, 8 八, 7 七, 6 六, 5 五, 4 四, 3 三, 2 二, 1 一, 0 〇 */
  suffix: '\3001';
  /* 、 */
  negative: "\30DE\30A4\30CA\30B9";
  /* マイナス */
  fallback: cjk-decimal;
}

@counter-style japanese-formal {
  system: additive;
  range: -9999 9999;
  additive-symbols: 9000 \4E5D\9621, 8000 \516B\9621, 7000 \4E03\9621, 6000 \516D\9621, 5000 \4F0D\9621, 4000 \56DB\9621, 3000 \53C2\9621, 2000 \5F10\9621, 1000 \58F1\9621, 900 \4E5D\767E, 800 \516B\767E, 700 \4E03\767E, 600 \516D\767E, 500 \4F0D\767E, 400 \56DB\767E, 300 \53C2\767E, 200 \5F10\767E, 100 \58F1\767E, 90 \4E5D\62FE, 80 \516B\62FE, 70 \4E03\62FE, 60 \516D\62FE, 50 \4F0D\62FE, 40 \56DB\62FE, 30 \53C2\62FE, 20 \5F10\62FE, 10 \58F1\62FE, 9 \4E5D, 8 \516B, 7 \4E03, 6 \516D, 5 \4F0D, 4 \56DB, 3 \53C2, 2 \5F10, 1 \58F1, 0 \96F6;
  /* 9000 九阡, 8000 八阡, 7000 七阡, 6000 六阡, 5000 伍阡, 4000 四阡, 3000 参阡, 2000 弐阡, 1000 壱阡, 900 九百, 800 八百, 700 七百, 600 六百, 500 伍百, 400 四百, 300 参百, 200 弐百, 100 壱百, 90 九拾, 80 八拾, 70 七拾, 60 六拾, 50 伍拾, 40 四拾, 30 参拾, 20 弐拾, 10 壱拾, 9 九, 8 八, 7 七, 6 六, 5 伍, 4 四, 3 参, 2 弐, 1 壱, 0 零 */
  suffix: '\3001';
  /* 、 */
  negative: "\30DE\30A4\30CA\30B9";
  /* マイナス */
  fallback: cjk-decimal;
}

7.1.2. 韓国語:korean-hangul-formalkorean-hanja-informalkorean-hanja-formal

korean-hangul-formal
韓国語ハングル数字 (例:일천일백일십일)
korean-hanja-informal
韓国語ハンジャ(漢字)数字(略式) (例:千百十一)
korean-hanja-formal
韓国語ハン(漢字)数字(正式) (例:壹仟壹百壹拾壹)
@counter-style korean-hangul-formal {
  system: additive;
  range: -9999 9999;
  additive-symbols: 9000 \AD6C\CC9C, 8000 \D314\CC9C, 7000 \CE60\CC9C, 6000 \C721\CC9C, 5000 \C624\CC9C, 4000 \C0AC\CC9C, 3000 \C0BC\CC9C, 2000 \C774\CC9C, 1000 \C77C\CC9C, 900 \AD6C\BC31, 800 \D314\BC31, 700 \CE60\BC31, 600 \C721\BC31, 500 \C624\BC31, 400 \C0AC\BC31, 300 \C0BC\BC31, 200 \C774\BC31, 100 \C77C\BC31, 90 \AD6C\C2ED, 80 \D314\C2ED, 70 \CE60\C2ED, 60 \C721\C2ED, 50 \C624\C2ED, 40 \C0AC\C2ED, 30 \C0BC\C2ED, 20 \C774\C2ED, 10 \C77C\C2ED, 9 \AD6C, 8 \D314, 7 \CE60, 6 \C721, 5 \C624, 4 \C0AC, 3 \C0BC, 2 \C774, 1 \C77C, 0 \C601;
  /* 9000 구천, 8000 팔천, 7000 칠천, 6000 육천, 5000 오천, 4000 사천, 3000 삼천, 2000 이천, 1000 일천, 900 구백, 800 팔백, 700 칠백, 600 육백, 500 오백, 400 사백, 300 삼백, 200 이백, 100 일백, 90 구십, 80 팔십, 70 칠십, 60 육십, 50 오십, 40 사십, 30 삼십, 20 이십, 10 일십, 9 구, 8 팔, 7 칠, 6 육, 5 오, 4 사, 3 삼, 2 이, 1 일, 0 영 */
  suffix: ', ';
  negative: "\B9C8\C774\B108\C2A4  ";
  /* マイナス(後にスペース) */
}

@counter-style korean-hanja-informal {
  system: additive;
  range: -9999 9999;
  additive-symbols: 9000 \4E5D\5343, 8000 \516B\5343, 7000 \4E03\5343, 6000 \516D\5343, 5000 \4E94\5343, 4000 \56DB\5343, 3000 \4E09\5343, 2000 \4E8C\5343, 1000 \5343, 900 \4E5D\767E, 800 \516B\767E, 700 \4E03\767E, 600 \516D\767E, 500 \4E94\767E, 400 \56DB\767E, 300 \4E09\767E, 200 \4E8C\767E, 100 \767E, 90 \4E5D\5341, 80 \516B\5341, 70 \4E03\5341, 60 \516D\5341, 50 \4E94\5341, 40 \56DB\5341, 30 \4E09\5341, 20 \4E8C\5341, 10 \5341, 9 \4E5D, 8 \516B, 7 \4E03, 6 \516D, 5 \4E94, 4 \56DB, 3 \4E09, 2 \4E8C, 1 \4E00, 0 \96F6;
  /* 9000 九千, 8000 八千, 7000 七千, 6000 六千, 5000 五千, 4000 四千, 3000 三千, 2000 二千, 1000 千, 900 九百, 800 八百, 700 七百, 600 六百, 500 五百, 400 四百, 300 三百, 200 二百, 100 百, 90 九十, 80 八十, 70 七十, 60 六十, 50 五十, 40 四十, 30 三十, 20 二十, 10 十, 9 九, 8 八, 7 七, 6 六, 5 五, 4 四, 3 三, 2 二, 1 一, 0 零 */
  suffix: ', ';
  negative: "\B9C8\C774\B108\C2A4  ";
  /* マイナス(後にスペース) */
}

@counter-style korean-hanja-formal {
  system: additive;
  range: -9999 9999;
  additive-symbols: 9000 \4E5D\4EDF, 8000 \516B\4EDF, 7000 \4E03\4EDF, 6000 \516D\4EDF, 5000 \4E94\4EDF, 4000 \56DB\4EDF, 3000 \53C3\4EDF, 2000 \8CB3\4EDF, 1000 \58F9\4EDF, 900 \4E5D\767E, 800 \516B\767E, 700 \4E03\767E, 600 \516D\767E, 500 \4E94\767E, 400 \56DB\767E, 300 \53C3\767E, 200 \8CB3\767E, 100 \58F9\767E, 90 \4E5D\62FE, 80 \516B\62FE, 70 \4E03\62FE, 60 \516D\62FE, 50 \4E94\62FE, 40 \56DB\62FE, 30 \53C3\62FE, 20 \8CB3\62FE, 10 \58F9\62FE, 9 \4E5D, 8 \516B, 7 \4E03, 6 \516D, 5 \4E94, 4 \56DB, 3 \53C3, 2 \8CB3, 1 \58F9, 0 \96F6;
  /* 9000 九仟, 8000 八仟, 7000 七仟, 6000 六仟, 5000 五仟, 4000 四仟, 3000 參仟, 2000 貳仟, 1000 壹仟, 900 九百, 800 八百, 700 七百, 600 六百, 500 五百, 400 四百, 300 參百, 200 貳百, 100 壹百, 90 九拾, 80 八拾, 70 七拾, 60 六拾, 50 五拾, 40 四拾, 30 參拾, 20 貳拾, 10 壹拾, 9 九, 8 八, 7 七, 6 六, 5 五, 4 四, 3 參, 2 貳, 1 壹, 0 零 */
  suffix: ', ';
  negative: "\B9C8\C774\B108\C2A4  ";
  /* マイナス(後にスペース) */
}

7.1.3. 中国語:simp-chinese-informalsimp-chinese-formaltrad-chinese-informaltrad-chinese-formal

simp-chinese-informal
中国語簡体字(略式)数字 (例:一千一百一十一)
simp-chinese-formal
中国語簡体字(正式)数字 (例:壹仟壹佰壹拾壹)
trad-chinese-informal
中国語繁体字(略式)数字 (例:一千一百一十一)
trad-chinese-formal
中国語繁体字(正式)数字 (例:壹仟壹佰壹拾壹)
cjk-ideographic
このカウンタースタイルは trad-chinese-informal と同じです。 (レガシー互換のため存在します。)

中国語の長形式スタイルはほぼ同一のアルゴリズムで定義されており(ここで一括記載し、差分のみ強調)、使用する文字セットが異なります。詳細は後続の表を参照してください。

  1. カウンター値が0の場合は、そのスタイルで指定された0の文字を表現とします。以降の手順はスキップ。
  2. まずカウンター値を十進数として表現します。0以外の各桁には適切な桁マーカーを付けます(1の位はマーカーなし)。
  3. 略式スタイルの場合、値が10~19の範囲なら十の位の数字を除去(マーカーは残す)。
  4. 末尾のゼロを削除し、残ったゼロは連続して一つのゼロ桁にまとめる。
  5. 0~9の数字をスタイルごとの対応文字に置き換え、結果文字列を返します。

これらすべてのカウンタースタイルのsuffixは「、」(U+3001)、 fallbackcjk-decimalrange-9999 9999negative値は各スタイルの記号表に記載の通りです。

次の表で各スタイルの使用文字を定義します:

コードポイント
simp-chinese-informal simp-chinese-formal trad-chinese-informal trad-chinese-formal
数字 0 零 U+96F6 零 U+96F6 零 U+96F6 零 U+96F6
数字 1 一 U+4E00 壹 U+58F9 一 U+4E00 壹 U+58F9
数字 2 二 U+4E8C 贰 U+8D30 二 U+4E8C 貳 U+8CB3
数字 3 三 U+4E09 叁 U+53C1 三 U+4E09 參 U+53C3
数字 4 四 U+56DB 肆 U+8086 四 U+56DB 肆 U+8086
数字 5 五 U+4E94 伍 U+4F0D 五 U+4E94 伍 U+4F0D
数字 6 六 U+516D 陆 U+9646 六 U+516D 陸 U+9678
数字 7 七 U+4E03 柒 U+67D2 七 U+4E03 柒 U+67D2
数字 8 八 U+516B 捌 U+634C 八 U+516B 捌 U+634C
数字 9 九 U+4E5D 玖 U+7396 九 U+4E5D 玖 U+7396
十の位マーカー 十 U+5341 拾 U+62FE 十 U+5341 拾 U+62FE
百の位マーカー 百 U+767E 佰 U+4F70 百 U+767E 佰 U+4F70
千の位マーカー 千 U+5343 仟 U+4EDF 千 U+5343 仟 U+4EDF
負符号 负 U+8D1F 负 U+8D1F 負 U+8CA0 負 U+8CA0
参考:simp-chinese-informalスタイルの最初の120値例:
 1     一    41   四十一    81   八十一
 2     二    42   四十二    82   八十二
 3     三    43   四十三    83   八十三
 4     四    44   四十四    84   八十四
 5     五    45   四十五    85   八十五
 6     六    46   四十六    86   八十六
 7     七    47   四十七    87   八十七
 8     八    48   四十八    88   八十八
 9     九    49   四十九    89   八十九
10     十    50    五十    90    九十
11    十一    51   五十一    91   九十一
12    十二    52   五十二    92   九十二
13    十三    53   五十三    93   九十三
14    十四    54   五十四    94   九十四
15    十五    55   五十五    95   九十五
16    十六    56   五十六    96   九十六
17    十七    57   五十七    97   九十七
18    十八    58   五十八    98   九十八
19    十九    59   五十九    99   九十九
20    二十    60    六十   100    一百
21   二十一    61   六十一   101  一百零一
22   二十二    62   六十二   102  一百零二
23   二十三    63   六十三   103  一百零三
24   二十四    64   六十四   104  一百零四
25   二十五    65   六十五   105  一百零五
26   二十六    66   六十六   106  一百零六
27   二十七    67   六十七   107  一百零七
28   二十八    68   六十八   108  一百零八
29   二十九    69   六十九   109  一百零九
30    三十    70    七十   110  一百一十
31   三十一    71   七十一   111 一百一十一
32   三十二    72   七十二   112 一百一十二
33   三十三    73   七十三   113 一百一十三
34   三十四    74   七十四   114 一百一十四
35   三十五    75   七十五   115 一百一十五
36   三十六    76   七十六   116 一百一十六
37   三十七    77   七十七   117 一百一十七
38   三十八    78   七十八   118 一百一十八
39   三十九    79   七十九   119 一百一十九
40    四十    80    八十   120  一百二十

7.2. エチオピア数値カウンタースタイル:ethiopic-numeric

ethiopic-numericカウンタースタイルは、すべての正の非ゼロ数値に対して定義されています。 下記のアルゴリズムは、十進数をエチオピア数字に変換します:

  1. 数値が1の場合、 "፩"(U+1369)を返す。
  2. 数値を2桁ずつのグループに分割する(最下位桁から開始)。
  3. 各グループに、最下位から順にグループ番号0としてインデックスを付与する。
  4. グループの値が0の場合、またはグループが最上位で値が1の場合、またはグループのインデックスが奇数で値が1の場合は、 桁を削除する(ただしグループ自体は残し、後述の区切り文字は付与される)。
  5. 残った各桁について、下記リストに従って対応するエチオピア文字に置換する。
    十の位 一の位
    コードポイント コードポイント
    10 U+1372 1 U+1369
    20 U+1373 2 U+136A
    30 U+1374 3 U+136B
    40 U+1375 4 U+136C
    50 U+1376 5 U+136D
    60 U+1377 6 U+136E
    70 U+1378 7 U+136F
    80 U+1379 8 U+1370
    90 U+137A 9 U+1371
  6. 奇数インデックスの各グループについて(元の値が0でない場合のみ)、 ፻(U+137B)を付加する。
  7. 偶数インデックスの各グループについて(インデックス0以外)、 ፼(U+137C)を付加する。
  8. グループを連結して1つの文字列とし、返す。

このシステムでは、名前は"ethiopic-numeric"、 range1 infinitesuffix"/ "(U+002F スラッシュ+U+0020 スペース)、 その他の記述子は初期値です。

十進数100は、エチオピア数字では፻(U+137B)です。

十進数78010092は、エチオピア数字では ፸፰፻፩፼፺፪ (U+1378 U+1370 U+137B U+1369 U+137C U+137A U+136A)です。

十進数780100000092は、エチオピア数字では ፸፰፻፩፼፼፺፪ (U+1378 U+1370 U+137B U+1369 U+137C U+137C U+137A U+136A)です。

8. 追加の「既製」カウンタースタイル

国際化ワーキンググループは、様々な世界の言語用の「既製」@counter-style規則の大規模リストを Ready-made Counter Styles文書で管理しています。 [predefined-counter-styles]

これら追加のカウンタースタイルは、ユーザーエージェントがデフォルトでサポートすることを意図したものではなく、 ユーザーや著者が直接スタイルシートへコピーして使うことができます。

9. API

9.1. CSSRuleインターフェースへの拡張

CSSRuleインターフェースは以下のように拡張されます:

partial interface CSSRule {
    const unsigned short COUNTER_STYLE_RULE = 11;
};

9.2. CSSCounterStyleRuleインターフェース

CSSCounterStyleRuleインターフェースは、@counter-style規則を表します。

[Exposed=Window]
interface CSSCounterStyleRule : CSSRule {
  attribute CSSOMString name;
  attribute CSSOMString system;
  attribute CSSOMString symbols;
  attribute CSSOMString additiveSymbols;
  attribute CSSOMString negative;
  attribute CSSOMString prefix;
  attribute CSSOMString suffix;
  attribute CSSOMString range;
  attribute CSSOMString pad;
  attribute CSSOMString speakAs;
  attribute CSSOMString fallback;
};
name, CSSOMString
name属性の取得時、関連する規則で定義された<counter-style-name>のシリアライズ値を含むCSSOMStringオブジェクトを返す。

name属性の設定時は下記手順を実行:

  1. 値が定義済みASCII大文字・小文字を区別しない一致なら小文字化する。

  2. 値が"decimal"、"disc"、"none"以外の場合は、関連規則の名前を値と等しい識別子として置き換える。

  3. それ以外は何もしない。

system, CSSOMString
symbols, CSSOMString
additiveSymbols, CSSOMString
negative, CSSOMString
prefix, CSSOMString
suffix, CSSOMString
range, CSSOMString
pad, CSSOMString
speakAs, CSSOMString
fallback, CSSOMString
その他の属性の取得時は、関連する規則で定義された記述子のシリアライズ値を含むCSSOMStringオブジェクトを返す。 記述子が規則で指定されていない場合は空文字列を返す。

設定時は次の手順を実行:

  1. 値からコンポーネント値のリストをパースする。

  2. 返された値が記述子の文法で無効、または@counter-style規則を無効化する場合は、何もせず手順終了。 (例えば、一部のsystemはsymbols記述子に2つの値が必要です。)

  3. 設定する属性がsystemであり、新しい値がアルゴリズム自体を変更するなら、何もせず手順終了。例えばfixed systemのfirst symbol valueのようなアルゴリズムの一部を変えるのは許可。

  4. 記述子に値をセットする。

10. HTML用サンプルスタイルシート

この節は参考情報であり、規範的ではありません。 HTML自身がその要素に適用されるスタイルを定義しており、一部はユーザーエージェントの裁量に委ねられています。

details > summary {
  display: list-item;
  list-style: disclosure-closed inside;
}

details[open] > summary {
  list-style: disclosure-open inside;
}

変更点

2017年12月候補勧告以降の変更点

2017年12月14日候補勧告以降の主な変更点:

コメント一覧があります。

2015年6月候補勧告以降の変更点

2015年6月11日候補勧告以降の主な変更点:

コメント一覧があります。

2015年2月候補勧告以降の変更点

謝辞

以下の人物や彼らが執筆した文書は、記数法定義に非常に役立ちました: Alexander Savenkov、 Arron Eicholz、 Aryeh Gregor、 Christopher Hoess、 Daniel Yacob、 Frank Tang、 Jonathan Rosenne、 Karl Ove Hufthammer、 Musheg Arakelyan、 Nariné Renard Karapetyan、 Randall Bart、 Richard Ishida、 Simon Montagu (Mozilla, smontagu@smontagu.org)

特にXidorn Quan氏には仕様全体に関する多岐にわたるレビュー、Simon Sapin氏とHåkon Wium Lie氏にはレビューコメントへの謝意を表します。

プライバシーおよびセキュリティに関する考慮事項

本仕様は新たなプライバシーやセキュリティ上の考慮事項を導入しません。

適合性

文書の慣例

適合性要件は、記述的な主張とRFC 2119の用語の組み合わせによって表現されます。規範的な部分で使用されるキーワード「MUST」、「MUST NOT」、「REQUIRED」、「SHALL」、「SHALL NOT」、「SHOULD」、「SHOULD NOT」、「RECOMMENDED」、「MAY」、「OPTIONAL」はRFC 2119で説明されている通りに解釈してください。ただし、読みやすさのために、これらの単語は本仕様書内ですべて大文字では表示されません。

本仕様書のすべてのテキストは、非規範的と明示されたセクション、例、および注釈を除き規範的です。[RFC2119]

本仕様書の例は「例えば」という言葉で導入されるか、class="example"のように規範的テキストから区別されます。以下のようになります:

これは情報例の一例です。

情報ノートは「Note」という言葉で始まり、class="note"のように規範的テキストから区別されます。以下のようになります:

Note、これは情報ノートです。

勧告は、特別な注意を促すためにスタイルされた規範的セクションであり、他の規範的テキストから<strong class="advisement">のように区別されます。例えば:UAsはアクセシブルな代替手段を提供しなければなりません。

適合性クラス

本仕様書への適合性は、3つの適合性クラスで定義されます:

スタイルシート
CSSスタイルシート
レンダラー
UAで、スタイルシートのセマンティクスを解釈し、それらを使用する文書をレンダリングします。
オーサリングツール
UAで、スタイルシートを作成します。

スタイルシートは、このモジュールで定義された構文を使用するすべての文が、汎用CSS文法および本モジュールで定義された各機能の個別文法に従って有効である場合、本仕様書に適合しています。

レンダラーは、適切な仕様書で定義された通りにスタイルシートを解釈することに加えて、本仕様書で定義されたすべての機能を正しく解析し、それに応じて文書をレンダリングすることで適合しています。ただし、デバイスの制限によりUAが文書を正しくレンダリングできない場合でも、UAは非適合ではありません。(例えば、UAがモノクロモニターで色をレンダリングする必要はありません。)

オーサリングツールは、汎用CSS文法および本モジュール内の各機能の個別文法に従って文法的に正しいスタイルシートを書き、本モジュールで説明されているスタイルシートのすべての他の適合要件も満たしている場合、本仕様書に適合しています。

部分的実装

著者が将来互換性のある解析規則を利用してフォールバック値を割り当てられるように、CSSレンダラーは、使用可能なレベルのサポートがないatルール、プロパティ、プロパティ値、キーワード、その他の構文要素を無効として(そして適切に無視)扱わなければなりません。特に、ユーザーエージェントは、サポートされていないコンポーネント値のみを選択的に無視して、サポートされている値のみを単一の複数値プロパティ宣言で認めてはなりません。値が無効と見なされる場合(サポートされていない値は無効である必要があります)、CSSでは宣言全体が無視される必要があります。

不安定および独自機能の実装

将来の安定したCSS機能との衝突を避けるために、CSSWGはベストプラクティスの遵守を推奨しています。これは、CSSの不安定な機能独自拡張の実装に関するものです。

非実験的実装

仕様がCandidate Recommendation段階に達すると、非実験的な実装が可能となり、実装者は、仕様に正しく実装されたことが証明できるCRレベルの機能について、接頭辞なしの実装をリリースするべきです。

CSSの実装間で相互運用性を確立・維持するために、CSS作業部会は非実験的CSSレンダラーに対し、実装レポート(必要に応じて、その実装レポートに使用したテストケースも)をW3Cに提出するよう求めています。W3Cに提出されたテストケースは、CSS作業部会がレビュー・修正する場合があります。

テストケースや実装レポートの提出に関する詳細は、CSS作業部会のウェブサイトhttps://www.w3.org/Style/CSS/Test/でご確認ください。ご質問は、public-css-testsuite@w3.orgメーリングリストまでお問い合わせください。

CR終了基準

本仕様書が提案勧告へ進むためには、各機能について少なくとも2つの独立した相互運用可能な実装が必要です。各機能は異なる製品セットで実装されても構いません。すべての機能が単一製品で実装される必要はありません。この基準のため、以下の用語を定義します:

独立
各実装は異なる団体によって開発され、他の適格な実装で使用されているコードを共有、再利用、派生してはなりません。本仕様書の実装に関係しないコード部分はこの要件から除外されます。
相互運用可能
公式CSSテストスイートの各該当テストケースに合格すること、または実装がWebブラウザでない場合は同等のテストに合格すること。該当するテストスイートのすべての関連テストには、同等のテストが作成されるべきです。そのようなユーザーエージェント(UA)で相互運用性を主張する場合、同じ方法でそれらの同等テストに合格できる追加のUAが1つ以上必要です。相互運用性のために、これらの同等テストはピアレビューのために公開されなければなりません。
実装
ユーザーエージェントであり、以下の条件を満たします:
  1. 仕様を実装していること。
  2. 一般公開されていること。実装は製品版またはその他の公開バージョン(ベータ版、プレビューリリース、ナイトリービルドなど)であってもよい。非製品版リリースは、安定性を示すために、少なくとも1か月間機能を実装している必要があります。
  3. 実験的ではないこと(つまり、テストスイートに合格することだけを目的として設計され、今後通常使用される予定のないバージョンではないこと)。

本仕様書は少なくとも6か月間、Candidate Recommendationとして維持されます。

索引

本仕様で定義される用語

参照によって定義された用語

参考文献

規範的参考文献

[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2021年6月8日. WD. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 3. 2020年12月17日. CR. URL: https://www.w3.org/TR/css-images-3/
[CSS-LISTS-3]
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/
[CSS-SCOPING-1]
Tab Atkins Jr.; Elika Etemad. CSS Scoping Module Level 1. 2014年4月3日. WD. URL: https://www.w3.org/TR/css-scoping-1/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2019年7月16日. CR. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS Text Module Level 3. 2021年4月22日. CR. URL: https://www.w3.org/TR/css-text-3/
[CSS-TEXT-DECOR-4]
Elika Etemad; Koji Ishii. CSS Text Decoration Module Level 4. 2020年5月6日. WD. URL: https://www.w3.org/TR/css-text-decor-4/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2019年6月6日. 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. 2021年7月15日. 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/
[CSS21]
Bert Bos; 他. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[CSSOM-1]
Simon Pieters; Glenn Adams. CSS Object Model (CSSOM). 2016年3月17日. WD. URL: https://www.w3.org/TR/cssom-1/
[HTML]
Anne van Kesteren; 他. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[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
[WebIDL]
Boris Zbarsky. Web IDL. 2016年12月15日. ED. URL: https://heycam.github.io/webidl/

参考情報文献

[CSS-CONTENT-3]
Elika Etemad; Dave Cramer. CSS Generated Content Module Level 3. 2019年8月2日. WD. URL: https://www.w3.org/TR/css-content-3/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS Pseudo-Elements Module Level 4. 2020年12月31日. WD. URL: https://www.w3.org/TR/css-pseudo-4/
[PREDEFINED-COUNTER-STYLES]
Richard Ishida. Ready-made Counter Styles. 2021年6月9日. NOTE. URL: https://www.w3.org/TR/predefined-counter-styles/

プロパティ索引

定義されたプロパティはありません。

@counter-style 記述子

名前 初期値
additive-symbols [ <integer [0,∞]> && <symbol> ]# n/a
fallback <counter-style-name> decimal
negative <symbol> <symbol>? "\2D" ("-" ハイフンマイナス)
pad <integer [0,∞]> && <symbol> 0 ""
prefix <symbol> "" (空文字列)
range [ [ <integer> | infinite ]{2} ]# | auto auto
speak-as auto | bullets | numbers | words | spell-out | <counter-style-name> auto
suffix <symbol> "\2E\20" ("." ピリオドとスペース)
symbols <symbol>+ n/a
system cyclic | numeric | alphabetic | symbolic | additive | [fixed <integer>?] | [ extends <counter-style-name> ] symbolic

IDL索引

partial interface CSSRule {
    const unsigned short COUNTER_STYLE_RULE = 11;
};

[Exposed=Window]
interface CSSCounterStyleRule : CSSRule {
  attribute CSSOMString name;
  attribute CSSOMString system;
  attribute CSSOMString symbols;
  attribute CSSOMString additiveSymbols;
  attribute CSSOMString negative;
  attribute CSSOMString prefix;
  attribute CSSOMString suffix;
  attribute CSSOMString range;
  attribute CSSOMString pad;
  attribute CSSOMString speakAs;
  attribute CSSOMString fallback;
};