# cti.li で本を作る — AI への指示

あなた（Claude Code・Codex などのコーディングエージェント）は、利用者の頼みに沿って、いまいるフォルダに本を作り、cti.li で EPUB に仕上げます。利用者は技術に詳しくない前提です。**技術的なことは聞き返さず、自分で決めて最後まで進めてください。** 聞くのは、利用者でないと決められない本の中身（何を書くか・誰に向けた本か など）だけにします。版の選び方・底本の記述の置き方・書き足した一文のような判断は自分で決め、最後に報告します。

できあがるのは、版面（頁の作り）まで自分で決めた本（EPUB）です。cti.li の読み器でそのまま読めます。判型は紙に刷れる寸法にそろえています（自分の本を紙で注文できるのは今後）。

**この指示書は、要約せずに全部読む。** まだなら、このフォルダに保存してから読む（`curl -sS -o AGENTS.md https://cti.li/contents/book/AGENTS.md`。PowerShell では `curl.exe`）。ウェブの頁を要約して読む道具（WebFetch など）だと、コマンドが抜け落ちることがある。利用者が後で直しを頼んだときも、このファイルを読み直してから始める。

以下のコマンドは全部このフォルダで打ちます。tar と curl のファイル名は相対で書きます（Windows の Git Bash の tar は `C:/…` のような名前を受けない）。

**Windows の PowerShell で動いているとき**は、下の「PowerShell では」のコマンドを使う（Windows PowerShell 5.1 で通ることを確かめてある）。決まり:
- `curl` は `curl.exe` と書く（PowerShell 5.1 の `curl` は別のコマンド）。`-F` の値は `"book=@book.tgz"` と引用符で囲む。
- `&&` が無いので、前のコマンドが失敗したら次へ進まないよう `if ($LASTEXITCODE -eq 0) { … }` で囲む（`;` でつなぐと、混んでいて断られたときにエラーの文が入ったファイルまで消える）。
- コマンドは直接打つ。.ps1 のファイルにするなら、UTF-8 の印（BOM）付きで保存する（印が無いと 5.1 は日本語のファイル名を読み違える）。
- 日本語のファイルは UTF-8 で読み書きする。読むときは `Get-Content -Encoding UTF8`、書くときは `-Encoding utf8`（印が付くが、点検は通る）。`>` や `Out-File` で書かない（UTF-16 になり、点検で「UTF-8 にしてください」と出る）。ファイルはエージェントのファイルを書く道具で書くのがいちばん確か。

## 1. 始める

本の中身によって、出発点を選びます。

- **青空文庫の作品から作る**（縦組み）: 作品のアドレス（図書カード `https://www.aozora.gr.jp/cards/…/card….html` か XHTML の頁）から、本文・ルビ・章・目次・奥付（底本の記述）が入った本のフォルダが届きます。外字は字に替わり、字下げは元の本のとおりです（全角の空白で始まる行は字下げ、ほかは `class="noindent"`）。

  ```
  curl -sS -G --data-urlencode "url=作品のアドレス" "https://cti.li/contents/book/api.php?do=aozora" -o book.tgz
  tar -xzf book.tgz && rm book.tgz
  ```

  PowerShell では:

  ```
  curl.exe -sS -G --data-urlencode "url=作品のアドレス" "https://cti.li/contents/book/api.php?do=aozora" -o book.tgz
  tar -xzf book.tgz; if ($LASTEXITCODE -eq 0) { Remove-Item book.tgz }
  ```

  - **何作品かを1冊にする**ときは、`--data-urlencode "url=…"` を作品の数だけ並べる（並べた順に入る。20作品まで）。作品ごとに1つの頁のファイルになり（作品の題が h1、章・節が h2）、各作品の底本の記述はその作品の終わりに入る。本の題は作品の題を「・」でつないだもの。
  - 章の見出しが「第一章」のような作品は、章ごとに頁のファイルに分かれる。「一」「二」のような番号だけの短編は分けず、1つのファイルに h2 で入る。
  - 同じ作品に版が幾つかある（新字新仮名・新字旧仮名など）ときは、利用者の指定が無ければ新字新仮名を選び、1冊の中で表記をそろえる。
  - 届く `book.json` の判型はいつも `shinsho`。頼みに合わせて変える（「文庫本」なら `a6`）。`"source"` は元の作品のアドレスで、EPUB に記録される（消さない）。
  - 青空文庫の本には絵が無いので `images/` は無い。絵を足すときに作る。

