当サイトの一部ページには、アフィリエイト・アドセンス・アソシエイト・プロモーション広告を掲載しています。

Amazonのアソシエイトとして、Security Akademeiaは適格販売により収入を得ています。

広告配信等の詳細については、プライバシーポリシーページに掲載しています。

消費者庁が、2023年10月1日から施行する景品表示法の規制対象(通称:ステマ規制)にならないよう、配慮して記事を作成しています。もし問題のある表現がありましたら、問い合わせページよりご連絡ください。

参考:令和5年10月1日からステルスマーケティングは景品表示法違反となります。 | 消費者庁

Re:VIEWで技術同人誌をつくる【ミジンコがはまったポイント】

2024年3月9日

Re:VIEWを使うタイミングは多くても半年に2回程度で、使うたびにいつも迷ってしまいます。
はまって数時間を消費したこともざらですので、将来の自分のために忘備録として残しておきます。

商標マーク

商標の説明においてコピーライトマークなどを使います。

「@<raw>{\texttrademark}」などのように指定すればPDF上で表示できます。

しかしながらこのコードの前後に文字列が来ると、PDFの生成時にエラーが発生しましたので、次のように1行に1つの@<raw>{}を書いて、前後の文は別の行に書きます。

== 商標

本書に登場するシステム名や製品名は、関係各社の商標または登録商標です。
また本書では、
@<raw>{\texttrademark}
、
@<raw>{\textregistered}
、
@<raw>{\textcopyright}
などのマークは省略しています。

画像を小さくする

画像を挿入する際には、次のようにします。

//image[hybrid_dic_attack][ハイブリッド辞書攻撃の例][scale=0.7]{
//}

1番目の大括弧内の「hybrid_dic_attack」は画像のファイル名です。

2番目の大括弧内はキャプションになります。

3番目の大括弧内でscaleを指定します。1.0だと元の画像の大きさ or ページに収まらない場合は調整されます。明示的に小さくしたければ、scaleの値を0.xのように小さくします。

画像前後の無駄な余白を解消する

普通に画像を挿入するために、次のコードを書いた場合、前後の文(「あああああ」と「いいいいい」)の間に挿入されます。

あああああ

//image[hybrid_dic_attack][ハイブリッド辞書攻撃の例][scale=0.7]{
//}

いいいいい

ページにおける文章の位置によっては、無駄な余白が出て、ページがすかすかになってしまいます。結果的にページ数が増えて、コスト増につながります。

これを解決する簡単な方法としてフローティングがあります。

次のコードのように画像に対してフローティングを指定すると、ページの上に画像を持って行き、なるべく文章を詰めてくれます。

//embed[latex]{
\floatplacement{figure}{t}
//}
//image[hybrid_dic_attack][ハイブリッド辞書攻撃の例][scale=0.7]{
//}
//embed[latex]{
\floatplacement{figure}{H}
//}

ただし、弊害として、画像を説明する文章や図参照の位置と画像の位置が別のページになってしまうことがあります。特にフローティング指定の画像が連続すると、数ページ先になってしまうことさえあります。

ただページ数が無駄に増えることを防げるので、私は基本的にフローティングを指定し、(状況に応じて)たまに外しています。

表の列が揃わない

表の各の項目はタブ区切りで書きます。

//table[rockyou_category][文字種別の件数ランキング]{
カテゴリーの組み合わせ	件数(件)	割合(%)
--------------------------------------------
loweralpha-numeric	6,074,867	42.35
loweralpha
3,726,129	25.98
numericeric	2,346,744	16.36
loweralpha-special-numeric	426,353	2.97
upperalpha-num	407,431	2.84
mixedalpha-numeric	382,237	2.66
loweralpha-special	381,623	2.66
upperalpha	229,875	1.6
mixedalpha	159,310	1.11
all	53,238	0.37
mixedalpha-special	49,655	0.35
special-numeric	46,606	0.32
upperalpha-special-numeric	27,737	0.19
upperalpha-special	26,813	0.19
special	5,773	0.04
//}

表をフローティング指定したい

表は画像ほど高さを取らないケースが多く、無駄な余白につながりにくいといえますが、表の大きさや場所によっては無駄な余白ができてしまいます。

表にもフローティング指定できます。ただし、画像の時はfigureを書いていたところを、tableに変更します。

