2022/2/28 by @kmuto

Re:VIEW 5.4 での変更点

Re:VIEW 5.4 において 5.3 から変更した点について解説します。


2022年2月28日に、Re:VIEW 5 系のマイナーバージョンアップである「Re:VIEW 5.4.0」をリリースしました。

今回のバージョン 5.4 は、5.3 で発見された不具合の修正と、テキスト化の際の利便性の向上、EPUB / CSS 組版向けのカスタマイズ割り込みの強化などを施しています。


既知の問題

現時点ではありません。


インストール

新規インストールの場合

$ gem install review

更新の場合

$ gem update review

既存プロジェクトのバージョンアップ追従

既存のプロジェクトを 5.4 に更新するには、Re:VIEW 5.4 をインストール後、プロジェクトフォルダ内で review-update コマンドを実行してください。

$ review-update
** review-update はプロジェクトを 5.4.0 に更新します **
config.yml: 'review_version' を '5.0' に更新しますか? [y]/n 
プロジェクト/sty/review-base.sty は Re:VIEW バージョンのもの (/var/lib/gems/2.7.0/gems/review-5.4.0/templates/latex/review-jsbook/review-base.sty) で置き換えら
れます。本当に進めますか? [y]/n 
プロジェクト/sty/review-jsbook.cls は Re:VIEW バージョンのもの (/var/lib/gems/2.7.0/gems/review-5.4.0/templates/latex/review-jsbook/review-jsbook.cls) で置き換えられます。本当に進めますか? [y]/n 
完了しました。

続いて、リリースノートをベースに、新規に導入した機能や変更点について理由を挙げながら解説します。

新機能

Re:VIEW に関する質問の受け付けに対応する GitHub Discussions を開始しました

Re:VIEW の実装に何か変化があったわけではないのですが、GitHub Discussions という場を設けました。

内容的に issue にするにはためらいがあるというときに、質問の場として使っていただければと思います。

生産的な場にしたいので、ご投稿の前には Re:VIEW Discussions 日本語でのご案内 をご覧になるようお願いします。

非互換の変更

EPUBMaker: opf ファイルの manifest 内の item を ID 文字列の辞書順でソートするようにしました

opf ファイルは EPUB のコンテンツ情報を管理するファイルですが、この中に manifest/item という項目があり、ここに EPUB ファイル内で保有しているファイル一覧が列挙されています。これまでの EPUBMaker では素朴にファイルシステムから Ruby のファイル取得 API で得られたファイル一覧を使っていたのですが、数式画像をリビルドしたり、ファイルシステム環境がそもそも違ったりすると、この順序が変わることがあります(ファイル取得 API のほうでは順序を保証していない)。

epdiff ツールなどでEPUB の差分を確認したいときにこの opf ファイルの不要な差分にわずらわされるのを避けるため、辞書順(a〜z順)にソートするようにしてから opf ファイルに書き出すようにしました。

これまでのバージョンとは非互換ではあるのですが、内容的にこれが何か副作用を起こす可能性はないでしょう。

TextMaker: 表の見出しセル行を太字表現(★〜☆)にするのではなく、見出しセル行と通常セル行の区切り線を入れるようにしました

rake textreview-textmaker で作るテキストファイルにおいて、これまでは表の見出しセルを太字表現にしていました。ただ実際の利用シーンではむしろ、見出しセル自体には装飾を付けず、通常セルとの間に区切り線を入れることのほうが大半……というか100%です。

そこで、今回のバージョンで、デフォルトを見出し装飾なし・区切り線ありに変更しました。従来の太字表現に戻すには textmaker セクションの th_bold パラメータを true に設定してください。

reファイル

//table{
A	B
---------------
C	D
//}

従来のテキスト変換後(および textmaker/th_bold:true 時)

◆→開始:表←◆
★A☆	★B☆
C	D
◆→終了:表←◆

Re:VIEW 5.4.0以降のテキスト変換後

◆→開始:表←◆
A	B
------------
C	D
◆→終了:表←◆

TextMaker: //indepimage 命令の出力結果を //image に合わせました

これまでテキスト化の際には //indepimage はファイルが見つからなくても { //} の中身があろうとなかろうと無視していました。制作の用途で使うときには、図版は後から作成したり、図版予定位置に「この画像を使ってこう加工しておいて」という指示を入れておくことがよくあります。//image ではそのために { //} の中身を指示情報扱いとして書き出していたので、//indepimage もこれに合わせました。