- **縦組みの本**（小説・随筆など）: `curl -sSL -o s.tgz https://cti.li/contents/book/starter.tgz && tar -xzf s.tgz && rm s.tgz`
- **横組みの本**（実用書・教科書・レシピなど。囲み・番号付きの手順・表の見本入り）: `curl -sSL -o s.tgz https://cti.li/contents/book/starter-horizontal.tgz && tar -xzf s.tgz && rm s.tgz`
- PowerShell では: `curl.exe -sSL -o s.tgz https://cti.li/contents/book/starter.tgz; tar -xzf s.tgz; if ($LASTEXITCODE -eq 0) { Remove-Item s.tgz }`（横組みは `starter-horizontal.tgz`）

ひな形の見本の文（「ここに本文を書きます」など）は全部、本の中身に置き換える。

次に、利用者の頼みと原稿を読み、次を決める。決まっていないものは妥当に選び、最後に報告する。

- 題・著者（`book.json`）。**著者名（利用者の名前や筆名）が原稿にも頼みにも無ければ、始める前に聞く**（利用者でないと決められない）。
- 判型（`book.json` の `"size"`）: `shinsho`（新書判 113×176mm）・`a6`（文庫判 105×148mm）・`b6`（128×182mm）・`a5`（148×210mm）・`b5`（182×257mm）・`a4`。読み物は `shinsho`、絵や表の多い本は `a5`・`b5` が無難。ひな形の `style.css` の余白と文字の大きさは、縦組みは新書判、横組みは A5 に合わせてある。判型を変えたら合わせて直し（4 の「1頁の行数」）、表紙・奥付の位置も見本で確かめる
- 章立て: 1章を1つの頁のファイルにする（章は新しい頁から始まり、目次に載る）。**本文が10頁くらいまでの短い本**（短い随筆・短編）は、章ごとに分けると半分空いた頁が並ぶので、1つのファイルにまとめる。そのファイルの h1 は本の題（作品の題）にし、章・節を h2 にする。h1 が1つだけの本は、目次（読み器の目次と 01-contents）に h2 も自動で載る。目次の頁（01-contents）は外してもよい。
- 表紙: 表紙用に渡された絵があれば使う。無ければ文字だけの表紙（本文に入れる写真を勝手に表紙にしない）。
- 紹介文（`book.json` の `"description"`）: 原稿から一、二文で自分で書き、報告する。ひな形の「この本の紹介を一、二文で。」は残さない。

**Word の原稿（.docx）**は、cti.li で文字と絵に分ける（ファイルの名前は日本語のままでよい）:

```
curl -sS -F "file=@原稿.docx" "https://cti.li/contents/book/api.php?do=word" -o word.tgz
tar -xzf word.tgz && rm word.tgz
```

PowerShell では:

```
curl.exe -sS -F "file=@原稿.docx" "https://cti.li/contents/book/api.php?do=word" -o word.tgz
tar -xzf word.tgz; if ($LASTEXITCODE -eq 0) { Remove-Item word.tgz }
```

`word.txt` と、絵（`images/word1.jpg` …）が届く。`word.txt` は段落が1行ずつで、Word の「表題」は行頭の `【題】`、「見出し1」は `#`、「見出し2」は `##`、ルビは `漢字《かんじ》`、絵の位置は `[絵: images/word1.jpg]`（すぐ次の行は、たいてい写真の説明）、表は `|` で区切った行、箇条書きは `・`。Word での絵の大きさは伝わらない。`word.txt` を下のテキストの原稿として読む。古い形式（.doc）は読めないので、利用者に Word で開いて「名前を付けて保存」で .docx にしてもらう。

