Re:VIEW でコードブロックを調整

# 環境

Re:VIEW 5.3

# はみ出る

以下のように、同人誌にしたときにはみ出るのが悩みの種でした。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/cb33d4be-abcc-74b6-3c6c-68c54c01d77f.png)


# 長い

また、ログをそのまま貼り付けたりなどすると延々とコードブロックばかり続いたりしてげんなりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/fef9a713-8470-a1f5-5124-94e65cd84400.png)

# 今回の挑戦

今回は、自動改行とコードブロックの縮小表示に挑戦してみます。

# 自動改行


Docs の『コードブロック内で自動改行する」
https://review-knowledge-ja.readthedocs.io/ja/latest/latex/linebreak-verbatim.html

ここでは、以下のコードが紹介されていました。

```
module ReVIEW
  module LATEXBuilderOverride
    # gem install unicode-display_width
    require 'unicode/display_width'
    require 'unicode/display_width/string_ext'

    CR = '→' # 送り出し文字。LaTeXコードも可
    ZWSCALE = 0.875 # 和文・欧文の比率。\setlength{\xkanjiskip}{\z@} しておいたほうがよさそう

    def split_line(s, n)
      # 文字列を幅nで分割
      a = []
      l = ''
      w = 0
      s.each_char do |c|
        cw = c.display_width(2) # Ambiguousを全角扱い
        cw *= ZWSCALE if cw == 2
        
        if w + cw > n
          a.push(l)
          l = c
          w = cw
        else
          l << c
          w += cw
        end
      end
      a.push(l)
      a
    end

    def code_line(type, line, idx, id, caption, lang)
      # _typeには'emlist'などが入ってくるので、環境に応じて分岐は可能
      n = 76
      n = 60 if @doc_status[:column]
      a = split_line(unescape(detab(line)), n)
      # インラインopはこの時点でもう展開されたものが入ってしまっているので、escapeでエスケープされてしまう…
      escape(a.join("\x01\n")).gsub("\x01", CR) + "\n"
    end

    def code_line_num(type, line, first_line_num, idx, id, caption, lang)
      n = 60
      n = 56 if @doc_status[:column]
      a = split_line(unescape(detab(line)), n)
      (idx + first_line_num).to_s.rjust(2) + ': ' + escape(a.join("\x01\n    ")).gsub("\x01", CR) + "\n"
    end
  end

  class LATEXBuilder
    prepend LATEXBuilderOverride
  end
end
```
n の値を64 から 76 に変更しました。

このコードを、 review-ext.rb ファイルにしてプロジェクトに置くだけだとエラー。

```# rake pdf
review-pdfmaker  config.yml
Traceback (most recent call last):
    14: from /usr/local/bin/review-pdfmaker:23:in `<main>'
    13: from /usr/local/bin/review-pdfmaker:23:in `load'
    12: from /var/lib/gems/2.7.0/gems/review-5.3.0/bin/review-pdfmaker:14:in `<top (required)>'
    11: from /var/lib/gems/2.7.0/gems/review-5.3.0/lib/review/pdfmaker.rb:93:in `execute'
    10: from /var/lib/gems/2.7.0/gems/review-5.3.0/lib/review/pdfmaker.rb:147:in `execute'
     9: from /var/lib/gems/2.7.0/gems/review-5.3.0/lib/review/pdfmaker.rb:264:in `generate_pdf'
     8: from /var/lib/gems/2.7.0/gems/review-5.3.0/lib/review/pdfmaker.rb:264:in `new'
     7: from /var/lib/gems/2.7.0/gems/review-5.3.0/lib/review/book/base.rb:42:in `initialize'
     6: from /var/lib/gems/2.7.0/gems/review-5.3.0/lib/review/book/base.rb:50:in `update_rubyenv'
     5: from /var/lib/gems/2.7.0/gems/review-5.3.0/lib/review/book/base.rb:50:in `load'
     4: from /var/www/html/G14Robot/articles/ATTiny/review-ext.rb:1:in `<top (required)>'
     3: from /var/www/html/G14Robot/articles/ATTiny/review-ext.rb:2:in `<module:ReVIEW>'
     2: from /var/www/html/G14Robot/articles/ATTiny/review-ext.rb:4:in `<module:LATEXBuilderOverride>'
     1: from /usr/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require'
