(APPENDIX) 補遺 {-}

デフォルト値の自動調整 {#default-property}

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

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

デフォルトのフォント

PDF 出力時のデフォルトフォントは, 生成時に OS を判定して設定している. その設定は表 \@ref(tab:font-default) のようなルールである.

tibble(
  engine = c("XeLaTeX", "LuaLaTeX"),
  Linux = c("Noto", "Noto"),
  Mac = c("游書体", "ヒラギノ"),
  `Windows (>= 8)` = c("游書体", "游書体"),
  `Windows (それ以前)` = c("MSフォント", "MSフォント")
  ) %>% kable(
  booktabs = T,
  caption = "OS/エンジン別のデフォルトフォント"
  ) %>%
  column_spec(1, background = "gray") %>%
  kable_styling(latex_options = "hold_position")

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

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

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

チャンクオプションのデフォルト設定も 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 側で制御するのは難しい.

コードブロックの整形と自動折り返し {#autoformatter}

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行の上限を指定する機能はない[^styler-width]. rmdja ではデフォルトで styler を使ったコード整形をするとともに, フォーマット beamer_presentation_japdf_book_ja にコードブロックの自動折り返しを有効にする code_softwarp というオプションを用意した. 前者ではデフォルトで false, 後者では true である.

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

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

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

knitr::opts_chunk$set(tidy = F)

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

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

という r rmdja::texlogo("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) が参考になるだろう.

[^styler-width]: 参考: Issues #247 [^rstudio-margin]: 参考: Vertical Line in the source editor?

PDF の組版に関する細かい話

ここではpandocテンプレート等の設定を解説する. PDF の出力は pandoc に大きく依存している. pandoc は PDF を生成する際に, YAMLフロントマターの設定を pandoc のテンプレートに代入し, 本文を追加した .tex ファイルを作成してタイプセットしている. よってプリアンブル部分は完全に動的に生成されるわけではなく, ある程度の定型が存在する. これを pandoc テンプレートというが, rmdja では日本語表示にあたっていろいろなパッケージ間の競合が見られたこのテンプレートを多少いじっている.

3種類の和文フォントを個別設定をした場合, \XeLaTeX{=latex}XeLaTeX{=html} はフォールバックフォントを有効にしている. j****fontoptions 以下に, FallBack=... というオプションでフォールバックフォントを指定すれば有効になる.

用紙サイズは, デフォルトは a4paper, B5 がよいなら b5paper オプションを classoptions: に指定する.

PDF を印刷所に持ち込んだことがないため詳しいことはわからないが, 『Bookdownによる技術系同人誌執筆』で指摘されているようなトンボやノンブルは出力されるように作ってある (そしてここで紹介されているようなLaTeXのコマンドの多くは rmdja では書く必要がなくなった).

TODO: PART の扉ページにはまだノンブルが表示されない

画像の配置

現在, PDFで画像の配置を固定する方法について何も特別なものを用意していない. 単純に自分は必要だとおもったことがないため. 固定したい場合は R Markdown や Bookdown のドキュメントを参考にしてほしい. ただし, 通常は章や部をまたいで表示されることはない (はず).

取り消し線

LaTeX の各パッケージのバージョンによっては, 和文に取り消し線 (\sout) を与えるとタイプセット時にエラーが出ることがある. もともとulem.styは欧文を前提にしたものなので適当に妥協してほしい.

TODO: しかし英文で書きたい場合

rmdja の機能を使いたいが, 執筆は英語でしたいと言う場合は最低限以下のような設定変更が必要である. デフォルトは日本語用文書クラスのため,

documentclass: book / report / article

など欧文用文書クラスを指定する.

rmdja では和文フォントを参照するので, 和文フォントの設定も手動で解除する必要がある.

を指定する. そして各種見出しも英文用に調整する.

TODO

参考文献リストの書式にこだわる: jecon.bst

0.4.3 以降の rmdjabiblatex がデフォルトであり, でいちおう和文献のリストが最低限のクオリティで表示できるようになっている. しかし自分で言うのもなんだが, だいぶ稚拙な出来栄えである. そこで和文と欧文を使い分けたスタイルファイルとして, jecon.bst を紹介する. jecon.bst の公式ではなく, 私がカスタマイズしたバージョンでも良い. こちらは本来よりも電子媒体としての利用を重視して,

といった変更をしている. 後者は, BibTeX エントリに以下のように archivePrefixarxiv と言う値が入っていると, eprint の値が ArXiv ID として表示される. これは ArXiv から直接 .bib ファイルを取得したり, Zotero などでインポートすれば必ず入力される項目である.

archivePrefix = {arXiv},
eprint = {XXXX.YYYYY},
...

このスタイルの使用には r rmdja::texlogo("upBibTeX") が必要である. 詳細は \@ref(biblio-advaneced) 章を参照されたい.

TODO: 現在 jecon.bst の表示も少しおかしいので確認中.

fontregisterer でグラフ用フォントを自動登録

Rで描いたグラフに日本語を表示する場合, Linux 系 OS ならばフォント名を適切に設定するだけで表示されるが, Windows や Mac ではフォントをグラフィックデバイスに登録する必要がある. しかし手動登録は面倒なので, インストールされているシステムフォントを全て自動登録するパッケージ, fontregisterer を用意している.

remotes::install_github(
  "Gedevan-Aleksizde/fontregisterer", repos = NULL)

もちろんこれは R Markdown 以外でも使用できる. このパッケージは読み込まれた時点で登録処理を行うため,

require(fontregisterer)

を最初に実行するだけで良い. 詳しい仕組みの解説は『おまえはもうRのグラフの日本語表示に悩まない (各OS対応)』に書いている.



Gedevan-Aleksizde/rmdja documentation built on Sept. 28, 2021, 2:49 a.m.