R+markdown+LaTeX 中文編譯解決方案


一丟丟前言

很久之前曾試圖以Rmarkdown編譯pdf文檔,無奈怎么鼓搗都會error,搜索了很久都沒能找到比較好的解決方案。在配置上將編譯器調成了xeLaTeX后就不了了之。這兩天心血來潮研究了一下xeLaTeX,終於明白之前為什么總是失敗了。入LaTeX門的時候一心一意盯着pdfLaTeX的后果就是入了過時的CJK包的坑,想要擴展的時候就跳不出來了。如今爽快的以xeLaTeX+xeCJK來處理之后終於打通了Rmarkdown編譯中文pdf文檔的任督二脈,且讓我暗自欣喜一陣:)不是什么大神,僅給出最簡的配置方法大家自己鼓搗去吧~


接下來是塞牙縫的最簡配置:

配置

  1. 安裝 R、Rstudio 以及 MiKTeX (推薦直接上 CTeX 的賊船)。
  2. Rstudio 中的配置:Tools -- Global Options -- General, 設置缺省的編碼格式為UTF-8(Default text coding: UTF-8)。當然,如果是默認的[Ask]狀態,Rstudio彈框框出來的時候再選 UTF-8 也是可以的。
  3. 依然是 Rstudio , Tools -- Global Options -- Sweave,將編譯器設置為 xeLaTeX. 另外,最上面有一個 Weave Rnw file using 的選項,在 Github 里有一個不錯的 Rnw 編譯pdf的解決方案,xccds / ggplot2.Rnw, 如果想要用以上方式進行中文編譯的話,別忘了將這個選項設為 knitr. 啊哈,想當年遍尋中文編譯方案無果的時候這位仁兄讓我看到了一絲曙光~
  4. Rmd 里的 yaml 欄(就是最上面的那兩個三條橫線中間的部分)需要玩耍一些小 trick 噢:)詳見下。
  5. 還需要在 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 的無所不能而已。嗯,以上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM