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`color-text.lua`.
the file
```{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`color` attribute, e.g.,
the
> 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('**太字**')
と書いても太字にはなりません).