Quartoでアカデミックなスライドを作るためのTips
はじめに
Beamerはお好きですか?
先日, Quartoで作ったスライドを学会発表で使ってみました. 私の専門は経済学ですが, 経済学の世界では98%が
- そこそこ良いデザイン. カスタマイズ性も高い
- デザイン面にこだわらなければ, マークダウン記法なので, Beamerと同程度の労力で作成できる
- 保守性が高い. 文中で変数を利用できるので, モデルや分析を多少変更しても数字が自動でアップデートされる
などの点でかなり気に入っています.
以下では, 学術目的のプレゼンを行う際のQuartoでのTipsを紹介します. Quartoでの基本的なスライドの作り方は公式ドキュメント やTom MockさんのRStudioカンファレンスでのスライドなどを参考にしてください. 学会発表で用いたスライドはまだ公開できる段階にないので, HTML版スライドとコードを参考にしてみてください. PDF版はSlideDeckに上げてみました.
データ
私はスライドの中で図表をレンダリングしています. つまり, 論文中の図表の画像ファイルを埋め込んでいるわけではありません. これは,
- 論文中の図表で適切なフォントサイズはスライド上では小さすぎる
- ハイライトなどの自由がきかない
- スライドのテーマとデザインを合わせたい (後述)
などの理由からです. そのため別ファイルにて図表に起こす直前のデータフレームを保存しておき, 図表をプロットする直前で読み込む形式を取っております.
load("tb_hoge.rds")
tb_hoge |>
ggplot(aes(x, y)) +
geom_point()
このデータフレームを用いれば, スライド中の地の文で図表中の数値を簡単に利用できます.
2021年のデータでは, `r tb_hoge$value[tb_hoge$year == 2021]`%の人が…
また, 分析を多少変更してtb_hoge.rds
の値が変更になったとしても, レンダリングし直せば数値がアップデートされる点も便利です.[1]
テーマ
Quartoではデフォルトのテーマが10個ほど用意されています. これらもいいデザインですが, 図と合わせたいという観点から, custom.scss
を作成して独自のテーマを用いています. 現在は xaringanthemr のstyle_mono_accent()
風にしています. カスタムできる部分については公式ドキュメントを参照してください.
部分的なCSS設定
よく使うCSSの設定はcustom.css
に記述しますが, その場しのぎ的にCSSの設定を使いたい場合があります (例えば少しだけフォントのサイズを変更したい場合.) その場合は,
::: {style="font-size: 0.68"}
ちょとだけ小さくしてスペースを詰めたい文章
:::
のように, style=
以下にCSSを書き込むことで変更できます.
Fragment
QuartoもといReveal.jsではそこそこ複雑なアニメーションが使えます. 実例を見たほうがわかりやすいと思うので, Tom Mockさんのスライドの この部分からのスライドをみるとよいと思います.
これとは別に, ここで議論されているように, . . .
はcolumns
環境やヘッダータグなどに対してうまく動かないことがあります. このような場合は, fragment
環境を設定するとうまくいく場合が多いです.
図
テーマ
スライドデザインの基本は要素を少なくすることです. そのため, 図表であってもフォントと基本色をスライドに合わせることが重要だと思います. xaringanthemrはスライドデザインのテーマとそれに応じたggplot
のテーマを自動で作成してくれたため, かなり便利でした. 残念ながらQuartoに対応したものはまだ作成されていないと思うので, 以下のように自分で関数を宣言しました.
本家xaringanthemerではggplot2::update_geom_defaults
を用いて, ggplot2::geom_*
関数群の色も再定義していますが, 2色以上用いる場合はどのみち色を手動で指定しなければならないので, あえて上書きしていません. 以下のように使います.
color_base <- "#1C5253"
tb_hoge |>
ggplot(aes(x, y)) +
geom_point(color = color_base) +
theme_quarto()
ハイライト
Rで図のハイライトといえばgghighlightでしょう.
p <- tb_hoge |>
ggplot(aes(x, y)) +
geom_col(color = color_base) +
theme_quarto()
p
p + gghighlight(x == "Japan")
などの使い方によって, 効果的に話を展開できるでしょう.
表
markdown
vs. kableExtra
vs. gt
?
HTMLスライドにおける表の作成方法としては基本的に上記の3択になると思っています. どれも一長一短ですが,
Markdown Table
- ハイライトができない
- 複数行や複数列をまとめてさらに高いレベルのラベルをつける (つまり
の\LaTeX multirow
multicol
のような)ことができない
kableExtra
- すこしだけ
gt
より書きづらい. 例えば, %表記の列は文字列に変換した上でalign
を指定しないといけない - ハイライトが
gtExtras
と比べると面倒
などの理由でgt
を使っています. 論文用のkableExtra
一択です.
数式問題
実は, Quartoで数式混じりの表を用いる場合少し大変です. そもそもgt
はkableExtra
の数式がQuarto上でだけレンダリングされないことはQuartoのIssueに挙がっています. 簡単な解決策は,
kableExtra::kbl(data, format="markdown")
のようにmarkdown tableとして出力することです. しかし, これでは上で述べたmarkdown tableの問題を抱えることになります.
そこで私は完全な
- Unicodeのギリシャ文字 (θ, τ, δなど)
- <sup> や <sub> のHTMLタグ
を用いてgt::fmt_markdown
で評価することでお茶を濁しています. 表中の数式で複雑な式になることはまれなので, 現状は問題なく使えています.
tibble(a = c("θ = 0", "τ<sup>δ-1</sup>")) |>
gt() |>
fmt_markdown(columns = everything())
ハイライト
gt
パッケージ本体でもtab_style
という関数で表内のセルをハイライトすることはできます. しかしこれは冗長な書き方をしないといけないので, 行/列単位でよければgtExtras
パッケージのgt_highlight_rows()
やgt_highlight_cols()
が便利です.
出力
HTML or PDF?
学会発表は用意されたPCを使うと思いますが, ブラウザが入っていないPCというものは想定しづらいのでhtml形式でも問題ないと思います. YAMLヘッダーに以下のように記述すれば, self-containedなhtmlファイル1つだけ出力されるので, PDFファイルのように手軽に持ち運べるでしょう.[2]
format:
revealjs:
standalone: true
embed-resources: true
しかし, さまざまな場面でPDFのフォーマットでの提出が求められると思います. また, 実際にPDFでプレゼンするかは別として, 保険のためにも手元にあるといいと思います.
- HTMLファイルをブラウザで開いた状態で
E
を押す - ブラウザの印刷→PDFとして保存をする
とすれば, PDFを出力できます. なお, fragmet単位で別ページにしたい場合は, YAMLで pdf-separate-fragments: true
を指定しましょう.
ハイパーリンク問題
各スライドに飛ぶようなハイパーリンクは, 実質的に<h2>タグにジャンプすることにほかならないので, 以下のようにリンクを貼ることができます.
## A Slide {#sec-slide}
<a href="#/sec-detail">detail↗</a>
## A Detail Slide {#sec-detail}
<a href="#/sec-slide">↩︎</a>
しかし, 私が把握している限りだと上記のようなPDF出力をした場合, リンクは反映されません. どなたか解決法をご存知でしたらご教示いただければ幸いです.
おわりに
以上が, Quartoを学術発表で使ってみた際の私なりの工夫です. QuartoのスライドはBeamerとほとんど同じ労力で作成でき, デザインの自由度や数字の保守性が高く, かなり学術向きだと思います. お役に立てたら幸いです.
Discussion