ナビゲーションドキュメントの作成

ナビゲーションドキュメントは出版物の構造を表現したり,読者が出版物の特定の箇所にジャンプできる仕組みを提供したりすることで,出版物の利便性やアクセシビリティを高める役割を持つドキュメントです.EPUBの出版物には必ずナビゲーションドキュメントが必要です.

EPUB 2.0.1のナビゲーションドキュメントは,NCXというXMLで記述されたファイルでしたが,EPUB 3.0ではナビゲーションドキュメントもXHTML5で記述することになりました.Sigilで作成したNCXファイルは,OEBPS/toc.ncxというファイル名となっています.ここでは,OEBPS/toc.ncxから,EPUB 3.0に対応したナビゲーションドキュメントを作成する方法を解説します.

最初にナビゲーションドキュメントにするXHTMLファイルを作成しましょう.このチュートリアルでは,OEBPS/Text/nav.xhtmlというファイル名でナビゲーションドキュメントを作成することにします.ファイルの中には,まずbody要素以外の部分を記述しておきます.xmlns:epub="http://www.idpf.org/2011/epub" という名前空間宣言が必要となる点に注意してください.

OEBPS/Text/nav.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2011/epub" lang="ja" xml:lang="ja">
<head> 
  <title></title>
</head> 

<body>
  …
</body>
</html>

出版物としての『草枕』の構造は,以下のようなものです.草枕という大きな見出しがあり,その内容は「一」から「十三」までの場面に分かれています.

この情報がOEBPS/toc.ncxでは,次のような形で記述されています.個々の単位は,navPointという要素の中に記述されています.ジャンプ先の場所はcontent要素のsrc属性に記述しています.

OEBPS/toc.ncx
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN"
   "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">

<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">
  <head>
    …
  </head>
  <docTitle>
    <text>草枕</text>
  </docTitle>
  <navMap>
    <navPoint id="navPoint-1" playOrder="1">
      <navLabel>
        <text>草枕</text>
       </navLabel>
       <content src="Text/Section0001.xhtml"/>
       <navPoint id="navPoint-2" playOrder="2">
         <navLabel>
           <text>一</text>
         </navLabel>
         <content src="Text/Section0001.xhtml"/>
       </navPoint>
       <navPoint id="navPoint-3" playOrder="3">
         <navLabel>
           <text>二</text>
         </navLabel>
         <content src="Text/Section0002.xhtml"/>
       </navPoint>
         …
       <navPoint id="navPoint-14" playOrder="14">
         <navLabel>
           <text>十三</text>
         </navLabel>
         <content src="Text/Section0013.xhtml"/>
       </navPoint>
     </navPoint>
    </navMap>
</ncx>

OEBPS/toc.ncxと同じ内容のナビゲーションを,EPUB 3.0では以下のように記述することができます.nav要素の内部に,ol要素とli要素で番号付きリストと,ジャンプ先のドキュメントのハイパーリンクを記述します.このハイパーリンクの参照するURIは,NCXファイルのcontent要素が持つsrc属性の値と一致させます.nav要素にはepub:typeという属性を付与することで,様々な役割のナビゲーションを記述することができます.目次に相当するナビゲーションには,epub:typeにtocという値を指定します.この目次用ナビゲーションをEPUBの仕様ではtoc navと呼びます.ナビゲーションドキュメントには,toc navが必ず必要です.なお,ナビゲーションドキュメントには,複数のナビゲーションを作成することができますが,toc navは一つしか作ることはできません.

OEBPS/Text/nav.xhtml
<body>
  <nav epub:type="toc" id="toc">
    <h1>目次</h1>
    <ol>
      <li><a href="Title.xhtml">草枕</a>
        <ol>
          <li><a href="Section0001.xhtml">一</a></li>
<li><a href="
Section0002.xhtml">二</a></li>
          …
          <li><a href="Section0013.xhtml">十三</a></li>
        </ol>
      </li>
    </ol>
  </nav>
</body>

応用としてより深い構造を持った出版物の目次の例を示します.以下のような階層構造をもった出版物があるとします.

