💠

Quartoでアカデミックなスライドを作るためのTips

2022/12/21に公開

はじめに

Beamerはお好きですか?

先日, Quartoで作ったスライドを学会発表で使ってみました. 私の専門は経済学ですが, 経済学の世界では98%が\LaTeXのBeamer, 2%ぐらいがPowerPointを用いてプレゼンをします. 私は個人的にはBeamerのデザインを好みませんし, PowerPointは進行中のプロジェクトの場合, 保守性 (つまり簡単に変更できるか) に問題があると思っています. Quartoは

  1. そこそこ良いデザイン. カスタマイズ性も高い
  2. デザイン面にこだわらなければ, マークダウン記法なので, Beamerと同程度の労力で作成できる
  3. 保守性が高い. 文中で変数を利用できるので, モデルや分析を多少変更しても数字が自動でアップデートされる

などの点でかなり気に入っています.

以下では, 学術目的のプレゼンを行う際のQuartoでのTipsを紹介します. Quartoでの基本的なスライドの作り方は公式ドキュメント やTom MockさんのRStudioカンファレンスでのスライドなどを参考にしてください. 学会発表で用いたスライドはまだ公開できる段階にないので, HTML版スライドコードを参考にしてみてください. PDF版はSlideDeckに上げてみました.

データ

私はスライドの中で図表をレンダリングしています. つまり, 論文中の図表の画像ファイルを埋め込んでいるわけではありません. これは,

  1. 論文中の図表で適切なフォントサイズはスライド上では小さすぎる
  2. ハイライトなどの自由がきかない
  3. スライドのテーマとデザインを合わせたい (後述)

などの理由からです. そのため別ファイルにて図表に起こす直前のデータフレームを保存しておき, 図表をプロットする直前で読み込む形式を取っております.

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 を作成して独自のテーマを用いています. 現在は xaringanthemrstyle_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に対応したものはまだ作成されていないと思うので, 以下のように自分で関数を宣言しました.

https://github.com/nicetak/quarto-slides-example/blob/main/code/slides/quarto_academic_tips/slides.qmd#L61-L113

本家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でしょう.

1つ目のスライド
p <- tb_hoge |>
  ggplot(aes(x, y)) +
  geom_col(color = color_base) +
  theme_quarto()

p
2つ目のスライド
p + gghighlight(x == "Japan")

などの使い方によって, 効果的に話を展開できるでしょう.

markdown vs. kableExtra vs. gt?

HTMLスライドにおける表の作成方法としては基本的に上記の3択になると思っています. どれも一長一短ですが,

Markdown Table

  • ハイライトができない
  • 複数行や複数列をまとめてさらに高いレベルのラベルをつける (つまり\LaTeXmultirow multicol のような)ことができない

kableExtra

  • すこしだけgtより書きづらい. 例えば, %表記の列は文字列に変換した上でalignを指定しないといけない
  • ハイライトがgtExtrasと比べると面倒

などの理由でgtを使っています. 論文用の\TeXファイルを出力する場合は, 下記の数式問題からkableExtra一択です.

数式問題

実は, Quartoで数式混じりの表を用いる場合少し大変です. そもそもgt\LaTeX記法の数式をサポートしていません (GitHubのIssueに2019年から挙がっていますが, すぐには解決されなさそうです.) また, kableExtra の数式がQuarto上でだけレンダリングされないことはQuartoのIssueに挙がっています. 簡単な解決策は,

kableExtra::kbl(data, format="markdown")

のようにmarkdown tableとして出力することです. しかし, これでは上で述べたmarkdown tableの問題を抱えることになります.

そこで私は完全な\LaTeX記法の数式は諦めて,

  • 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でプレゼンするかは別として, 保険のためにも手元にあるといいと思います.

  1. HTMLファイルをブラウザで開いた状態で E を押す
  2. ブラウザの印刷→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とほとんど同じ労力で作成でき, デザインの自由度や数字の保守性が高く, かなり学術向きだと思います. お役に立てたら幸いです.

脚注
  1. 経済学だと, サンプルの年齢層を変更したり, モデルの設定を少し変更することで結果が少し変わることなどのことがよく起きます. またクリーニングや分析のミスなどを見つけた場合に軽微な修正が入ることも多々あります. ↩︎

  2. self-contained: true のオプションはdeprecated warningが出ます. ↩︎

GitHubで編集を提案

Discussion