/usr/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in `require': cannot load such file -- unicode/display_width (LoadError)
rake aborted!
Command failed with status (1): [review-pdfmaker  config.yml...]
lib/tasks/review.rake:112:in `block in <top (required)>'
/usr/share/rubygems-integration/all/gems/rake-13.0.1/exe/rake:27:in `<top (required)>'
Tasks: TOP => pdf => book.pdf
(See full trace by running task with --trace)
```
こちらを参考に、
「技術書典13に向けて執筆環境を整える（Markdown + Re:VIEW）」
https://zenn.dev/sikkim/articles/d5e6d851d100d2

Gemfile に以下の行を追加しました。
```
gem unicode-display_width
```

更に、

```
# gem install unicode-display_width
```
とすると、うまくいきました。

``
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c1d1c23e-7c20-1248-5c50-289a81ebe40e.png)

# サイズ縮小

フォントサイズを小さくしてみます。

こちらの方法に沿って、
「Re:VIEW 覚え書き - Qiita」
https://qiita.com/kauplan/items/01dee0249802711d30a6


`config.yml` で

```
debug: true
```
と設定してから rake pdf を実行、book-pdf/~~~.tex の中身を見るとコードブロックは以下のように記述されている。

```

\begin{reviewlistblock}
\begin{reviewemlist}
.
.
.
\end{reviewemlist}
\end{reviewlistblock}
```

このうち、revielistblock は 

https://github.com/reviewml/reviewknowledge-ja/blob/master/docs/latex/review3-latex.md
によると、

> `//emlist` や `//list` などから変換されるコード類を、`\begin{reviewlistblock}` 〜 `\end{reviewlistblock}` 環境で囲むようにしました。任意の前後空きの調整に使うことを想定していますが、デフォルトのスタイルではこの環境自体は何もしません。

とのことでした。

また、`reviewemlist` は、
`book-pdf/review-base.sty` 
で、
```
\newenvironment{reviewemlist}{%
  \medskip\small\begin{shaded}\ifdefined\reviewlistxkanjiskip\xkanjiskip=\reviewlistxkanjiskip\fi\setlength{\baselineskip}{1.3zw}\begin{alltt}}{%
  \end{alltt}\end{shaded}}
```
と設定されていました。

このことから、
sty/reviewmacro.sty の最後の方を以下のようにしました。

```

\renewenvironment{reviewemlist}{%
  \medskip\tiny\begin{shaded}\ifdefined\reviewlistxkanjiskip\xkanjiskip=\reviewlistxkanjiskip\fi\setlength{\baselineskip}{1.3zw}\begin{alltt}}{%
  \end{alltt}\end{shaded}}

\renewenvironment{reviewlist}{%
  \begin{shaded}\tiny\ifdefined\reviewlistxkanjiskip\xkanjiskip=\reviewlistxkanjiskip\fi\setlength{\baselineskip}{1.3zw}\begin{alltt}}{%
  \end{alltt}\end{shaded}\par\vspace*{0.5zw}}

\renewenvironment{reviewsource}{%
  \begin{shaded}\tiny\ifdefined\reviewlistxkanjiskip\xkanjiskip=\reviewlistxkanjiskip\fi\setlength{\baselineskip}{1.3zw}\begin{alltt}}{%
  \end{alltt}\end{shaded}\par\vspace*{0.5zw}}

\renewenvironment{reviewcmd}{%
  \color{white}\medskip\tiny\ifdefined\reviewlistxkanjiskip\xkanjiskip=\reviewlistxkanjiskip\fi\begin{shadedb}\setlength{\baselineskip}{1.3zw}\begin{alltt}}{%
  \end{alltt}\end{shadedb}}


\endinput
```




`\endinput` の前に `reviewemlist` を含む関係しそうなものを置いています。

`\newenvironment` から `\renewenvironment` 
に変更するのが肝要ぽいです。


もとのもの文字サイズが ` \small` となっていたものを `\tiny` に変更しました。


更に、フォントサイズが変わるので先の review-ext.rb の 文字数を以下のように変更しました。



```
.
.
.
    def code_line(type, line, idx, id, caption, lang)
      # _typeには'emlist'などが入ってくるので、環境に応じて分岐は可能
      n = 136
      n = 128 if @doc_status[:column]
      a = split_line(unescape(detab(line)), n)
      # インラインopはこの時点でもう展開されたものが入ってしまっているので、escapeでエスケープされてしまう…
      escape(a.join("\x01\n")).gsub("\x01", CR) + "\n"
    end

    def code_line_num(type, line, first_line_num, idx, id, caption, lang)
      n = 128
      n = 120 if @doc_status[:column]
.
.
.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/7a2533d4-be1d-768e-9ee8-825f1e9efe1d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6c0dd072-33bd-3a03-4f45-51a534b9310d.png)
良くなりましたね!