2011年6月8日水曜日

ePub 2.0 ことはじめ (5) 目次の作成

の続きです。

Makefile ができたので、XHTML ファイルを編集しても最少の手間で ePub ドキュメントを生成できるようになりました。本エントリーでは、「目次」の作成方法を解説します。

目次の作成

iBooks では目次がないと ePub ドキュメントとして不正に扱われます。そのため、簡単な目次の作成方法については「絳アト日記: ePub 2.0 ことはじめ (1) シンプルな ePub を作る」で解説しました。おさらいしてみましょう。

目次を作るには、まず content.opf ファイルに目次ファイル「toc.ncx」があることを認識させます。そして、toc.ncx ファイルで目次を作ります。

content.opf ファイルの変更点

content.opf ファイルにおける目次ファイルの変更部分は二か所です。

まず manifest 要素に toc.ncx が ncx (目次) ファイルであることを登録します。今回の場合、次のようになります:

<manifest>
  <item id="ncx" href="toc.ncx" media-type="text/xml" />
  ...
 </manifest>

id 属性値は ncx としておくのが無難でしょう。href 属性値は自由に決めて構いませんが、拡張子は ncx とします。今回は toc.ncx という名前を採用しました。media-type 属性値は text/xml です。

次に spine 要素に toc 属性を追加します。属性値は目次ファイルの ID です:

 <spine toc="ncx">
目次ファイル (toc.ncx) は次のようになります:
<?xml version="1.0" encoding="UTF-8"?>
<ncx xmlns="http://www.daisy.org/x3986/2005/ncx/" version="2005-1">
  <head>
    <meta name="dtb:uid" content="akaato.com20110418"/>
    <meta name="dtb:depth" content="1"/>
    <meta name="dtb:totalPageCount" content="0"/>
    <meta name="dtb:maxPageNumber" content="0"/>
  </head>
  <docTitle>
    <text>ePub 2.0 ことはじめ</text>
  </docTitle>
  <navMap>
    <navPoint id="chap1" playOrder="1">
      <navLabel>
        <text>第一章 ことはじめ</text>
      </navLabel>
      <content src="chap1.xhtml"/>
    </navPoint>
  </navMap>
</ncx>

dtb:uid

目次ファイルの例を見れば分かる通り、目次ファイルには一つの navMap 要素が入ります。navMap 要素の前はヘッダーと考えて構いません。navMap 要素の中身が目次となって表示されます。

navMap 要素の中に目を移す前に、目次ファイルのヘッダー部分へ注意を向けましょう。ここに meta 要素で name="dtb:uid" というコードがあります。この属性値には、content.opf ファイルで dc:identifier で設定した値から「urn:uuid」を除いたものを設定します。

今回の例では、content.opf の概当部分は次の様になっていますから

 <dc:identifier id="BookId">urn:uuid:akaato.com20110418</dc:identifier>

toc.ncx の概当部分は下記の様になります:

 <meta name="dtb:uid" content="akaato.com20110418"/>

navPoint

navMap 要素の中には複数の navPoint 要素を入れることができます。この navPoint が「目次」となります。

一般的な navPoint 要素は次の様になります。

<navPoint id="目次用のID" playOrder="目次の順番 (数字)">
 <navLabel><text>目次名</text></navLabel>
 <content src="URL"/>
</navPoint>

「目次用のID」は content.opf 内の ID とは無関係です。playOrder の順番に目次が並べられます。navPoint 要素は入れ子にすることも可能ですし、「#name」も利用可能です。

一例です。

<navMap>
  <navPoint id="chap1" playOrder="1">
    <navLabel>
      <text>第一章 ことはじめ</text>
    </navLabel>
    <content src="chap1.xhtml"/>

    <navPoint id="chap1" playOrder="2">
 <navLabel>
   <text>1.1 利用可能な要素</text>
 </navLabel>
 <content src="chap1.xhtml#elem"/>

 <navPoint id="structure" playOrder="2">
   <navLabel><text>1.1.1  構造要素</text></navLabel>
   <content src="chap1.xhtml#structure"/>
 </navPoint>

 <navPoint id="text" playOrder="3">
   <navLabel><text>1.1.2  テキスト</text></navLabel>
   <content src="chap1.xhtml#text"/>
 </navPoint>

 <navPoint id="link" playOrder="4">
   <navLabel><text>1.1.3  ハイパーリンク</text></navLabel>
   <content src="chap1.xhtml#link"/>
 </navPoint>

 <navPoint id="list" playOrder="5">
   <navLabel><text>1.1.4  リスト</text></navLabel>
   <content src="chap1.xhtml#list"/>
 </navPoint>

 <navPoint id="fix" playOrder="6">
   <navLabel><text>1.1.5  修正</text></navLabel>
   <content src="chap1.xhtml#fix"/>
 </navPoint>

 <navPoint id="table" playOrder="7">
   <navLabel><text>1.1.6  テーブル</text></navLabel>
   <content src="chap1.xhtml#table"/>
 </navPoint>
    </navPoint>
  </navPoint>
</navMap>

結果です。iPhone の iBooks で表示させました。

0 件のコメント:

コメントを投稿