この出版物が「章」単位のXHTMLファイルに分割して記述してあり,それぞれのXHTMLファイルが複数の「節」や「項」を含むとします.この場合,toc navは例えば以下のようになものになります.「節」や「項」のハイパーリンクには,#から始まる文字列であるアンカーを使用しています.

EPUB Navigation Document
<body>
<nav epub:type="toc" id="toc">
<h1>目次</h1>
<ol>
  <li><a href="chap1.xhtml">第一章</a>
    <ol>
      <li><a href="chap1.xhtml#sec-1.1">第一節</a>
        <ol>
          <li><a href="chap1.xhtml#sec-1.1.1">第一項</a></li>
          <li><a href="chap1.xhtml#sec-1.1.2">第二項</a></li>
        </ol>
      </li>
      <li><a href="chap1.xhtml#sec-1.2">第二節</a></li>
      …
    </ol>
  </li>
  <li><a href="chap2.xhtml">第二章</a></li>
  …
</ol>
</nav>
</body>

このtoc navが参照するXHTMLファイルは以下のようになっています.toc navのアンカーと同じ文字列は,参照先の要素が持つid属性の値と一致しています.

chap1.xhtml
<?xml version="1.0" encoding="UTF-8"?> 
<html  lang="ja" xml:lang="ja">
<head> 
  <title>第一章</title>
</head> 
<body> 
  <h1 id="sec-1.1">第一節</h1>
    <h2 id="sec-1.1.1">第一項</h2>
    <h2 id="sec-1.1.2">第二項</h2>
    …
  <h1 id="sec-1.1">第二節</h1>
    …
</body> 
</html>

これ以降,OEBPS/toc.ncxは使用しません.情報の重複を避けるために削除するか,EPUBを展開したディレクトリの外に移動しておいてください.

EPUB 3.0では後方互換性のため,EPUBファイルがNCXファイルを内包することを認めていますが,このチュートリアルではXHTMLのナビゲーションドキュメントのみを利用することにします.

manifestにナビゲーションドキュメントを追加する

作成したナビゲーションドキュメントのエントリをパッケージドキュメントであるOEBPS/content.opfに記述します.パッケージドキュメントをテキストエディタで表示してください.パッケージドキュメントでは,manifest要素の中に出版物を構成するファイルを登録しなければなりません.ここにナビゲーションドキュメントを追加する代わりにOEBPS/toc.ncxに関するエントリは削除してしまいます.また,表紙画像であるcover.pngに関するエントリも,EPUB 3.0の仕様に従った形に修正しました.

OEBPS/content.opf変更前
<?xml version="1.0" encoding="UTF-8"?>
<package …>
  …

  <manifest>
    …
    <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
    <item id="cover.png" href="Images/cover.png" media-type="image/png"/>
    … 
  </manifest> 

  … 

</package>
OEBPS/content.opf変更後
<?xml version="1.0" encoding="UTF-8"?>
<package …>
  …

  <manifest>
    …
    <item properties="nav" id="nav.xhtml" href="Text/nav.xhtml" media-type="application/xhtml+xml"/>
    <item properties="cover-image" id="cover.png" href="Images/cover.png" media-type="image/png"/>
    …
  </manifest>

  …

</package>

上記のコードが示すとおり,EPUB 3.0ではitem要素にproperties属性を加えることで,出版物のリソースに対してより詳細な意味付けを行います.ここではナビゲーションドキュメントと表紙画像であるcover.pngにproperties属性を付与しました.properties属性に利用する値には次の表のようなものがあります.ナビゲーションドキュメントのエントリだけは,必ず一つ必要です.

表.item要素のproperties属性に使用する値
必要性 基数 説明
cover-image オプショナル ゼロ以上 このアイテムが表紙画像であることを表します.
mathml 該当するアイテムに必要 ゼロ以上 このアイテムがMathMLを利用していることを表します.
nav 必要 1 このアイテムがナビゲーションドキュメントであることを表します.
remote-resources 該当するアイテムに必要
ゼロ以上 このアイテムが外部リソースを利用していることを表します.
scripted 該当するアイテムに必要
ゼロ以上 このアイテムがスクリプトを利用していることを表します.
svg 該当するアイテムに必要
ゼロ以上 このアイテムがSVGのマークアップを利用していることを表します.

