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 的无所不能而已。嗯,以上。

你可能感兴趣的:(markdown)