6 (WIP) 簡単なレイアウト・スタイル変更

前章では文書の内容に関する構文を紹介した. ここでは, 文書全体のデザインやスタイルの設定方法のうち, rmdja が用意している簡単なものを紹介する.

6.1 フォント変更

フォント変更の方法は HTML と PDF で大きく違う. まずは HTMLについて. _output.yml にはデフォルトのフォントを設定できるが, 選択肢は sansserif しかない.

output: rmdja::gitbook_ja:
  config:
    fontsettings:
      family: serif

しかし HTML は文字通りHTMLで出力しているため, CSS の使い方次第でいくらでもデザインを変えることができる. 例えば自作した CSS ファイルを以下のように指定できる.

output:
  output: rmdja::gitbook_ja:
    css: ABC.css

PDF を生成する場合, ver 0.3 以降ではデフォルトのフォントファミリを OS に応じて変えている. もし変更したい場合はYAMLフロントマターの以下の項目を変更する

  • mainfont: 欧文セリフフォントファミリ
  • sansfont: 欧文サンセリフフォントファミリ
  • monofont: 等幅フォントファミリ (コードの表示などに使用)
  • jfontpreset: 和文フォントファミリのプリセット
  • jmainfont: 和文メインフォントファミリ (一般に明朝体を指定)
  • jsansfont: 和文セリフフォントファミリ (一般にゴシック体を指定)
  • jmonofont: 和文等幅フォントファミリ (コードの表示などに使用)

jfontpresetzxjafont または luatex-ja によるプリセットで, 3種類の和文フォントを一括指定できる. 個別指定したフォントはこれを上書きする. 特にこだわりがないなら一括指定で良いが, ソースコードを多く掲載する場合は M+Ricty などのフォントを用意すると良いだろう. rmdja ではデフォルトで3種類の和文フォントファミリに対して, OSごとの標準日本語フォントが選択される (図 6.1). いずれも各OSで標準でインストールされているはずであるが, 現時点ではフォントが実際にインストールされているか確認する機能はない.

表 6.1: デフォルトで使用される日本語フォントファミリ
Mac Linux Windows (8以降) Windows (それ以前)
XeLaTeX 游書体 Noto 游書体 MSフォント
LuaLaTeX ヒラギノ ProN Noto 游書体 MSフォント

それ以外で使用可能な主なプリセット名は表 6.2 の通り. これらは XeLaTeX, LuaLaTeX でそれぞれ zxjafont.sty, luatex-ja.sty を利用してフォントが埋め込まれる. 両者の多くではプリセット名が共通しているが, 一部例外もあることに注意 (特に XeLaTeX は luatex-ja との互換性を考慮してエイリアスをいくつも用意している). また, より詳細な一覧やオプションの全貌については, ⼋登崇之氏の『PXchfon パッケージ』および zxjafont のマニュアル と, 『luatex-ja の使い方』を確認してほしい.

表 6.2: 主な指定可能なフォントプリセット名
フォント XeLaTeX LuaLaTeX 備考
MS ゴシック/明朝 ms ms XeLaTeX のみ HGフォントと併用する ms-hg などのバリエーションあり
游書体 yu-win10 yu-win10 Windows 8 以前は yu-win, Mac では yu-osx
ヒラギノ系 hiragino-pro hiragino-pro hiragino-pron で ProN/StdN版を指定
Noto フォント noto/noto-jp noto-otf/noto-otc
源ノ角ゴ/明朝 sourcechan-jp sourcehan-jp
原ノ味フォント haranoaji haranoaji
梅フォント ume ume
小塚フォント kozuka-pro kozuka-pro -pr6 で ProVI版, -pr6n で Pro6N版を指定なども指定可能
IPA (Ex) フォント ipa/ipaex ipa/ipaex XeLaTeX のみ ipa-hg などのバリエーションあり

さらに, それぞれの項目に対してオプションを設定する場合, options と接尾辞のついた項目が用意されている. 欧文と和文フォントで全く異なるタイプのフォントを使ったために相対的なサイズが合わず不格好な場合は

mainfont: Palatinno
mainfontoptions:
  - Scale=0.9

などと書いて調整できる.

6.1.1 どのフォントを使用すべきか

既に書いたように rmdja では, Windows なら游書体シリーズやBIZ UDフォントシリーズ, Macならヒラギノや游書体といったようにOS標準のフォントが自動で選択される. よく, LaTeXやグラフで日本語が表示できないときは「IPAフォント」をダウンロードして使え, という記述がネット上に出回っているが, これは正確ではないとわかる.

文字化けは多くの場合, 文字コードの指定ミスか日本語のグリフ (文字) が存在しない欧文フォントを使用しているのが原因であり, このようにしかるべき方法でフォントを指定すれば使い慣れたOS標準のフォントが使用でき, BIZ UDフォントのような可読性に優れたフォントも使用可能である.

