5.1 フォント色

Markdown 構文にはテキストの色を変更する方法は組み込まれていません. HTML と LaTeX の構文で単語の書式を変更できます.

  • HTML では, テキストを <span> タグで囲み CSS で色を設定します. 例えば <span style="color: red;">text</span> というふうに.

  • PDF では, LaTeX コマンドの \textcolor{}{} が使えます. これには LaTeX パッケージの xcolor が必要で, Pandoc のデフォルトの LaTex テンプレートに含まれています.

PDF でテキストの色を変更する例として, 以下のようなものを挙げます.

---
output: pdf_document
---

薔薇は \textcolor{red}{赤い}, 菫は \textcolor{blue}{青い}.

上記の例では, カーリー・ブレイス({})のペアの1番目には指定するテキスト色が含まれ, 2番めには色を適用したいテキストが含まれています.

複数の出力フォーマットに対応する R Markdown の文書をデザインしたいときは, 生の HTML または LaTeX コードを文書の中に埋め込むべきではありません. それは, 出力フォーマットがかわると無視される (例: LaTeX コードは HTML では無視され, HTML タグは LaTeX 出力時には失われます.) ためです. 次に, この問題に対処する方法を2つ提示します.

5.1.1 生の HTML/LaTeX コードを書く関数を使う

以下のようなカスタム R 関数を書くことで knitr パッケージの is_latex_output() および is_html_output() 関数を使って, 出力フォーマットに依存した適切な構文を挿入することができます.

colorize <- function(x, color) {
  if (knitr::is_latex_output()) {
    sprintf("\\textcolor{%s}{%s}", color, x)
  } else if (knitr::is_html_output()) {
    sprintf("<span style='color: %s;'>%s</span>", color,
      x)
  } else x
}

そうするとインライン R コード内で `r colorize("文の一部を赤色にする", "red")` ように使うことができます. これは 文の一部を赤色にする でしょう (モノクロで印刷されたものを読んでいるなら, 赤色には見えないはずです).

5.1.2 Lua フィルタを使う (*)

Lua という他のプログラミング言語が関わるこの方法は, R ユーザにとっては少し発展的ですが, きわめて強力です. Pandoc の Lua フィルタ(4.20節参照)を使って Markdown 要素をプログラムで修正することができます. 以下は使用例の全容です.

---
title: "Color text with a Lua filter"
output: 
  html_document: 
    pandoc_args: ["--lua-filter=color-text.lua"]
  pdf_document: 
    pandoc_args: ["--lua-filter=color-text.lua"]
    keep_tex: true
---

First, we define a Lua filter and write it to
the file `color-text.lua`.

```{cat, engine.opts = list(file = "color-text.lua")}
Span = function(el)
  color = el.attributes['color']
  -- if no color attribute, return unchange
  if color == nil then return el end
  
  -- transform to <span style="color: red;"></span>
  if FORMAT:match 'html' then
    -- remove color attributes
    el.attributes['color'] = nil
    -- use style attribute instead
    el.attributes['style'] = 'color: ' .. color .. ';'
    -- return full span element
    return el
  elseif FORMAT:match 'latex' then
    -- remove color attributes
    el.attributes['color'] = nil
    -- encapsulate in latex code
    table.insert(
      el.content, 1,
      pandoc.RawInline('latex', '\\textcolor{'..color..'}{')
    )
    table.insert(
      el.content,
      pandoc.RawInline('latex', '}')
    )
    -- returns only span content
    return el.content
  else
    -- for other format return unchanged
    return el
  end
end
```

Now we can test the filter with some text in brackets with
the `color` attribute, e.g.,

> Roses are [red and **bold**]{color="red"} and
> violets are [blue]{color="blue"}.

この例では, bracketed_spans という名称の Pandoc Markdown 拡張機能をこっそり使っています. これはテキストに属性を付けて書くことを可能にします. 例えば [text]{.class attribute="value"} のように. cat コードチャンク19内で定義された Lua フィルタは, 出力が HTML ならば <span style="color: ..."></span> という形でテキストを配置し, LaTeX なら \textcolor{...}{} として配置します. color-text.lua というファイル名で書き出しコマンドラインオプション --lua-filter で有効になった Lua フィルタは出力フォーマットの pandoc_args オプションを経由して Pandoc に与えられます.

従来の方法と比較して, Lua フィルタを使う利点はパーレン (()) の中でも Markdown 構文が使えることですが, 以前の節で紹介した R の colorize() 関数は Markdown 構文を使うことができません (例えば colorize('**太字**') と書いても太字にはなりません).


  1. cat コードチャンクを詳しく知らないのなら, 15.6節を見てください. ここでは, チャンクを .lua ファイルに書き出す便利な方法としてこのエンジンを使っています. そのため Lua スクリプトを color-text.lua という別のファイルとして管理しなくてもよいわけです. cat エンジンを使いたくなというなら, コードチャンクに Lua コードを埋め込む代わりに Lua コードを正しくコピーして別のファイルに保存することができます.↩︎