Thursday, October 15, 2020 / Chromebook, Crostini, AsciiDoc

Chromebook で AsciiDoc をビルドする環境をつくる

執筆用のChromebookにAsciiDocでコンテンツをビルドする環境をつくったときの備忘録です。 HTMLに変換するだけならわけないのですが、PDFに変換しようとすると日本語が文字化けしてしまう問題がありました。 ググってもかなり苦労したのと、Chromebook の Linux(Crostini) 環境での構築説明が見つからなかったのでメモを残します。 ChromeOS バージョンは Version 86.0.4240.77 (Official Build) (64-bit) です。

asciidoctor, asciidoctor-pdf をインストール

とりあえずは:

sudo apt get install asciidoctor

するだけで asciidoctor コマンドは入ります。

成果物としてHTMLだけをつくるつもりならこれでよいのですが、PDFも生成しようと思うと asciidoctor-pdf などが必要になり それらは apt では入らない(たぶん)ので 試行錯誤の上、結局 ruby と gem を使ってインストールしました。

apt で入れた方の asciidoctor は削除しましょう。 sudo apt remove asciidoctor

つまり、以下のようにしました。

sudo gem install asciidoctor
sudo gem install coderay
sudo gem install asciidoctor-pdf

coderay は ソースコード部分をシンタックスハイライトするものです。 これで asciidoctor と asciidoctor-pdf コマンドが入ります。

which asciidoctor
which asciidoctor-pdf

などして確認してみましょう。

AsciiDoc 形式で記事を書く

カレントディレクトリに article.adoc というファイル名で以下の内容を用意。

= 転生したらInDesignだった件
Tomoaki Oshima <tomo.osima@gmail.com>

:doctype: article
:source-highlighter: coderay
:icons: font

== はじまりはいつも夜だった

かずやは今夜も眠い目をこすりながらディスプレイを睨んでいた。

[source,javascript]
----
var applyParagraphStyle = function(textFrame, paragraphIndex, fontSize){
    if( paragraphIndex<textFrame.paragraphs.length ){
        var paragraph = textFrame.paragraphs[paragraphIndex];
        paragraph.pointSize = fontSize;
    }
};

applyParagraphStyle(textFrame, 0, '24Q');<1>
----
<1> 最初の段落を指定して フォントサイズを 24Q に変更

ちなみに、source-highlighter を指定しているが、この方法では適用できなかった。コマンドオプションとして指定すれば適用できた。方法は後述。

HTML,PDF に変換する

asciidoctor -b html article.adoc -o article.html
asciidoctor-pdf article.adoc -o article.pdf

これでそれぞれの形式に変換はできるのだが、PDFは日本語部分が文字化けしてしまう。
このように:

article-but-ng

それでどうしたら良いかと言えば、 https://github.com/asciidoctor/asciidoctor-pdf#support-for-non-latin-languages の説明の通り pdf-theme=default-with-fallback-font 指定すればとりあえずは回避できる。

つまり:

asciidoctor-pdf -a pdf-theme=default-with-fallback-font article.adoc -o article.pdf

これで日本語フォントが文字化けしないでPDF出力できました。 未確認ですが、事前に別途 Noto フォントをインストールしていたので、それがないと日本語が出ないかもしれません。

明示的に使うフォントを指定するなどは 別途 pdf theme 設定を yml で記述して指定するなど必要らしい。現状はそこまで把握していません。

その他、改行位置を調整してくれるなどの追加オプション scripts=cjk とか、PDF用紙サイズを指定するためオプション pdf-page-size=A5 を追加して、 最終的には変換コマンドは以下のようになりました。

asciidoctor-pdf -a scripts=cjk -a pdf-theme=default-with-fallback-font -a pdf-page-size=A5 article.adoc -o article.pdf

結果:

article

Code に Syntax Highlight を適用する

adoc 内で source-highligher として coderay 指定しているがうまく適用されない。 しかし、asciidoctor コマンドの引数として指定してやると難なく適用できました。

このように:

asciidoctor -a source-highlighter=coderay -b html article.adoc -o article.html
asciidoctor-pdf -a source-highlighter=coderay -a scripts=cjk -a pdf-theme=default-with-fallback-font -a pdf-page-size=A5 article.adoc -o article.pdf

なお coderay が対応している言語は coderay のサイト でご確認ください。

まとめ

コマンドを毎回打つのが面倒なので、Makefile にまとめます。

sudo apt install make して make コマンドを入れておくことが必要です.

Makefile

papersize:=A5

highlighter:=source-highlighter=coderay
cjk:=scripts=cjk
pdftheme:=pdf-theme=default-with-fallback-font

all: html pdf
html: article.html
pdf: article.pdf

article.html : article.adoc
	asciidoctor -a $(highlighter) -b html $< -o $@

article.pdf : article.adoc
	asciidoctor-pdf -a $(highlighter) -a $(cjk) -a $(pdftheme) -a pdf-page-size=$(papersize) $< -o $@

clean :
	rm -f *.html
	rm -f *.pdf