reファイル(図版ファイルはどちらも存在しない)

//image[図1][キャプション]{
fig1.pngの左上を切り出してください。
//}

//indepimage[概念図]{
PowerPointファイル1枚目から作図願います。
1.は①としてください。
//}

従来(indepimageの内容コメントが無視される)

◆→開始:図←◆
fig1.pngの左上を切り出してください。

図1.1 キャプション
◆→終了:図←◆

◆→画像 概念図←◆

Re:VIEW 5.4.0以降

◆→開始:図←◆
fig1.pngの左上を切り出してください。

図1.1 キャプション
◆→終了:図←◆

◆→開始:図←◆
PowerPointファイル1枚目から作図願います。
1.は①としてください。
◆→終了:図←◆

TextMaker: //imgtable 命令の出力結果を //image および //table に合わせました

図版ファイルを表代わりに配置する //imgtable ですが、これもテキスト化では内容が従来無視されていました。//indepimage 同様に表示するようにします。

reファイル

//imgtable[figtable1][キャプション]{
table.xlsx 2つめのシートから作図願います。
アミ色はK10%にしてください。
//}

従来(キャプションしか入らない)

表1.1 キャプション

Re:VIEW 5.4.0以降

◆→開始:表←◆
表1.1 キャプション

table.xlsx 2つめのシートから作図願います。
アミ色はK10%にしてください。
◆→終了:表←◆

ハイライト有効時に、//source 命令もハイライト対象として中身をエスケープしないようにしました

ハイライト(highlight)有効時、PDFMaker および EPUBMaker において //list//emlist//cmd//listnum//emlistnum はハイライト対象となっていましたが、同じプログラムコード提示用命令である //source についてはハイライト対象から漏れていましたので、これを追加しました。

ハイライトをもともと使っていない、あるいはハイライトを使っているが //source を使っていない、のであれば特に影響はありません。ハイライト対象から外れていることを期待して //source を使っていたケースでは、後述の review-ext.rb での差し戻し指示が必要です。

ハイライト対象になるとどうなるかというと、reファイル→コンパイラ→ビルダ(LATEXBuilder / HTMLBuilder)と渡るときに、コンパイラでは本来行っている文字のエスケープやインライン命令の処理などを何も行わず、ビルダに引き渡します。ビルダは渡ってきたものを外部のハイライトプログラム(istings.sty、pygments、rouge など)に処理を委ねます。

エスケープやインライン命令の処理をしたものをハイライトプログラムに渡してしまうと、たとえば < だったところが PDFMaker なら \textless{}、EPUB なら &lt; のようにエスケープされた文字がそのまま出てしまうことになります。

逆に言うと、既存の挙動では、プログラムコード内でインライン命令(太字など)を使いたいときにはハイライトを使えない、ということです。

//list//emlist ではハイライトを使いたい(インライン命令は使わない)が、//cmd//source ではインライン命令を使いたい(ハイライトは使わない)という場合は、以下のように review-ext.rb を使ってハイライト対象を制限することで対処できます。

module ReVIEW
  module CompilerOverride
    def non_escaped_commands
      if @builder.highlight?
        %i[list emlist listnum emlistnum] # cmdとsourceを除く
      else
        []
      end
    end
  end

  class Compiler
    prepend CompilerOverride
  end
end

バグ修正

Ruby 3.1 で YAML のエラーが発生するのを修正し、互換性も持たせました

お待たせいたしました。いくつか報告をいただいていたとおり、以前のバージョンの Re:VIEW を Ruby 3.1 で使おうとすると、Date に関する YAML エラーという現象が発生していました。

メジャーアップデートならともかくマイナーアップデートでライブラリに非互換の挙動を入れるのはいかがなものかという気持ちはありますが、Ruby 3.1 以降でも動作するように修正を行いました。

Ruby の古いバージョンを切り捨てる、gem を使う、という方法も提案されていたのですが、小さめのコードで新旧バージョン両方への対応ができたのでほっとしています。

とはいえ、今後も Ruby 側のライブラリの変更で互換性保持が困難となる可能性はありますし、いつまでも Ruby バージョンの古いものに引きずられるのも開発の阻害となります。今回はまだ Ruby 2.5 をサポートしますが、Re:VIEW の次のメジャーバージョンアップでは Ruby 2.7 以上をサポート対象にすることにして、Ruby 2.5 向けの具体的な対応はしなくなる予定です。

