R Markdown 與 TeX

R
Markdown
programming language
融合兩種文檔編寫工具,讓你的簡報與文件更漂亮。
Author

Anthony Sung

Published

May 26, 2023

排版一直以來是一個很麻煩的事情,無論是新聞、雜誌,乃至於學術文章,要將文章清楚、俐落且富有美感的呈現出來是需要功夫的;此外,要透過何種方式進行排版,也成為了諸多想學習排版或是已經成為排版的人而言心中曾經冒出的疑問。對此,這篇文章將會透過 R Markdown 的方式,結合些許的 \(\TeX\) 語法,將個人的排版經歷與方法分享給大家。

在 R 語言中新增 Markdown 檔案

我們在此預設讀者的電腦中均已安裝 R 語言與 R Studio。

安裝所需套件與基本設定

我們需要執行以下兩行指令安裝rmarkdownknitr,這是兩個使用 R Markdown 的重要套件。

install.packages("rmarkdown")
install.packages("knitr")

安裝完畢後,在 R Studio 的使用介面中,可以依照以下方式新增 R Markdown 檔案:File\(\rightarrow\)New File\(\rightarrow\)R Markdown,如下圖所示。

接著就會看到以下的畫面:

我們可以在TitleAuthorDate欄位上打上標題、作者名字與編輯日期。設定完成後,我們可以選擇輸出格式,在這篇文章中我們以.PDF檔案作為範例,確認後按下OK即可進入下一步。

介面介紹

點擊OK後我們可以看到一份 R Markdown 的編輯畫面。

首先 1 至 5 行代表的是文章的基本設定,包含標題、作者名字、編輯日期,以及之後會使用到的一些\(\TeX\) 語法設定的地方,稱為前言區(preamble)。接著,我們可以看到這幾行程式碼:

{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)