**利用者の原稿（テキストのファイルなど）の読み方**: 空行か改行で段落を分ける。行頭の全角の空白は字下げのしるしなので、段落にするときは消す（字下げは CSS が付ける）。全角の空白で下げた短い行や「一　…」のような行は見出し。「[写真1　説明]」のような印は、そこに絵を置き、説明を figcaption にする。利用者の絵は `images/` に**写す**（元のファイルは残す）。原稿の字は変えない（数字を漢数字にするなど、組むために直したところは報告する）。

## 2. フォルダの決まり

```
book.json      題・著者・組み方向・判型
style.css      全頁に当たる CSS（版面・書体・見出し・本文）
pages/         頁のファイル。名前の順に本になる
  00-cover.html    表紙
  01-contents.html 目次（<nav class="toc"></nav> に h1 から目次が自動で入る）
  10-….html, 20-….html …  章（1章を1ファイルに）
  99-colophon.html 奥付
css/           追加の CSS（表紙の cover.css など）
images/        絵（jpg・png・svg）。表紙の絵は images/cover.jpg（本棚の表紙になる）
fonts/ audio/ video/  書体（woff2・ttf）・音声（mp3・m4a）・動画（mp4）を使うとき
```

- `book.json`: `"title"`・`"author"`（必須）、`"writing"`: `"vertical"`（縦組み・右綴じ）か `"horizontal"`（横組み・左綴じ）、`"size"`（上の判型）、`"description"`（紹介文）、`"language"`（既定 `ja`）、`"source"`（元にした作品のアドレス。1つなら字、幾つもなら並び。書かなくてよい）。
- 頁のファイルの中身は **`<body>` の中身だけの普通の HTML**。章の題は `<h1>`（目次と読み器の目次になる。目次に載るのは h1 だけ。h1 が本に1つだけなら h2 も載る）、節は `<h2>`。
- 頁のファイルの先頭に `<!-- class: cover -->`（body の class）、`<!-- css: css/cover.css -->`（その頁だけの CSS）を書ける。
- ファイル名は半角の英数字と `- _ .` だけ。文字は UTF-8。
- **1つの頁のファイルは、読み器では1つのまとまりとして別々に組まれる。** `@page :first` は各ファイルの1頁目に当たり、頁番号（`counter(page)`）もファイルごとに1から数える。目次に頁番号は入らない（読み器では目次から飛べる）。章が1〜2頁の短い本では頁番号が「2」ばかりになるので、消してよい（`@page` の `@bottom-center` を `content: none`）。読み器の画面サイズでは、頁番号は出ない。
- 縦組みと横組みを途中で変えるときは、`book.json` の `"writing"` と、`style.css` の `html { writing-mode: … }` の両方を変える。ひな形の CSS は組み方向ごとに値が違うので、組み方向に合ったほうのひな形から始めるのが早い。

## 3. 作る → 見る → 直す（必ず見本を目で見る）

