達人出版会日記

ITエンジニア向けの技術系電子書籍の制作と販売を行う達人出版会のブログです。

はじめてのEPUB:その2

昨日の日記は割と好評のようで、気を良くしながらの第2回です。

今回は、1つの.epubなファイル内に複数のXHTMLコンテンツドキュメントを持つ場合の書き方を試してみます。

コンテンツドキュメントが複数ある場合、それは「章」と同じような単位として扱われるようです。もっとも、ドキュメントにはそのように明記されているわけではないので、はっきりしたことは分かりませんでした。ただ、いくつかのサンプルを見た感じではchapterごとにファイルができているようですし、またbookwormの日本語の画面では「前章へ」「次章へ」というナビゲーションが表示される(ただし英語版では「Previous」「Next」だった)ところを見ると、それっぽいような気がします。

今回のファイル構成は以下のようになります。

sample2/mimetype
sample2/META-INF/container.xml
sample2/OEBPS/content.opf
sample2/OEBPS/text/content001.xhtml
sample2/OEBPS/text/content002.xhtml
sample2/OEBPS/text/content002b.xhtml
sample2/OEBPS/text/content003.xhtml
sample2/OEBPS/text/content004.xhtml
sample2/OEBPS/toc.ncx

mimetype、container.xmlは、ファイルの中身もパスも前回と同じです。ファイルとして違うのは、前回は一つだったcontent*.xhtmlファイルが、5つに分かれているところです。また、content002b.xhtmlとなっているのは、ちょっとした仕掛けがあるためです。これは toc.ncx ファイルを説明するところで触れます。

content.opfファイルは以下のようになります。

<?xml version="1.0"?>
<package xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookID" version="2.0">
    <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
        <dc:title>サンプルその2</dc:title>
        <dc:creator opf:role="aut">高橋征義(達人出版会)</dc:creator>
        <dc:language>ja</dc:language>
        <dc:identifier id="BookID" opf:scheme="URL">http://example.com/epub/sample/sample2.epub</dc:identifier>
    </metadata>
    <manifest>
        <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
        <item id="c001" href="text/content001.xhtml" media-type="application/xhtml+xml"/>
        <item id="c002" href="text/content002.xhtml" media-type="application/xhtml+xml"/>
        <item id="c002b" href="text/content002b.xhtml" media-type="application/xhtml+xml"/>
        <item id="c003" href="text/content003.xhtml" media-type="application/xhtml+xml"/>
        <item id="c004" href="text/content004.xhtml" media-type="application/xhtml+xml"/>
    </manifest>
    <spine toc="ncx">
        <itemref idref="c001"/>
        <itemref idref="c002"/>
        <itemref idref="c002b" />
        <itemref idref="c003"/>
        <itemref idref="c004"/>
    </spine>
</package>

基本的には前回とあまり変わっていません。大きく違うのは、 manifest要素内のitem要素がいっぱい増えたところと、spine要素のitemref要素が増えたところです。これらは、複数あるコンテンツドキュメントを順番にすべて表示させる場合には、同じ数だけ記述します。

もう少し具体的に説明すると、manifest要素の方は、表示に使われるファイルを示すものです。つまり、表示用のファイルが一通りmanifest内に網羅されていることになります。一方、spine要素は、各ドキュメントのファイルが表示される際の、その流れというか順番を指定する要素のようです。そのため、manifest要素の中には出てきても、spine要素には出てこない、ということもあります。その逆はないはずです。

さて、続いて、toc.ncxファイルです。

<?xml version="1.0"?>
<!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" xml:lang="ja">
    <head>
        <meta name="dtb:uid"
              content="http://example.com/epub/sample/sample2.epub"/>
        <meta name="dtb:depth" content="1"/>
        <meta name="dtb:totalPageCount" content="0"/>
        <meta name="dtb:maxPageNumber" content="0"/>
    </head>
    <docTitle>
        <text>サンプル</text>
    </docTitle>
    <navMap>
        <navPoint id="navPoint-1" playOrder="1">
            <navLabel>
                <text>1章</text>
            </navLabel>
            <content src="text/content001.xhtml"/>
        </navPoint>
        <navPoint id="navPoint-2" playOrder="2">
            <navLabel>
                <text>2章</text>
            </navLabel>
            <content src="text/content002.xhtml"/>
            <navPoint id="navPoint-2-1" playOrder="3">
              <navLabel>
                <text>2章おまけ</text>
              </navLabel>
              <content src="text/content002b.xhtml"/>
            </navPoint>
        </navPoint>
        <navPoint id="navPoint-3" playOrder="4">
            <navLabel>
                <text>3章</text>
            </navLabel>
            <content src="text/content003.xhtml"/>
        </navPoint>
        <navPoint id="navPoint-4" playOrder="5">
            <navLabel>
                <text>4章</text>
            </navLabel>
            <content src="text/content004.xhtml"/>
        </navPoint>
    </navMap>
</ncx>

これまた長いですね……。たいしたことはやってないんですけど。

前回と比べると、navMap要素の内のnavPointが増えています。これの書き方はよく分かってないのですが、ここに要素を列挙すると、その分ナビゲーションのところに表示される項目が増えます。

あと、先ほど触れていたちょっとした仕掛けというのは、第2章のところです。ここは、navPoint要素が入れ子になっています。こういうのができるらしいんです。実際にやってみると、リーダによってはナビゲーションが入れ子と言うか、一段階深くなることがわかります。

そういえば、コンテンツドキュメントのファイルは紹介してませんでした。content001.xhtmlは以下のようになります。

<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<title>サンプル文書001</title>
</head>
<body>
<h1>見出しその1</h1>
<p>こんにちはこんにちは!(1)</p>
</body>
</html>

その他のcontent*.xhtmlも同じような感じで作っておきます。

それでは表示させてみましょう。Calibreではこんな感じです。

ナビゲーションがそれっぽいです。

bookwormだとこんな感じです。

こちらだと、左のナビゲーションのところで、2章のおまけが表示されていません。これは、2章を表示させているときには表示されます。

こんな感じです。EPUBリーダの挙動の違いはこんなところにもあるようです。