環境
Re:VIEW 5.3
はみ出る
以下のように、同人誌にしたときにはみ出るのが悩みの種でした。
長い
また、ログをそのまま貼り付けたりなどすると延々とコードブロックばかり続いたりしてげんなりします。
今回の挑戦
今回は、自動改行とコードブロックの縮小表示に挑戦してみます。
自動改行
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 ファイルにしてプロジェクトに置くだけだとエラー。
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
とすると、うまくいきました。
サイズ縮小
フォントサイズを小さくしてみます。
こちらの方法に沿って、
「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]
.
.
.