1. **固める**: `tar -czf book.tgz book.json style.css pages $(ls -d css images fonts audio video 2>/dev/null)`（css・images・fonts・audio・video は、あるものだけが入る）
2. **見本**: 頁の画像と点検の結果を取ってきて、**画像を開いて目で見る**。前の見本は消してから広げる（古い画像を見ないため）。

   ```
   curl -sS -F book=@book.tgz "https://cti.li/contents/book/api.php?do=preview&page=all" -o preview.tgz
   rm -rf preview && mkdir preview && tar -xzf preview.tgz -C preview && rm preview.tgz
   ```

   PowerShell では（固めるところから）:

   ```
   $d = @('css','images','fonts','audio','video') | Where-Object { Test-Path $_ }
   tar -czf book.tgz book.json style.css pages @d
   curl.exe -sS -F "book=@book.tgz" "https://cti.li/contents/book/api.php?do=preview&page=all" -o preview.tgz
   if (Test-Path preview) { Remove-Item -Recurse -Force preview }
   New-Item -ItemType Directory preview | Out-Null
   tar -xzf preview.tgz -C preview; if ($LASTEXITCODE -eq 0) { Remove-Item preview.tgz }
   ```

   tar が失敗したら、`preview.tgz` の中身（エラーの文）を読む。

   - `preview/report.txt` を先に読む。点検の結果（`[誤り]`・`[注意]`）、頁のファイルごとの頁数と頁の埋まり具合（余白を含む頁全体に対する割合なので、字でいっぱいの頁でも 85% ほど）、頁数の合計、自動の注意（表紙が2頁に割れた・章の最後の頁に字が少ししかない・途中の頁が大きく空いた・縦組みで横倒しの数字 など）が出る。`[誤り]` は必ず直す。`[注意]` も読んで直す。
   - `preview/p003-001.png` は「頁のファイルの3番目の1頁目」。
   - `page=` は**頁のファイルの番号**（report.txt の一覧の番号）で、`all`・`3`・`3-5`・`1,3,5`。直したら、直した頁のファイルだけを見直せばよい。
   - `dpi=`（24〜150、既定 100）。`mode=screen` で読み器の「画面サイズ」（携帯 100×190mm）、`size=large`・`xlarge` で文字を大きくしたとき。
   - 点検だけなら `do=check`（画像なし、すぐ返る）。
3. **見るところ**: 字や絵が版面からはみ出していないか／見出しだけが頁の終わりに取り残されていないか／章の最後の頁に1〜2行だけ残っていないか／途中の頁が大きく空いていないか／絵の大きさ／縦組みの数字・英字の向き／ルビ／目次／表紙。
   - **整えるのは、読み器の標準（`book.json` の判型・文字の大きさ標準）。**
   - **仕上げの前に一度、`mode=screen` で表紙・絵のある頁のファイル・奥付を見る**（例: `page=1,4,9&mode=screen`）。ここでは割れ・はみ出しだけを直す（読む人が画面や字の大きさを変えたときの空きや1行の残りまでは直さなくてよい）。`size=xlarge` も同じ（見るのは任意）。
   - `[注意]` の「途中の頁が大きく空いた」は、写真を次の頁に大きく載せるなど、わざとそうしたのなら残してよい。
4. **仕上げ**: `curl -sS -F book=@book.tgz "https://cti.li/contents/book/api.php?do=epub" -o book.epub`（PowerShell では `curl.exe -sS -F "book=@book.tgz" "https://cti.li/contents/book/api.php?do=epub" -o book.epub`）
   誤りがあると EPUB にならず、`book.epub` の中身が誤りの報告（文）になる。小さすぎるときは開いて読む。表紙の絵（images/cover.jpg）が無ければ、表紙の頁を組んだ絵が本棚の表紙になる。EPUB には判型（`book.json` の size）も記録される。

## 4. 書き方の要点（組版エンジンは Copper）

- 判型は `book.json` で決まる。`style.css` には `@page { size }` を書かず、`@page { margin: 上 右 下 左; @bottom-center { content: counter(page) } }` で余白と頁番号を決める。
- **1頁の行数**は、余白・文字の大きさ・行送りで決まる。縦組みでは、1頁の行数 ≒ （頁の幅 − 左右の余白）÷（文字の大きさ × 行送り）、1行の字数 ≒ （頁の高さ − 上下の余白）÷ 文字の大きさ（1pt = 0.353mm）。横組みは幅と高さを入れ替える。判型を変えたときの目安（縦組み、行送り 1.7）:
  - `a6`（文庫）: 9pt、余白 上下 14mm・左右 11.5mm → 15行×37字
  - `shinsho`: 9.5pt、余白 上 18・下 16・左右 13mm → 15行×42字（ひな形）
  - `b6`: 9.5pt、余白 上 18・下 16・左右 15mm → 17行×44字
  - `a5`: 10pt・行送り 1.75、余白 上 20・下 18・左右 17mm → 18行×48字

  章の最後の頁に1行だけ残ったら、どれかを少し変える。
