---
tags: LaTeX, markdown, R, 排版
---
# 快速上手數學報告(2) - Rmarkdown 教學
[TOC]
$\LaTeX$ 學習曲線最陡之處,在於熟悉編排的樣板跟各種篇排設定、設定 $\LaTeX$ 編輯器、脫離以往 Word 等所見即所得的 GUI 排版觀念三者並行才始得生產一篇像樣的文章。
這篇文章的想法,在於利用已打包成套的 R Studio,先跳過編輯器設定的學習,並使用較為直觀的 markdown 來接觸排版標記語言式的概念(此時已經能生產堪用之數學報告),之後再去學習 $\LaTeX$ 語法。
## 需要安裝甚麼軟體? 做甚麼設定?
- R - [CRAN](https://cloud.r-project.org/):R 語言的主程式,RStudio IDE 使用的主語言。
- RStudio - [RStudio.com](https://www.rstudio.com/products/rstudio/download/):知名的 R 語言開源 IDE (整合開發環境),注意其免費範圍在非商業使用,商用仍須付費(不過官方目前沒在抓商用無授權就是了)。
安裝完兩個程式之後,我們透過直接建立一個新的 .Rmd 檔讓 RStudio 自行安裝並設定需要的 package

按下去後,會跳出視窗,現在我們要先接觸 $\LaTeX$ 報告,先設定為 pdf;

> 第一次按下去後,會開始下載相關的 package,若失敗了,在 R console 下執行下列程式碼:
>
> ```R
> install.packages("rmarkdown")
> ```
>
> 如果沒有範本供選擇,則執行下列程式碼:
>
> ```R
> install.packages("devtools") # 如果以前沒有安裝 devtools
> devtools::install_github("rstudio/rmarkdown") # 更新 rmarkdown 到最新版
> devtools::install_github("rstudio/rticles")
> ```
## Rmarkdown 編輯器介面
新檔案的視窗應該會長這樣:

那我們要如何操作呢?可以先嘗試按按看 Knit 這個按鈕,程式會提示你先儲存,再幫你編譯這個檔案,輸出成 PDF。
### 工作流程
```flow
newfile=>start: 建立檔案
cot1=>condition: 要不加入程式碼
knit=>end: 編譯並輸出檔案(然後反覆修改)
chunkot=>operation: 開 chunk 撰寫程式碼並測試
markdown=>operation: 撰寫文本,調整 YAML
recode=>condition: 需不需要增加程式碼
newfile->cot1
cot1(yes)->chunkot->markdown
cot1(no)->markdown
markdown->recode
recode(yes)->chunkot
recode(no)->knit
```
## Rmarkdown 結構
> 這節有點冗餘,可以大概看過需要的,先玩玩看再說
新檔案內容應該會長這樣:

Rmarkdown 由三個部分組成:
### Markdown
撰寫文本使用,基本上就是普通的 markdown 語法就可以了,其中若 markdown 語法不足,也可嘗試直接使用 $\LaTeX$ 語法(不透過 $\LaTeX$ 輸出會不支援 $\LaTeX$ 語法)。
這邊複習一下:
```markdown
# 1階標題
## 2階標題
### 3階標題
#### 4階標題
##### 5階標題
###### 6階標題
內文 *斜體* **粗體** ***粗體加斜體***
下一個段落的內文(空一行)
下一個層級的內文(用兩個以上的空白分隔)
同級內文不分行(同空格的不同行會被視為一個空白)
同級內文分行(加上一個空行)
再下一個層級的內文
(這個空行的縮排規則似乎有 Bug,建議不要太常用)
- 無序項目
- 無序項目
- 下一個層級無序項目
1. 有序項目(第一個可指定開始序號例如0.)
3. 除第一項不需要順序,編譯時電腦會幫你自動排序
2. 下一個層級有序項目
- 同層級無序項目(可以混編)
[連結文字](連結URL)

$數學式$
$$數學公式$$
@bibtex關鍵字 (使用bibtex提及引用文獻)
|表格標題1|表格標題2|表格標題3|表格標題4|
|:---:| ---:|:--- | --- |
|置中 |靠右 |靠左 | 預設 |
(前兩行一定要有不然會擺爛給你看,故不能沒有標題列,
也不能分行,很難用,故建議直接貼 LaTeX 表格 )
---
上面這個是分隔線(在簡報輸出時可作為強制換頁)
```
### Chunk
撰寫程式碼的地方,可用 Insert 按鈕設定:

或是直接在編輯器裡打出這樣的內容:
```R
```{使用程式語言代碼 Chunk名稱, Chunk參數名稱=Chunk參數設定, 下一個Chunk參數名稱=Chunk參數設定}
程式碼區域
```
```
chunk 參數是設定程式碼在如何執行,或是執行後如何呈現到文件中,可透過 chunk 右方的三個小按鈕的第一個做設定:(三個小按鈕依序是設定、執行這個 chunk 之前所有的 chunk、執行這個 chunk,可以事先看看程式碼5執行成果)

設定完後按 Apply 會自動幫你補齊參數設定。
若要一次設定所有 chunk 一些固定的參數,可以在整篇文件的最前面加上一個 chunk:
```markdown
```{r setup, include=FALSE} # include=FALSE 可讓此 chunk 單純執行
# 但不顯示程式碼,也不輸出程式結果,適合
# 設定或帶入一些 package
knitr::opts_chunk$set(Chunk參數名稱=Chunk參數設定, ...)
```
```
#### SAS 怎麼辦?
假如要使用 SAS 在 Rmarkdown 裡面的話,可以使用 SASmarkdown Package,安裝方法是在 R console 下執行:
```R
install.packages("SASmarkdown")
```
要使用 SAS 作為 chunk 語言,先在加入如下 chunk 程式碼:
```R
```{r setup, include=FALSE}
library(SASmarkdown)
saspath <- "C:/Program Files/SASHome/SASFoundation/9.4/sas.exe" # 你電腦裡 SAS 的位置
sasopts <- "-nosplash -linesize 75" # 一些排版設定
knitr::opts_chunk$set(engine="sashtml", engine.path=saspath,
engine.opts=sasopts, comment=NA) # 在每一個 chunk 預載以 SAS 執
# 行程式碼的指令
```
```
請注意,SASmarkdown 視每個 chunk 為獨立的 SAS 程式碼,若不指定將輸出存在 liberary,就無法繼續使用資料,若要下方的 chunk 碼延續前方 chunk 的執行程式碼,需使用下列方法。
首先,設定用的 chunk 要多加一行 `sas_collectcode() ` ,變成:
```R
```{r setup, include=FALSE}
library(SASmarkdown)
saspath <- "C:/Program Files/SASHome/SASFoundation/9.4/sas.exe" # 你電腦裡 SAS 的位置
sasopts <- "-nosplash -linesize 75" # 一些排版設定
knitr::opts_chunk$set(engine="sashtml", engine.path=saspath,
engine.opts=sasopts, comment=NA)
sas_collectcode() # setup
```
```
之後需要被延續的程式碼,在 chunk 參數設定要加入 `collectcode=TRUE` 例如:
~~~SAS
# 需要被下方執行程式碼
```{r DATAstep, collectcode=TRUE}
data class;
set sashelp.class;
bmi = 703*weight/height**2;
run;
```
# 會繼承上面的程式碼執行
```{r PROCstep}
proc means data=class;
var bmi;
run;
```
~~~
### YAML
在檔案開頭用兩行 `---` 夾在中間的區域,用來設定輸出的設定,初學時可以不用自己打,可透過如下操作設定:

按下後可以設定,詳細的 YAML 寫法可以參考:https://bookdown.org/yihui/rmarkdown/ 的第三章、第四章,下面談我們寫作業比較容易用到的:
```yaml
--- # 初學不要碰這裡請用 output options 按出來就好
documentclass: LaTeX document class 寫這邊
# 除 documentclass 其他能用的 LaTeX 設定有:
# lang, fontsize, classoption, geometry,
# mainfont, sansfont, monofont, mathfont,
# linkcolor, urlcolor, citecolor
title: "標題寫這邊"
subtitle: "次標題寫這邊"
author: "作者寫這邊"
institute: "機構寫這邊"
date: "日期寫這邊"
url: "參考連結寫這邊"
bibliography: .bib的檔案路徑寫這邊 #假如有引文獻使用 BiBTeX 管理的方法
output: # <- YAML 的寫法是用空白縮排跟冒號代表資料結構以這兩行
pdf_document: # 為例,代表的是 output 下面的 pdf_document 設定
toc: true # 需要章節表
includes: # 設定預載檔案
in_header: .tex檔路徑 # 設定要透過 LaTeX 編譯時預載的表頭檔案
keep_tex: yes # 設定是否保留 .tex 檔
latex_engine: xelatex # 設定編譯使用的 LaTeX 引擎,若要打中文報告
# 必須使用 xelatex
md_extensions: +header_attributes # 設定 markdown 語法外掛
pandoc_args: --number-sections # 設定 markdown 轉 LaTeX 的規則
html_document: # 輸出網頁時的設定
toc: true # 跟上面一樣有些是共通的
smart: no # 這是智慧整理縮排關掉的方式
number_sections: true # 加上這個會有標題會有編號
beamer_presentation: # 輸出beamer簡報時的設定
slide_level: 2 # 預設等級多少的標題會被獨立成一張簡報
theme: "Warsaw" # 簡報版型主題設定
colortheme: "whale" # 簡報色彩主題設定
fonttheme: "professionalfonts" # 簡報字體主題設定
includes: # beamer_presentation 會繼承部分 pdf_document 的語法
in_header: header.tex
---
```
#### 中文要怎麼設定
假如以 $\LaTeX$ 相關的輸出,需要先進行設定,首先我們要在 YAML 加入:
```yaml
output:
pdf_document:
includes:
in_header: 中文化表頭tex檔路徑
latex_engine: xelatex # 才可以用 Uincode
```
其中使用 `includes: in_header:` 是要讓 Rmarkdown 轉 $\LaTeX$ 時,在檔頭加入中文化相關的 userpackage 與設定,請新建立一個 `.tex` 檔,並加入如下程式碼:
```latex
% Set CJK
\usepackage{fontspec}
\usepackage{xeCJK}
\setCJKmainfont{標楷體} %設定中文為系統上的字型,而英文不去更動,使用原TeX字型
\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt %這兩行一定要加,中文才能自動換行
```
#### LaTeX 表格
同樣的,要讓 Rmarkdown 中直接使用 $\LaTeX$ 表格語法,也要把相關 userpackage 載入到 header:
```latex
% For Latex Table
\usepackage{booktabs}
\usepackage{multirow}
```
## 小結 - 若你看太累想直接 End 的話
這篇文章大致把學統計會用到的數學報告工具提的差不多了,比起看完這篇,個人認為比較簡單的方式是直接裝好 RStudio 嘗試新建一個檔案,並自己把自己的作業寫上去,不會可以參考下面參考資料。
## 參考資料
- Rmarkdown 官方快查表:https://bookdown.org/yihui/rmarkdown/
- Rmarkdown 開發者寫的手冊 (非常詳細):https://bookdown.org/yihui/rmarkdown/
- 本文主要參考文本:http://www.learn-r-the-easy-way.tw/chapters/17
- SASmarkdown 部分參考文本:https://www.ssc.wisc.edu/~hemken/SASworkshops/sas.html#writing-sas-documentation