Home About Contact
Stack , Pandoc , EPUB , AsciiDoc

Ubuntu 22.04 への Pandoc 3.1.9 のインストール、Asciidoc から EPUB への変換

Kindle 用のEPUB生成に Pandoc を使っているのだが、古い Pandoc では、ソースコードとして json を記述した部分のインデントが意図通り変換されない問題があった。 そこで最新の Pandoc にすれば解決するかと思い、インストールをはじめた。 予想外に大変だったのでインストール記録を残す。 なお、json のインデント問題は解消されました。

しかし残念ながら、画面の横幅の狭い Android スマフォを使ってその Kindle アプリで閲覧した場合は、json のソースコードのインデントガタガタ問題は引き続き起きていた。 EPUB ソースを確認したがそちらは問題ない。おそらくは画面幅に応じて適切にレンダリング調整された結果、インデントが揃わなくなっていると思われる。 なぜなら、Kindle Paper White で見た場合は、該当箇所についてインデントガタガタ問題は生じていないから。

Stack を入れる

Stackを入れる方法がいくつかあるのですが、結果としてうまくいったのは、これです。

$ curl -sSL https://get.haskellstack.org/ | sh

https://docs.haskellstack.org/en/stable/install_and_upgrade/ に説明のあるとおりです。

もしかして、 apt で入れる( sudo apt install haskell-stack ) 方法やバイナリを落としてきて配置というのでも問題なかったかもしれません。

Pandoc を入れる

Stack さえあれば次のようにして、インストールできるらしいのですが:

$ stack unpack pandoc
$ cd pandoc-3.1.9
$ stack init
$ stack install

stack init ではなく stack setup すべき、なのか。init と setup でどうちがうのは、未把握。

どちらにしても、gcc や g++ が必要になるので、事前に入れておく必要があります。

$ sudo apt-get install g++ gcc libc6-dev libffi-dev libgmp-dev make xz-utils zlib1g-dev git gnupg netbase

これも https://docs.haskellstack.org/en/stable/install_and_upgrade/ に説明のあるとおりです。

今回、躓いたのは digest-0.0.1.7 です。

[S-7011]
       While building package digest-0.0.1.7 (scroll up to its section to see the error) using:

scroll up してみると:

digest                           > Configuring digest-0.0.1.7...            
digest                           > Error: Cabal-simple_6HauvNHV_3.8.1.0_ghc-9.4.7: The program 'pkg-config'
digest                           > version >=0.9.0 is required but it could not be found.

ということで、この ポイントは Error: Cabal ... The program 'pkg-config' version >= 0.9.0 is required but it could not be found という部分です。

要するに 0.9.0以上の pkg-config が必要だが それが ない ということ です。どうすれば pkg-config がある状態にできるのかわからなかったのですが、 どうやら apt で入れればよいようです。

$ sudo apt install pkg-config

これで、digest で躓く問題は解消され、うまく pandoc 3.1.9 を入れることができます。

先に書いたように pkg-config さえあれば、 stack unpack pandoc とか stack unpack pandoc-cli とかの流れで 普通にインストールできると思われますが、 今回、こちらの環境で、最終的に Pandoc 3.1.9 のインストールに成功した方法はこれです。

まず以下のいずれかのサイトから pandoc-3.1.9.tar.gz を入手する。

たぶん、どちらも同じ内容と思われるが実際はわかりません。

$ tar xf pandoc-3.1.9.tar.gz
$ cd pandoc-3.1.9
$ stack setup
$ stack install

結構時間かかりましたが、無事インストールできました。

AsciiDoc から EPUB を生成する方法

Pandoc を入れた目的が AsciiDoc で書いた原稿から EPUB を作り出すことなので、その方法も書き残します。 処理の全体像としては:

  1. AsciiDoc から Docbook に変換( asciidoctor を利用 )
  2. Docbook から EPUB に変換( Pandoc を利用 )

ということになります。

具体的に、たとえば foo.adoc から EPUB (foo.epub) をつくりだすには次のようにします。

$ asciidoctor -b docbook -o foo.adoc docbook.xml
$ pandoc docbook.xml \
    --from docbook --to epub3 -o foo.epub \
    --epub-cover-image=cover.jpg \
    --highlight-style my.theme

cover.jpg を用意しておきましょう。

なお、 asciidoctor から直接 EPUB を出すことができたと思いますが、 その方法で KDP (Amazon の Kindle Desktop Publishing) に使おうとすると文字化けするため、 pandoc を経由してEPUB をつくっている。

もちろん、文字化けを回避するような設定があるのかもしれないが、わからなかった。 または、それは2年前の話なので、今や asciidoctor から直接 EPUB 出しても問題ないのかもしれない。

スタイルのカスタマイズ

今回 はじめて --highlight-style オプションを使ってみたのですがこれ便利ですね。

詳しくは、このページに書いてあります。

次のようにすれば、デフォルトテーマである pygments のデフォルト設定を my.theme ファイルに書き出すことができます。

$ pandoc --print-highlight-style pygments > my.theme

属性ごとにカラー設定 (CSS 的な)が書いてあるので、必要なら変更すればよいです。 今回変更したかったのは、json のソースコードを書く部分で json 文法エラーになると赤色の文字になるのですが(デフォルトの振る舞い) それを抑止したい、ということで黒色に変更しました。

diff -u をメモしておきます。

--- my.theme.org	2023-11-04 05:16:55.042742269 +0000
+++ my.theme	2023-11-04 05:16:46.914705217 +0000
@@ -61,9 +61,9 @@
             "underline": false
         },
         "Error": {
-            "text-color": "#ff0000",
+            "text-color": "#000000",
             "background-color": null,
-            "bold": true,
+            "bold": false,
             "italic": false,
             "underline": false
         },

本来 json 文法が正しくなければ赤字になるのはうれしいのだが、 本で説明するときに、json 全体ではなく一部だけを書きたいことがある。 その場合に、部分 json なので必ず json 文法エラーになってしまう。 そして、その部分が赤字+ボールドになる。 これは不都合なので、黒字+非ボールドに変更する設定を入れました。

まとめ

Haskell 勢(Stack, Pandoc)はネットの情報が少ない気がする。(単にグーグル検索で見た場合に表出しにくいだけなのかもしれない。) ググっても簡単に解決できないので辛い。

それから、 この手順で EPUB 生成したとき EPUBの目次の階層が意図通りにならなかった。 2レベルまでの階層構造は問題ないのだが、3レベル階層まで下がったあと、2レベルに戻る部分がおかしくなってしまう。 ただし、この現象が何が原因で起こるのかなど詳しいことは調べていない。