Quartoで論文を書いて英文誌に投稿するまで (2)  -- メタデータ記入からデータ埋め込みまで

[データ解析からQuarto導入まで](https://qiita.com/issakuss/items/9cdc0c2f900dac175d88)の続きです。
論文に関する情報、メタデータを準備していきます。
解析結果を埋め込むために、データの読み込みも行っていきます。

# Step 3. メタデータの記入

以降は、ジャーナルテンプレートをダウンロードしたときに自動で生成された、`paper.qmd` を書き換える形で論文執筆していきます。

`paper.qmd` の冒頭を見ると、１行目と54行目に、`---` と書いてあります。
`---` から `---` までの行には、メタデータと呼ばれる情報を、YAML形式で記入していきます。
不要な情報のある行は削除してしまって大丈夫です。

わかりにくい点だけご紹介しましょう。

### author: affiliations: id

```
author:
  - name: Alice Anonymous
    affiliations: 
        - id: some-tech
```

の部分は、所属のコードです。
論文の著者欄に、

> Gonbei Nanashino<sup>a, b</sup>
> a: Nantoka University
> b: Doutara Research Institute

みたいに書かれてますよね。
この a とか b とかです。
例だと `some-tech` となっていますが、登場順に `a` とか `b` とかにするのが一般的かと思います。

### attributes: corresponding

```
author:
  - name: Alice Anonymous
    attributes:
        corresponding: true
```

のように、`corresponding: true` となっていると、その筆者が corresponding author として示されます。
たとえば elsevier テンプレートだと、

> Gonbei Nanashino<sup>a, b, *</sup>
> <sup>\*</sup> Corresponding Author

と表示されます。

### format: elsevier-pdf: keep-tex

```
format:
  elsevier-pdf:
    keep-tex: true
```
の箇所は、`keep-tex: true` のままにしておきましょう。
Quarto は、.qmd ファイルを .pdf に変換するにあたって、まず .tex ファイルを生成します。
TeX のファイルですね。
.tex ファイルを介して .pdf に変換するわけです。
この中間ファイルである .tex を残しておくかどうかがこのオプションです。
.tex ファイルは投稿する際に用いるので、true にしておきましょう。

### format: elsevier-pdf: journal

```
format:
  elsevier-pdf:
    keep-tex: true
    journal:
      name: Journal Name
      formatting: preprint
      # model: 3p # Don't set a model with preprint
      cite-style: authoryear
```

**name** には、投稿先のジャーナル名を入力してください。
**formatting** 以下については、[テンプレートの詳細](https://github.com/quarto-journals/elsevier)をご確認ください。

**一部、フィールドの追加が必要です。**
`keep-tex` の 上あたりに、`echo: false` と `wrap: preserve` を加えてください。

```
elsevier-pdf:
  echo: false  # ←追加
  wrap: preserve  # ←追加
  keep-tex: true
```

といった形です。

# Step 4. 参考文献・略語リストの準備

## 略語リストを作成する

解析時の変数名などに使った略語と、論文に掲載する正式語の対応表を作成しましょう。
以下のような .ini ファイルで作成します。

```{abbr.ini}
[quest]
    external = External
    internal = Internal
    neuro = Neuroticism
    extra = Extraversion
    open = Openness
    agree = Agreeableness
    consc = Conscientiousness

[stat]
    mean = \textit{M}
    std = \textit{SD}
    r = \textit{r}
    p.unc = $p_{\mathrm{unc.}}$
    p.corr = \textit{p}\textsubscript{Bonf.}
```

これを、`paper.qmd` と同じ位置に置きます。
`[quest]` や `[stat]` といったセクション分けは、ご自身の使いやすいよう適当に設定してください。
`\textit{}` で囲むことで、イタリックになります。
`\textsubscript{}` なら下付き文字です。
`$$` で囲むことによって、数式を記述することもできます。

実際には、論文を書きながら項目を追加していく形になるでしょう。

## 参考文献リストを作成する

Quarto が生成した bibliography.bib を編集して、自身の参考文献リストを作成します。
.bib ファイルの作り方については別の記事に譲ります。
なんらかの論文管理ソフトから生成するのがよいかと思います。


# Step 5. データの読み込み

Step 0 にて、.ini, .csv, .png ファイルとして用意した結果を読み込ませましょう。
読み込みをするための .R ファイルを作成します。

:::note info
.R ファイルではなく、.py ファイルなど、Quarto で実行可能なファイルならなんでもOKです。
ただし、後述の理由から R をオススメします。
ややこしいコードは書かないので、私のように普段 R を使わない人でも大丈夫です。
:::

`in-render.R` というファイルを、`paper.qmd` と同じ位置に作成します。

```
project
├─ (解析に必要なファイルたち)
├── result
└── publish
    └── paper
        ├── （略）
        ├── paper.qmd
        ├── in-render.R  ←新規作成
        └── tools
```

`in-render.R` には、以下のようなコードを書きます。

``` in-render.R
source('tools/helper.R')

# --- Settings ---
nr <- NumRenderer(
  sdgt_general = 1,
  sdgt_not_greater_than_one = 2,
  sdgt_percent = 2,
  sdgt_pval = 3,
  min_pval = 0.001,
  abbr_ngto_head = TRUE
)
dir_home <- "../../"
dir_result <- file.path(dir_home, "result")

path_abbr_ini <- file.path("abbr.ini")

path_method <- file.path(dir_result, "method.ini")
path_table_descriptive <- file.path(dir_result, "table_descriptive.csv")
path_table_corrs <- file.path(dir_result, "table_corrs.csv")
path_fig_scatter <- file.path(dir_result, "fig_scatter.png")

embeded_fig_exts = '.png'
# --- ------- ---

abbr <- flatten_list(read.ini(path_abbr_ini))
ready_to_embed_fig(dir_result, embeded_fig_exts)

# Method

method <- read.ini(file = path_method)
n_subjects <- method$demographic$n_subjects
python_ver <- method$misc$python_ver
pingouin_ver <- method$misc$pingouin_ver

# Table

desc <- read.csv(path_table_descriptive, row.names = 2)
corr <- read.csv(path_table_corrs, row.names = 1)

set_table_appearance <- function(table) {
  return(
    table  |>
    kableExtra::kable(row.names = TRUE,
                      format = "latex",
                      escape = FALSE,
                      booktabs = TRUE) |>
    kableExtra::kable_styling(full_width = TRUE)
  )
}
```

上から順に見ていきましょう。

## ツールを読み込む

私が書いたツールを読み込むために、

```R
source('tools/helper.R')
```

から始めています。

## 表示桁数を設定する

```R
# --- Settings ---
nr <- NumRenderer(
  sdgt_general = 1,
  sdgt_not_greater_than_one = 2,
  sdgt_percent = 2,
  sdgt_pval = 3,
  min_pval = 0.001,
  abbr_ngto_head = TRUE
)
```

の部分で、論文に数値を記載する際の小数点以下桁数を設定しています。
`NumRenderer()` は、`tools/helper.R` にて私が作った関数です。
数値の種類ごとに、表示する小数点以下桁数を設定します。

- **sdgt_general**: 以下に示すパターン以外における数値
- **sdgt_not_greater_than_one**: 比率や相関係数など、絶対値が1を超え得ない数値（p 値除く）
- **sdgt_percent**: パーセンテージ
- **sdgt_pval**: p 値

この関数を使うと、論文をPDFへ出力したとき、設定した通りの小数点以下桁数に丸めてくれます。
さらに、`abbr_ngto_head = TRUE`[^1] とすると、比率・相関係数または p 値における、頭の 0 を省略してくれます。
[^1]: `ngto` は Not Greater Than One の略です。私が勝手に略しました。

> 例：p = 0.051 → p = .051

また、`min_pval` に設定した値よりも小さい p 値を記載すると、

> p < .001

といった表記に変換してくれます。
`NumRenderer()` の詳細な使い方は後ほどご説明します。

## ファイルパスを設定する

```R
dir_home <- "../../"
dir_result <- file.path(dir_home, "result")

path_abbr_ini <- file.path("abbr.ini")

path_method <- file.path(dir_result, "method.ini")
path_table_descriptive <- file.path(dir_result, "table_descriptive.csv")
path_table_corrs <- file.path(dir_result, "table_corrs.csv")
path_fig_scatter <- file.path(dir_result, "fig_scatter.png")

embeded_fig_exts = '.png'
```

で、読み込むファイルのあるパス名を設定します。
また、論文に埋め込む画像の拡張子を `embeded_fig_exts` に指定します。

## 略語リストを読み込む

```R
abbr <- flatten_list(read.ini(path_abbr_ini))
```

`path_abbr_ini` に指定した、abbr.ini を読み込みます。
`flatten_list()` という helper.R にある関数を使って、セクション分けをつぶしてます。

## Figure をコピーする

```R
ready_to_embed_fig(dir_result, embeded_fig_exts)
```

によって、論文に埋め込む .png ファイルを、`result/` から `publish/paper/tex-source-files/` へコピーしています。
`tex-source-files/` というディレクトリはこの関数により自動で生成されます。

`result/` にある .png ファイルを直接埋め込んでも問題はありません。
しかし、PDF 生成に必要なファイルを一つのディレクトリ（`tex-source-files/`）にまとめておくことで、のちの作業がやりやすくなります。

## .ini ファイルを読み込む

```R
# Method

method <- read.ini(file = path_method)
n_subjects <- method$demographic$n_subjects
python_ver <- method$misc$python_ver
pingouin_ver <- method$misc$pingouin_ver
```

`read.ini()` を使って、.ini ファイルに保存した数値を読み込みます。
続けて、`method` の中身を各変数に格納しています。
paper.qmd 内にて `method$demographic$n_subjects` と打ち込んでもOKです。
しかし表記が長くて読みづらくなるので、こちらで `n_subject` といった変数に格納しています。


## テーブルを読み込む

```R
desc <- read.csv(path_table_descriptive, row.names = 2)
corr <- read.csv(path_table_corrs, row.names = 1)
```

`row.names` 引数に、行の名前に対応する列の番号を指定しています。
table-descriptive.csv のようなマルチインデックスの場合、低次なインデックスの方を指定します。

## テーブル埋め込みを準備する

```R
set_table_appearance <- function(table) {
  return(
    table  |>
    kableExtra::kable(row.names = TRUE,
                      format = "latex",
                      escape = FALSE,
                      booktabs = TRUE) |>
    kableExtra::kable_styling(full_width = TRUE)
  )
}
```

manuscript.qmd 中で `kableExtra()` を使って表を整えます。
しかし毎回同じ引数を入力したりも面倒なので、関数にしておきました。
関数 `set_table_appearance()` に 表 `table` を与えると、
`kableExtra` パッケージによっていい感じに見た目が整えられます。

## paper.qmd に in-render.R を反映させる

`paper.qmd` に戻りましょう。
メタデータを書いた直後に、以下のように書いてやります。

````paper.qmd
---
（略）
      cite-style: authoryear
---

```{r}
source('in-render.R')
```
````

これで、`in-render.R` に書いた内容が `paper.qmd` に反映されます。

今回はいったんここまでです。
次回は、[本文執筆からPDF出力まで](https://qiita.com/issakuss/items/d528d826102282ea69cf)です。