ArtSaltのサイドストーリー

音楽、フリーウェア、WEBサービス、食べものなどに関する日記。トラックバック、コメント歓迎。

KindleGenで電子書籍をつくる

Kindle用電子書籍を自分でつくるには Mobipocket Creator, calibre, Online ebook converter などが便利だけど、細かい箇所までこだわりたければ KindleGen のほうがいい。手順は…

  1. 本文のHTMLをつくる。
  2. 目次 (Table of Contents) をつくる。
  3. 表紙の画像や挿し絵を用意する。
  4. すべてのファイルを管理するOPFをつくる。
  5. KindleGenにOPFを読み込ませてMobipocketを生成する。

ご覧のとおり作業工程の大半はEPUBと全く同じ。

本文のHTMLを書く

電子書籍の本文を書く。Kindleに表示されるMobipocketファイルで使えるHTMLとCSSには以下のような特徴がある。

  1. p要素などの文字の大きさは {font-size:larger;} のようなCSSで変更可能だがh1-6要素では全く不可能。h1要素とh2要素の大きさの違いは明確だがh5要素とh6要素はほとんど区別できない。
  2. ブロックレベル要素の先頭がインデントされてしまう。上下のマージンがほとんどない。美しくないと感じるなら任意のブロックレベル要素に {text-indent:0em; margin-top:0.6em;} のようなCSSを指定する必要がある。
  3. blockquote要素の中にp要素などのブロックレベル要素を入れるとインデントされない。
  4. margin-left, margin-top, margin-bottom の指定は有効だが margin-right の指定は無視される。
  5. mbp:pagebreak というMobipocket独自の空要素がある。意味は読んで字のごとし。

上記#3はひどいバグだ。どんなCSSを書いてもインデントされない。たとえば

<blockquote style="margin-left:3%;">
	<p>アンドレ・カンドレって誰ですか。</p>
	<p>井上陽水のことです。</p>
</blockquote>

と書いても無駄。ゆえに以下のような見苦しいソースを書いて対処するしかない。すなわちp要素のタグを削ればKindleが当該要素をインデントする。

<blockquote>アンドレ・カンドレって誰ですか。</blockquote>
<blockquote>井上陽水のことです。</blockquote>

以下はHTML文書の例。ファイル名は何でもいいけどここでは content.html とする。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en-us" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="content-style-type" content="text/css" />
<style type="text/css">
<!--
h1, h2, h3, h4, h5, h6, p, ul, ol, dl, pre, blockquote, table
{margin-top:0.6em; text-indent:0em;}
.font_size
{font-size:x-large;}
-->
</style>
</head>

<body>
<h1><a name="TOC">目次</a></h1>

<ul>
<li><a href="#chapter1">第1章 - 桃太郎誕生</a></li>
<li><a href="#chapter2">第2章 - 鬼が島の対決</a></li>
</ul>

<mbp:pagebreak />
<h1>桃太郎</h1>
<h2>昔の人</h2>

<mbp:pagebreak />
<h2><a name="chapter1">桃太郎誕生</a></h2>

<p><img src="momo1.jpg" /></p>

<p>昔、昔、ある村におじいさんとおばあさんが住んでいました。ある日のことです。おばあさんが川で洗濯していました。しばらくすると川に大きな桃が流れてきました。おばあさんはとても驚きました。</P>

<mbp:pagebreak />
<h2><a name="chapter2">鬼が島の対決</a></h2>

<p><img src="momo2.gif" /></p>

<p>桃太郎はキジ、犬、猿を家来にしました。桃太郎は家来を引き連れて船に乗って鬼が島に向かいました。その島には怖い鬼がたくさんいました。桃太郎と家来たちは鬼を退治するつもりです。</p>

<p>桃太郎は勝ちました。鬼は負けました。桃太郎と家来たちはおじいさんとおばあさんのところに帰りました。<span class="font_size">終わり</span></P>

</body></html>

目次をつくる

以下は目次の例。ファイル名は何でもいいけどここでは toc.ncx とする。拡張子 ".ncx" は "Navigation Control for XML" の略。

