9.1 LaTeX か HTML か

LaTeX と HTML はどちらもよく使われるフォーマットです. knitr::is_latex_output() 関数は出力フォーマットが LaTeX かどうか (Pandoc 出力フォーマットの latex および beamer) を教えてくれます. 同様に knitr::is_html_output 関数は出力フォーマットが HTML かどうか教えてくれます. デフォルトでは Pandoc 出力フォーマットのうち markdown, epub, html, html4, html5, revealjs, s5, slideous, そして slidy が HTML 出力とみなされます. ある Pandoc 出力が HTML であると思えないなら, そのフォーマットを除外するために, 例えばこのように excludes 引数を使えます.

# markdown を HTML として扱わない
knitr::is_html_output(excludes = "markdown")
## [1] TRUE

ある出力要素が LaTeX または HTML のみで生成されるのなら, これらの関数を条件つきで生成できるように使えます. 例えば, PDF のページには大きすぎる表はフォントサイズを小さくした環境内に表を入れるとよいでしょうが, そういった LaTeX 環境は HTML 出力では機能しませんので, HTML 出力に含めるべきでありません (HTML 出力でフォントサイズを調整したいなら, CSS を使うこともできます). 以下はその例です.

---
title: tiny 環境内で表をレンダリングする
output:
  pdf_document:
    latex_engine: lualatex
  html_document: default
documentclass: ltjsarticle
---

```{r, setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
options(knitr.table.format = function() {
  if (knitr::is_latex_output()) 'latex' else 'pandoc'
})
```

LaTeX 環境の `tiny` は LaTeX 出力でのみ生成されます.

```{r, include=knitr::is_latex_output()}
knitr::asis_output('\n\n\\begin{tiny}')
```

```{r}
knitr::kable(mtcars)
```

```{r, include=knitr::is_latex_output()}
knitr::asis_output('\\end{tiny}\n\n')
```

比較のため, 以下に通常のフォントサイズの表を配置します.

```{r}
knitr::kable(mtcars)
```

上記の例でのポイントはチャンクオプション include = knitr::is_latex_output() です. \begin{tiny} \end{tiny} 環境は出力フォーマットが LaTeX の場合のみ含まれます. この例の2つの表は出力が LaTeX でない場合は同じ見た目になるでしょう.

5.1節では HTML と LaTeX 出力のテキストの色を変更する関数を使用しました. 4.14節では, アニメーションの例を提示しました. これにも今回の小ワザを使うことができます. HTML 出力に対してアニメーションを生成し, LaTeX 出力に対しては静止画を生成するコードチャンクはこのようになります.

```{r animation.hook=if (knitr::is_html_output()) 'gifski'}
for (i in 1:2) {
  pie(c(i %% 2, 6), col = c('red', 'yellow'), labels = NA)
}
```

これらの条件付けのための関数はどこでも使えます. 他のチャンクオプションにも使えます (例えばチャンクの評価に条件を付けるため eval に使うなど) し, あるいはこの例のように R コード内にも使えます.

```{r, eval=knitr::is_html_output(), echo=FALSE}
cat('これは HTML 出力でのみ見えます')
```

```{r}
if (knitr::is_latex_output()) {
  knitr::asis_output('\n\n\\begin{tiny}')
}
```