R markdown的pdf报告(中文输出解决方案)

要生成一个动态报告,我一般会首选html报告(网页版报告),其交互性以及页面更加丰富点;但是如果是要一份正规的报告,那么一般会选PDF报告

在前面一篇博文R Markdown学习中提到过,如果你是用RStudio来生成报告的话,还除了pandoc外(因为RStudio自带),还需要安装miktex(windows),因为这是基于latex的

对于要在PDF中显示中文(中文LaTeX排版)的话,建议安装CTEX,下载地址:http://www.ctex.org/CTeXDownload;这里点需要注意下,网上有些建议安装basic版就够了,其实我还是建议安装完整版,不然后续一些模板需要一些latex包时,又要需要再安装,那样就有点麻烦了(主要是我不怎么懂latex,更不会安装latex包啦~~)

pandoc的下载地址:http://pandoc.org/installing.html

安装好上述,你在RStudio中按照流程新建一个pdf的rmarkdon就可以开始时会用了,YAML如下图所示:

---
title: "aaa"
output: 
  pdf_document:
    keep_tex: yes  
    latex_engine: xelatex
---

latex_engine设置引擎:建议用xelatex,默认是pdflatex


如果你是写英文报告,那么以上步骤就足够了

But,如果像我一样需要写中文的报告,那么你会发现以上步骤根本识别不了中文(latex对中文不太友好)。。。查了资料遇了几次坑,总结下如何用rmarkdown写中文pdf报告

实现的pdf中输出中文,主要靠的是latex的xeCJK包,那么可以选择在YAML上加上命令调用这个包,如下:

---
title: "中文"
CJKmainfont: Microsoft YaHei
output:
  pdf_document:
    includes:
      header-includes:
        - \usepackage{xeCJK}
    keep_tex: yes
    latex_engine: xelatex
---

记得一定要用CJKmainfont设定好字体,不然还是无法显示中文的(显示空白),这坑查了好久才发现!!!

或者用in_header: header.tex来调用xeCJK包以及CJKmainfont,你可以在header.tex(放在R运行的当前目录下)写入latex的一些语法,如写入:

\usepackage{xeCJK}  
\setCJKmainfont{Microsoft YaHei}

然后在rmarkdown中的YAML改为:

---
title: "中文"
output:
CJKmainfont: Microsoft YaHei
  pdf_document:
    includes:
      in_header: header.tex
    keep_tex: yes
    latex_engine: xelatex
  word_document: default
---

如果上述能成功运行并且未报错,那么就能在pdf报告中显示中文了;没成功的话(比如我。。。),那么再试试谢益辉大神写的rmarkdown的模板包rticles,里面的CTeX Document就是写好支持中文pdf的模板,怎么使用的话这里不细说了,参照这个文章https://github.com/rstudio/rticleshttps://github.com/rstudio/rticles/blob/master/inst/rmarkdown/templates/ctex/skeleton/skeleton.Rmd即可

但是,通过以上方法,我还是没有成功,报错都是跟letax相关的(也就是之前装的CTEX),我查了网上相关资料,在谢益辉的建议下,决定使用其开发的TinyTeX包,是一个瘦身版的TeX Live,能很好的兼容rmarkdown,并且最新的rmarkdown默认会调用TinyTeX

怎么使用TinyTeX呢,按照中文说明文档来就行TinyTeX 中文文档,非常简单,但记得把你LaTeX套件(也就是提到的CTEX/miktex)删除掉

主要是TinyTeX能让你以R包的方式来维护你的LaTeX包,缺啥补啥,非常方便!

我将我的LaTeX套件替换成TinyTeX后,再次使用上述的几种方法来实现pdf中文,均成功无报错信息,看样子之前均是LaTeX套件的问题。。。


简单总结下就是,如果想用rmarkdown来写中文版的pdf报告,那么有以下两种方法:

  • 安装LaTeX套件(CTEX/miktex),YAML中写入latex的一些设置
  • 使用rticles包中的CTeX模板+TinyTeX = 全R包解决方案

如果你是遇到图片中的中文无法正常显示的话,可以考虑用showtext包(但我没试过,因为现在很少会在报告中的图片中添加中文了。。特别是我们这方面的)

以上是我解决PDF中文显示的一些解决方案以及过程,均整理自网上资料,如下面这些可供参考:

rmarkdown转化中文字符为PDF的设置
showtext package integration
RStudio 中Knitr 输出中文的问题
Rmarkdown安装配置、输出PDF正文中文以及图片中文配置
Rmarkdown中文实现

本文出自于http://www.bioinfo-scrounger.com转载请注明出处