kdnakt blog

hello there.

Re:VIEW Starterで複数行の強制改行をインライン命令で出力する

Re:VIEW Starterを使ってPDFを作成していてちょっと困った部分があったので、まとめておきます。

 

 

[Re:VIEW Starterとは]

Re:VIEWという「技術(書|者)のための電子・紙書籍制作ツール」があります。しかし、Re:VIEWは初期設定を行うのが難しいため、その初期設定をGUIを利用して行えるのがRe:VIEW Starterというサイトです。

kauplan.org

 

2021年3月時点で最新のRe:VIEW Starterのユーザーガイドはこちらです。

 

[強制改行を連続で使いたい]

さて、本題です。

 

Re:VIEW Starterでは以下のように表を記述できます。

//tsize[40,60]
//table[?][改行なし]{
項目		内容
----------------------
ひらがな		あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよ
カタカナ		アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨ
//}

このコードは以下のような表に変換されます。

f:id:kidani_a:20210321153220p:plain

 

「内容」の列が中途半端なところで改行されてしまっているので、これをいい感じにするために、@<br>{}という強制改行命令を利用します。

//tsize[40,60]
//table[?][内容のみ改行あり]{
項目		内容
----------------------
ひらがな		あいうえおかきくけこさしすせそ@<br>{}たちつてとなにぬねのはひふへほまみむめもやゆよ
カタカナ		アイウエオカキクケコサシスセソ@<br>{}タチツテトナニヌネノハヒフヘホマミムメモヤユヨ
//}

このコードは以下のような表に変換されます。

f:id:kidani_a:20210321153620p:plain

 

改行は上手くいきましたが、2行目が表をはみ出してしまったので、さらに強制改行命令を追加します。

//tsize[40,60]
//table[?][内容のみ改行追加]{
項目		内容
----------------------
ひらがな		あいうえおかきくけこさしすせそ@<br>{}たちつてとなにぬねのはひふへほ@<br>{}まみむめもやゆよ
カタカナ		アイウエオカキクケコサシスセソ@<br>{}タチツテトナニヌネノハヒフヘホ@<br>{}マミムメモヤユヨ
//}

このコードは以下のような表に変換されます。

f:id:kidani_a:20210321154316p:plain

 

今度は、「項目」列のセルが下の方に来てしまっているため、ここに改行を追加してセルの上部に配置してみます。

//tsize[40,60]
//table[?][項目も改行あり(7つ)]{
項目		内容
----------------------
ひらがな@<br>{}@<br>{}@<br>{}@<br>{}@<br>{}@<br>{}@<br>{}		あいうえおかきくけこさしすせそ@<br>{}たちつてとなにぬねのはひふへほ@<br>{}まみむめもやゆよ
カタカナ@<br>{}@<br>{}@<br>{}@<br>{}@<br>{}@<br>{}@<br>{}		アイウエオカキクケコサシスセソ@<br>{}タチツテトナニヌネノハヒフヘホ@<br>{}マミムメモヤユヨ
//}

このコードは以下のような表に変換されます。

f:id:kidani_a:20210321155004p:plain

 

ようやくいい感じの表を作ることができました!しかし、元のテキストを見ると@<br>{}がたくさん並んでおり、いい感じではありません。

本来書きたい内容よりも強制改行命令の文字列が多くなっており可読性が低いです。

 

[独自のインライン命令を追加する]

これを解決するために、まずは独自のインライン命令を追加してみます。

 

2021年3月現在、Re:VIEW Starterで作成したプロジェクトの直下にはreview-ext.rbというRubyで書かれたソースコードがあります。

ソースコード中のコメントによれば「Re:VIEWを拡張し、インライン命令とブロック命令を追加する」ためのファイルです。

 

例えば、@<hearts>{}と記載するとと出力するための命令は以下のような形で定義されています。

module ReVIEW

  Compiler.definline :hearts            ## ハートマーク
  ## 省略

  ## LaTeX用の定義
  class LATEXBuilder
    ## ハートマーク
    def inline_hearts(str)
      '$\heartsuit$'
    end
   ## 省略
  end

  ## HTML(ePub)用の定義
  class HTMLBuilder
    ## ハートマーク
    def inline_hearts(str)
      #'&hearts;'
      '&#9829;'
    end
   ## 省略
  end
  
  class TEXTBuilder
    ## ハートマーク
    def inline_hearts(str)
      '&hearts;'
    end
   ## 省略
  end
