はじめに
今年度に入ってからR markdownを止めてQuartoに移行して大量に資料を作ってみたところ,とりあえず計算結果が確認できればいいやとササッとhtmlで作る分には非常にお手軽なのですが,人に見せるレポートをPDFで作ろうとしたりすると細かいところの調整などに結構時間がとられてしまいます.そうした悪戦苦闘の記録を備忘録を兼ねてここに公開しておきます.多くは時間がない中でそれらしく見えればいいやの精神で作っていますので,もっといいやり方もあるかもしれませんが,そこはバッドノウハウということで….
当然のようにtidyverse
パッケージの利用が前提です.
library(tidyverse)
フォーマット共通
表の中にLaTeX数式を入れる
kableExtra::kbl()
とkableExtra::kable_styling()
でLaTeXコードをエスケープしないようにして,チャンクオプションにresults: asis
を指定し,最後にprint()
で出力します.
#| label: tbl-latex-math
#| tbl-cap: LaTeX数式を含む表
#| results: asis
df_latex <- tibble(
x = c("$x_1$", "$x_2$", "$x_3$"),
y = c("$y_1$", "$y_2$", "$y_3$")
)
df_latex |>
kbl(escape = FALSE) |>
kable_styling(protect_latex = TRUE) |>
print()
出力フォーマットに応じて処理を変える
knitr::is_*()
関数を使います.例えば,stargazer::stargazer()
関数を使って回帰分析の結果を出力する際に,html形式とlatex形式でオプションを切り替えるには次のようにします.
if (is_html_output()) {
stargazer::stargazer(model, type = "html")
} else if (is_latex_output()) {
stargazer::stargazer(model, type = "latex")
}
docx形式への出力かどうかを判定したいときはknitr::pandoc_to()
関数を使います.
if (pandoc_to("docx")) {
head(mpg) |> gt()
} else {
head(mpg) |>
kbl(booktabs = TRUE) |>
kable_styling(latex_options = "striped")
}
PDF編
TeXファイルで出力する
参考文献のスタイルにjecon.bst
を指定するとPDFでの出力に失敗するので,LaTeX形式で出力してからlatexmk
を使いましょう.
LuaLaTeX + jlreqを使うものとして,必要最小限のYAMLヘッダーは次のようになります.
format:
latex:
documentclass: jlreq
classoption:
- article
knitr:
opts_chunk:
dev: cairo_pdf
cite-method: natbib
include-in-header:
file: "preamble.tex"
biblio-style: jecon
bibliography: references.bib
preamble.tex
は最低限の内容なら以下の通り.
\usepackage{luatexja}
\usepackage[haranoaji, deluxe]{luatexja-preset}
ggplot2
とggrepel
で日本語フォントを使う
セットアップチャンクで次を実行.
#| label: setup
library(ggplot2)
library(ggrepel)
library(extrafont)
fontfamily <- "好きなフォント名"
theme_update(text = element_text(family = fontfamily))
update_geom_defaults("text", list(family = fontfamily))
update_geom_defaults("label", list(family = fontfamily))
update_geom_defaults("text_repel", list(family = fontfamily))
update_geom_defaults("label_repel", list(family = fontfamily))
当然ですが,あらかじめextrafont::font_import()
でシステムのフォントを読み込んでおく必要があります.
Revealjs編
ポインターを使う
qmdファイルがあるディレクトリで次を実行しポインタープラグイン1を追加します.
Rコンソールではなく,シェルで実行します.
> quarto add quarto-ext/pointer
qmdファイルのYAMLヘッダーに以下を追加します.
revealjs-plugins:
- pointer
プレゼンテーション中にq
を押すとポインターが有効になります.
PDFへのエクスポートで数式が消えるのを防ぐ
Revealjsプレゼンテーションはプレゼン中にE
を押すことでPDFにエクスポートすることができますが,このときに数式が消えてしまうことがあります.
これを防ぐためには,YAMLヘッダーのrevealjs:
以下に次を追加します.
html-math-method: mathjax
既定の数式表示はmathjaxになっているはずなのですけどね.PDFのプロパティで比較すると,html-math-method: mathjax
を指定していない場合,MathJax_Size2_Regular
ってのが欠けてるみたいです.
タイトルで改行する
YAMLヘッダーのタイトルの中に<br>
を入れます.
title: "タイトル1行目<br>タイトル2行目"
その他
ネタが増えたら(思い出したら)追記します.