rbenv/gem/bundler を常用する方には Ruby も関連物もどんどん上げていけばいいのでは?という意見もあるのでしょうけれども、私自身は Debian GNU/Linux ディストリビューションの配布物信頼性・安定性のほうに重きを置いているので、せめて Debian stable および oldstable でサポートされている期間はその収録 Ruby バージョンについて Re:VIEW でも対応する対象にしたいと考えています。(Node.js などを見てると Long-Time-Support な OS ディストリビューション公式とは相性が悪くなる風潮が強いなぁという印象ですが。)

EPUBMaker: epub:type=cover が大扉や奥付に入るのを修正しました

epubcheck でもひっかからないしリーダーにも影響しないという些末なことではあるのですが、EPUB の表紙ファイルには epub:type=cover という属性を入れることが推奨されています。これが処理の関係で大扉や奥付にも入ってしまっていましたので、削除しました。

無効な urnid の例がサンプルとして示されているのを削除しました

config.yml のコメントアウトした設定で urnid パラメータに対し

# urnid: urn:uuid:http://example.com/book-title/

としていましたが、これを実際に使おうとすると epubcheck でエラーになります。urnid の内容はランダムな UUID が入るのでそもそも有効にする意味はないのですが、どうしても同じ UUID で作り直したいというときのサンプルとして上記は不適切なので、以下のように例示を置き換えました。

# urnid: urn:uuid:ffffffff-ffff-ffff-ffff-ffffffffffff

当然ながら実際に固定の UUID で使いたいというときには、別の妥当な値に変更する必要があります。Re:VIEW での UUID の生成は以下と同じです。

$ ruby -e 'require "securerandom"; puts SecureRandom.uuid'
2b0987ec-a155-4d70-998e-6507b87e49a9

config.yml の YAML 構文にエラーがあったときに例外ではなく妥当なエラーを返すようにしました

config.yml の YAML ファイルはだいぶ大きいため、インデントを誤ったり : を付けたセクションを有効にしたけれども下位をコメントアウトのままにしてしまったりといったケースがあります。このときに例外が発生して捕捉し損ねていたため、バックトレース付きのエラーになってしまっていました。

この例外を捕捉し、正しく(?)エラーを返すようにしました。

ただ、Ruby の YAML 処理を行う Psych ライブラリ、および YAML の性質上、YAML の構文エラーについてはかなりざっくりした列・行の提示だけで、解決のヒントにあまり寄与してくれない傾向です。変更容易性と評価容易性を合わせ持たせるのはどうしたらよいですかねぇ……(JSON 管理で GUI/Web 設定とすればエラーは減らせると思うのですが、ちょっとした変更のたびに Web ブラウザというのもという気分もあり)。

IDGXMLMaker: secttags を有効にしている状態で前付や後付がエラーになるのを修正しました

IDGXML を使っていてかつ secttags(見出しレベル登場に応じて、chapter, sect, sect2, …と構造要素で囲む)を有効にしているという非常にレアな状況ではあるのですが、このときに前付や後付のように章番号が存在しない箇所でエラーが発生していました。エラーにせず chapter 構造で囲むように修正しています。

なお、多くは語りませんが、中間処理では構造要素を使うにしても、InDesign にインポートする前には構造タグ類は除去することをお勧めします。

ドキュメント

GitHub Discussions について README.md に記載しました

冒頭で言及した GitHub Discussions について記載しました。

その他

RuboCop 1.25.1 の指摘を反映しました

恒例の Rubocop 先生対応です。

終わりに

今回の Re:VIEW 5.4 では、大きな新機能は入れませんでした。新規・既存のユーザーにとっては、Ruby 3.1 以上への対応が一番大きなところでしょうか。

テキスト化周りの機能強化については、業務用で review-ext.rb をやりくりしていたのをようやくこのたびマージできたので、私自身にとってはかなりのメリットがあります。

CSS 組版向けの機能は今回でいろいろ入れたのですが、具体的にこれらの機能を活用しての Vivliostyle.js や AntennaHouse Formatter、VersaType Converter といった CSS 組版ソフトウェア向けの具体的な参照実装をお見せしていないので、わかりにくいところかもしれません。業務では AntennaHouse Formatter、VersaType Converter の実装を保有しているものの、業務利用デザイン合わせなので参照実装として出すわけにもいかず、ページデザインレイアウトから考えないといけないのが頭の痛いところです。このあたりは紙面デザイナー / CSS デザイナーの方の参戦を期待したいですね。

Enjoy!