Markdownの原稿から簡単にKindle本を出版する方法

### この度KDPでJava SE書籍を2冊出版しました

皆さん、こんにちは、Udemy講師の斉藤賢哉です。この度『Amazon Kindle ダイレクト・パブリッシング』（以降KDP）から電子書籍を2冊、出版させていただきました。
・[『Learning Java SE Basic編』](https://amzn.asia/d/4z70k9d)
・[『Learning Java SE Advanced編』](https://amzn.asia/d/fNzcVde)
価格は前者が980円、後者が780円なのですが、「Kindle Unlimited」を利用している方は無料でお読みいただきます。実はこの両書籍ですが、内容は以下リンク先の一連のQiita記事と完全に同内容です。

https://qiita.com/KenyaSaitoh/items/4711a078a851510bc4da

Qiitaで無料で読めるコンテンツを敢えて書籍化したのは、「情報がまとまった書籍として手元に持っておきたい」「マーカーを引きながらKindleで読みたい」というニーズがあると考えたからですが、単に「Kindleで書籍を出してみたかったから」というのも大きな理由の一つでした。

今回、Qiita向けに作成したMarkdownから、Kindle形式のフォーマットに変換し、目次や体裁を整えた上でKDPで出版することができました。私がググって調べてみた限りでは、「Markdownから」という観点で参考になる情報がまとまっている記事が見つからなかったため、あくまでも「オレ流」にはなりますが、試行錯誤の末に確立した方法を皆さんにご紹介します。

### MarkdownからKindleフォーマットへの変換作業概要

結論としては、Markdownで書かれた記事が手元にある場合、それをKindle形式のフォーマットに変換して、KDPで出版するのは、それほど大した作業ではない、ということが分かりました。もちろんKindleで読んでいただくわけですから、たまに見かける「固定レイアウト」ではなく、フォントの拡大・縮小ができる「**可変レイアウト**」の方が圧倒的に良いですし、**Kindleの目次機能が使える**、というのもマストの要件ですね。

さてKindleが対応しているフォーマットには、DOCX、KPF、EPUB、MOBIといった種類があります。この中からどのフォーマットを選ぶかですが、Markdownから変換可能である、目次を作成可能である、という点を踏まえると、DOCX形式が現実的な選択肢になると思います。正直なところ私も最初はDOCXと聞いて,
「MS Wordを使わないといけないのか～」と抵抗感ありまくりでしたが、Wordでの編集作業はごく限定的ですので、その点はご安心ください。

### MarkdownからKDP出版に至る作業フロー

Qiita用に作成したMarkdownからKDPでの出版に至る作業フローは、以下のようになります。

(1)QiitaでMarkdownを書く
(2)Markdownをテキストファイルとして保存する
(3)テキストエディタなどでMarkdownを編集する（主に一括置換）
(4)MarkdownをDOCXに変換する
(5)変換後のDOCXをMS Wordで編集する
(6)編集後のDOCXをKindleでチェックする
(7)KDPで出版へ

詳細は後述しますが、この中でも人手による編集作業が必要なのは、「(3)テキストエディタなどでMarkdownを編集する」と「(5)変換後のDOCXをMS Wordで編集する」です。(3)は、テキストエディタでもいけますが、スクリプトが書ける人は正規表現で一括置換するのがお薦めです。(5)は、純粋にMS Wordでの編集作業になりますが、あまり大した労力ではありません。
また「(4)MarkdownをDOCXに変換する」と「(6)編集後のDOCXをKindleでチェックする」は、何らかのツールを使う必要がありますが、(4)では私はTyporaというツールを使いました。(6)はAmazonが提供する「Send to Kindle」というツール（Webサービス）を使います。

#### 作業(3)：テキストエディタなどでMarkdownを編集する

作業フローとしては、まず最初に「(1)QiitaでMarkdownを書」き、次に「(2)Markdownをテキストファイルとして保存」しますが、ここまでは説明不要と思います。Markdownは(4)でDOCX形式に変換するのですが、その前にKindleを意識して、テキストファイルとして実施しておくべき作業が幾つかあります。

##### コードブロック

まずQiitaでは、例えばJavaコードであれば、以下のようにコードブロックを記述しますよね。

![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/29b4b950-f18c-8d53-e445-d6441af8c6a2.png)

これが、そのままではKindleでは正しくコードブロックとして認識されず、また技術書として致命的なのがコード名である「Hello.java」という情報が失われてしまいます。色々試したところ、「java」の後ろの文字列が邪魔をしているようなので、これを削ります。ただし「コード名」は必要な情報なので、正規表現を利用して以下のように一括置換しました。置換方法はテキストエディタの機能を使っても良いですし、自分でちゃちゃっとスクリプトを書いても良いかと思います。

|置換対象文字列|置換後文字列|
|--|--|
|\```java:(.*)|【$1】\n```java|

すると、上記のコードブロックは以下のように変わります。

![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/50bf19ab-e9e6-0a38-e441-71047dcb4565.png)

これでコード名の情報は失われず、かつJavaコードとして認識されますので、Kindle上でもソースコードっぽく配色されるようになります。

##### ノート記法の修正

Qiitaではお馴染みのノート記法（「:::note info」や「:::note warn」）ですが、これはKindleでは認識されません。そこで別の表現に修正します。私は以下のように一括置換しました。

|置換対象文字列|置換後文字列|
|--|--|
|:::note info|【Information】|
|:::note warn|【Warning】|

##### 注釈記法の修正

Qiitaでは注釈記法は、`[^1]`と書きます。これはこのままKindleでも注釈として解釈されます。ただし、複数のQiita記事を統合し、まとめて1つの書籍にしようとすると、困ったことが起きます。1つ1つの記事の中で`[^1]`、`[^2]`とナンバリングされていても、統合すると番号が`[^1]`、`[^2]`、…、`[^1]`、`[^2]`、…と重複して登場することになってしまい、書籍全体を通してのナンバリングにはならない（ゆえにKindle上でも正しく認識されない）という問題です。
そこでこれもDOCX変換前に、テキストファイルとして修正してしまいましょう。私はプログラムを書いて、書籍全体で通しの番号が振られるようにしました。適当に書いたものですが、Javaだとこんなイメージですね。

```java
try (BufferedReader br = Files.newBufferedReader(dest);
        BufferedWriter bw = Files.newBufferedWriter(dest2)) {
    int ind1 = 0;
    int ind2 = 0;
    String line;
    Pattern pattern1 = Pattern.compile("\\[\\^\\d\\](?!:)"); // 注釈参照元
    Pattern pattern2 = Pattern.compile("\\[\\^\\d\\]:"); // 注釈説明文
    while ((line = br.readLine()) != null) {
        Matcher matcher1 = pattern1.matcher(line);
        Matcher matcher2 = pattern2.matcher(line);
        if (matcher1.find()) {
            ind1++;
            String after = matcher1.replaceAll("[^" + ind1 + "]");
            bw.write(after + System.lineSeparator());
        } else if (matcher2.find()) {
            ind2++;
            String after = matcher2.replaceAll("[^" + ind2 + "]:");
            bw.write(after + System.lineSeparator());
        } else {
            bw.write(line + System.lineSeparator());
        }
    }
    bw.flush();
} catch (IOException ioe) {
    throw new RuntimeException(ioe);
}
```

#### 作業(4)：MarkdownをDOCXに変換する

Markdown文書をDOCX形式に変換するためには、専用のツールが必要です。中でもお薦めなのがTypora(https://typora.io/)です。多くの皆さんは、Markdownを記述するとき、QiitaのWebブラウザ上で直接記述するか、VS Codeあたりを利用しているかと思います。私もそうしていますし、この原稿もそのように書いています。実は世の中にはMarkdown専用のエディタ製品があるのですが、その中でも代表的なのがTyporaです。見た目も洗練された高機能なMarkdownエディタです。15日間であればフリーで使え、14.99USD＋TAXで購入（買い切り）することもできます。試しにTyporaで、私のQiita記事（Markdown）をそのまま貼り付けてみるとこんな感じで、画像データも含めてそのまま取り込むことが可能です。

![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/6bb05ed9-a28a-de8f-6897-19ea93e58e15.png)

今回はこのTyporaを、Markdownエディタとしてではなく、DOCX変換のためのツールとして使います。Typoraで当該のMarkdownを開いてから、「ファイル」「エクスポート」を選択すると、以下のような画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/d149dee4-a1a7-c096-78a7-cef994f053e1.png)

この中から「Word(.docx)」を選択すると、MarkdownをDOCX形式に変換することができます。

#### 作業(5)：変換後のDOCXをMS Wordで編集する

作業(4)で変換したDOCXを、今度はMS Wordで編集します。MS Wordで変換後DOCXを開くと、このようにMarkdownの見出し記法が、DOCXでも見出しとして認識されていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/4fe7f40f-3ad7-4093-d7a2-9c0db7fdadba.png)

##### 目次を作成する
MS Wordの機能で目次を作成します。見出しがすでに出来上がっていますので、目次の作成は簡単です。具体的には、「参考資料」タブから「目次」を押下し、好みの目次レイアウトを選択します。すると、Markdownの構造に合わせて目次が自動的に作成されます。

##### 改ページを入れる
Markdownには「改ページ」という概念がないため、読み易さを向上させるために、MS Word上で文章の節目節目で改ページを入れます。

MS Wordの作業はざっと以上で終了です。Wordの作業に慣れていない、という方にも大きな負担にはならないものと思います。

#### 作業(6)：編集後のDOCXをKindleでチェックする

Amazonが提供する「Send to Kindle」というWebサービスを使って、作業(5)で作成したDOCXが、実際にKindleで閲覧するとどのようなイメージになるのかを確認します。
このサービスは以下のURLからアクセスします。DOCXをドロップするだけで、自分の端末上のKindleでDOCXを閲覧することができます。

https://www.amazon.co.jp/sendtokindle

#### 作業(7)：KDPで出版へ

作業(6)で問題なければ、コンテンツは完成なので、出版の準備が整ったことになります。
KDPのサイトで本人確認など必要な手続きを済ませたら、「タイトルの新規作成」を押下し、新規書籍のための画面に遷移します。
ここで書籍のタイトルや著者名などを入力し、作成済みのDOCXをアップロードします。また、書籍の表紙の画像は別途で作成しておき、同じようにアップロードします。
書籍の価格や、ロイヤリティオプションもこの時点で決定します。ロイヤリティオプションについて詳細は割愛しますが、35%プラン（価格の自由設定が可能、Amazon以外でも出版可）と70%プラン（価格制限あり、Amazon独占契約、Kindle Unlimited対象）がありますので、どちらかを選択します。
すべての情報を入力して保存すると、出版の準備が始まります。最大72時間で出版が開始される、とのことですが、私の場合は短いケースで4時間、長いケースでは半日程度でメールが通知され、出版開始となりました。

##### 解決しなかった字下げ問題

この方法で残念ながら解決できなかったのが、Kindle上で発生する字下げ問題です。具体的には以下のように、ソースコードの先頭に自動的に半角スペース分の字下げが入れられてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/d79129cc-72bd-d5ad-6877-adb4f6ae7299.png)

致命的ではありませんが、ちょっと気になりますよね。
なお、DOCX上では字下げ設定は入っておらず、また「Send to Kindle」で確認しても字下げが入っていないのに、なぜかKDPで出版すると、DOCX形式の場合はこのように自動的に字下げされてしまう、という不具合？のようです。
私が調べた限り、現時点ではこの問題を解決する方法はなさそうでしたが、解決できた方がいましたら、お知恵をお借りできると嬉しいです。