end

 

また、review-latexbuilder.rbというファイルを見ると、強制改行の場合は\\\\[0pt]という文字列を返すinline_br()メソッドが定義されています。

これらを参考に、7個の強制改行を出力するインライン命令を以下のようにreview-ext.rbに追加してみます。今回はPDF(LaTex)のみ対応するので、LATEXBuilderの部分のみ修正します。

module ReVIEW

  Compiler.definline :br7
  
  ## LaTeX用の定義
  class LATEXBuilder
    def inline_br7(str)
      "\\\\[0pt]" * 7
    end
    ## 省略
  end
end

 

こうすると、以下のように表を記述できます。

//tsize[40,60]
//table[?][項目も改行あり(独自)]{
項目		内容
----------------------
ひらがな@<br7>{}		あいうえおかきくけこさしすせそ@<br>{}たちつてとなにぬねのはひふへほ@<br>{}まみむめもやゆよ
カタカナ@<br7>{}		アイウエオカキクケコサシスセソ@<br>{}タチツテトナニヌネノハヒフヘホ@<br>{}マミムメモヤユヨ
//}

このコードは以下のような表に変換されます。

f:id:kidani_a:20210321160137p:plain

 

これで元のテキストもすっきりしました!

しかし、まだ問題があります。場合によっては改行の数が7つではなく、もっと必要な場合があります。その度に独自のインライン命令を追加で定義することもできますが、それは面倒なのでやりたくありません。

 

[強制改行命令を改造する]

独自のインライン命令を必要な改行数分だけ定義するかわりに、既存の強制改行命令を改造してみます。

インライン命令は@<br>{}のように<>の中に命令の名前を書き、{}の中に引数を記載するので、これを利用して改行の個数を指定します。

 

review-latexbuilder.rbファイルのinline_br()メソッドを以下のように修正します。

    def inline_br(s)
      "\\\\[0pt]" * (s.present? ? s.to_i : 1)
    end

 

これを利用すると、以下のように表現できます。

//tsize[40,60]
//table[?][項目も改行あり(改造)]{
項目		内容
----------------------
ひらがな@<br>{7}		あいうえおかきくけこさしすせそ@<br>{}たちつてとなにぬねのはひふへほ@<br>{}まみむめもやゆよ
カタカナ@<br>{7}		アイウエオカキクケコサシスセソ@<br>{}タチツテトナニヌネノハヒフヘホ@<br>{}マミムメモヤユヨ
//}

このコードは以下のような表に変換されます。

f:id:kidani_a:20210321161124p:plain


これで必要な数だけ改行の数を指定できるようになりました! 🎉

 

[乱用注意]

上で紹介したような形で、独自の命令を追加したり、既存の命令を改造したりする場合、Re:VIEW Starterのバージョンアップに追随できなくなる可能性があります。

 

私の場合、2019年末に初めてRe:VIEW Starterを触って、いくつか上記のような改造をしていました。

2021年3月現在あらためてRe:VIEW Starterでプロジェクトを作成してみると、Re:VIEW Starterで作成されるプロジェクトのlibディレクトリに含まれるRubyで書かれたソースコードのファイル構成などが大きく変わっていました。そのため、前回の変更を新しく作成したプロジェクトに移植するのにやや苦労しました。

 

Re:VIEW Starterはユーザーガイドの付録Cによれば「2〜3 週間ごとにリリースされ」、「新機能の追加とバグ修正が急ピッチで進」むそうです。

バージョンアップごとの不要なコンフリクトや移植作業を避ける為にも、このような魔改造は避けた方が賢明でしょう*1

 

[まとめ]

  • Re:VIEW Starterを利用するとGUIRe:VIEWの初期設定が行える
  • コードを追加することで、独自のインライン命令を定義したり既存の命令を改造したりできる
  • バージョンアップに追随できなくなるので魔改造はほどほどに
  • 今回のコードは以下のリポジトリにまとめてある 

github.com

*1:同じくユーザーガイドの付録Cによれば、将来的にRe:VIEW StarterのGitリポジトリが公開されるようなので、魔改造した内容をプルリクエストで取り込んでもらえる日が来るかもしれません。