Quarto （バッド）ノウハウ集

# はじめに

今年度に入ってからR markdownを止めてQuartoに移行して大量に資料を作ってみたところ，とりあえず計算結果が確認できればいいやとササッとhtmlで作る分には非常にお手軽なのですが，人に見せるレポートをPDFで作ろうとしたりすると細かいところの調整などに結構時間がとられてしまいます．そうした悪戦苦闘の記録を備忘録を兼ねてここに公開しておきます．多くは時間がない中でそれらしく見えればいいやの精神で作っていますので，もっといいやり方もあるかもしれませんが，そこはバッドノウハウということで…．

当然のように`tidyverse`パッケージの利用が前提です．

```r
library(tidyverse)
```

# フォーマット共通

## 表の中にLaTeX数式を入れる

`kableExtra::kbl()`と`kableExtra::kable_styling()`でLaTeXコードをエスケープしないようにして，チャンクオプションに`results: asis`を指定し，最後に`print()`で出力します．

```r
#| 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形式でオプションを切り替えるには次のようにします．

```r
if (is_html_output()) {
  stargazer::stargazer(model, type = "html")
} else if (is_latex_output()) {
  stargazer::stargazer(model, type = "latex")
}
```

docx形式への出力かどうかを判定したいときは`knitr::pandoc_to()`関数を使います．

```r
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ヘッダーは次のようになります．

```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`は最低限の内容なら以下の通り．

```preamble.tex
\usepackage{luatexja}
\usepackage[haranoaji, deluxe]{luatexja-preset}
```

## `ggplot2`と`ggrepel`で日本語フォントを使う

セットアップチャンクで次を実行．

```r
#| 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ファイルがあるディレクトリで次を実行しポインタープラグイン[^pointer]を追加します．
Rコンソールではなく，シェルで実行します．

[^pointer]: [https://github.com/quarto-ext/pointer](https://github.com/quarto-ext/pointer)

```shell
> quarto add quarto-ext/pointer
```

qmdファイルのYAMLヘッダーに以下を追加します．

```YAML
revealjs-plugins: 
  - pointer
```

プレゼンテーション中に`q`を押すとポインターが有効になります．

## PDFへのエクスポートで数式が消えるのを防ぐ

Revealjsプレゼンテーションはプレゼン中に`E`を押すことでPDFにエクスポートすることができますが，このときに数式が消えてしまうことがあります．

![数式なし.png-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131152/56e40cc0-daa5-5fe8-5de3-b1c464471715.png)

これを防ぐためには，YAMLヘッダーの`revealjs:`以下に次を追加します．

```YAML
html-math-method: mathjax
```

![数式あり.png-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131152/40b83376-7e35-69e9-2719-2b0b1850cda7.png)

既定の数式表示はmathjaxになっているはずなのですけどね．PDFのプロパティで比較すると，`html-math-method: mathjax`を指定していない場合，`MathJax_Size2_Regular`ってのが欠けてるみたいです．

## タイトルで改行する

YAMLヘッダーのタイトルの中に`<br>`を入れます．

```YAML
title: "タイトル1行目<br>タイトル2行目"
```

![タイトル1行目 タイトル2行目.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131152/9d09306f-8252-7244-4c6b-a23887a68c87.png)

# その他

ネタが増えたら（思い出したら）追記します．