- 段落の初めは一字下げ（見出しの直後も下げる）。字下げしない段落は `<p class="noindent">`（「で始まる会話を下げない本もある。元の本や利用者の好みに合わせる）。
- ルビ `<ruby>漢字<rt>かんじ</rt></ruby>`、縦中横 `<span class="tcy">12</span>`、傍点・圏点 `<span class="em">…</span>`、脚注 `<span class="fn">注の文</span>`（`float: footnote`）。
- **縦組みの数字**: 縦組みの文の数字は漢数字にするのが普通。量や数は位取りで（3つ→三つ、10年→十年、100本→百本、25人→二十五人）、年号・番号は一字ずつ（1962年→一九六二年）。数字のまま残したいもの（型番・番地など）は、2桁までは縦中横（`<span class="tcy">12</span>`）。半角のままだと横倒しになる（点検で注意が出る）。原稿の数字を直したら報告する。
- **位置を決めるとき**: 縦組みでは、上からの距離が `margin-inline-start`（% は版面の高さに対して効く）、右からの距離が `margin-block-start`（mm で）。横組みでは上からの距離を `margin-top` の mm で書く（% の margin・padding は版面の**幅**に対して効く）。`height: 100%` のような高さ・幅の % と flex の space-between は、思ったように広がらないことがある。表紙・扉・奥付は余白で置く。
- **頁いっぱいの絵の表紙**は、`css/cover.css` の説明のとおり、頁の背景（`@page :first` の `background`）にする。`<img>` を `width: 100%; height: 100%` にして頁いっぱいにしようとしない（画面サイズで割れる）。
  - 題が描いてある絵: `images/cover.jpg` にする（そのまま本棚の表紙になる）。
  - 題の無い絵に題・著者を重ねる: `images/cover-art.jpg` など**別の名前**にして背景にし、題・著者の字を上に置く。本棚の表紙は、その表紙の頁を組んだ絵から作られる（`cover.jpg` にすると、題の無い絵がそのまま本棚に出る）。
- 縦組みの中の英字の名前・URL は横倒しのままでよい（縦組みの本では普通）。数字は下の「縦組みの数字」のとおり。
- 絵: `<figure><img src="images/x.jpg" alt="…"/><figcaption>…</figcaption></figure>`。大きさは `max-block-size`（縦組みでは横幅、横組みでは高さ。ひな形は版面の半分まで）。写真を1枚で1頁に大きく載せるなら `<figure class="page">`（ひな形にある。前後で改頁し、版面の 85% まで）。文の後ろで絵が次の頁へ1枚だけ送られて小さく見えるときも、これにする。その間の大きさにしたいときは、絵ごとに `<img style="max-block-size: 65%">` のように 50%〜85% で変えてよい。JPEG・PNG は長辺 2000 ピクセルくらいまで。**SVG も使える**（そのまま EPUB に入る。viewBox を絵にぴったり詰めると大きく出る。SVG の中の字の書体も下の書体から選ぶ）。全体で 60MB を超えない。
- **音声・動画**: `<audio controls src="audio/1.mp3"></audio>`、`<figure><video controls src="video/1.mp4" poster="images/1-poster.jpg" width="640" height="360"></video><figcaption>…</figcaption></figure>`。読み器では、押すと鳴る・再生する。PDF と紙の本では再生できないので、動画には `poster`（止まった絵）と、何の動画かが分かる説明を付ける。動画は mp4（H.264）で短く小さく（長辺 1280 ピクセルくらいまで）。全体で 60MB を超えない。見本の画像で、`poster` の絵が版面に収まっているかを見る。
- 改頁は `break-before: page`、割りたくないまとまりは `break-inside: avoid`、見出しの直後で頁を割らないのは `break-after: avoid`。並べるときのあきは `margin` より `gap`（flex・grid）。flex-wrap・grid・border-radius・background・`::before` の counter・表の罫は効く。
- **読み器の「画面サイズ」（携帯）**: 頁の余白は読み器が細く決め（6mm くらい。`@page` の margin は効かない）、版面は幅 87mm・高さ 177mm ほどになる。表紙・扉・奥付の位置や絵の大きさは、判型の版面にもこの大きさにも収まる mm で決める。画面サイズのときだけ効く規則は書けない（`@media (max-width: …)` で見分けようとしない。幅の測り方が頁の余白で変わり、当てにならない）。
- 書体（cti.li にあるもの。太字の有無）:
  - 明朝: `"Noto Serif JP"`（太字あり）・`"Shippori Mincho"`（太字あり）・`"Zen Old Mincho"`（太字あり）・`"BIZ UD明朝"`（太字あり）・`"Kaisei Tokumin"`（太字あり）・`"Sawarabi Mincho"`（太字なし）・`"Hina Mincho"`（太字なし）
  - ゴシック: `"Noto Sans JP"`・`"Zen Kaku Gothic New"`・`"BIZ UDゴシック"`・`"M PLUS 1p"`（どれも太字あり）・`"Sawarabi Gothic"`（太字なし）
  - 丸ゴシック: `"Zen Maru Gothic"`（太字あり）・`"Kiwi Maru"`（中太まで）
  - 手書き風・飾り: `"Klee One"`（やや太まで）・`"Yusei Magic"`・`"Mochiy Pop One"`・`"Dela Gothic One"`・`"DotGothic16"`（どれも太字なし）
  - ほかの書体は `fonts/` に置いて `@font-face` で読む。
  - **Dela Gothic One には縦書き用の（）【】が無い。** 縦組みで使うなら、括弧を `<span style="text-orientation: sideways">（</span>` のように倒す。
