Themeの開発
Themeを作成する
vivliostyle theme createによる雛形生成
Vivliostyle CLIでテーマプロジェクトの雛形を生成します。npm create vivliostyle-theme は同じコマンドのエイリアスです。
npx vivliostyle theme create <directory>
# または
npm create vivliostyle-theme <directory>
対話形式で以下の項目を入力します。いずれもコマンドラインオプションで指定できます。
| 項目 | オプション | 説明 |
|---|---|---|
| パッケージ名 | --name |
テーマのnpmパッケージ名(既定値: vivliostyle-theme-<directory>) |
| 説明 | --description |
テーマの説明 |
| 作者 | --author |
作者名 |
| 分類 | --category |
テーマの分類(novel / magazine / journal / report / misc) |
生成されるファイル構成
<directory>/
├── .gitignore
├── package.json # パッケージ定義(vivliostyle.theme 設定を含む)
├── README.md # テーマの説明・使い方
├── theme.css # テーマのメイン CSS
├── vivliostyle.config.js # プレビュー用の設定ファイル
└── example/
├── 01_typography.md # サンプル原稿(VFM 形式)
├── 02_figures-and-tables.md
├── 03_code-and-math.md
└── assets/
各ファイルの役割:
| ファイル | 役割 |
|---|---|
package.json |
テーマのメタ情報。vivliostyle.theme プロパティでテーマ名・作者・メインCSS・カテゴリを定義 |
theme.css |
テーマのスタイル定義本体。theme-baseの @import とCSS変数のカスタマイズが初期設定済み |
vivliostyle.config.js |
vivliostyle preview でテーマの動作確認に使用。entryに example/ の原稿を指定 |
example/*.md |
テーマ適用例を示すサンプルMarkdown。VFM記法に対応 |
雛形をカスタマイズする
theme.cssの編集
生成直後の theme.css は、theme-baseのモジュールをインポートし、CSS変数でカスタマイズする次のような構成になっています。
/* theme-base の基本モジュールをインポート */
@import '@vivliostyle/theme-base';
/* 機能モジュールをインポート */
@import '@vivliostyle/theme-base/appendix';
@import '@vivliostyle/theme-base/citation';
@import '@vivliostyle/theme-base/endnote';
@import '@vivliostyle/theme-base/equation';
@import '@vivliostyle/theme-base/figure';
@import '@vivliostyle/theme-base/footnote';
@import '@vivliostyle/theme-base/listing';
@import '@vivliostyle/theme-base/math';
@import '@vivliostyle/theme-base/page';
@import '@vivliostyle/theme-base/section';
@import '@vivliostyle/theme-base/sidenote';
@import '@vivliostyle/theme-base/table';
@import '@vivliostyle/theme-base/theorem';
@import '@vivliostyle/theme-base/toc';
/* コードハイライト(Prism)を追加 */
@import '@vivliostyle/theme-base/prism';
@import '@vivliostyle/theme-base/prism/theme-okaidia';
:root {
/* 基本スタイル */
--vs-font-family: 'Times New Roman', serif;
--vs-font-size: 12px;
--vs--heading-line-height: 1.3;
--vs--h1-font-size: 2.5em;
/* 脚注 */
--vs-footnote--call-content: '[' counter(footnote) ']';
/* ページレイアウト */
--vs-page--mbox-bottom-center-content: counter(page);
--vs-page--mbox-top-left-content: env(doc-title);
/* 目次 */
--vs-toc--ol-indent-size: 1.5rem;
}
独自のスタイルを追加するには、このファイルの末尾にルールを記述します。ページサイズの設定例:
@page {
size: A5;
margin: 20mm 15mm;
}
theme-baseのモジュール活用
theme-baseは機能ごとにモジュール分割されています。パッケージエントリに含まれるのは基本モジュールだけなので、必要な機能モジュールのインポートだけを残せます。
/* 基本モジュールのみ */
@import '@vivliostyle/theme-base';
/* 必要な機能モジュールを追加 */
@import '@vivliostyle/theme-base/toc';
@import '@vivliostyle/theme-base/footnote';
利用可能なモジュール一覧(@vivliostyle/theme-base/<サブパス> でインポート):
| サブパス | 内容 | CSS変数プレフィックス |
|---|---|---|
| (パッケージエントリ) | CSSリセット・変数の規定値・基本HTMLタグのスタイル | --vs-, --vs-- |
figure |
図の採番・相互参照 | --vs-figure-- |
table |
表の採番・相互参照 | --vs-table-- |
citation |
引用文献の採番・相互参照 | --vs-citation-- |
listing |
コードリストの採番・相互参照 | --vs-listing-- |
equation |
数式の採番・相互参照 | --vs-equation-- |
theorem |
定理の採番・相互参照 | --vs-theorem-- |
appendix |
付録の採番・相互参照 | --vs-appendix-- |
endnote |
後注 | --vs-endnote-- |
footnote |
脚注 | --vs-footnote-- |
footnote/external-links |
外部リンクの脚注化 | --vs-footnote-- |
page |
ページメディア | --vs-page-- |
section |
見出し番号・節参照 | --vs-section-- |
toc |
目次 | --vs-toc-- |
math |
数式(MathML / MathJax)の表示 | --vs-math-- |
sidenote |
番号付き傍注 | --vs-sidenote-- |
prism |
コードハイライト基盤 | --vs-prism-- |
prism/theme-prism |
Prismデフォルトテーマ | --vs-prism-- |
prism/theme-okaidia |
Okaidiaテーマ | --vs-prism-- |
詳細はtheme-baseのREADMEを参照してください。
CSS変数のオーバーライド
theme-baseや各テーマが公開するCSS変数を :root で上書きすることで、テーマをカスタマイズできます。
:root {
/* フォント設定 */
--vs-font-family: 'Noto Serif JP', serif;
--vs-font-size: 10.5pt;
/* 見出し */
--vs--h1-font-size: 2em;
--vs--heading-line-height: 1.4;
/* 相互参照の共通カウンタスタイル */
--vs-counter-style: upper-roman;
/* ページヘッダ・フッタ */
--vs-page--mbox-top-left-content: env(pub-title);
--vs-page--mbox-top-right-content: env(doc-title);
--vs-page--mbox-bottom-center-content: counter(page);
}
実際のテーマでの活用例として、theme-techbookはテーマ固有のCSS変数(--vs-theme-<name>--*)を公開しています:
:root {
--vs-theme-techbook--inline-code-color-bg: #ecf0f1;
--vs-theme-techbook--inline-code-color-body: #34495e;
--vs-theme-techbook--footnote-color-bg-on-screen: #e6f6d7;
--vs-theme-techbook--image-resolution-for-figure-image: 300dpi;
}
example/ディレクトリの編集
example/ にはテーマの適用例を示すサンプルMarkdownを配置します。
- 最低1つのMarkdownファイルが必要です
- VFM (Vivliostyle Flavored Markdown)記法が利用できます
- テーマが対応する主要なスタイル(見出し、コードブロック、脚注、画像、数式等)を網羅する内容を推奨します
プレビューで動作確認:
npm run example:preview
Themeを公開する
事前検証
公開前に vivliostyle theme validate を実行して、パッケージの妥当性を検証します。生成された雛形では npm run validate に割り当てられています。
npm run validate
検証項目:
| チェック | 種別 | 内容 |
|---|---|---|
| スタイルロケータ | エラー | vivliostyle.theme.style、style、main のいずれかが設定されていること |
| スタイルファイル | エラー | パッケージ内に実在すること(拡張子が .css でない場合は警告) |
| 作者情報 | 警告 | vivliostyle.theme.author または author が設定されていること |
| キーワード | 警告 | keywords に vivliostyle-theme が含まれていること |
| 分類 | 警告 | vivliostyle.theme.category が上記の分類のいずれかであること |
プレビュー確認
npm run example:preview
vivliostyle.config.js の設定に基づき、example/ のサンプル原稿にテーマを適用した状態でプレビューが表示されます。
package.jsonの必須フィールド
{
"name": "vivliostyle-theme-<name>",
"main": "theme.css",
"keywords": ["vivliostyle", "vivliostyle-theme"],
"vivliostyle": {
"theme": {
"name": "Theme Display Name",
"author": "Author Name",
"style": "theme.css",
"category": "misc",
"topics": []
}
}
}
| フィールド | 必須 | 説明 |
|---|---|---|
vivliostyle.theme.style |
✅ | メインCSSファイルのパス |
vivliostyle.theme.author |
✅ | テーマの作者名 |
vivliostyle.theme.name |
— | テーマの表示名 |
vivliostyle.theme.category |
— | novel / magazine / journal / report / misc |
vivliostyle.theme.topics |
— | テーマの用途を示すトピックの配列 |
keywords |
— | "vivliostyle" と "vivliostyle-theme" を含めることを推奨 |
詳細な仕様はVivliostyle Themeの仕様を参照してください。
npmへの公開
npm publish
公開後、テーマは以下から検索可能になります:
公式テーマとして提案する
自作したテーマは、ぜひVivliostyle公式テーマとして提案してください。詳細は公式Themeの採用を参照してください。