RMarkDown でPDF出力

Rmarkdownを使ってレポートをPDF出力させたい。

で、見様見真似でネットの情報を探しながらやったが、なかなかうまくいかなかった。

以下、それへの対応。


# インストール
まずは、RStudioを一回インストールしなおして０からスタート。
んでから、以下ページを参考に、tinytexをインストール。

https://shohei-doi.github.io/quant_polisci/r-markdown-pdf.html

# rmarkdownファイルの作成
rmarkdownをRStudioから作るときに、デフォルトで入っているものから、以下のページを参考にYAMLを変更。

https://qiita.com/Atsushi776/items/9ef1e5d744e2b91c61ee

```YAML
output:
  pdf_document: 
    latex_engine: xelatex 
documentclass: bxjsarticle
classoption: xelatex,ja=standard
geometry: no
```

# pdfcropとghostscriptがない！と怒られる。 
でknitすると、以下のエラー。

```
Tool(s) not installed or not in PATH: pdfcrop, ghostscript
```
以下のページを参考に、pdfcropとghostscriptをインストールしてみた。

https://stackoverflow.com/questions/66305776/got-knit-issue-with-r

PDFcropは以下のコマンドをたたく。

```r
tinytex::tlmgr_install("pdfcrop")
```
Ghostscriptは以下からDL,Install.　環境変数でパス通すのも忘れずに。

https://www.ghostscript.com/download/gsdnld.html


# geometryパッケージ関係で怒られる。
再度knit.
今度は以下のエラー。

```
LaTeX Error: Option clash for package geometry.
```

で以下のページを参考にしてみる。

https://qiita.com/nozma/items/1c6b000b674225fd40d7

こちらのページではPandocの設定を弄るとある。
やけど、弄ろうにも、このページに記載していある通りに出力に--templateなんで書かれてないし、フォルダを探し回ってもそれっぽいファイルも見つからない。バージョンが違うからか？

どうしようか。。。と再度ググってみると、以下のページを発見。

http://rio.andrew.ac.jp/~yane/class/rmd/2.html

こちらの最後の注釈に少し書いてあるように、`geometry: no`を消す。

# 無事出力！
するとknitが通って、無事に出力された！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/d05fac62-9777-10af-2e03-c813954ea6d3.png)

# font問題発生
YAMLの書き方で、以下のような書き方もある。これは最初のリンクで紹介したページを参考にしたもの。

```YAML
output:
  pdf_document: 
    latex_engine: xelatex 
documentclass: bxjsarticle
header-includes: 
  - \usepackage{zxjatype} 
  - \usepackage[ipa]{zxjafont} 
 ```
ってことで、これでやってみたら、「フォントが見つからん」って怒られた。

```
! Package fontspec Error: The font "IPAMincho" cannot be found.
```

`tinytex::tlmgr_install("ipaex")`をやってみてフォントをインストールしてみる。
けどやっぱりだめ。
ipaexフォントを以下のページからダウンロードしてきて、Windowsに直接インストールしてみてもだめ。

https://moji.or.jp/ipafont/installation/

うーん・・・と思って、ふと思ったのが、ipaexのフォントやのに、プリアンブルの指定が`ipa`なのがおかしいんちゃうん？っていう点。
てことで、プリアンブルをipaexに変えてみた。

```YAML
output:
  pdf_document: 
    latex_engine: xelatex 
documentclass: bxjsarticle
header-includes: 
  - \usepackage{zxjatype} 
  - \usepackage[ipaex]{zxjafont} 
 ```

するとうまくいった！！

あー、眠た～～～～。



# ggplot2を含む箇所でコンパイルエラー！

うまくいったと思って、じゃあ、自分のデータ分析結果をknitしようとしたら、以下のコンパイルエラー。

```
! File ended while scanning use of \@xverbatim.
<inserted text> 
                \par 
<*> Report.tex

 エラー: LaTeX failed to compile Report.tex. See https://yihui.org/tinytex/r/#debugging for debugging tips. See Report.log for more info.
```
一個一個切り分けて原因を探ると、ggplot2 で描いた画像を出力させるところでエラーが出てる。
とうことでググると、以下の情報を見つける。

https://qiita.com/smina2018/items/0aaa56a448c95e87f6a7

最初のオプション指定の個所で

```r 
knitr::opts_chunk$set(
  dev = "cairo_pdf",
  dev.args = list(family = "ipaexg")
)
```
とすればよいとのこと。Cairo_pdfというツールがあるのでそれを使う、というのとfontにipaexgを使えという指定。

ということでこれを設定して、knit!

できた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/719a515e-d98a-df4e-94c8-7e732cb5b4a4.png)

他にも色々と参考になった。

https://ill-identified.hatenablog.com/entry/2020/10/03/200618

# 図表番号を入れる・参照する。

ggplotの出力に対して図キャプションをつけたいし、文章の中で引用したい。
おなじく、表として出力させるものには表番号をつけたい。
ということでその方法は以下の通り。

## 図番号
各Chunkの最初の{r}に以下のようにすることで、そのチャンクが出力する図に対してキャプションが付与される。
こういう仕様から、当然、各チャンクが出力する図は1つしか設定できないということですな。
引用したい場合には、`\\label{}`をキャプションの中に書き込む。受けたい場合は`\ref{}`でok。

```r
{r fig.cap="ほげほげほげ \\label{fig:ほげほげほげ}"}
```

