一丟丟前言
很久之前曾試圖以Rmarkdown編譯pdf文檔,無奈怎么鼓搗都會error,搜索了很久都沒能找到比較好的解決方案。在配置上將編譯器調成了xeLaTeX后就不了了之。這兩天心血來潮研究了一下xeLaTeX,終於明白之前為什么總是失敗了。入LaTeX門的時候一心一意盯着pdfLaTeX的后果就是入了過時的CJK包的坑,想要擴展的時候就跳不出來了。如今爽快的以xeLaTeX+xeCJK來處理之后終於打通了Rmarkdown編譯中文pdf文檔的任督二脈,且讓我暗自欣喜一陣:)不是什么大神,僅給出最簡的配置方法大家自己鼓搗去吧~
接下來是塞牙縫的最簡配置:
配置
- 安裝 R、Rstudio 以及 MiKTeX (推薦直接上 CTeX 的賊船)。
- Rstudio 中的配置:
Tools -- Global Options -- General, 設置缺省的編碼格式為UTF-8(Default text coding: UTF-8)。當然,如果是默認的[Ask]狀態,Rstudio彈框框出來的時候再選 UTF-8 也是可以的。 - 依然是 Rstudio ,
Tools -- Global Options -- Sweave,將編譯器設置為 xeLaTeX. 另外,最上面有一個Weave Rnw file using的選項,在 Github 里有一個不錯的 Rnw 編譯pdf的解決方案,xccds / ggplot2.Rnw, 如果想要用以上方式進行中文編譯的話,別忘了將這個選項設為 knitr. 啊哈,想當年遍尋中文編譯方案無果的時候這位仁兄讓我看到了一絲曙光~ - Rmd 里的 yaml 欄(就是最上面的那兩個三條橫線中間的部分)需要玩耍一些小 trick 噢:)詳見下。
- 還需要在 Rmd 文件路徑下放置一個header.tex來包含tex文件的基本信息。詳見下。
文本內容
Rmd 文件
---
title: "這是一個標題"
author: "hi,我是作者"
output:
pdf_document:
includes:
in_header: header.tex
keep_tex: yes
latex_engine: xelatex
word_document: default
html_document: default
---
我要打中文!!讓我說句 helloworld 吧!
- 自己手動敲的話注意縮進!!!Rmd 的 yaml 欄比較傲嬌,有一些縮進缺了就會 error 了喵~
需要注意的就是latex_engine:xelatex 了。即使設置了默認的編譯器為xeLaTeX依舊要手動再聲明一遍編譯器(我也不知道為什么R這么傲嬌)
而對於 in_header:header.tex,想對 LaTeX 動手動腳的話就是它啦~
header.tex
首先,tex文件最好也存為 UTF-8 格式,特別是在聲明xeCJK字體時用到了中文的情況下。
然后,嗯,最簡的解決方案不是么?哦呵呵~
法一:站在巨人的肩膀上——CTex
如果你安裝了CTeX套裝,一句話足矣~
header.tex
\usepackage{ctex}
法二:調戲一下 xeCJK
header.tex
%\documentclass{article} %雖然加了注釋號,但請注意這一行絕對不能注釋掉!因為pandoc后生成的tex文件已含有此句
\usepackage[BoldFont,SlantFont,CJKsetspaces,CJKchecksingle]{xeCJK}
\setCJKmainfont[BoldFont=SimSun]{Microsoft YaHei} %我是雅黑控
\setCJKmonofont{SimSun}% 設置缺省中文字體
\parindent 2em %段首縮進
\documentclass{article} 一句萬萬不能加上!!表手多一時順手打上了,醬紫直接就跪了。因為 knitr 使用的 md 轉 tex 的編譯器 pandoc 在生成 tex 的時候就會首先加上\documentclass{article}, 所以如果在 header.tex 里又來一遍的話會error。而上述ctex解決方案里不出現這個問題應該是將documentclass語句視為覆蓋設置。
So?
header 的運用可以各種的化腐朽為神奇吶,棒棒噠~~~
想加載其它 package 的時候就在 header 里加上是一件多爽快的事情吶~~~
提點一個小 trick,就是,在Rstudio編譯error了以后,可以到路徑下看一看pandoc調戲出來的tex文件,糾錯什么的看tex順眼多了,而且tex才是最實質的導致編譯進程停止的罪魁禍首喵~
Last but not least, 如果要做精細排版的話,還是直接在文本編輯器里敲 TeX 吧。去繞 R 呀 markdown 呀什么的其實只是為了感慨一下 R 的無所不能而已。嗯,以上。