また, 無料公開されているフォントとしては, Noto フォントや原ノ味が存在する. 特に後者は見た目こそ既存の有名フォント(原ノ角やNoto)と大差ないが, CIDを持っており組版の点で効率的であり, Tex Live にも同梱されるようになった.

一方で, IPAフォントシリーズのうち, 「IPAmj明朝」フォントは行政の戸籍管理システム用途で開発されたため14 約6万字の漢字を収録するなど他の無料公開フォントと比べ格段に収録グリフ数が多いという特徴がある. さらに, CJK統合漢字のフルサポートをしているフォントとして, 9万字近い漢字を収録した花園明朝シリーズがある.

言うまでもなくこれらは明朝体のみであるため単体では整った日本語文書に使用することが難しいが, 異字体や稀にしか使われない(あるいは日本語では通常使われない)漢字の表記にこだわりたい場合は必要になるだろう15.

6.2 YAML フロントマターの設定によるスタイル変更

RMD ファイルの冒頭に書かれているYAMLフロントマターは様々なことが設定できる. これらのオプションは Pandoc のものに対応している. HTML はスタイルのほとんどが 規格化された CSS で操作できるため, 主に PDF に関するものである. また, 本章はあくまで簡易的な機能解説であるため, より詳細な解説は後の章で再度取り上げる.

6.2.1 ハイパーリンクの配色変更

たとえば PDF では, 以下のようにしてハイパーリンクの色を変更できる.

link-citations: true
linkcolor: blue
citecolor: blue
urlcolor: magenta

まず, ハイパーリンクを有効にする, link-citations:true が必要である. 次に, リンクの種類ごとに色を指定できる. linkcolor は文書のハイパーリンクの色, citecolor は巻末の参考文献リストへのリンクの色, そして urlcolor は文書外の URL へのリンクの色である.

また, ページのヘッダ・フッタは pagestyle で指定できる.

pagestyle: headings

文書クラスによっても多少変わるが, プリセットが4種類用意されている.

  1. empty: 何も表示しない
  2. plain: ページ数のみ表示
  3. headings: ヘッダに罫線を引き, ページ数だけでなく章のタイトルも表示する
  4. fancy: ユーザによるカスタマイズ (WIP)
  1. が一般的な書籍のものに近いスタイルである. (1-3) は, タイトルページや調整のための白紙ページなどはかならずしも変更されない. そういった根本的な変更がしたい場合のため, (4) が用意されている. しかし, 現時点では fancyhdr.sty の使い方を知る必要がある.

6.2.2 LaTeX エンジンの変更

PDF の出力は rrmdja::texlogo(“LaTeX”)を使用する. その処理プログラムにはいくつかバリエーションがあり,rmdjaでは XeLaTeX とrmdja::texlogo(“LuaLaTeX”)の使用を想定している (R Markdown では pdfLaTeX もサポートしているが, これは日本語表示が難しいためrmdja` では採用していない).

両者は多少の違いがある (正確には, 両者それぞれに対応した和文組版パッケージの違いにも由来する).

  1. 組版の違い. XeLaTeX で和文組版を制御する zxjatype.sty にはいくつか改善の余地が残っている.
  2. 速度の違い. 年々改善されているようだが, それでも LuaLaTeX は処理の遅さが目立つ16.
  3. フォントレンダの違い. 一概に言うのは難しいが, デフォルト設定では文字のウェイトや和文・欧文の相対的なバランスが微妙に異なる.
  4. 和文・欧文を同時に扱う際の挙動の違い. LuaLaTeX は和文と欧文の処理ルールが競合する時, 和文の処理を優先する傾向がある. 一方で rrmdja::texlogo(“XeLaTeX”)(およびzxjatype.sty`) はなるべく両者を共存できるように作られている.

もし和文組版の厳格さを優先したいのなら rrmdja::texlogo(“LuaLaTeX”)を使うべきである. しかし処理速度があまりに遅いとか, 欧文の扱いが気に入らないとかの場合はr rmdja::texlogo("XeLaTeX") を使うと良い. 特に書籍形式でなくプレゼンテーション資料であれば, 組版ルールの厳格さはあまり気にならないことだろう.

6.2.3 文書クラスのカスタマイズ

デフォルトでは bxjsbook という文書クラスを使用している. この他 rmdja では bxjsreport, ltjsbook, ltjsreport, ljreq という文書クラスに対応している. ただし ljreq は LuaLaTeX でのみ動作する.

6.2.4 LaTeX のカスタマイズ

PDF のデザインを微調整したい場合, 自分で LaTeX のソースに変更を加える必要がある. よってこの機能は LaTeX の使用に慣れたユーザのみが使用してほしい.

LaTeX のソースに変更を加える方法は2つ. 1つは header-includes を使うことである.

