オープンソースの画像生成AIをセットアップから使い方まで解説する『Stable Diffusion AI画像生成ガイドブック』(ソシム刊)発売中(→本のサポートページ

Re:VIEWで電子書籍とInDesign向けXMLを作るぞ

Wordで書かれた原稿をInDesignDTPして、同時にリフロー型の電子書籍にもしたいという案件が来た。

Re:VIEW」というテキスト変換ツールがある。決められた記法で書かれたテキストファイルをEPUB形式の電子書籍Markdown、HTML、InDesign向けXML(IDGXML)などに変換してくれる。TeXをインストールすればPDFでの出力も可能。@kmutoさんなどが開発している。

この種のテキスト変換ツールでは「Pandoc」というのもある。Pandocの記法はMarkdownを拡張したもの。

今回PandocではなくRe:VIEWを採用したのは、「リード文」(章や節の冒頭に載る、ここからの内容の概略)を指定する記法があったりして書籍の執筆向けであるとか、IDGXMLのInDesignへの取り込みで(ツールをひとつ通すと)いい感じにいけるとわかったから。

WindowsMacRe:VIEW環境をインストール

Re:VIEWRubyで動作する。WindowsRe:VIEWを使うにはまずRubyをインストールする。「RubyInstaller」からインストールするのが簡単だ。

Rubyをインストールしたのち、「コマンドプロンプト」から「gem install review」でRe:VIEWがインストールされる。Rubyのインストール前にコマンドプロンプトを開いていた場合、環境変数(PATH)の変化を反映させるためにコマンドプロンプトを再起動する。

検索してみると「WindowsRe:VIEWを使うにはCygwinを」という解説がたくさん見つかるが、今のRe:VIEWWindowsコマンドプロンプトで使うことができる。

MacにはRubyがプリインストールされている。「ターミナル」から「sudo」(管理者として実行)を加えて「sudo gem install review」とする。

gemとgemsのアップデート
gemコマンドのアップデートは「gem update --system」、インストールされたgemsのアップデートは「gem update」。Re:VIEWだけアップデートしたいときは「gem update review」。Macではそれぞれ先頭に「sudo 」をつける。

.reファイルの執筆環境

上の記事で、テキストエディタAtom」でRe:VIEW向け設定を使う方法が解説されている。シンタックスハイライトだけでなくリアルタイムプレビューもできるそうでこれはいいですね。

Windows版で試してみたら、自分のところではプレビューはエラーが出てうまくいかなかった。「language-review」パッケージについて「Uncaught TypeError: Cannot read property 'getParent' of null」とのこと)

Re:VIEWを使ってみる

「review-init ドキュメント名」と実行すると、標準的な設定ファイルやフォルダを作ってくれる。

「.re」ファイルからHTMLを作るには、たとえば「sample.re」からなら「review-compile --target html sample.re > sample.html」。

