言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Kindle 電子書籍の作り方 (Kindlegen)

ingalls_new

前回 Mobipocket Creator を使った mobi ファイルの作り方について書きました。 今回は Kindlegen http://www.amazon.com/gp/feature.html?docId=1000234621 を使って電子書籍を作る方法です。Kindlegen は Window と linux で動くコマンドラインツールで、原始的なだけに mobi ファイルの作成には何が必要なのかという事がより理解しやすいと思います。題材として短い方が良いと思うので Daniel H. H. Ingalls の Design Principles Behind Smalltalk を使います。

$ mkdir ingalls
$ cd ingalls
$ wget -m -np http://www.cs.virginia.edu/~evans/cs655/readings/smalltalk.html
$ mv www.cs.virginia.edu/~evans/cs655/readings/smalltalk* .

ではおもむろに kindlegen を使ってみます。

$ kindlegen.exe smalltalk.html

ingalls_old

単純な HTML なのでこれでもそれなりに読めますが、練習のために目次を付けてみます。最初機械的に付けようかと思ったのですが、HTML が意外と汚いので手で付ける事にしました。まず、目次はこんなかんじ。

<a name="TOC"/><h2>Contents</h2>
<p><a href="#Introduction">Introduction</a></p>
<p><a href="#Language">Language</a></p>
<p><a href="#Communicating_Objects">Communicating Objects</a></p>
<p><a href="#Organization">Organization</a></p>
<p><a href="#User_Interface">User Interface</a></p>
<p><a href="#Future_Work">Future Work</a></p>
<mbp:pagebreak />

mbp:pagebreak というのは mobi 独自のタグで、改ページだそうです。あとは適当に name タグを付けます。たとえば Language の所はこんな具合です。

<a name="Language"/>
<h2>Language</h2>

FONT タグを見出しに使っていたりすると後が面倒なので、この時点で少しずつ HTML が論理的になるよう掃除してゆきます。目次自体にも TOC という名前を付けます。次に、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">

   <docTitle><text>Design Principles Behind Smalltalk</text></docTitle>

   <navMap>
      <navPoint id="navPoint-1" playOrder="1">
         <navLabel><text>Contents</text></navLabel><content src="smalltalk.html#TOC"/>
      </navPoint>
      <navPoint id="navPoint-2" playOrder="2">
         <navLabel><text>Introduction</text></navLabel><content src="smalltalk.html#Introduction"/>
      </navPoint>
      <navPoint id="navPoint-3" playOrder="3">
         <navLabel><text>Language</text></navLabel><content src="smalltalk.html#Language"/>
      </navPoint>
      <navPoint id="navPoint-4" playOrder="4">
         <navLabel><text>Communicating Objects</text></navLabel><content src="smalltalk.html#Communicating_Objects"/>
      </navPoint>
      <navPoint id="navPoint-5" playOrder="5">
         <navLabel><text>Organization</text></navLabel><content src="smalltalk.html#Organization"/>
      </navPoint>
      <navPoint id="navPoint-6" playOrder="6">
         <navLabel><text>User Interface</text></navLabel><content src="smalltalk.html#User_Interface"/>
      </navPoint>
      <navPoint id="navPoint-7" playOrder="7">
         <navLabel><text>Future Work</text></navLabel><content src="smalltalk.html#Future_Work"/>
      </navPoint>
   </navMap>
</ncx>

さて、ここまで来たら本格的に書誌情報(メタ情報)を作ります。書誌情報というのは作者名やタイトル等の事です。先ほどは html から自動抽出されましたが、自分で指定する事も出来ます。これは smalltalk.opf という名前で作ります。toc.ncx もここで指定します。 を指定すると、Kindle の Go To Beginning や Table of Contents といった特別のメニューが有効になります。

<?xml version="1.0" encoding="utf-8"?>
<package unique-identifier="uid">
  <metadata>
    <dc-metadata xmlns:dc="http://purl.org/metadata/dublin_core"
    xmlns:oebpackage="http://openebook.org/namespaces/oeb-package/1.0/">

      <dc:Title>Design Principles Behind Smalltalk</dc:Title>
      <dc:Language>en-us</dc:Language>
      <dc:Creator>Daniel H. H. Ingalls</dc:Creator>
      <dc:Description>from the BYTE August 1981 Special Issue on Smalltalk</dc:Description>
      <dc:Date>02/19/2010</dc:Date>
    </dc-metadata>
    <x-metadata>
      <output encoding="utf-8" content-type="text/x-oeb1-document">
      </output>
      <EmbeddedCover>smalltalk_files/dpbs_figure1.gif</EmbeddedCover>
      <SRP Currency="USD">0.99</SRP>
    </x-metadata>
  </metadata>
  <manifest>
    <item id="item1" media-type="text/x-oeb1-document" href="smalltalk.html"></item>
    <item id="toc" media-type="application/x-dtbncx+xml" href="toc.ncx"></item>
  </manifest>
  <spine toc="toc">
    <itemref idref="item1" />
  </spine>
  <tours></tours>
  <guide>
    <reference type="toc" title="Table of Contents" href="smalltalk.html%23TOC"></reference>
    <reference type="start" title="Startup Page" href="smalltalk.html%23Introduction"></reference>
  </guide>
</package>

ほかにも HTML を掃除したり色々必要ですが、そんなわけでこのファイルを kindlegen に指定すれば書籍が完成します。

$ kindlegen.exe smalltalk.opf

ソースコードを以下に置きます。また、出来た本もレポジトリに置いておきます。

http://github.com/propella/DesignPrinciplesBehindSmalltalk

まとめ

  • 本の内容を HTML で書く。
  • ナビゲーション用に toc.ncx ファイルを作る。
  • 書誌情報、html と toc.ncx へのリンクを opf ファイルに書く。
  • kindlegen で opf ファイルを指定する。