@vivliostyle/theme-base の basic.css (v1.0.0) の変数をタグごとに整理

こんにちは。Vivliostyle という CSS を使った組版ソフトウェアがあり、現在勉強中です。執筆する上で @vivliostyle/theme-base の仕様を理解しておく必要があるようなので、手始めにその一番基本となる basic.css の内容をメモします。

theme を使いこなすには、まずどのような変数が定義されているかを知る必要があります。用途に合わせた変数名の逆引き辞典のようなものがあればよいのですが、現状見当たらないので、自分で逆引きメモを作ってみようというのが狙いです*1

:root にある大量の変数定義はすっ飛ばして、その後の実際の css (?) の部分だけ整理します。「こういう編集したいから css はこう変えたい」→「なら theme のこの変数を上書きするのがよい」といった調べ方をする想定です。

リンク

theme-base v1.0.0 (現在の最新) のリンク↓
github.com

そのうち basic.css へのリンク↓
github.com

典型パターン

数が膨大とはいえ、ある程度規則的に命名されている。

基本形

例. p タグ

p {
  hanging-punctuation: var(--vs--p-hanging-punctuation);
  hyphens: var(--vs--p-hyphens);
  letter-spacing: var(--vs--p-letter-spacing);
  line-height: var(--vs--p-line-height);
  margin-block: var(--vs--p-margin-block);
  margin-inline: var(--vs--p-margin-inline);
  text-align: var(--vs--p-text-align);
  text-indent: var(--vs--p-text-indent);
  text-spacing: var(--vs--p-text-spacing);
  word-break: var(--vs--p-word-break);
  word-spacing: var(--vs--p-word-spacing);
}

抽象化すると以下のように表現できる。

tagName {
  key: var(--vs--${tagName}-${key});
  ...
}

この形式を基本形と呼ぶこととする。

一部のタグ群については、個々のタグ名ではなく、共通のタグ名で代表することがある。

例.

code,
kbd,
pre,
samp {
  font-family: var(--vs--monospace-font-family);
  ...
}

この場合には「共通のタグ名は monospace」などと断りを入れた上で基本形とみなすこととする。

デフォルト付き基本形

いくつかのタグをまとめて処理する場合、個別タグでの設定の変数と、全体のデフォルト値を設定していることがある。

例.

h1 {
  break-after: var(--vs--h1-break-after, var(--vs--heading-break-after));
  ...
}

抽象化すると以下のように表現できる。

tagName {
  key: var(--vs--${tagName}-${key}, var(--vs--${defaultName}-${key}));
  ...
}

この形式をデフォルト付き基本形と呼ぶこととする。h1 タグの場合はデフォルト名は heading である。

基本形と同様、一部のタグ群については、個々のタグ名ではなく、共通のタグ名で代表することがある。

例.

b,
strong {
  font-family: var(--vs--bold-font-family, var(--vs--heading-font-family));
  ...
}

この場合は「共通のタグ名は bold」などと断りを入れた上でデフォルト値付き基本形とみなすこととする。

タグごとの変数

全称系 (*, *::before, *::after)

*,
*::before,
*::after {
  border-color: var(--vs-border-color);
}

html タグ

基本形のキー

  • font-size

「--vs--${key}」形式のキー

  • font-family
  • font-feature-settings
  • font-kerning
  • font-stretch
  • font-style
  • font-synthesis
  • font-variant
  • font-variation-settings
  • font-weight
  • letter-spacing
  • line-height
  • tab-size
  • hyphens
  • line-break
  • overflow-wrap
  • word-break
  • columns
  • column-fill
  • column-gap
  • text-orientation
  • text-underline-offset
  • text-underline-position
  • orphans
  • widows
  • writing-mode
  • text-spacing
  • hanging-punctuation
  • text-align
  • word-spacing

その他

html {
  background-color: var(--vs-color-bg);
  color: var(--vs-color-body);
}

body タグ

各種カウンタのリセットのみ

body {
  /* TODO: Remove prettier-ignore after Prettier v3
  https://github.com/prettier/prettier/issues/13202 */
  /* prettier-ignore */
  counter-reset: var(--vs-crossref--root-counter-reset,)
    var(--vs-footnote--root-counter-reset,) var(--vs-document-root-counter-reset,);
}

code, kbd, pre, samp タグ

