論理目次と視覚目次を別にする

先日「目次にルビをつけてください」というリクエストにのけ反った。
『電子書籍の目次が難しい』http://t2aki.doncha.net/?id=1366594374
この時、教えてもらって、論理目次と視覚目次を別に作って対応。忘れないうちにメモしておこうと、すっかり忘れてたので改めてメモ。
EPUB3の目次は2種類。
・デバイスやアプリで使うための「論理目次」
・画面に表示するための「視覚目次」
たぶん、ひとつの目次ファイルを両方に使うことが多いと思う(って、『EPUB3::かんたん電子書籍作成』 が、ひとつの目次ファイルを論理目次と視覚目次に使っている)
でも、論理目次は使えるタグが限られていて、ルビタグなどはエラーになる。
そこで、論理目次とは別ファイルで視覚目次用のファイルを作る。こっちは本文のページと同じくxhtmlファイルとして使われるので、ルビタグも使える。
・パッケージファイル content.opf
manifest部分
<item id="nav" href="text/nav.xhtml" media-type="application/xhtml+xml" properties="nav" />
<item id="text.display.xhtml" href="text/display.xhtml" media-type="application/xhtml+xml" />
spine部分
<!-- <itemref idref="nav" linear="no" /> -->
<itemref idref="text.display.xhtml" linear="yes" />
manifestで視覚目次も指定しておいて、spineでは視覚目次を入れて、論理目次を外してしまう。
・ナビゲーション文書 nav.xhtml
toc 部分
<nav epub:type="toc" id="nav">
<h1>目次</h1>
<ol>
<li style="diplay:none;" hidden="hidden"><a href="display.xhtml">目次</a></li>
...
</ol>
</nav>
landmarks 部分
<nav epub:type="landmarks" id="landmarks" hidden="hidden" style="display:none;">
<h2>Guide</h2>
<ol style="list-style-type:none;">
<li><a epub:type="cover" href="cover.xhtml">表紙</a></li>
<li><a epub:type="toc" href="display.xhtml">目次</a></li>
<li><a epub:type="bodymatter" href="title.xhtml">本文</a></li>
</ol>
</nav>
ナビゲーション文書の目次部分(toc)には、視覚目次を入れておく(目次に「目次」という項目があるのはイヤなので display:none として、ここでは表示させないようにした)
landmarks 部分に視覚目次を指定しておく。
・視覚目次 display.xhtml
視覚目次はナビゲーション文書のtoc部分(olタグ)だけのファイルで、ルビなどのタグが使える。
クライアントからのリクエストはこれで解決だった。
こうすることで、レイアウト・デザインが自由にできる目次が可能だけど、目次をふたつ持つことで間違いの元がひとつ増える。本当はひとつで済ませたいところだったなあ。

