4/ 文書の作成

Quartoを使った研究成果と分析プロセスの共有

宋財泫(関西大学)

1 YAMLヘッダーの構成

YAMLヘッダーの構成要素(の一部)

  • (1)メタ情報、(2)フォーマット、(3)チャンクオプションに大別
    • メタ情報:タイトル、作成日、作成者、言語、概要、…
    • フォーマット:HTML文書(html)か、PDF文書(pdf)か、HTMLスライド(revealjs)か、…
      • 文書の幅、目次の見た目、コードハイライトのテーマなど文書の「全体的」な見た目や構成に関する内容が多い
    • チャンクオプション:全チャンクに共通するチャンクオプション
  • 詳細はQuarto公式ホームページを参照

文書のメタ情報(例)

title: 文書のタイトル
subtitle: 文書のサブタイトル
author:
  - name: 宋財泫
    affiliation: 関西大学
    email: song@kansai-u.ac.jp
    url: https://www.jaysong.net/
  - name: ぽよんぽよん
    affiliation: 国立ソウル大学校
date: 1986/10/8
date-modified: today
lang: ja
abstract: |
      ここに概要が入る
      長ければ改行しても良い
1
文書のタイトル
2
文書のサブタイトル
3
著者名:著者が一人で、氏名のみOKならauthor: 著者名でもOK
4
第一著者の氏名
5
第一著者の所属
6
第一著者のメールアドレス
7
第一著者のホームページ
8
第二著者の氏名と所属
9
文書の作成日
10
文書の最終修正日:todayにするとレンダーした日付が自動的に入る
11
文書の言語
12
文書の概要:普段は不要だが、Quartoで論文を執筆する際はよく使う。概要が長い場合、|を入力し、改行してから概要を書く

フォーマット(例)

format: htmlを基本とし、オプションを追加したい場合は以下のように書く

format: 
  html:
    grid:
      body-width: 1024px
    theme: flatly
    highlight-style: a11y
    toc: true
    toc-location: right
    toc-depth: 3
    number-sections: true
1
ページレイアウト:sidebar-width(左のサイドバーの幅)、body-width(本文の幅)、margin-width(右のサイドバーの幅)、gutter-width(間隔)が調節可能
2
本文の幅を1024pxに(既定値は800px)
3
flatlyテーマを使用
4
コードハイライトのスタイルはa11y
5
目次あり
6
目次の位置は右側のサイドバー(通常、「マージン」と呼ばれる領域)
7
目次の深度は3
8
見出しに通し番号を付ける

チャンクオプション(例)

すべてのチャンクに同じオプションを付けたい場合

  • 個別のチャンクにオプションはknitr: opts_chunkより優先する
knitr: 
  opts_chunk: 
    dev: ragg_png
    fig-align: center
    dpi: 300
    message: false
    warning: false
1
作図エンジンは{ragg}のpngフォーマットにする(文字化け防止)
2
図は中央に揃える(![]()で入れた図には適用されない。チャンクオプションなので、チャンクから生成される図のみ適用される)
3
図は解像度は300に(印刷する予定がないなら150程度でもOK))
4
メッセージを表示しない({tidyverse}の読み込みやread_csv()後のメッセージなど)
5
警告メッセージを表示しない

2 よく使う機能

相互参照