これらの値についてのより詳細な説明は,EPUB Publication 3.0 [Publication30] を参照してください.

spineの修正

パッケージドキュメントでは,manifest要素の次にspine要素があります.spine要素には出版物の読み順を記述します.EPUB 2.0.1では, spine要素はtoc属性を持っており,値にmanifestに記述したNCXファイルのidを指定していました.EPUB 3.0ではナビゲーションに NCXファイルを利用しないため,この属性は不要となります.次のようにtoc属性を削除してください.

OEBPS/content.opf変更前
  <spine toc="ncx">
    …
  </spine>
OEBPS/content.opf変更後
  <spine>
    …
  </spine>

spineにナビゲーションドキュメントを追加する

EPUB 3.0のナビゲーションドキュメントはXHTMLで記述してあるため,コンテンツの一部として読者に表示することもできます.ナビゲーションドキュメントを表示するためには,パッケージドキュメントのspine要素の中に,ナビゲーションドキュメントのエントリを追加します.spine要素の記述順序は,出版物の読み順を表しているため,エントリを記述する位置に注意してください.以下の例では,表紙であるCover.xhtmlの後ろにナビゲーションドキュメントを指定しています.itemref要素のidref属性の値は,manifestに記述したitemのid属性の値と一致するようにしてください.

OEBPS/content.opf
<?xml version="1.0" encoding="UTF-8"?>
<package …>
  …

  <manifest>
    …
    <item properties="nav" id="nav.xhtml" href="Text/nav.xhtml" media-type="application/xhtml+xml"/>
    …
  </manifest>

  <spine>
    <itemref idref="Cover.xhtml"/>
    <itemref idref="nav.xhtml"/>
    …
  </spine>

  …

</package>

以下のコードはスタイルシートを利用してナビゲーションの表示を簡略化した例です.この例では,「節」にあたる階層は表示されますが,「項」にあたる階層は表示されません.

EPUB Navigation Document
…
<ol>
  <li><a href="chap1.xhtml#sec-1.1">第一節</a>
    <ol style="display:none">
      <li><a href="chap1.xhtml#sec-1.1.1">第一項</a></li>
      <li><a href="chap1.xhtml#sec-1.1.2">第二項</a></li>
    </ol>
  </li>
  <li><a href="chap1.xhtml#sec-1.2">第二節</a></li>
      …
</ol>
…

この例が示すように,ナビゲーションそのものの持つ情報を減らすのではなく,スタイルシートで見栄えを制御するようにしてください.

landmarks navを追加する

これまでの工程で,ナビゲーションドキュメントを作成して,目次用のナビゲーションであるtoc navを記述しました.今度は,一歩進んで,別の目的を持ったナビゲーションを作成してみましょう.なおナビゲーションドキュメントにとって,toc nav以外のナビゲーションは必須ではありません.EPUB 3.0として必要最低限の対応を行う場合には,このセクションは飛ばしてしまっても構いません.

テキストエディタでパッケージドキュメントであるOEBPS/content.opfを表示してみてください.このファイルの中には,以下のようなguide要素の記述が見つかるはずです.これは,Sigilで作成したセマンティクスの情報を記述したものです.

OEBPS/content.opf
<?xml version="1.0" encoding="UTF-8"?>
<package …>
  <metadata …>
    …
  </metadata>

  <manifest>
    …
  </manifest>

  <spine>
    …
  </spine>

  <guide>
     <reference type="cover" title="Cover" href="Text/Cover.xhtml"/>
  </guide>

</package>

このguide要素がEPUB 3.0では,将来的には廃止される予定となっているため,利用が推奨されていません.その代わりナビゲーションとしてセマンティクスを記述する仕組みが用意されています.セマンティクスを記述したナビゲーションを,仕様ではlandmarks navと呼びます.

OEBPS/Text/nav.xhtml
<body>
  <nav epub:type="toc" id="toc">
    …
  </nav>

  <nav epub:type="landmarks">
    <h2>Guide</h2>
    <ol>
        <li><a epub:type="loi" href="Cover.xhtml">表紙</a></li>
        <li><a epub:type="toc" href="#toc">目次</a></li>
    </ol>
  </nav>
</body>