補遺A デフォルト値の自動調整

これはユーザーが通常気にする必要のないような rmdja 内部での処理を解説する. knitrrmarkdown の仕様に精通している, 自分で細かい設定をしたいユーザ向けの解説である. 既に R Markdown に慣れていて, かなりトリッキーな使い方をしていたらどうも rmdja の機能とは競合するようだ, という場合は参考にしてほしい.

rmdja では R Markdown で日本語文書を作成する上での大きな障害の1つである, YAML フロントマターの設定を改善している. rmdja の文書フォーマットはYAMLフロントマターのデフォルト値などを日本語文書に適したものに変更している. さらに, ユーザーをOSごとのフォントの違いや煩雑で重複だらけの設定から解放するため, 内部処理でも動的に設定変更している. もちろんこれらは ユーザーによる YAML フロントマターやチャンクオプションの変更で上書きできる.

A.1 デフォルトのフォント

PDF 出力時のデフォルトフォントは, 生成時に OS を判定して設定している. その設定は表 A.1 のようなルールである.

表 A.1: OS/エンジン別のデフォルトフォント
engine Linux Mac Windows (>= 8) Windows (それ以前)
XeLaTeX Noto 游書体 游書体 MSフォント
LuaLaTeX Noto ヒラギノ 游書体 MSフォント

これらは XeLaTeX ならば zxjafont, LuaLaTeX ならば luatex-ja で用意されているプリセットを使って設定している. 使用 OS の判定は R の基本関数による. なお, Noto フォントを選んだのは Ubuntu 18以降の日本語用フォントだからである. Ubuntu から派生したOSにはプリインストールされていることが多いようだが, Debian, Cent OS, Fedora 等にはおそらくプリインストールされていないので注意. 現時点ではフォントが実際にインストールされているかを確認する機能はない.

フォントのプリセットを指定した場合, 個別設定は無効になる. さらに, 3種類の和文フォントを全て設定していない場合もデフォルトのプリセットから選ばれる.

A.2 チャンクオプションのデフォルト設定

チャンクオプションのデフォルト設定も R Markdown から多少変更している.

block, block2, asis などのブロックを echo=Finclude=F にするメリットはほぼないため, knitr::opts_chunk$set(echo = F, include = F) と一括設定してもこれらは echo=T, include=T のままである. 変更したい場合は, チャンクごとに設定することで有効になる.

デフォルトの R グラフィックデバイスは, HTML では "PNG", PDF では "cairo_pdf" としている. "cairo_pdf" を使う理由は (1) R でよく描画するような単純な図形はベクタ画像が適しているが, 件数のとても多いデータの散布図などはベクタ画像にするとファイルサイズが大きくなるため, そのような画像を適度に「劣化」させてファイルサイズを軽減してくれる, (2) 日本語フォントの表示と埋め込みの設定が最も簡単, というものである. そして HTML はそもそもデフォルトの設定で PDF が表示できない Web ブラウザが多いことから, PNG をデフォルトにした. もし HTML でもベクタ画像を表示したいのなら "svglite" を設定して SVG 形式にすると良いだろう.

knitr::opts_chunk(dev = if (knir::is_latex_output()) "cairo_pdf" else "svglite")

ただし, R 以外のプログラムで出力した画像には cairo_pdf は使えないため, 内部では pdf を使用している. これらの画像が日本語フォントを適切に埋め込めるかはそれぞれの設定に依存するため, R 側で制御するのは難しい.

A.3 コードブロックの整形と自動折り返し

HTML はともかく, PDF はコードの自動折り返しが難しい. 例えば RCB Ch. 5.3 では, listings.sty を使う方法が書かれているが, この方法ではデフォルトのシンタックスハイライトが使えなくなり, R Markdown の大きなメリットの1つが損なわれてしまう. また, 同 Ch. 11.10 では knitr のチャンクオプションで tidytidy.opts を設定するという方法が紹介されている. この機能は formatR::tidy_source() 関数を利用したコード整形であり, この関数の width.cutoff というオプションで自動折り返しを始める位置を指定できる. (たまに勘違いしている人がいるが, ドキュメントをちゃんと読めば分かるように) このようにコード整形機能は自動折り返しを目的としたものではないため, 長すぎる関数名や文字列があると width.cutoff を超過することも十分ありえる. 同章では styler パッケージがより機能が豊富だと言及しているが, このパッケージも現時点では1行の上限を指定する機能はない37. rmdja ではデフォルトで styler を使ったコード整形をするとともに, フォーマット beamer_presentation_japdf_book_ja にコードブロックの自動折り返しを有効にする code_softwarp というオプションを用意した. 前者ではデフォルトで false, 後者では true である.

しかし, これらを使っても「きれいな」コーディングになるとは限らない. 過剰な折り返しで行数が増えてしまう可能性もあるし, 折り返しや改行の位置がふぞろいになる可能性もある. また, トークン単体で非常に長い場合 (たとえば100字分の文字列) も, 途中で折り返すことはできない. よって現状では究極的には手動で調整する必要がある

その際のアシストツールとして, RStudio の機能であるマージン位置の表示38 や, WrapRmd パッケージを使うのが良いだろう.

逆に自動コード整形が一切不要という場合, 最初のチャンクで以下のように設定する.

また, 自動折り返しの発生した箇所にはデフォルトでキャリッジリターンの記号が表示される. これが不要である場合, 例えば

\usepackage{fvextra}
\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\},breaklines,breakanywhere,breaksymbolleft={},breaksymbolsepleft=0pt,breaksymbolindentleft=0pt}

という LaTeX コードを includes または header-includes を経由して与える. より細かい設定は fvextra のドキュメントを参照してほしい.

PDF での自動コード整形に関する話題は R Markdown の Issues #646 および Stack Overflow の質問 “pandoc doesn’t text-wrap code blocks when converting to pdf” と TeX Stack Exchange の質問 [“Break Lines in minted environment”])(https://tex.stackexchange.com/questions/200310/break-lines-in-minted-environment) が参考になるだろう.