<?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>dummy</text></docTitle>
	<navMap>
		<navPoint id="navPoint1" playOrder="1">
			<navLabel><text>dummy</text></navLabel>
			<content src="content.html#TOC" />
		</navPoint>
		<navPoint id="navPoint2" playOrder="2">
			<navLabel><text>dummy</text></navLabel>
			<content src="content.html#chapter1" />
		</navPoint>
		<navPoint id="navPoint3" playOrder="3">
			<navLabel><text>dummy</text></navLabel>
			<content src="content.html#chapter2" />
		</navPoint>
	</navMap>
</ncx>

おおざっぱに言うと、

  • HTMLファイルの名前
  • 上記HTMLで記述されたa要素のhref属性で指定されたアンカー名

をここで指定すればいい。

ここではdocTitle要素、navLabel要素、text要素として "dummy" という文字列を記述した。この部分の適切な名前はHTMLファイルの目次部分に書けばいいので "dummy" でもいいという判断。これを書いておけばKindle上で 5-way controller を左右に動かして前の章や後ろの章にジャンプできる。

表紙の画像、挿し絵など

JPEGでもGIFでも何でもよい。ただしMobipocket生成時にすべてGIFに変換される。

OPFは本文と目次と画像を管理するファイル

以下はOPFの例。ファイル名は何でもいいけどここでは content.opf とする。

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://www.idpf.org/2007/opf" version="2.0">

<metadata>
	<dc-metadata xmlns:dc="http://purl.org/metadata/dublin_core" xmlns:oebpackage="http://openebook.org/namespaces/oeb-package/1.0/">
		<dc:Language>en-us</dc:Language>
		<dc:Title>桃太郎</dc:Title>
		<dc:Creator>昔の人</dc:Creator>
	</dc-metadata>
</metadata>

<manifest>
	<item id="toc" media-type="application/x-dtbncx+xml" href="toc.ncx" />
	<item id="cover-image" media-type="image/jpg" href="cover.jpg" />
	<item id="content" media-type="application/xhtml+xml" href="content.html" />
</manifest>

<spine toc="toc">
	<itemref idref="cover-image" />
	<itemref idref="content" />
</spine>

<guide>
	<reference type="toc" title="目次" href="content.html%23TOC />
</guide>

</package>

ご覧のとおり、OPFは <package> に始まり </package> に終わる。package要素は以下の要素から構成される。

  • metadata
    • dc-metadata
      • dc:Language
      • dc:Title
      • dc:Creator
  • manifest
    • item
  • spine
    • itemref
  • guide
    • referenece

簡単に説明しとく。

metadata
その名のとおりメタデータ。音楽のMP3タグみたいな役割を果たしているわけだが省略は絶対に許されない。
manifest
Mobipocketに収斂する各種ファイルの宣言。たとえば表紙の画像なら「これは表紙の画像ファイルである」と宣言する。それからアドレスも指定する。
spine
表紙、本文、目次などの順番を決める要素。目次の場所が本文の直前か直後かはここの記述で決まるようだ。spineには「書物の背」という意味があるとか。
guide
Kindle上で "Go to Table of Contents" を可能にするにはguide要素が必須。目次に関して場所などを指定。

KindleGen実行

content.html, 画像, toc.ncx, content.opf, さらに kindlegen.exe をすべて同じディレクトリに置き、content.opf をマウスでドラッグして kindlegen.exe にドロップする。文法エラーがなければ content.mobi という名前のMobipocketが生成されるはず。

参考文献

Google
WWW ArtSaltのサイドストーリー
Web site (optional)
Comment - Need to type CAPTCHA, an image of distorted Japanese Hiragana or Katakana afterward.
Password - Not allowed to modify your comment later if password not entered.
On secret mode?
 

http://art2006salt.blog60.fc2.com/tb.php/1236-52abd656

このブログについて

最近のエントリ

カテゴリー
あわせて読みたいブログ

あわせて読みたい

最近のコメント
Internet Explorer
よりも便利です

Opera 9 - Always secure with Opera Firefoxをダウンロード!!

相互リンク