EPUB生成を変更
2018年8月、review-ext.rbによるOverride拡張で脚注のEPUB生成を変更しました。
Re:VIEWのバージョンは2.5.0です。
>review version 2.5.0
Windows10に書籍執筆支援システム「Re:VIEW」をインストールして使用しています。
脚注について
脚注とは、本文の枠外に記載した用語解説や補足説明などです。文章中の説明したい箇所に脚注番号などの特定の記号を付け加え、ページ下の欄外や文書の末尾に説明となる記述をします。
Re:VIEWでは、脚注番号を付けるところに「@<fn>{識別ID}」インライン命令を記述し、脚注本文は「//footnote[識別ID][本文]」で記述します。
テスト原稿
テスト原稿(sample5)を作成します。
= はじめてのRe:VIEW == Re:VIEWとは @<b>{Re:VIEW}@<fn>{ChangeName}は、電子書籍向けの簡易なマークアップ言語で 記述したテキストファイルをEPUBやPDFなどの形式に変換する ツールセットです。 @<b>{Re:VIEW}は、2002年ごろに青木峰郎さんが開発しました。 その後、武藤健志@<fn>{Participation}さんが開発・保守を引き継いでいます。 == Re:VIEWの文書変換 @<b>{Re:VIEW}は、マークアップファイル(.re)で書いた原稿から EPUBやPDFを出力することができます。 //footnote[ChangeName][ 最初は「ReVIEW」という名称でしたが、2014年に「Re:VIEW」となりました] //footnote[Participation][ 武藤さんは、2018年1月から参画しました]
EPUB結果
EPUBを生成すると脚注番号と脚注本文を出力しました。脚注本文は、//footnoteを書いた位置に出力します。本文の直後に表示しているので、少々気になります。
脚注番号をクリックするとポップアップ画面で脚注本文を表示します。紙の書籍では実現不可能なポップアップ画面が使えることは、EPUB電子書籍の魅力の一つですね。
PDF結果
PDFを生成すると脚注番号と脚注本文を出力しました。脚注本文は、ページ下方のアンダーラインの下に表示しています。一般的な紙の書籍で見る形式で美しく、やはり組み版システムのTeXの実力ですね。
脚注のEPUB生成を変更したい
脚注は、テキスト内に表示する脚注参照番号から脚注本文へリンクしています。しかし、脚注本文から脚注番号への逆方向へリンクしていません。
脚注本文を読んでいて、本文のどの部分に書いてあるのか気になることがあります。双方リンクにすれば、電子書籍の魅力がもっと増すと思います。
脚注のEPUB生成
Re:VIEWで生成したEPUBの内容を解析してみます。EPUBをzip解凍して、コードを確認します。(OEBPS>sample5.xhtml)
<b>Re:VIEW</b> <a id="fnb-ChangeName" href="#fn-ChangeName" class="noteref" epub:type="noteref">*1</a> は、電子書籍向けの簡易なマークアップ言語で記述したテキストファイルをEPUBやPDFなどの形式に変換するツールセットです。 <b>Re:VIEW</b>は、2002年ごろに青木峰郎さんが開発しました。 その後、武藤健志 <a id="fnb-Participation" href="#fn-Participation" class="noteref" epub:type="noteref">*2</a> さんが開発・保守を引き継いでいます。 ・・・ <div class="footnote" epub:type="footnote" id="fn-ChangeName"> <p class="footnote">[*1] 最初は「ReVIEW」という名称でしたが、2014年に「Re:VIEW」となりました</p> </div> <div class="footnote" epub:type="footnote" id="fn-Participation"> <p class="footnote">[*2] 武藤さんは、2018年1月から参画しました</p> </div>
脚注番号(*1)は、「fnb-識別ID」という名称を付けて「#fn-識別ID」へのリンクになっています。
<a id=”fnb-ChangeName” href=”#fn-ChangeName” class=”noteref” epub:type=”noteref”>*1</a>
脚注本文は、「#fn-識別ID」の<DIV>定義となっています。
<div class=”footnote” epub:type=”footnote” id=”fn-ChangeName”>
<p class=”footnote”>[*1] 最初は「ReVIEW」という名称でしたが、2014年に「Re:VIEW」となりました</p>
</div>
双方向リンクにするには、脚注本文から脚注番号「fnb-識別ID」へのリンクを付ければよさそうです。しかし、Re:VIEWが生成する部分なので手が出ません。
システム書き換えができる?
Re:VIEW フォーマットガイドにRe:VIEWの構文説明があります。しかし、Re:VIEWに関する資料が不足しています。
最近発見したのですが、Docs » Re:VIEW ナレッジベースという宝のページがあります。
ナレッジベースに、review-ext.rbによる拡張の基本について説明があります。
Docs » Re:VIEW のモンキーパッチによる拡張の基本
この仕組みを利用すれば、ソースコードを改造しなくてもRe:VIEWがEPUB生成するコードをカスタマイズできそうです。
Re:VIEWのシステムコードを参考にします。
私の環境のRe:VIEWシステムは、「C:\Ruby25-x64\lib\ruby\gems\2.5.0\gems\review-2.5.0\」以下にインストールしています。
EPUB生成に関するコードは、lib\review\htmlbuilder.rbで定義しています。
@fnインライン命令と//footnote命令の部分を参考にします。
def inline_fn(id) if @book.config['epubversion'].to_i == 3 %Q(<a id="fnb-#{normalize_id(id)}" href="#fn-#{normalize_id(id)}" class="noteref" epub:type="noteref">*#{@chapter.footnote(id).number}</a>) else %Q(<a id="fnb-#{normalize_id(id)}" href="#fn-#{normalize_id(id)}" class="noteref">*#{@chapter.footnote(id).number}</a>) end rescue KeyError error "unknown footnote: #{id}" end def footnote(id, str) if @book.config['epubversion'].to_i == 3 puts %Q(<div class="footnote" epub:type="footnote" id="fn-#{normalize_id(id)}"><p class="footnote">[*#{@chapter.footnote(id).number}] #{compile_inline(str)}</p></div>) else puts %Q(<div class="footnote" id="fn-#{normalize_id(id)}"><p class="footnote">[<a href="#fnb-#{normalize_id(id)}">*#{@chapter.footnote(id).number}</a>] #{compile_inline(str)}</p></div>) end end
モンキーパッチでシステム書き換え
サンプルに従ってreview-ext.rbのコードを書きます。
module ReVIEW module BuilderOverride # 「Builder」のメソッドへの上書き・追加など</span> end class Builder prepend BuilderOverride # これでBuilderに上書きが反映される end end
EPUB生成なので、BuilderはHTMLBuilderです。footnoteの関数を定義して、参照元のコードをベースにして「fnb-識別ID」へのリンクを挿入します。
module ReVIEW ### footnoot命令の変更 module HTMLBuilderOverride def footnote(id, str) if @book.config['epubversion'].to_i == 3 puts %Q(<div class="footnote" epub:type="footnote" id="fn-#{normalize_id(id)}"><p class="footnote"><a href="#fnb-#{normalize_id(id)}">(≪)</a> [*#{@chapter.footnote(id).number}] #{compile_inline(str)}</p></div>) else puts %Q(<div class="footnote" id="fn-#{normalize_id(id)}"><p class="footnote">[<a href="#fnb-#{normalize_id(id)}">*#{@chapter.footnote(id).number}</a>] #{compile_inline(str)}</p></div>) end end end class HTMLBuilder prepend HTMLBuilderOverride # これでHTMLBuilderに上書きが反映される end end
システム書き換え結果
EPUBを生成すると、脚注本文から脚注番号へのリンクが作成できました。(≪)をクリックすると本文内の脚注番号へジャンプします。
まとめ
書籍執筆支援システム「Re:VIEW」でreview-ext.rbによる構文拡張で脚注のEPUB生成を変更しました。
Re:VIEWシステムは、モンキーパッチによりオリジナルのソースコードを変更することなくコードを拡張できるので便利です。