(設定ファイルを置かない場合、CSSはreファイルと同じディレクトリにある「stylesheet.css」を参照する。stylesheet.cssの例は https://github.com/kmuto/review/blob/master/test/sample-book/src/style.css などに)

InDesign向けXMLにするには「review-compile --target idgxml sample.re > sample.xml」。これは後述する方法でもう一度変換してからInDesignで読み込むとよい。

EPUBを作るには「sample.yml」などyml形式のテキストファイルに設定を書いて「review-epubmaker sample.yml」。

Re:VIEWの解説書

Re:VIEWについてひと通り解説した同人誌が無償で提供されている。

EPUBやPDFに出力するためのファイル一式が提供されているので、Re:VIEWを使って自分で変換するとよい。ただしPDFでの出力はTeXのインストールが必要でちと大変。

EPUBの閲覧は「Calibre」で

EPUBの閲覧にいいのは電子書籍管理ソフトの「Calibre」で、Windows/Mac/Linux用が提供されている。

IDGXMLをInDesignに読み込むための変換スクリプト

Re:VIEWで出力したIDGXMLはそのままだとInDesignではちょっと使いづらい。変換するスクリプトがあった。

これは「xsltproc」を使うということでMacにインストールしようとしたが、そのために必要な「libxml」をMacへインストールできなかった。

libxmlのソースは↓にある。ここから自分でコンパイルすればいいかもしれない。

Windowsではxsltprocをインストールできた。しかしこれがなかなか大変だった。xsltprocのインストール方法は↓で解説されている。

ここで説明されているのは「libxslt」のインストールだがこのページで正しい。このページの「Prev」にはこう書いてある。

1.2. xsltprocとは

xsltprocとはlibxsltを使用したツールで、XMLファイルに対してXSLを適用させるためのコマンドラインツールです。

libxsltに付属しています。

1. はじめに

さて、xsltproc(libxslt)をインストールするにはあらかじめインストールしておくべきソフトがいろいろある。ここがけっこう大変なのだった。

  1. gettextをインストール(解説:http://saj.co.jp/techinfo/htmls/other-gettext-install_windows_precompile.html
  2. libiconvとzlibをインストール(解説:http://saj.co.jp/techinfo/htmls/xml-libxml2-install_windows_precompile.html
  3. libxml2をインストール(解説:http://saj.co.jp/techinfo/htmls/xml-libxml2-install_windows_precompile.html

この順序でインストールしていって、やっとxsltproc(libxslt)をインストールできる。お疲れさまでした。

ユーザー環境変数の追加について

xsltprocのインストールに際しては、実行ファイルを置いた場所を環境変数「PATH」に指定してあげる必要がある。

「システムのプロパティ」([Win]+[Break]→「システムの詳細設定」)→「詳細設定」タブの[環境変数]ボタンをクリック→[PATH]をクリックして[編集]ボタンをクリック、「変数値」の末尾にxsltprocのインストールディレクトリ(「;C:\bin\usr\bin」など)を記入する。

IDGXMLをInDesignへ読み込む手順

まず「review-compile --target idgxml 変換元.re > 変換元.xml」などで.reファイルをIDGXMLに変換する。次に「名もないテクノ手に」にあるスタイルシートをたとえば「4review.xsl」などで保存して、「xsltproc 4review.xsl 変換元.xml > 変換先.xml」などとすればInDesign向けに読み込みやすいXMLファイルになる。

XMLファイルをInDesignに読み込む方法の解説は以下。

この記事の「XMLの読み込み」に、InDesignXMLを流し込む方法が解説されている。InDesign側であらかじめ段落スタイルや文字スタイルを作っておき、XMLのどのタグをどのスタイルに割り当てるかを指定していく。

ここでしっかりやっておけば、InDesignに流し込んでからの作業が格段に楽になる。

「技術書典」にRe:VIEWInDesignを使った組版の解説本が出る

6月25日にアキバで開催される技術書オンリーの同人誌即売会「技術書典」で、@kmutoさん自ら執筆の『Re:VIEW+InDesign制作技法』なる本が販売されるとのこと。買います!

Wordファイルからテキストをちゃんと取り出すソフト「xdoc2txt」

ところで今回の仕事では元原稿がWord形式で提供されている。これをいったんテキスト形式に変換しなければならなかった。

Wordでdocxファイルなどを読み込み、「名前を付けて保存」でテキスト形式(txt)を選択しても、テキストボックス内の文字が出力されなかったりしてうまくない。

そんなあなたに「xdoc2txt」。WordやExcel、PDFなどのファイルから文字を取り出す。テキストボックス内の文字列もちゃんと取り出してくれてありがたい。

(docxやpdfをドラッグ&ドロップできるショートカットを作るときは、ショートカットのプロパティの「ショートカット」タブにある「リンク先」を「C:\…\xdoc2txt.exe -f -8 -o=0」にするとUTF-8のテキストファイルに書き出される)

WZ Editor 5.x向けのRe:VIEW向け色分けスタイル設定

わかる人向けです。Re:VIEWのすべての記法を網羅しきれていない可能性があります。最新版のWZ Editorと互換性があるかは不明です。

reword(use=1;rgb="0x0000FF";atr=2;re=1): https?://[\w/\:;%\.,\$\&\!@\+\?=~\#-]+
reword(use=1;rgb="0x0080C0";atr=3;re=1): ^\s\*+\s|^\s\d+\.\s|^\s:\s
reword(use=1;rgb="0x800040";atr=0;re=1): ^\*+\^\+\]+
words(use=1;rgb="0xC46B00";atr=0;flag=1): @  @< >{ } ( ) //

1つの.reファイルを分割するPerlスクリプト

Re:VIEWで1つの.reファイルを複数のHTMLに分割して出力する方法がわからない。どうもRe:VIEWは1つの.reファイルにはh1要素(「= 」で始まる行、章タイトルの扱いになる)が1つしかない前提で作られているようだ。しかし原稿全体を検索したいときや一括置換したいときなど、複数の.reファイルを横断的に検索するのはちょっと手間だし間違いも入りやすい。1つの.reファイルでh1が出てくるごとにHTMLファイルを分割して出力するようなしくみがほしい。

といっても今のところどうにもならないので、h1ごとに「.re」を生成するPerlスクリプトを書いた。

以下をサンプル「all.re」として保存する。

#@# ここから「preface.re」

* 本書中に登場する各種の会社名、製品名は一般に各社の登録商標です。

= はじめに

本書が読者の皆さんの役に立つことを願っています。

#@# この行から下が「chap1.re」

= あれについて

あれこれ

#@# この行から下が「chap2.re」

= これについて

これそれ

以下のPerlスクリプトを「all.re」と同じディレクトリに置いて実行する。自分用なのでファイル名、分割方式などはすべて決め打ちになっている。

上のページで紹介されていたスクリプトでは1行ごとにファイル出力していたが、それだとディスクへの書き込みがたくさん発生して処理がものすごく遅かった。分割するファイルの内容ごとに変数に入れていき、最後にまとめてファイル出力する処理にしたらすぐ終わるようになった。

#! /usr/local/bin/perl
use warnings;

my $chap=0;
my $infile="all.re"; #入力ファイルのファイル名
my $outfilename = "preface.re"; #最初の出力ファイル名だけ「preface.re」固定、2つめから"chap".n-1.".re"に
# $infileの冒頭(見出しなし)〜最初のh1〜次のh1の手前までを「preface.re」として出力、
# 2つめのh1から次のh1の前の行までを「chapN.re」として出力

open IN, $infile or die $!;

while (<IN>) {
	if (/^= .+/) {
		$chap++;
		$out[$chap] .= $_;
	}
	else {
		$out[$chap] .= $_;
	}
}
close IN;
my $i = -1;
foreach (@out){
	if ($i > 0){
		$outfilename = "chap".$i.".re";
		open (OUT , "> $outfilename");
		$outarray = $i + 1;
		print OUT $out[$outarray];
		}
	else {
		open (OUT , "> $outfilename");
		print OUT $out[0].$out[1];
		}
	$i++;
}
close(OUT);
exit;

これで「preface.re」「chap1.re」「chap2.re」が生成される。これに合わせた「config.yml」や「catalog.yml」をあらかじめ作っておけば、このPerlスクリプトの実行に続けて「review-epubmaker config.yml」をすればEPUBが作られるというわけ。そういうバッチファイルを書いた。

Re:VIEWへの要望:見出し文字列を取得しつつ見出しへリンクしたい

Re:VIEWでは「@{#見出しid,リンク文字列}」という書式で見出しへリンクできる。ただし「リンク文字列」の部分は自分で書かなければならないから、あとで見出しを書き換えたりしたら「リンク文字列」も忘れずに書き換えなければならない。

また「@{章id}」という記法などもあり、これは「第x章「これについて」」 のような文字列に置換される。@の中の「リンク文字列」の部分を、@みたいに章idを指定して取得できたらいいなあ。実はできるのかな?

(こういう要望はGitHubにissueを立てればいいのかなー。でもGitHubは恐ろしくてできない)

追記:config.ymlでの指定でリンクになる由

「config.yml」に「chapterlink: true」と書いておくことで、@や@で参照した文字列がその見出しへのリンクになるとのこと。確かにできました。@kmutoさんありがとうございます。

EPUBのお手軽作成は「でんでんコンバータ」で

EPUBへの変換という目的だけなら「でんでんコンバータ」が簡単だ。

Markdownをもとにした「でんでんマークダウン」でいろいろ指定する。

「でんでんコンバータ」は画像などの構成ファイルが50ファイルまでという制限があるため今回は採用しなかった。また、(EPUBの内部的に)章ごとに別のHTMLファイルに分かれてほしいときにどうしたらいいのかもわからず。

md2reviewでMarkdownRe:VIEW形式に変換

MarkdownRe:VIEW形式に変換するには「md2review」を使う。

「ターミナル」から「gem install md2review」でインストールされる。

Windowsでも同様に「install md2review」。

MacRubyのバージョンが低いとき

こんな手順でmd2reviewをインストールできた。

  1. Homebrewをインストール(http://brew.sh/index_ja.html
  2. gitを2.3.5にバージョンアップ(https://sourceforge.net/projects/git-osx-installer/files/?source=navbar
  3. rbenvをインストール(brew install rbenv ruby-build)
  4. Ruby 2.3.0をインストール(rbenv install 2.3.0)
  5. md2reviewをインストール(gem install md2review)

Pandoc用Re:VIEWのWriter

ひょっとしてこれを使えば、Pandocが扱えるいろいろなファイルを直接Re:VIEW向けに変換できるのかもしれない。(未検証)

カスタムWriterを使用するには、単にLuaスクリプトへのパスを出力フォーマットとして指定するだけです。例えば:

pandoc -t data/sample.lua
Pandoc ユーザーズガイド 日本語版 - Japanese Pandoc User's Association

とのこと。

はてな記法Markdown記法の相互変換

はてな記法を使ってマークアップした文書をRe:VIEWに使いたいことがあるかもしれない。またその逆もあるかもしれない。そういった場合、間にMarkdownを挟んで変換することになる。(以下はいずれも未検証)

はてな記法Markdown(Hateda2md)
一生涯はてな記法しますか?それともMarkdownしますか?(http://melborne.github.io/2012/05/05/to-be-hatena-notation-or-to-be-markdown/
Markdownはてな記法(hatena.lua
PandocのカスタムWriterでMarkdownからはてな記法に変換 - Qiita(http://qiita.com/takada-at/items/4d94a8811b4aaa5d5fd3

Markdownになればmd2reviewでRe:VIEW形式に変換できる。Re:VIEWからMarkdownへの変換はRe:VIEW本体で可能である。

Pandoc向けのはてな記法Writerもあるもよう。

(6月9日記)