header-includes:
  - ...
  - ...

これでリスト風にプリアンブルを書くことができる. ただし, % を使った改行エスケープは使用できない. もう1つは, 出力フォーマットの includes に設定する方法で, 以下のように命令文ではなく TEX ファイルを指定する.

output: rmdja::pdf_book_ja:
  includes:
    in_header: i.tex
    before_body: b.tex
    after_body: a.tex

それぞれ, プリアンブル, 本文冒頭 (document 環境, 表紙や目次等の直後), 本文後に挿入される. しかし, TEX ファイルの大枠は Pandoc のテンプレートファイルで決まっているため競合することもある. よってテンプレートを確認しながら作る必要がある. テンプレートファイルは Pandoc 独自の簡易なマクロが挿入されている以外は通常の LaTeX ソースと同じである17.

テンプレートファイルは R で以下を実行して得られるディレクトリにある. beamer-ja.tex.template は beamer 用, document-ja.tex.template はそれ以外の文書用である.

system.file("resources/pandoc-templates", package = "rmdja")

テンプレートを修正しなければ意図した変更ができない場合, 以下のようにして別のテンプレートファイルを指定できる.

output: rmdja::pdf_book_ja:
  template: new-file

6.3 チャンク/コードおよび出力ブロックのスタイルの一括変更

すでに書いたように, コードブロックのシンタックスハイライトはいくつかのプリセットを適用できる. また, チャンクオプションにはいろいろなものがあり, それらは全て, knitr::opts_chunk::set() で以降のチャンクに対して一括して適用できる. 詳細は https://yihui.org/knitr/options/#code-decoration などを見てもらうとして, いくつかを抜粋する. YAMLフォーマットと違い, チャンクオプションは全て R のコードとして評価されるため, 論理値は TRUE/FALSE または T/Fと表記すること.

  • highlight: シンタックスハイライトを適用するかどうか.
  • background: コードブロックの背景色. デフォルトは #F7F7F7 つまり灰色である.
  • tidy, tidy.opts: コードの自動整形を適用するかどうかと, そのオプション. rmdja のデフォルト設定では styler パッケージを使用している. 詳しくは付録 (autoformatter) を参照.
  • prompt: コードブロックにプロンプト記号 > を表示するかどうか
  • comment: 出力ブロックの行頭に表示する記号. デフォルトは ##
  • size: 出力ブロックのフォントサイズ
  • indent: 出力ブロックのインデント

6.3.1 行番号の表示

行番号の表示は attr.source = c(".numberLines", .lineAnchors") を指定する.

rmdja で提供するフォーマットでは, `YAML フロントマターで一括して行番号を表示することを指定できる.

output: rmdja::pdf_document_ja:
  add_rownumber: true

このオプションは上記のチャンクオプションのデフォルト値を変更するものである. よって, これを設定した状態で任意のコードブロックの行番号を非表示としたい場合は逆にチャンクオプション attr.source = NULL を指定する.

6.3.2 コードブロックのページまたぎ禁止

長いソースコードを掲載するとページまたぎが発生する. 現時点では, rmdja の機能としてコードブロックに個別にページまたぎを許可・禁止を指定する機能はない (Pandoc の基本機能の範囲でサポートされていないため) が, 一括で指定することはできる. 例えば

header-includes:
  - \@ifpackageloaded{fvextra}{}{\usepackage{fvextra}}
  - \DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\},breaklines,breakanywhere,samepage=true}

と書く. ただし直接関係あるのは samepage=true だけである. これはテンプレートの記述を上書きするという乱暴な方法なので, 他のデフォルトオプションも混在している. commandchars=\\\{\} はシンタックスハイライトに関する設定で, 基本的に消すべきでない. breaklines は行途中の折り返しを許可するもの, breakanywhere はどこでも行の折り返しを許可するというもので, いずれもデフォルトのコード自動整形と関係がある. ちなみに TEX ファイルを開いて highliting 環境に個別に samepage=true オプションを指定すれば個別に折り返しを禁止できる.


  1. https://www.ipa.go.jp/about/press/20111026_2.html↩︎

  2. LaTeX での使い方は https://texwiki.texjp.org/?TeX%E3%81%A8%E5%A4%96%E5%AD%97 などを参照↩︎

  3. ただし R Markdown に限って言えば R コードの処理時間のほうが問題となることもある. また, XeLaTeX であっても文献処理や索引処理など関連プログラムを多く使用すればそれなりに遅くなる.↩︎

  4. 現時点では日本語版ユーザーガイドでも未翻訳のパート. しかし if, for 文など簡単な制御構文しかないため, 結局 LaTeX のマクロを使うことが多いだろう. https://pandoc-doc-ja.readthedocs.io/ja/latest/users-guide.html#templates, https://pandoc.org/MANUAL.html#templates↩︎