//embed[latex]{
\floatplacement{table}{t}
//}
//table[convert_example][表の例]{
変換前	変換後
--------------------------------------------
hoge	fuga
1111	2222
//}
//embed[latex]{
\floatplacement{table}{H}
//}

表の項目の自動折り返し

表の中に長い文字列があっても自動折り返しされずに、文章エリアからはみ出てしまいます。

「//table直前に「//tsize[|latex|xx,yy]」を書きます。

これは2列の場合であり、xxとyyは列の幅を数値で指定できます。

//tsize[|latex|10,110]
//table[convert_example][表の例]{
変換前	変換後
--------------------------------------------
hoge	ああああああああああああああああああああああああああああああああああああああああああああああああああ
1111	いいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい
//}

※私の環境では合計値の目安は120です。

3列の場合は「//tsize[|latex|20,20,80]」のように3つの幅を指定します。

なお、コラム内の場合は幅数が少し小さくします。

※私の環境では合計値が105が目安です。

参考記事

表内の強制改行

表内であっても、@<br>{}を使えます。

長いURLがはみ出てしまう

URLの形式によっては、箇条書き内、注釈内(//footnote)のURLが文章エリアからはみ出てしまうことがあります。

その際は、無理に@<href>{https://~~~}を使わずに、直接URLを書きます。

そうすれば若干URLが短く表示されるので、文章エリア内(or エリア外でも違和感がないレベル)に収まる可能性があります。

注釈内であれば、URLの前後の文を外して、@<br>{}を使うとよいかもしれません。

//footnote[splashdata_2017]["'Starwars' appears on list of worst passwords of 2017"@<br>{}@<href>{https://www.cnet.com/culture/internet/worst-passwords-2017-star-wars-splashdata-list/}]

コマンドやコードの自動折り返し

@<code>{…}内のコマンドやコードが長いとはみ出てしまいます。

色々な方法があるようですが、私は次のようにしました[1]昔はseqsplitを使ったアプローチで解決していましたが、技術書典13以降はDockerのRe:VIEW環境に移行したので、別のアプローチで解決した次第です。

1:articleフォルダー内に次のような"review-ext.rb"ファイルを作ります。

私の同人誌はB5なので、nの値を76にしました。

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'などが入ってくるので、環境に応じて分岐は可能
        # A5ならn=64、B5なら76でちょうどよい.
        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

2:unicode-display_widthを適用するために、ビルド環境の"Gemfile"ファイル(プロジェクトフォルダー直下にある)に追記します。

# A sample Gemfile
source "https://rubygems.org"

gem 'review', '5.4.0'
gem 'pandoc2review'
gem 'rake'
# gem 'review-peg', '0.2.2'
+ gem 'unicode-display_width'

ただし、私のビルド環境は「Docker+Re:VIEW」なので、PDF生成時にunicode-display_widthをinstall gemするようにしました。

$ docker run --rm -v `pwd`:/work vvakame/review:5.0 /bin/sh -c "gem install unicode-display_width && cd /work && review-pdfmaker config.yml"

参考記事

次の記事が参考になります。

隠しノンブルを入れる

ドキュメントクラスオプションhiddenfolioにプリセットを指定します。

私は印刷所(ねこのしっぽ)に渡すデータについては"config.yml"ファイル内で次のようにしています。

texdocumentclass: ["review-jsbook", "media=print,paper=b5, serial_pagination=true,hiddenfolio=nikko-pc,openany, fontsize=10pt,baselineskip=15.4pt,line_length=40zw,number_of_lines=42, head_space=15mm,headheight=5mm, headsep=2mm,footskip=7mm"]

レイアウトの設定

私が使っている"review-custom.sty"ファイル内は次の通りです。

「余白の削除」「サンプルコードを小さくする」「左右のページの上部の表示を自然にする」など。

% for user-defined macro

%% 偶数ページの左側に章名、奇数ページの右側に説明
%% http://acro-engineer.hatenablog.com/entry/2018/12/18/120000
\lhead[\gtfamily\sffamily\bfseries\upshape \leftmark]{}
\rhead[]{\gtfamily\sffamily\bfseries\upshape \rightmark}

%% サンプルコードを更に小さく
\renewenvironment{reviewemlist}{%
  \medskip\footnotesize\begin{shaded}\setlength{\baselineskip}{1.2zw}\begin{alltt}}{%
  \end{alltt}\end{shaded}}

\renewenvironment{reviewlist}{%
  \begin{shaded}\footnotesize\setlength{\baselineskip}{1.2zw}\begin{alltt}}{%
  \end{alltt}\end{shaded}\par\vspace*{0.5zw}}

\renewenvironment{reviewcmd}{%
  \color{white}\medskip\footnotesize\begin{shadedb}\setlength{\baselineskip}{1.2zw}\begin{alltt}}{%
  \end{alltt}\end{shadedb}}

%% 章タイトルの上余白をなくす
\def\@makechapterhead#1{%
  %\vspace*{2\Cvs}% 欧文は50pt
  {\parindent \z@ \raggedright \normalfont
    \ifnum \c@secnumdepth >\m@ne
      \if@mainmatter
        \huge\headfont \@chapapp\thechapter\@chappos
        \par\nobreak
        \vskip \Cvs % 欧文は20pt
      \fi
    \fi
    \interlinepenalty\@M
    \Huge \headfont #1\par\nobreak
    \vskip 3\Cvs}} % 欧文は40pt

%% 目次の上余白を狭める
\renewcommand{\tableofcontents}{%
  \settowidth\jsc@tocl@width{\headfont\prechaptername\postchaptername}%
  \settowidth\@tempdima{\headfont\appendixname}%
  \ifdim\jsc@tocl@width<\@tempdima \setlength\jsc@tocl@width{\@tempdima}\fi
  \ifdim\jsc@tocl@width<2zw \divide\jsc@tocl@width by 2 \advance\jsc@tocl@width 1zw\fi
  \if@twocolumn
    \@restonecoltrue\onecolumn
  \else
    \@restonecolfalse
  \fi
  %
  %\chapter*{\contentsname}%
  %% 章も目次も右起こしにする or しない
  \if@openleft\cleardoublepage\else
  \if@openright\cleardoublepage\else\clearpage\fi\fi
  %% 章が右起こしでも、目次は右起こしにしない
  %\clearpage
  %
  \plainifnotempty
  \@makechapterhead{\contentsname}
  %
  \@mkboth{\contentsname}{}%
  \@starttoc{toc}%
  \if@restonecol\twocolumn\fi
}

%% //cmdや//emlistの横幅をぎりぎりまで広げる
\setlength{\FrameSep}{4pt}

%% ページ番号配置を下部中央にする
\fancyfoot{}% 既存の設定をキャンセル
\cfoot{\thepage}% 下部中央に配置
\fancypagestyle{plainhead}{% 章扉も変更
  \fancyfoot{}% 既存の設定をキャンセル
  \cfoot{\thepage}% 下部中央に配置
  \fancyhead{}% 以下はオリジナルのreview-styleと同じ
  \renewcommand{\headrulewidth}{0pt}%
  \renewcommand{\footrulewidth}{0pt}}

%% 奥付を必ず偶数ページにする
\renewcommand{\reviewcolophon}[0]{\clearoddpage}

PDF生成時のドキュメントクラス

“config.yml"ファイル内でPDF生成時のドキュメントクラスを記述します。

なるべく文字を詰めるために色々と試行錯誤しましたが、次のドキュメントクラスに落ち着きました。

基本は青色のところを使っています。上の青色が印刷所向けのPDF(表紙なし、トンボあり)、下の青色が電子書籍向けのPDF(表紙あり)になります。

## これはIPUSIRONオリジナル
#
B5印刷用・トンボあり 【本番用】
texdocumentclass: ["review-jsbook", "media=print,paper=b5, serial_pagination=true,hiddenfolio=nikko-pc,openany, fontsize=10pt,baselineskip=15.4pt,line_length=40zw,number_of_lines=42, head_space=15mm,headheight=5mm, headsep=2mm,footskip=7mm"]
#B5印刷用・トンボあり、奇数・偶数ページで綴じしろに差を付けない 【ドラフト用(画像を当ててコンパイルの高速化)】
#綴じしろのスペースを空けるなら、gutter=30mmを入れる.
#texdocumentclass: ["review-jsbook", "media=print,paper=b5, serial_pagination=true,hiddenfolio=nikko-pc,openany, fontsize=10pt,baselineskip=15.4pt,line_length=40zw,number_of_lines=42, head_space=15mm,headheight=5mm, headsep=2mm,footskip=7mm, draft"]
# B5印刷用・トンボなし 【ドラフト用】
#texdocumentclass: ["review-jsbook", "media=print,paper=b5,tombopaper=b5 serial_pagination=true,hiddenfolio=nikko-pc,openany, fontsize=10pt,baselineskip=15.4pt,line_length=40zw,number_of_lines=42, head_space=15mm,headheight=5mm, headsep=2mm,footskip=7mm, draft"]
# B5電子配布版 【本番用】
#texdocumentclass: ["review-jsbook", "media=ebook,paper=b5, serial_pagination=true,hiddenfolio=nikko-pc,openany, fontsize=10pt,baselineskip=15.4pt,line_length=40zw,number_of_lines=42, head_space=15mm,headheight=5mm, headsep=2mm,footskip=7mm"]
# B5電子配布版 【ドラフト用】
#texdocumentclass: ["review-jsbook", "media=ebook,paper=b5, serial_pagination=true,hiddenfolio=nikko-pc,openany, fontsize=10pt,baselineskip=15.4pt,line_length=40zw,number_of_lines=42, head_space=15mm,headheight=5mm, headsep=2mm,footskip=7mm, draft"]

タイトルにて任意の位置で改行する

1:"syt\review-base.sty"ファイルを確認します。

下記のコードがタイトルページを生成するTeXコードになります。

% titlepage
\ifdefined\review@titlepage
  \ifthenelse{\isundefined{\review@titlefile}}{%
    \def\reviewtitlepagecont{%
       \begin{titlepage}
       \thispagestyle{empty}
       \begin{center}%
       \mbox{} \vskip5zw
       \reviewtitlefont%
       {\Huge\review@booktitlename\par}%
       \ifdefined\review@subtitlename
         \vskip 1em%
         {\Large\review@subtitlename\par}%
       \fi
       \vskip 15em%
       {\huge
       \lineskip .75em
       \begin{tabular}[t]{p{\textwidth}}%
       \centering\review@titlepageauthors
       \end{tabular}\par}%
       \vfill
       {\large\review@date \review@intn@edition\hspace{2zw}\review@intn@publishedby\par}%
       \vskip4zw\mbox{}
       \end{center}%
       \end{titlepage}\clearpage
    }
  }{%
    \def\reviewtitlepagecont{\review@titlefile}
  }
\fi

「{\Huge」と「\par}%」の間がタイトルに対応します。「\review@booktitlename」には、設定ファイルである"config.yml"ファイルで設定されているタイトルを引っ張ってきて代入されます。

しかし設定ファイルのタイトル指定のところでは改行を指定できません。

そこで、上記のTeXコードをベースとして(改行を含む)タイトルを決め打ちし、対応するタイトル専用のTeXファイルを用意すればうまくいくはずです。

これを踏まえた上で、このTeXコードを参考にしてタイトル部を決め打ちにしてしまうのです。

2:articleフォルダーに次の"title.tex"ファイルを作ります。

「{\Huge」と「\par}%」の間にタイトルとなる文字列を入れます。改行したい位置に"\\"を入れます。

\begin{titlepage}
\thispagestyle{empty}
\begin{center}%
\mbox{} \vskip5zw
\reviewtitlefont%
{\Huge ハッキング・ラボで遊ぶために\\辞書ファイルを鍛える本 \par}%
\ifdefined\review@subtitlename
  \vskip 1em%
  {\Large\review@subtitlename\par}%
\fi
\vskip 15em%
{\huge
\lineskip .75em
\begin{tabular}[t]{p{\textwidth}}%
\centering\review@titlepageauthors
\end{tabular}\par}%
\vfill
{\large\review@date \review@intn@edition\hspace{2zw}\review@intn@publishedby\par}%
\vskip4zw\mbox{}
\end{center}%
\end{titlepage}\clearpage

3:"config.yml"ファイルにおいてtitlefileのところで"title.text"を指定します。

# titlefile: null
titlefile: title.tex

参考記事

References

References
1 昔はseqsplitを使ったアプローチで解決していましたが、技術書典13以降はDockerのRe:VIEW環境に移行したので、別のアプローチで解決した次第です。

同人誌Re:VIEW

Posted by ipusiron