相互参照(cross-reference)の方法:@ラベル名

  • 図、表、式の場合、自動的に「図 1」や「Table 5」のように接頭詞が付く
    • 文書の言語設定に依存
    • 見出しの場合は数字のみ出力される
  • 相互参照に使う図表等のラベル名には決まった接頭詞(prefix)を使う
    • 図(fig-)、表(tbl-)、数式(eq-)、見出し(sec-
  • @ラベル名の前後は半角スペースを入れる

相互参照(単一の図)

Input:

@fig-myfig1 は適当に作った表です。

```{r}
#| label: fig-myfig1
#| fig-cap: 適当に作った図
#| echo: false
plot(rnorm(100), type = "l")
```

Output:

図 1 は適当に作った図です。

図 1: 適当に作った図

Input:

R猫弐号機(@fig-rcat2nd)

![R猫弐号機](画像パス){#fig-rcat2nd}

Output:

R猫弐号機(図 2

図 2: R猫弐号機

相互参照(単一の表)

Input:

@tbl-mytbl1 は適当に作った表です。

```{r}
#| label: tbl-mytbl1
#| tbl-cap: 適当に作った表
gt::gt(iris[1:3, 1:3])
```

Output:

表 1 は適当に作った表です。

gt::gt(iris[1:3, 1:3])
表 1: 適当に作った表
Sepal.Length Sepal.Width Petal.Length
5.1 3.5 1.4
4.9 3.0 1.4
4.7 3.2 1.3

Input:

@tbl-mytbl2 も適当に作った表です。

|Name    |Age |
|:-------|---:|
|Takaichi|64  |
|Noda    |68  |

:与野党党首の年齢 {#tbl-mytbl2}

Output:

表 2 も適当に作った表です。

表 2: 与野党党首の年齢
Name Age
Takaichi 64
Noda 68

相互参照(複数の図)

参照方法は@fig-ラベル名(単一の図と同じ方法)

  • ラベルは::: {layout-ncol=n #fig-ラベル名}![](画像パス){#fig-ラベル名}のように両方指定

Input:

::: {layout-ncol=2 #fig-rcats}
![弐号機](画像3のURL or パス){#fig-rcats1}

![量産機](画像4のURL or パス){#fig-rcats2}

: かわいいR猫たち
:::

@fig-rcats は..., @fig-rcats2 は...

Output:

(a) 弐号機
(b) 量産機
図 3: かわいいR猫たち

図 3 は…, 図 3 (b) は…

相互参照(複数の図; 続き)

図の群を参照する方法は@fig-ラベル名(単一の図と同じ方法)

  • 個別の図を参照したい場合は@fig-ラベル名-番号(最初の図から1、2、3、…)

Input:

```{r}
#| label: fig-two-plts
#| layout-ncol: 2
#| fig-cap: 2つの折れ線グラフ
#| fig-subcap: 
#|   - 線のみ
#|   - 点 + 線
#| echo: false
plot(rnorm(10), type = "l")

plot(rnorm(10), type = "b")
```

@fig-two-plts は..., @fig-two-plts-1 は...

Output:

(a) 線のみ
(b) 点 + 線
図 4: 2つの折れ線グラフ

図 4 は…, 図 4 (a) は…

相互参照(複数の表)

参照方法は@tbl-ラベル名(単一の表と同じ方法)

  • 図同様、群のラベルと個別のラベルを両方指定する

Input:

::: {#tbl-favorite layout-ncol=2}
|ID   |Name |Favorite|
|:---:|-----|:-------|
|1    |Song |Ramen   |
: 宋の好物 {#tbl-favorite-s}

|ID   |Name |Favorite|
|:---:|-----|:-------|
|2    |Kim  |Truffle |
: 金の好物 {#tbl-favorite-k}

好物リスト
:::

@tbl-favorite と @tbl-favorite-s

Output:

表 3: 好物リスト
(a) 宋の好物
ID Name Favorite
1 Song Ramen
(b) 金の好物
ID Name Favorite
2 Kim Truffle

表 3表 3 (a)

相互参照(複数の表; 続き)

複数の図の相互参照と同じ方法

  • ただし、ラベルの接頭詞はfig-でなく、tbl-
  • fig-capfig-subcapの代わりにtbl-captbl-subcapを使用

Input:

```{r}
#| label: tbl-two-tbls
#| layout-ncol: 2
#| tbl-cap: irisデータセットの一部
#| tbl-subcap: 
#|   - setosa
#|   - versicolor
gt::gt(iris[1:5, 1:2])   # setosa
gt::gt(iris[51:55, 1:2]) # versicolor
```

@tbl-two-tbls と @tbl-two-tbls-1

Output:

gt::gt(iris[1:5, 1:2])   # setosa
gt::gt(iris[51:55, 1:2]) # versicolor
表 4: irisデータセットの一部
(a) setosa
Sepal.Length Sepal.Width
5.1 3.5
4.9 3.0
4.7 3.2
4.6 3.1
5.0 3.6
(b) versicolor
Sepal.Length Sepal.Width
7.0 3.2
6.4 3.2
6.9 3.1
5.5 2.3
6.5 2.8

表 4表 4 (a)

相互参照(数式)

$$の後ろの{#eq-ラベル名}を追加

  • 2つ目の$$の後ろにラベルを付けること(1つ目の後だとエラーが出る)。

Input:

ポアソン分布の確率密度関数(@eq-poisson)は美しいぞ。

$$
p(x) = \frac{e^{-\lambda} \lambda^{x}}{x !}
$$ {#eq-poisson}

Output:

ポアソン分布の確率密度関数(式 1)は美しいぞ。

\[ p(x) = \frac{e^{-\lambda} \lambda^{x}}{x !} \tag{1}\]

相互参照(見出し)

  • [-@sec-ラベル名]1
    • 見出しのラベルは## 見出し {#sec-ラベル名}のように指定

Input:

# はじめに {#sec-intro}

## 背景 {#sec-background}

## 問い {#sec-rq}

### 問い1 {#sec-rq1}

### 問い2 {#sec-rq2}

## 先行研究 {#sec-review}

[-@sec-intro]章、第[-@sec-rq]章、第[-@sec-rq2]

Output:

引用

  • YAMLヘッダーに.bibファイルを指定(例:bibliography: references.bib
    • @固有キー:著者名(年)
    • [@固有キー]:(著者名 年)
    • [-@固有キー]:(年)
  • 英語の文献のみなら良いが、日本語の文献を引用する時はかなり厄介

Input:

@imai_williams_2022 says ...

[see @knuth_1984; @imai_williams_2022]

The god[-@knuth_1984] says ...

Output:

Imai and Williams (2022) says …

(see Knuth 1984; Imai and Williams 2022)

The god(1984) says …

@article{knuth_1984,
  author  = {Donald E. Knuth},
  year    = {1984},
  title   = {Literate Programming},
  journal = {The Computer Journal},
  volume  = {27},
  number  = {2},
  pages   = {97--111}
}

@book{imai_williams_2022,
  author    = {Kosuke Imai and Nora Webb Williams},
  year      = {2022},
  title     = {Quantitative Social Science: An Introduction in tidyverse},
  publisher = {Princeton University Press},
}

コールアウト

::: {.callout-*}:::(見出しは###、…)

  • *にはnotewarningimportanttipcaution
  • オプション:icon="false"collapse="true"

Input:

::: {.callout-note}
#### Quartoは私たちの友達!

末永くよろしくね!
:::

Output:

Quartoは私たちの友達!

末永くよろしくね!

Input:

::: {.callout-tip icon="false"}
#### アイコンを消したい...?

`icon="false"`を付けてみてね
:::

Output:

アイコンを消したい…?

icon="false"を付けてみてね

パネル

::: {.panel-tabset}:::で囲まれた領域内の内容が段組みの対象

  • 各タブの見出しは#(宋は主に#####5つ以上を使用)

Input:

::: {.panel-tabset}
#### コード

```{r}
library(tidyverse)

my_plt <- ggplot(iris) +
  geom_point(aes(x = Petal.Length,
                 y = Petal.Width,
                 color = Species))
```

#### 結果

```{r}
plot(my_plt)
```
:::

Output:

library(tidyverse)

my_plt <- ggplot(iris) +
  geom_point(aes(x = Petal.Length,
                 y = Petal.Width,
                 color = Species))
plot(my_plt)

段組み

::::{.columns}::::で囲まれた領域内の内容が段組みの対象

  • :::{.column}:::で囲まれた領域が一つ一つの段(width=で幅指定)

Input:

:::: {.columns}
::: {.column width=15%}
1段目
:::

::: {.column width=25%}
![R Cat](画像パス)
:::

::: {.column width=60%}
```{r}
gt::gt(iris[1:10,])
```
:::
::::

Output:

1段目

R Cat
gt::gt(iris[1:10,])
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
5.1 3.5 1.4 0.2 setosa
4.9 3.0 1.4 0.2 setosa
4.7 3.2 1.3 0.2 setosa
4.6 3.1 1.5 0.2 setosa
5.0 3.6 1.4 0.2 setosa
5.4 3.9 1.7 0.4 setosa
4.6 3.4 1.4 0.3 setosa
5.0 3.4 1.5 0.2 setosa
4.4 2.9 1.4 0.2 setosa
4.9 3.1 1.5 0.1 setosa

コードの注釈

チャンク内の各行の最後に# <数字>を追加し、チャンク外に数字. 注釈を記入

  • 複数の行に同じ番号を振ることも可
  • 以下はYAMLヘッダーにcode-annotations: selectを指定した例
    • 他にもbelow(既定値)、hoverあり

Input:

```{r}
x <- 1:10   # <1>
y <- sum(x) # <2>
print(y)    # <2>
```

1. xに1から10の自然数を格納
2. yにxの和を格納し、出力

Output:

x <- 1:10
y <- sum(x)
print(y)
1
xに1から10の自然数を格納
2
yにxの和を格納し、出力
[1] 55

チャンクの表示

{r}の代わりに{{r}}を使用

  • 授業資料(Quartoの使い方)を作成する時くらいしか使わない機能

Input:

```{{r}}
#| label: fig-myplt
#| fig-cap: My plot
plot(1:10)
```

Output:

```{r}
#| label: fig-myplt
#| fig-cap: My plot
plot(1:10)
```

3 PDF出力

PDF出力が必要なケース

  • 研究成果の公開、共有が目的ならHTMLで十分
    • HTMLの方が機能が豊富であり、見た目のカスタマイズも比較的簡単1
  • しかし、Quartoは論文執筆のための強力なツールでもある
    • HTMLフォーマッ可のジャーナルはないはず(少なくとも政治学では)
    • \(\Rightarrow\) 論文、レポートをなどの印刷を念頭においたものを作成するのであれば、出力物はHTMLよりもPDFが望ましい
  • 最近はtypstを使う手もあるが、ここでは定番のLaTeXを使用する方法を紹介

QuartoからPDFを作成するための準備

LaTeX環境を予め用意しておくこと

  1. TeXLive(Windows/Linux) or macTeX(macOS)
    • TeX環境のインストールは時間がかかるため、TeX初心者はtinytexを推奨
install.packages("tinytex")
tinytex::install_tinytex()
  1. haranoajiパッケージ(多分、今は不要1
    • TeXLive/macTeXの場合
      • tlmgr install haranoaji(Windows2
      • sudo tlmgr install haranoaji(macOS/Linux)
    • tinytex環境ならRコンソールでtinytex::tlmgr_install("haranoaji")

どこを修正すれば良いか

YAMLヘッダーのformathtmlからpdfに変えるだけ

  • 日本語が含まれた文書は文字化けが発生するおそれがあるため、修正が必要1
  • LuaLaTeXの代わりにXeLaTeXも可2
  • 以下は日本語を含むPDFを出力するためのYAMLヘッダーの例
format:
  pdf:
    pdf-engine: lualatex
    documentclass: ltjsarticle
    classoption:
      - a4paper
      - 10.5pt
    number-sections: true
    mainfont: Noto Serif CJK JP      # フォントは自分のPC環境に合わせて修正
    sansfont: Noto Sans CJK JP       # フォントは自分のPC環境に合わせて修正
    monofont: Noto Sans Mono CJK JP  # フォントは自分のPC環境に合わせて修正

HTML + PDFの二刀流

一つのYAMLヘッダーに複数のフォーマットを指定することも可

  • どのフォーマットでレンダーするかはRenderボタン右の▼をクリックして選べる
format:
  html:
    theme: flatly
    highlight-style: a11y
  pdf:
    pdf-engine: lualatex
    documentclass: ltjsarticle
    classoption:
      - a4paper
      - 10.5pt
    mainfont: Noto Serif CJK JP
    sansfont: Noto Sans CJK JP
    monofont: Noto Sans Mono CJK JP

参考)参考文献の話

参考文献の管理・挿入はBibTeXを使用する(引用は@固有キー

  • 参考文献が英文のみなら問題ないが、日本語の参考文献が混ざっていると厄介
    • 例)英文のジャーナル名はJournal、和文のジャーナル名は『ジャーナル名』
  • 社会科学ではjecon.bst(経済学用のBibTeX style file)が定番
  • 2026年1月現在、正攻法でjecon.bstを使う方法は(少なくとも宋にとっては)不明
  • プロジェクトフォルダーに.latexmkrcファイルを格納し、PDFエンジンとしてLatexmkを使用することで、とりあえず・・・・・使うことはできる

参考文献

Imai, Kosuke, and Nora Webb Williams. 2022. Quantitative Social Science: An Introduction in Tidyverse. Princeton University Press.
Knuth, Donald E. 1984. “Literate Programming.” The Computer Journal 27 (2): 97–111.