まず手を動かしてみましょう。手元にEPUBファイルがあれば、次の手順で中身を見られます。
.epub から .zip に変えるこれだけです。特別なソフトは要りません。EPUBはZIPそのものなので、警告も出ずに普通に展開されます。
「解凍できるなら、フォルダをZIPで固めて拡張子を .epub にすればEPUBができる」と思うかもしれませんが、そう単純ではありません。次章以降で説明する圧縮の仕方の決まりがあるためです。
解凍すると、だいたいこのような構成になっています。
OEBPS というフォルダ名や、その中の分け方は作ったツールによって変わります。item だったり xhtml だったりしますが、それで問題ありません。
一方、先頭の mimetype と META-INF/container.xml だけは、名前も場所も変えられません。 この2つだけが固定で、残りは自由——これがEPUBの構造を理解する第一歩です。
中身はたった一行、これだけです。
役割は「このZIPはEPUBです」と名乗ることです。ただし、このファイルには他のファイルにはない、厳しい決まりがあります。
読書アプリは、ファイルの先頭を少し読むだけで「これはEPUBだ」と判断できるようになっています。そのために、この位置と形式が決められています。
普通の圧縮ソフトでフォルダをZIPにすると、ファイルの順番は選べませんし、mimetype も一緒に圧縮されてしまいます。その結果、拡張子を .epub にしても読書アプリが開いてくれません。
この「先頭に、無圧縮で」という条件を満たすには、圧縮の手順を分けて実行する必要があります。EPUB作成ツールが最初にやっているのは、この処理です。
META-INF/container.xml の中身は、こんな内容です。
やっていることは1つだけで、「本の情報は OEBPS/content.opf にあります」と教えているだけです。
フォルダ名が自由なのは、この案内板があるからです。読書アプリはまず META-INF/container.xml を見て、そこに書かれた場所へ進みます。
ここがEPUBでもっとも重要なファイルです。大きく3つの部分に分かれています。
| 部分 | 役割 |
|---|---|
| metadata | タイトル、著者、言語など、本そのものの情報 |
| manifest | 収録しているファイルの一覧表 |
| spine | ページをめくる順番 |
ここで気をつけたいのが dc:title です。読書アプリの本棚に並ぶのは、ファイル名ではなくこの値です。 ファイル名を丁寧につけても、ここが空だと本棚に「無題」と表示されてしまいます。
dc:language も重要です。日本語なら ja を指定します。これがないと、読書アプリが日本語向けの組版ルールを適用してくれないことがあります。
EPUBに入っているファイルは、すべてここに登録されている必要があります。 画像を1枚追加したのに登録を忘れると、それだけでエラーになります。逆に、登録されているのに実物がない場合もエラーです。
目次のファイルには properties="nav" という印をつけます。これで「このファイルが目次です」と示しています。
manifest が「何が入っているか」の一覧なら、spine は「どの順番で読むか」を決めるものです。並び順がそのままページ順になります。
そして日本語の本で特に重要なのが page-progression-direction です。
| 値 | 意味 | 使う本 |
|---|---|---|
| rtl | 右から左へ進む | 縦書き・マンガ |
| ltr | 左から右へ進む | 横書き |
縦書きの本なのにこの指定がないと、ページをめくる方向が逆になります。 縦書きがうまくいかないときに最初に確認すべき箇所のひとつです。
EPUB 3では、目次を専用のファイルとして必ず用意します。見た目は普通のHTMLのリンク集ですが、epub:type="toc" という印がついているのが特徴です。
読書アプリの目次ボタンを押したときに出てくるのが、この内容です。リンク先のファイルが存在しないと、目次から飛べない本になります。
古いEPUB 2では toc.ncx というファイルが目次の役割を担っていました。EPUB 3では nav.xhtml に置き換えられていますが、古い読書アプリのために両方を入れているEPUBもあります。
ここから先は、Webページとほとんど同じです。
本文をどう分けるかは自由ですが、1ファイルが大きすぎると読書アプリの動作が重くなるため、章ごとに分けるのが一般的です。
ここまで見てきた通り、EPUBの構造そのものは複雑ではありません。本文と画像とデザイン指定を、案内板と一覧表と一緒に箱に詰める——それだけです。
ただし、守るべき決まりが細かくあります。
mimetype を先頭に、圧縮せずに入れるmanifest に登録するspine に正しく指定するひとつ欠けただけで、読書アプリが開けなかったり、ストアの入稿で弾かれたりします。しかもエラーの原因は、たいてい表示された内容からは分かりません。
だから実際の制作では、原稿や画像を渡せば構造を自動で組み立ててくれるツールを使うのが一般的です。とはいえ、中身を一度でも見ておくと、うまくいかないときに「どこを疑えばいいか」の見当がつくようになります。それがこの記事の目的です。