(2021/3/21追記）
キャプションの中に`_`が含まれていると、コンパイルは通るけど、うまくキャプションの処理ができなくなるみたい。
出力されるtexを見てみたら、図の描画指示の部分に\textbackslashってタグが付いてた。なんでかわからんけど、`_`は避ける！

## 表番号
まず表を出力させるためには、表の中身をデータフレームの形で用意しておく必要がある。
その上で、knitrパッケージのkable関数を使う。
例えば以下のような感じ。引用させたい場合のlabelの書き方は図と同じ。

```r
r<-describe(dataset[c("Q1_1","Q1_2","Q1_3")])
description<- data.frame(
    Q = c("Q1_1","Q1_2","Q1_3"),
    n = r$n,
    Mean=r$mean,
    SD = r$sd 
 )
kable(description,  
      caption = "問1の3つの質問の記述統計量 \\label{tab:Q1_description}" )
```

kable関数をそのままコンソールに出力させてみると、要はデータフレームをmarkdown記法の表に書き換えてるだけ。

ちなみに上でやっているのは、psychパッケージのdescribe関数で記述統計量を出した後、そのうちのｎ数と平均と標準偏差だけを表として出力させたいということで、describeの出力から、n数と平均と標準偏差を取り出して、データフレームとして格納している。

# タイトルと目次と本文の間にそれぞれ改ページを入れたい。
要はtexなので、texと同じ乗りで`\newpage`が使えるし、`\tableofcontents`が使える。
これを使って、明示的に目次を作らせればよい。
なお`\tableofcontents`で目次を作らせるときには、YAMLのなかの目次作成指示の個所は`toc: no`にしないといけない。

あと`\tableofcontents`で目次を作らせると、デフォルトではレベル2(`subsection`)までしか表示されない。なので、レベル3(`subsubsection`)まで表示させたい場合には以下のようにレベル設定する。

ということでYAMLヘッダの直後に以下を書き込む。

```latex
\newpage
\setcounter{tocdepth}{3}
\tableofcontents
\newpage
```

# chunk中の日本語出力
`print()`だと以下の通り、漢字の出力うまくいかない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/936ed932-590d-b9af-26ba-dc889a8ae4ec.png)

`cat()`だとうまくいく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/994cf1e4-7dba-c86d-722f-6e419366e110.png)

# markdown記法での表の調整

## 表タイトルと相互参照
自作の表の上に一行空白行を置いて、`Table: ＊＊＊＊＊`と書けばよい。相互参照はlatexの基本に則って、`\label{}`をつければOK.

```
Table: 有意であった施策 \labe{有意であった施策}

項目|内容|
|:--|:--|
Q8|ほげほげほげ
Q6|ほげほげほげ
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/33dc2047-ee9f-4a98-af69-b1678286b63c.png)

## Markdown記法での表の列幅

2行目に配置指示と合わせて記載するハイフン`-`の数で決まるようだ。

```markdown
|クラスタ|名前|特徴
|:--|:--|:---|
グループ1|惰性的組織|権威主義ではないが、自由もあまりない。長期的思考に乏しい。
グループ2|閉塞的成果主義組織|権威主義・責任回避的で、自由な雰囲気はない。長期的思考にも乏しい。スピード重視で個人主義的。
グループ3|開放的攻撃重視型組織|権威主義風潮はまったくなく、自由闊達で創造的。長期的思考にたって物事すすめるが、スピード重視でもある。
グループ4|開放的守備重視型組織|権威主義的ではあるが、自由闊達さも持ち合わせている。長期的思考に立って物事するめるが、スピードはまったく重視されず慎重さ・綿密さが求められる。個人よりもチームワークが重視される。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/3d0154ec-2bc4-13f5-6c3b-ae5ec27f90d3.png)

```markdown
|クラスタ|名前|特徴
|:--|:--|:------------------|
グループ1|惰性的組織|権威主義ではないが、自由もあまりない。長期的思考に乏しい。
グループ2|閉塞的成果主義組織|権威主義・責任回避的で、自由な雰囲気はない。長期的思考にも乏しい。スピード重視で個人主義的。
グループ3|開放的攻撃重視型組織|権威主義風潮はまったくなく、自由闊達で創造的。長期的思考にたって物事すすめるが、スピード重視でもある。
グループ4|開放的守備重視型組織|権威主義的ではあるが、自由闊達さも持ち合わせている。長期的思考に立って物事するめるが、スピードはまったく重視されず慎重さ・綿密さが求められる。個人よりもチームワークが重視される。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/a7da0c52-13d9-146c-e930-4c05191e8cda.png)

## 任意の行で横罫線を引く
横罫線を引きたい個所のすぐ下の行頭に`\hlin`eを置けばよい。

```latex
|クラスタ|名前|特徴
|:--|:--|:---|
グループ1|惰性的組織|権威主義ではないが、自由もあまりない。長期的思考に乏しい。
\hline グループ2|閉塞的成果主義組織|権威主義・責任回避的で、自由な雰囲気はない。長期的思考にも乏しい。スピード重視で個人主義的。
グループ3|開放的攻撃重視型組織|権威主義風潮はまったくなく、自由闊達で創造的。長期的思考にたって物事すすめるが、スピード重視でもある。
グループ4|開放的守備重視型組織|権威主義的ではあるが、自由闊達さも持ち合わせている。長期的思考に立って物事するめるが、スピードはまったく重視されず慎重さ・綿密さが求められる。個人よりもチームワークが重視される。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317916/64f0f154-b483-7796-0b26-865afd7850a1.png)

注意点として、`\hline`の直後は半角スペースを置かないといけない。また、行頭の縦罫線`|`は省略するか、`\hline`を縦罫線の後に置く。縦罫線の前に`\hline`を置いてしまうと空白のセルが1つできてしまう。

#そのほか参考：

https://k-metrics.github.io/cabinet/basics_rmd.html

https://blog.atusy.net/2018/10/27/linbreaks-in-yaml-front-matter-of-rmd/

https://rstudio.com/wp-content/uploads/2015/03/rmarkdown-reference.pdf

https://bookdown.org/yihui/rmarkdown-cookbook/