Amazonで電子出版した

親父(元教員)が自分の書いた論文を電子出版したいと言ってきたので、父親が作成したWordファイルを基に EPUB に変換して電子出版した。 EPUB の実態はHTML+CSSだったので、簡単に変換することが出来た。

大きな流れ

今回の作業の肝は、文章を構造化することである。構造化とは、文書の要素に対して、引用や見出しのレベルを指定するものである。こうすることで、コンピューターが処理しやすくなる。例えば、引用の箇所は、30ポイント左の空白を一律で空けるといったようなことが簡単に出来る。また、見出しを基に自動的に目次を生成することが可能になる。

親父から送られてきたWordファイルは、次のようなものであった。

  • 引用だけスタイルが指定してある。見出しは強調しているだけで、自身でナンバリングしている。Wordの場合、見出しに章の番号を自動で振るのは複雑なのでこうなるのもよくわかる。
  • 傍点・圏点、ルビを利用している
  • セルを結合している複雑な表がある

今回の作業は、Pandocを利用して次のように変換を行った。Markdownに変換後、構造化を行った。EPUBの編集の際には、GitHub上で親父と修正作業を行った。

  1. Wordファイル(.docx)
  2. Markdown
  3. EPUB

Google DocumentがEPUB形式の書き出しが出来ると聞き、Wordファイルを取り込んでみたが、ルビや圏点・傍点に対応していないことが判明したために利用を見送った。Google Documentが利用できると、親父と簡単に共同作業ができるため、ありがたかったのだが。

WordファイルからMarkdownへの変換

pandoc を利用し、次のコマンドで変換を行った。

$ pandoc input_file.docx -t markdown-raw_html-native_divs-native_spans -o output_file.md

Markdownの感想

WordからMarkdownへ変換を行っているが、本来は不要な工程だ。 docxファイルから変換できる数少ないフォーマットて、電子書籍に関する巷のノウハウが一番存在するのがMarkdownだったため、消極的な理由から利用していた。次に述べるように、日本語の電子書籍に用いるには、ベターだがベストではないソリューションであると感じた。

Markdownの利点

  • テキストファイルなのでGitを用いた構成管理が可能
  • 対応しているエディタが多く、編集作業が行いやすい。プレビューを見ながらの編集が行えたり、文法のチェックが簡単に行える。
  • 文法がシンプルなため、習得が用意

Markdownの欠点

  • セルの結合など複雑な表に対応できない。ただし、HTMLで記載すれば対応できるので、問題なし。
  • ルビ、圏点・傍点などが対応していない。ただし、HTMLで記載すれば対応できるので、問題なし。
  • 強調するのに分かち書きが必須ではないようだが、利用していたMarkdownエディタだと認識してくれない。

Markdown から EPUBの変換

pandocでEPUBファイルに変換後、そのままではGitで管理できないため、構成管理できるようにした。

pandocのコマンドは、メモし忘れた。

構成管理できるように、.epub ファイルの拡張子を .zip に変更し、解凍し、Gitに追加した。ルートファイルは次のようになる。

f:id:Artisan:20200505092137p:plain
解凍したEPUBファイル

EPUBファイルの編集

単なるHTML+CSSファイルのため、お好きなエディタで編集すればよい。 親父とは、GitHub上でやりとりをした。ITエンジニアではないが、文書の修正はやってもらえた。

EPUBファイルのビルド

Gitに格納されているのは、解凍された状態なので、圧縮して .epub の拡張子のファイルを生成する必要がある。

次のようなMakefileを作成し、適宜makeコマンドを実行した。

all:
    rm main.epub;cd epub;zip -X0 ../main.epub mimetype;zip -9 -r ../main.epub META-INF OEBPS
$ make

EPUBにおける日本語固有の処理

ルビ

漢字等のよみを表示する。

例:規範ノモ秩序

<ruby>規範<rt>ノモ</rt>秩序<rt></rt></ruby>

圏点・傍点

文字の上に「・」が表示されるもの。強調を意味する。

あらゆる創造を<span class="emph-dot">になう</span>
span.emph-dot {
  text-emphasis-style: dot;
  -epub-text-emphasis-style: dot;
  -webkit-text-emphasis-style : dot;
}

構文チェック

epubcheckを利用した。

github.com

Amazonへの登録

省略

まとめ

  • EPUBはHTML+CSSのスキルがあれば容易
  • Wordが基ファイルの場合には、Pandocを利用し、変換を行う必要がある

epubcheckで「mimetypeファイルエントリが存在しないか、アーカイブの先頭以外の場所に存在しています.」

epubcheckというEpub向けのW3C製の構文チェッカーがあります。 実行するとありがたい指摘をしてくれるのですが、次のエラーだけは原因が分かりませんでした。

$ java -jar epubcheck.jar ~/tmp/main.epub 
EPUB version 3.2 のルールを使って検証します.
ERROR(PKG-006): /home/Artisan/tmp/main.epub(-1,-1): mimetypeファイルエントリが存在しないか、アーカイブの先頭以外の場所に存在しています.

チェックは終了しましたがエラーが検出されました
メッセージ: 0 件の致命的エラー / 1 件のエラー / 0 件の警告 / 0 件の情報

EPUBCheck 完了

調べたところ、次のようなやりとりを発見。

github.com

どうやら、mimetype を圧縮せずに zip し、その後その他のリソースを圧縮して追加せよとのことらしい。 詳細はよくわからんが、次のようにすればOKらしい。本当はしっかりオプションを理解しないとだめなんだろうけど…。

$ zip -X0 ../main.epub mimetype
$ zip -9 -r ../main.epub META-INF OEBPS

PHPのマジックメソッド

__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() および __debugInfo() があるみたい。

https://www.php.net/manual/ja/language.oop5.magic.php

ここでは、__toString()__invoke() の使い方を簡単に説明する。

__toString()

クラスが文字列に変換される際の動作を決めるもの。

__invoke()

オブジェクトを関数としてコールされる際に呼び出されるもの。

<?php
class TestClass
{
    public function __toString()
    {
      return 'toString() is called.';
    }

    public function __invoke()
    {
      return 'invoke() is called.';
    }
}

$class = new TestClass();
echo $class;
echo $class();

出力結果

toString() is called.invoke() is called.

MySQLにパスワード無しでログインする

ただし、絶対に開発環境などセキュリティが担保されているところで利用してね。

my.cnfに次のように設定する。

[mysqld]
skip-grant-tables

sudo systemctl restart mysql

などでMySQLを再起動させる。