Re:VIEWのOverride拡張でEPUB生成を変更する方法

Re:VIEW Override拡張

Re:VIEW Override拡張

EPUB生成を変更

2018年8月、review-ext.rbによるOverride拡張で脚注のEPUB生成を変更しました。

Re:VIEWのバージョンは2.5.0です。

>review version
2.5.0

Windows10に書籍執筆支援システム「Re:VIEW」をインストールして使用しています。

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脚注

EPUB脚注

脚注番号をクリックするとポップアップ画面で脚注本文を表示します。紙の書籍では実現不可能なポップアップ画面が使えることは、EPUB電子書籍の魅力の一つですね。

EPUB脚注 ポップアップ画面

EPUB脚注 ポップアップ画面

PDF結果

PDFを生成すると脚注番号と脚注本文を出力しました。脚注本文は、ページ下方のアンダーラインの下に表示しています。一般的な紙の書籍で見る形式で美しく、やはり組み版システムのTeXの実力ですね。

PDF脚注

PDF脚注

脚注の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を生成すると、脚注本文から脚注番号へのリンクが作成できました。(≪)をクリックすると本文内の脚注番号へジャンプします。

EPUB脚注 逆リンク

EPUB脚注 逆リンク

 

まとめ

書籍執筆支援システム「Re:VIEW」でreview-ext.rbによる構文拡張で脚注のEPUB生成を変更しました。

Re:VIEWシステムは、モンキーパッチによりオリジナルのソースコードを変更することなくコードを拡張できるので便利です。