基本形のキー (共通のタグ名は monospace)

  • font-family
  • font-feature-settings
  • font-kerning
  • font-size
  • font-stretch
  • font-variant
  • font-variation-settings
  • font-weight
  • hyphens
  • letter-spacing
  • line-height
  • text-spacing
  • word-break
  • word-spacing

h1, h2, h3, h4, h5, h6 タグ

デフォルト付き基本形のキー (デフォルト名は heading)

  • break-after
  • break-inside
  • font-family
  • font-feature-settings
  • font-kerning
  • font-size
  • font-stretch
  • font-variant
  • font-variation-settings
  • font-weight
  • hyphens
  • letter-spacing
  • line-height
  • margin-block
  • text-align
  • text-indent
  • text-spacing
  • word-break
  • word-spacing

b, strong タグ

基本形のキー (共通のタグ名は bold)

  • font-size
  • font-weight
  • vertical-align

デフォルト付き基本形のキー (共通のタグ名は bold; デフォルト名は heading)

  • font-family
  • font-feature-settings
  • font-kerning
  • font-stretch
  • font-variant
  • font-variation-settings

del タグ

基本形のキー

  • text-decoration

em タグ

タグ名は em の代わりに emphasis を用いる。
基本形のキー

  • font-family
  • font-feature-settings
  • font-kerning
  • font-size
  • font-style
  • font-stretch
  • font-variant
  • font-variation-settings
  • font-weight
  • vertical-align

:is(b, strong) em

デフォルト付き基本形のキー (共通のタグ名は bold-emphasis; デフォルト名は emphasis)

  • font-family
  • font-feature-settings
  • font-kerning
  • font-size
  • font-stretch
  • font-variant
  • font-variation-settings
  • font-weight

その他

:is(b, strong) em {
  vertical-align: var(--vs--bold-emphasis-vertical-align, unset);
}

big タグ

基本形のキー

  • font-size
  • vertical-align

small タグ

基本形のキー

  • font-size
  • vertical-align

sub タグ

基本形のキー

  • font-size
  • inset-block-end

sup タグ

基本形のキー

  • font-size
  • inset-block-start

rt タグ

基本形のキー

  • font-size

hr タグ

基本形のキー

  • margin-block
  • margin-inline

その他

hr {
  border-color: var(--vs--hr-border-color, var(--vs-border-color));
  border-width: 0;
  border-block-start-width: var(--vs--hr-border-width);
}

a タグ

タグ名は a の代わりに anchor を用いる。
基本形のキー

  • color
  • text-decoration

a:hover

a:hover {
  text-decoration: var(--vs--anchor-text-decoration-on-hover);
}

img タグ

基本形のキー

  • image-resolution

p タグ

基本形のキー

  • hanging-punctuation
  • hyphens
  • letter-spacing
  • line-height
  • margin-block
  • margin-inline
  • text-align
  • text-indent
  • text-spacing
  • word-break
  • word-spacing

blockquote タグ

基本形のキー

  • font-size
  • margin-block
  • margin-inline
  • writing-mode

figure タグ

基本形のキー

  • align-items
  • break-inside
  • display
  • flex-direction
  • margin-block
  • margin-inline
  • writing-mode

figure > :not(:is(picture, figcaption)), figure > picture > img

固有変数利用は「--vs--figure-item-padding-inline」のみ

figure > :not(:is(picture, figcaption)),
figure > picture > img {
  max-inline-size: 100%;
  padding-inline: var(--vs--figure-item-padding-inline);
}

figure img

値の設定

figure img {
  object-fit: contain;
}

figure table

値の設定

figure table {
  margin: 0;
}

figcaption タグ

基本形のキー

  • break-inside
  • font-size
  • margin-block
  • margin-inline
  • text-align
  • text-indent

ul, ol, dl タグ

基本形のキー (共通のタグ名は lists)

  • margin-block
  • margin-inline

:is(ul, ol) :is(ul, ol), dl dl

値の設定

:is(ul, ol) :is(ul, ol),
dl dl {
  margin-block: 0;
  margin-inline: 0;
}

ul, ol タグ

基本形のキー

  • list-style-type
  • padding-inline-start

デフォルト付き基本形のキー (デフォルト名は lists)

  • text-align
  • text-indent

ul:not(:is(ul *, ol *))

ul:not(:is(ul *, ol *)) {
  padding-inline-start: max(
    var(--vs--ul-padding-inline-start),
    var(--vs--ul-minimum-inline-indent-size)
  );
}

