このドキュメントを生成したRmdファイルのコードはこのgistにおいてます。

導入

これはTufte handout スタイルというもので、詳しくは適当にググってください。特徴は大きめなサイドノートがあり、図と文章がうまいことできて、そしてタイポグラフィもいい感じです。

このスタイルの元はLaTexやHTML/CSS1 See Github repositories tufte-latex and tufte-cssからきているようです。これらをtufte パッケージに詰め込んで、R Markdownに使えるようにしたとのことです。これを使うには、まずCRAN からtufteをインストールしてください。その後、R Markdownドキュメント冒頭のYAMLメタデータに、以下のように記述すればOKです:

---
title: "sushi tabetai"
author: "kazutan"
output:
  tufte::tufte_html: default
---

このパッケージの目的は2つあるそうです:

  1. 同一のR Markdownドキュメントから、PDFとHTMLの両方の出力をほぼ同じように提供すること;
  2. サイドノート領域や余白の図といったTufte styleの要素を書き出すのにシンプルなシンタックスを提供することです。実際すごくシンプルです。

見出し

第1レベルと第2レベルの見出ししか拾いません。要するに###のみです。あと、段落の最初部分に以下の様なおしゃれなものをつけることもできますが、日本語には関係ない気がするのでテンプレのをそのまま残しときます:

In his later books2 Beautiful Evidence, Tufte starts each section with a bit of vertical space, a non-indented paragraph, and sets the first few words of the sentence in small caps. To accomplish this using this style, call the newthought() function in tufte in an inline R expression `r ` as demonstrated at the beginning of this paragraph.3 Note you should not assume tufte has been attached to your R session. You should either library(tufte) in your R Markdown document before you call newthought(), or use tufte::newthought().

余白の図

余白に図を配置するには、knitrチャンクオプションでfig.margin = TRUEとしてしまえばOKです。以下チャンクの例です:

