はじめに
技術書典に自分で本を出してみたいと考えました。実際に執筆して、本にするまでにどうすればいいかを調べてみました。
この記事は、調べてこれならできそうだというのをまとめたものです。
ツールとしてはVivliostyleを使用するのがよさそうです。
Vivliostyle とは何か
Vivliostyle は「Web 標準をベースにした CSS 組版エンジン」を掲げる OSS プロジェクトです。ブラウザ同等のレンダリングを行いながら、CSS Paged Media 仕様に従ってページ区切り・マスターページ・欄外注などを制御できます。CLI 版は 2025 年 3 月に v8.19.0が公開済みで、内部で動く Vivliostyle.jsもv2.31.1 へ更新されました。
Web 技術者ならおなじみの flexbox / grid / variable fonts をそのまま紙面に持ち込めるのが最大の特徴です。
メリット:6点
- CSS だけで段組やノンブル(柱・ノンブル)を指定できる
–@page
やrunning()
でヘッダー・フッターを再利用、column-count
で段組を簡単に切替。 - 既存のフロントエンド資産を転用可能
– コンポーネント指向の CSS 設計や PostCSS/Sass などをそのまま適用できる。 - マルチプラットフォーム & 無償
– Electron も不要、Node.js が動けば macOS/Windows/Linux いずれでも同一結果を得られる。 - CI/CD と相性抜群
–vivliostyle build
を GitHub Actions や GitLab CI に仕込めば push → 自動 PDF 生成 → Release Assets という流れがYAMLで実現できる。 - 反復ビルドが高速
– 同一ツリーをキャッシュすれば数十ページのリフローは数秒〜十数秒程度。 - MIT ライセンスで商用利用も安心
デメリット:5点
- CSS Paged Media の学習コスト
–@page :left
/:right
、bleed
やcrop
など、Web では触らないプロパティが多く「InDesign に慣れた DTP 担当者」と逆転現象が起こることも。 - 高精度タイポグラフィは依然課題
– JIS 組版例外処理や約物半角アキ調整、禁則の詳細制御は LuaTeX/InDesign ほど自在ではなく、微調整 CSS が膨らみがち。 - 大規模本(300 ページ超)のビルド時間とメモリ
– DOM 全展開のアプローチゆえ、数百ページ+高解像度図版では数 GB の RAM を要求するケースがある。 - 印刷所要件とのギャップ
– リッチ PDF/X-1a 指定、フォント完全埋込、透明効果フラット化などは別途 Ghostscript 等でパイプを組む必要がある。 - CLI の Breaking Changes
– 2025 年 4 月の 9.0.0-next 系からは Node.js v18 以上必須 になり、旧 CI が落ちた事例も。パイプライン固定バージョン管理が欠かせない。
参考(GitHubActions)
ポイントは以下の部分。何もしないと日本語が豆腐
で表示されました。これを回避するために、日本語フォントを入れています。
- name: Install Japanese fonts
run: |
sudo apt-get update
sudo apt-get install -y fonts-noto-cjk fonts-ipafont-gothic fonts-ipafont-mincho
yaml
以下のGitHubActionsで動作確認済み。
name: Build Technical Book with Vivliostyle
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
# 手動実行を可能にする
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
- name: Install Japanese fonts
run: |
sudo apt-get update
sudo apt-get install -y fonts-noto-cjk fonts-ipafont-gothic fonts-ipafont-mincho
- name: Install dependencies
run: |
npm install -g @vivliostyle/cli
# プロジェクト固有の依存関係がある場合
if [ -f package.json ]; then
npm install
fi
- name: Install additional tools (optional)
run: |
# 必要に応じてマークダウン処理ツールなどをインストール
npm install -g marked
- name: Build PDF with Vivliostyle
run: |
# 基本的なビルドコマンド
vivliostyle build
# または、より詳細な設定でビルド
# vivliostyle build --input manuscript/ --output book.pdf --theme @vivliostyle/themes/bunko
- name: Upload PDF artifact
uses: actions/upload-artifact@v4
with:
name: technical-book-pdf
path: '*.pdf'
retention-days: 30
- name: Upload HTML artifact (optional)
uses: actions/upload-artifact@v4
with:
name: technical-book-html
path: |
*.html
css/
images/
retention-days: 30
# リリース時にPDFを自動アップロード(オプション)
- name: Create Release
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v1
with:
files: '*.pdf'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
yaml