ol:not(:is(ul *, ol *))

ol:not(:is(ul *, ol *)) {
  padding-inline-start: max(
    var(--vs--ol-padding-inline-start),
    var(--vs--ol-minimum-inline-indent-size)
  );
}

dd タグ

基本形のキー

  • margin-inline-start

dt, dd タグ

基本形のタグ (共通のタグ名は dt-dd)

  • display

デフォルト付き基本形のキー (デフォルト名は lists)

  • text-align
  • text-indent

pre タグ

基本形のキー

  • margin-block
  • margin-inline
  • font-size
  • overflow-x
  • padding-block
  • padding-inline
  • text-align
  • word-break
  • writing-mode

その他
基本形のうしろに「-on-screen」または「-on-print」を付ける。

@media screen {
  pre {
    white-space: var(--vs--pre-white-space-on-screen);
  }
}
@media print {
  pre {
    white-space: var(--vs--pre-white-space-on-print);
  }
}

table タグ

基本形のキー

  • break-inside
  • font-size
  • margin-block
  • margin-inline
  • writing-mode

デフォルトが2つあるパターン
以下の形式を取る:

table {
  border-〇-△-width: var(
    --vs--table-border-width-〇-△,
    var(
      --vs--table-border-width-outer,
      var(--vs--table-border-width)
    )
  );
}

下記の全組み合わせの4通りが設定されている。

  • 〇は「block」および「inline」
  • △は「start」および「end」

その他

table {
  max-block-size: 100%;
  max-inline-size: 100%;
}

*:has(> table)

タグ名を table とした基本形のうしろに「-on-screen」または「-on-print」を付ける。

@media screen {
  *:has(> table) {
    overflow-x: var(--vs--table-container-overflow-x-on-screen);
  }
}
@media print {
  *:has(> table) {
    overflow-x: var(--vs--table-container-overflow-x-on-print);
  }
}

table, tr, th, td タグ

デフォルト付き基本形のキー

table,
tr,
th,
td {
  border-color: var(--vs--table-border-color, var(--vs-border-color));
}

th, td タグ

基本形のキー (共通のタグ名は table-cell)

  • padding-block
  • padding-inline
  • font-weight

th タグ

デフォルト付き基本形 (デフォルト名は bold)

  • font-size

デフォルト値が2個あるパターン
以下の形式を取る。

th {
  key: var(
    --vs--th-${key},
    var(
      --vs--bold-${key}, var(--vs--heading-${key})
    )
  );
}
  • font-family
  • font-feature-settings
  • font-kerning
  • font-stretch
  • font-variant
  • font-variation-settings

その他

th {
  text-align: var(
    --vs--th-text-align, 
    var(--vs--table-text-align, center)
  );
}

td タグ

デフォルト付き基本形のキー (デフォルト名は table)

  • text-align

その他

変数利用は「--vs--table-border-width-cell」と「--vs--table-border-width」のみ。

tr:not(:last-child) {
  border-block-end-width: var(
    --vs--table-border-width-row,
    var(--vs--table-border-width-cell, var(--vs--table-border-width))
  );
}

thead > tr:last-child {
  border-block-end-width: var(
    --vs--table-border-width-thead-inner,
    var(--vs--table-border-width-cell, var(--vs--table-border-width))
  );
}

tfoot > tr:first-child {
  border-block-start-width: var(
    --vs--table-border-width-tfoot-inner,
    var(--vs--table-border-width-cell, var(--vs--table-border-width))
  );
}

th:not(:last-child),
td:not(:last-child) {
  border-inline-end-width: var(
    --vs--table-border-width-column,
    var(--vs--table-border-width-cell, var(--vs--table-border-width))
  );
}

:is(tr, th, td, tbody, thead, tfoot, col, colgroup)[align='left'] {
  text-align: left;
}

:is(tr, th, td, tbody, thead, tfoot, col, colgroup)[align='right'] {
  text-align: right;
}

:is(tr, th, td, tbody, thead, tfoot, col, colgroup)[align='center'] {
  text-align: center;
}

:is(tr, th, td, tbody, thead, tfoot, col, colgroup)[align='justify'] {
  text-align: justify;
  text-align-last: justify;
}

*1:「気にせず直接 CSS 書けばいいやん」という声が聞こえてきそうですが、LaTeXTeX 命令を書きたくないのと同様で、先人がイイカンジに調えてくれた道になるべく乗っかってみたいという気持ちです。