\```{r fig-margin, fig.margin = TRUE, fig.cap = "MPG vs horsepower, colored by transmission.", fig.width=3.5, fig.height=3.5, cache=TRUE}
library(ggplot2)
mtcars2 <- mtcars
mtcars2$am <- factor(
  mtcars$am, labels = c('automatic', 'manual')
)
ggplot(mtcars2, aes(hp, mpg, color = am)) +
  geom_point() + geom_smooth() +
  theme(legend.position = 'bottom')
\```

行頭の\はエスケープさせるために入れています。無視してください。このチャンクを入れると以下(右?)のようになります:

MPG vs horsepower, colored by transmission. MPG vs horsepower, colored by transmission.

library(ggplot2)
mtcars2 <- mtcars
mtcars2$am <- factor(
  mtcars$am, labels = c('automatic', 'manual')
)
ggplot(mtcars2, aes(hp, mpg, color = am)) +
  geom_point() + geom_smooth() +
  theme(legend.position = 'bottom')

チャンクオプションのfig.capは図のキャプションを提供します。また、fig.widthfig.heightでサイズ指定できます(inchです)。なお、ハンドアウトの余白に合わせて自動的に調整されます。

任意の余白コンテンツ

ぶっちゃけ、余白部分にはmarginfigureというknitrエンジンでいろんなのを放り込めます。以下のようなコードがあるとします:

\```{marginfigure}
We know from _the first fundamental theorem of calculus_ that for $x$ in $[a, b]$:
$$\frac{d}{dx}\left( \int_{a}^{x} f(u)\,du\right)=f(x).$$
\```

これをドキュメント内に入れておいてKnitすると、余白部分に上記の内容が出てきます。数式もOKです。

We know from the first fundamental theorem of calculus that for x in [a, b]:
\[\frac{d}{dx}\left( \int_{a}^{x} f(u)\,du\right)=f(x).\]

ただ、このmarginefigureブロック内では、できるだけシンプルなものにとどめておくようにしてください。太字(**太字**)や_イタリック_(_イタリック_)ぐらいにしておいて、この中でさらに脚注とか参照とかブロックレベルの要素(リストや引用など)は避けときましょう。

フルワイドな図

チャンクオプションでfig.fullwidth = TRUEと指定すれば、メイン部分と余白部分の両方にまたがる、フルワイドな図を描けます。以下チャンクの例です:

\```{r fig-fullwidth, fig.width = 10, fig.height = 2, fig.fullwidth = TRUE, fig.cap = "A full width figure.", warning=FALSE, cache=TRUE}
ggplot(diamonds, aes(carat, price)) + geom_smooth() +
  facet_grid(~ cut)
\```

このチャンクを含んでKnitすると、以下のようになります:

ggplot(diamonds, aes(carat, price)) + geom_smooth() +
  facet_grid(~ cut)
A full width figure.

A full width figure.

他のチャンクオプションとも併用できますし、fig.width, fig.cap, out.widthなど対応してます。

メイン部分の図

もちろんメイン部分にも図を描けますし、むしろこれがデフォルトです。以下チャンク例です:

\```{r fig-main, fig.cap = "A figure in the main column.", cache=TRUE}
ggplot(diamonds, aes(cut, price)) + geom_boxplot()
\```

このチャンクを含んでKnitすると、以下のようになります:

ggplot(diamonds, aes(cut, price)) + geom_boxplot()

A figure in the main column.

A figure in the main column.

キャプションは余白部分に表示されるようになります。

サイドノート

このスタイルの最も主要な機能は、やはりこのサイドノートかと。使い方は簡単で、ノートを入れたい場所で、^[ほげほげ]4 ほげほげと入れてください。ほげほげはノートの本文です。なおこれは本来脚注で、それが文末にではなく横にくるように設定してある、と考えてください。

なお、これは自動的に通し番号が振られるようになります。もし自動的に番号を割り振ってほしくない場合、tufteパッケージのmargin_note()関数をインラインRチャンクで挿入してください。うなぎの白焼き食べたいですよね ただし、このmargin_note()で差し込んだテキストではMarkdownシンタックスは評価されません。Markdownシンタックスなどいろいろしたいときは、先に紹介したmarginfigureブロックを利用してください。

References

HTML出力の場合、リファレンスは巻末ではなく余白ノート部分に出てきます。こまかいところは省略します。tufteのテンプレに書いてありますのでそっちを参照してください。

Tables

knitr::kableで作ってもらえば、このtufteスタイルの表が出力されます:

knitr::kable(
  mtcars[1:6, 1:6], caption = 'A subset of mtcars.'
)

A subset of mtcars.

mpg cyl disp hp drat wt
Mazda RX4 21.0 6 160 110 3.90 2.620
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875
Datsun 710 22.8 4 108 93 3.85 2.320
Hornet 4 Drive 21.4 6 258 110 3.08 3.215
Hornet Sportabout 18.7 8 360 175 3.15 3.440
Valiant 18.1 6 225 105 2.76 3.460

引用

Markdownシンタックス同様、>で引用となります。さらに、tufteパッケージ内のquote_footer()関数も使えます。以下サンプルです:

> "オープンソースのバグに文句だけ言う輩より、issueが即クローズされようとも、手を動かし続けるホクソエムらは素敵だなって思いますね"
>
> `\r tufte::quote_footer('--- teramonagi')`

三行目のrの前の\は取り除いてください。これを評価させるとこうなります:

“オープンソースのバグに文句だけ言う輩より、issueが即クローズされようとも、手を動かし続けるホクソエムらは素敵だなって思いますね”

— teramonagi

ちなみにquote_footer()を使わないと、普通の引用文として評価されるのでイマイチです:

“オープンソースのバグに文句だけ言う輩より、issueが即クローズされようとも、手を動かし続けるホクソエムらは素敵だなって思いますね”

— teramonagi

レスポンシブ

HTML出力されたものはレスポンシブです。ページ幅が760pxを下回ると、サイドノートと余白ノートは隠れるようにデフォルトで設定されています。サイドノートはその番号をクリックすると見れますし、余白ノートはその場所の丸印をクリックすると見れます。

このドキュメントの幅を小さくしてみて確認してみてください。

More Examples

テンプレのドキュメントに実用的なサンプルが記載されていましたが、ここでは省略します。実際にこのtufteパッケージをインストールして、テンプレを確認してみてください。

本家のテンプレRmdをみてみたい方は、このGitHubへのリンク、 もしくはRStudio (File -> New File -> R Markdown -> From Template)などから確認してください。

Enjoy!!