- 使えないもの: `<script>`・フォーム・外のサイトの絵や CSS（手元の images/・css/ に置いて読む）。点検で外される。
- 色は自由。細い字に薄い色は読みにくい。

## 5. 終わったら利用者に伝える

- できた `book.epub` の場所。
- 読み方: ブラウザで https://cti.li/contents/reader.html を開き、「EPUB を開く」で `book.epub` を選ぶ（選ぶとすぐ組んで出る）。スマホでも読める（開いたブラウザでだけ読め、リンクを渡しても他の人は読めない）。
  - 判型を新書判（`shinsho`）以外にしたときは、読み器の「設定」の「本の大きさ」で同じ判型（例: 文庫・A6）を選ぶよう伝える（選ぶとすぐ組み直る）。読み器はまだ本の判型を読まない。
- 直したいときは、このフォルダでまた AI に頼めばよい（`pages/` などを直して、3 の手順で作り直す）。
- 自分で決めたこと（組み方・判型・表紙・書き足したもの など）と、気になる所が残っていればそれ。
- 作業に使ったファイル（`preview/`・`book.tgz`・`word.txt`）は消してよい。本を直すときに要るのは `book.json`・`style.css`・`pages/`・`css/`・`images/` と、この `AGENTS.md`（消さない）。

## 6. 守ること

- 他人の文章や絵を勝手に使わない。使ってよいのは、利用者が権利を持つもの・許しを得たもの・著作権の切れたもの（青空文庫など）。青空文庫の本は、奥付の底本の記述を消さない。
- 1回に送れるのは 60MB まで。
- 点検と見本は cti.li の組版を使う。1回ずつ結果を見てから次を送る（同時に何本も送らない）。
- 混んでいると `429`・`503` が返る（受けたファイルが tar.gz でなく短い文になり、tar が失敗する。そのファイルを読めば分かる）。30秒ほど待ってからやり直す。
- 見本の `report.txt` に `[誤り] 組めませんでした` だけが出たときは、本の誤りではなく cti.li の組版が一時的に失敗したことがある。本を直さずに、30秒ほど待ってから同じものを送り直す。続けて出るなら、その文を利用者に伝える。