這幾行代表的意思如下,inclue=FALSE即是不將程式區塊包含於輸出的文件中,echo=TRUE則是要求程式碼要含在文件輸出。而我們可以在編輯區看到好幾個程式區塊,加入方式有兩種,第一種就是直接輸入```,並於其後加入{r}或是{python}。第二種方法則是點擊工作列上方的增加程式區塊符號,選擇需要顯示的程式語言即可。

關於 Markdown 語法的相關內容,請參考MarkDown語法大全

TeX 語法設定

進行\(\TeX\) 語法有兩個目的。如果有聽過 \(\TeX\) 的人應該知道 \(\TeX\) 是用於進行數學排版的語言,而 \(\TeX\) 可以應用在 R Markdown 中,讓文件變得更簡潔、漂亮。另一方面,由於有些文件必須以中文呈現,因此必須透過 \(\TeX\) 語法的相關設定,才能顯示中文於文件中。

數學排版

有鑒於本篇文章並非 \(\TeX\) 語法教學,故不會著重許多細節,還煩請見諒。如果要進入數學模式,我們有兩種顯示方式,一種是行內(inline)顯示,即數學符號顯示於文字與文字之間,方法為打上$$,接著在裡面加入 \(\TeX\) 語法;另一個則是建立一個數學區塊,我們可以在文件中打上以下程式碼,便可以產生一個數學區塊。

$$

$$

以下我們針對常用的 \(\TeX\) 語法整理為表格,供使用者參考。如果想要了解更多 \(\TeX\) 語法的指令,可以參考這份文件

語法 結果
$x=y$ \(x=y\)
$x+y$ \(x+y\)
$x-y$ \(x-y\)
$x*y$ \(x*y\)
$x/y$ \(x/y\)
$x \times y$ \(x \times y\)
$x > y$ \(x > y\)
$x < y$ \(x < y\)
$x \geq y$ \(x \geq y\)
$x \leq y$ \(x \leq y\)
$x^n$ \(x^n\)
$x_i$ \(x_i\)
$\hat{x}$ \(\hat{x}\)
$\overline{x}$ \(\overline{x}\)
$\tilde{x}$ \(\tilde{x}\)
$\frac{d}{dx}$ \(\frac{d}{dx}\)
$\frac{\partial }{\partial x}$ \(\frac{\partial }{\partial x}\)
$\int^{a}_{b}$ \(\int^{a}_{b}\)
$\sum^{n}_{i=1}$ \(\sum^{n}_{i=1}\)
$x_{1} + x_{2} + \cdots + x_{n}$ \(x_{1} + x_{2} + \cdots + x_{n}\)
$x_{1}, x_{2}, \cdots, x_{n}$ \(x_{1}, x_{2}, \cdots, x_{n}\)
$\mid x \mid$ \(\mid x \mid\)
$x \in \mathbb{R}$ \(x \in \mathbb{R}\)
$A \subset B$ \(A \subset B\)
$A \subseteq B$ \(A \subseteq B\)
$A \cup B$ \(A \cup B\)
$A \cap B$ \(A \cap B\)
$\sin$ \(\sin\)
$\max$ \(\max\)
$\log$ \(\log\)
$\exp$ \(\exp\)
$\{X_{i}\}^{n}_{i=1} \sim \operatorname{N}(\mu, \sigma^2)$ \(\{X_{i}\}^{n}_{i=1} \sim \operatorname{N}(\mu, \sigma^2)\)
${n \choose x}$ \({n \choose x}\)
$\lim_{x \to \infty} f(x)$ \(\lim_{x \to \infty} f(x)\)

更多關於數學排版的技巧請參考 LaTeX 數學排版。

中文字體設定

讀者可以先從這份文件的Github下載main.Rmd這份檔案。下載完畢後開啟,可以看到在前言區中,多了好幾行程式碼,以下我們來一一介紹。

---
title: \hei{標題}
date: 2022-10-15
author: 作者名字
output:
  pdf_document:
    latex_engine: xelatex
    includes:
      in_header: "preamble.tex"
---

pdf_document後面的latex_engine代表我們指定要使用哪種 \(\TeX\) 的編譯系統,由於我們要顯示中文,因此就必須使用xelatex。接著可以看到以下幾行:

includes:
      in_header: "preamble.tex"

我們可以在 Markdown 的前言區加上in_header: "preamble.tex",代表我們將preamble.tex這個.tex檔加入進來。這個檔案裡的內容如下:

% Font Setting
\usepackage{xeCJK}
\usepackage{fontspec}
\setmainfont[Numbers = OldStyle]{LinLibertine_R.otf} % Set the main font of the document 
\setCJKmainfont[AutoFakeBold={2.5},AutoFakeSlant={0.6}]{cwTeXQMing-Medium}
\setCJKfamilyfont{kai}{cwTeX Q Kai}
\newcommand{\kai}[1]{{\CJKfamily{kai}#1}}
\setCJKfamilyfont{yuan}{cwTeX Q Yuan Medium} 
\newcommand{\yuan}[1]{{\CJKfamily{yuan}#1}}
\setCJKfamilyfont{hei}{cwTeX Q Hei}
\newcommand{\hei}[1]{{\CJKfamily{hei}#1}}

% Title Setting
\usepackage{titlesec} % Custom section title style
\titleformat{\section}{\normalfont\Large\yuan}{\thesection}{1em}{}
\titleformat{\subsection}{\normalfont\large\yuan}{\thesubsection}{1em}{}
\titleformat{\subsubsection}{\normalsize\yuan}{\arabic{section}.\arabic{subsection}.\arabic{subsubsection}\quad}{0em}{}

這幾行是設定字體的,\usepackage{xeCJK}這行必須加入,否則剛剛使用的latex_engine: xelatex就沒有用了,\usepackage{fontspec}則是將中、英字體分開設定。後面的\setmainfontsetCJKmainfont顧名思義就是設定主要字體與主要「中文」字體,可以看到設定字體前我們加上了[Numbers = OldStyle],代表將字體設定成 OldStyle 的格式,顯示結果如下:

接下來看到以下兩行:

  - \setCJKfamilyfont{kai}{cwTeX Q Kai}
  - \newcommand{\kai}[1]{{\CJKfamily{kai}#1}}

第一行代表我們在中文字體家族中設定一個名為cwTeX Q Kai的字體,接著新建一個指定叫做\kai,方便我們日後如果要更改文字的字型,可以使用\kai{想要更改的文字}進行更換。最後,必須注意,這些字體都必須是已經安裝在讀者端的電腦上,如果想要下載由吳聰敏老師開發的cwTeX系列字體,可以參考這篇文章。而後面的\usepackage{titlesec}則是設定不同深度的標題之格式,包含字體、大小、標題開頭數字之計算方式。

排版成果

技巧提點

假設文件中需要安裝某些套件,但又不想讓這些套件跑出來的結果出現在輸出的文件中,我們可以在 chunk 上面進行設定。如果想要設定這份文件的檔案路徑,可以這麼做:

knitr::opts_chunk$set(echo = TRUE)
setwd("你的路徑")

若想要關閉系統提示,則在設定區{}中加上message = FALSE即可,例如:

::: {.cell}

```{.r .cell-code}
library(haven)
library(tidyverse)

:::

小結

排版是需要學習與時間培養的,作者本人也是透過做中學、學中做的方式慢慢建立排版的直覺。因此,學習在每份文件都使用排版軟體排版吧!如果喜歡這篇文章的話也別忘了分享給需要的朋友喔。