R:如何使用RMarkdown渲染中文pdf报告
Rmarkdown作为一种将R等编程语言和Markdown的简洁语法结合在一起的增强版Markdown语法,其在报告输出、数据分析、沟通交流中的易用性和便利性已得到了足够的体现。
Rmarkdown的一个重要特点就是可以在普通Markdown语法之上内嵌R等语言代码,并可以格式化输出和展示代码的结果,如展示图表等。
本文主要是展示如何使用Rmarkdown渲染pdf版中文报告(需要对Rmarkdown有一定了解)。似乎是谢益辉(https://yihui.org/)的rticles包出现了bug,所以更确切的说,本文是展示如何在Rstudio中使用rticles包的CTex模板完成中文pdf报告的渲染。
准备工作
需要安装如下工具:
R、Rstudio。
pandoc:https://github.com/jgm/pandoc/releases/tag/2.10.1。
tinytex:tinytex::install_tinytex()
rmarkdown、riticles:install.packages("rmarkdown")、install.packages("rticles")。
中文pdf渲染
在Rstudio中,File -> New File -> R Markdown,打开Rmarkdown新建对话框。使用从模板新建,创建CTex模板文件。
如果是英文RMarkdown其实是不需要CTex的,output里面指定输出格式为pdf_document即可。但是一旦有中文,那么pdf_document渲染的pdf就会缺失中文的内容,而CTex就是一种支持中文的LaTeX。RMarkdown渲染成pdf是先渲染成LaTeX,然后再转成pdf的,所以上面的准备工具中也可以看到需要安装一种LaTeX编译环境,此处是使用益辉大佬的tinytex包自动安装的当前系统可用的tinytex。
益辉大佬将很多杂志的Rmarkdown模板整理成rticles包,这样可以直接创建相应的RMarkdown模板,新建的CTex模板如图所示:
如果此时直接点击Rstudio的Knit按钮,就会报错。因为这个模板有bug,YAML头文件里面的documentclass重复了:“Duplicate map key: 'documentclass'"。
但是删除了其中一个documentclass参数,依然会报错:"Couldn't find template file ctex/resources/template.tex"。
报错提示缺少ctex模板。
暂时也不确定是怎么回事,反正我去查看rticles包的github备份,里面的ctex也没有template.tex
由于RMarkdown的输出格式是在YAML头文件里面的output控制的,而相应的格式输出其实是调用相应的输出函数,比如输出pdf格式,其实是调用的pdf_document函数。而ctex的格式输出是由ctex_article函数控制的,而它的源码就是封装了pdf_document_format函数,添加了latex_engine信息,那么就可以考虑修改output头文件。
function (..., latex_engine = "xelatex")
{
pdf_document_format("ctex", latex_engine = latex_engine,
...)
}
YAML信息修改:
# 模板的output头文件信息
output:
rticles::ctex:
fig_caption: yes
number_sections: yes
toc: yes
# 修改后的output头文件信息,更换为pdf_document,添加latex编译引擎
output:
pdf_document:
latex_engine: xelatex
fig_caption: yes
number_sections: yes
toc: yes
搭配好模板中已经存在的documentclass: ctexart
信息就可以在RMarkdown中正常使用CTex了,保存修改后,点击Knit to PDF即可正常进行渲染了。
- JavaScript实例---表格隔行变色以及移入鼠标高亮
- 1022: [SHOI2008]小约翰的游戏John
- Javascript数组
- 1588: [HNOI2002]营业额统计
- [git]撤销的相关命令:reset、revert、checkout
- Thrift教程初级篇——thrift安装环境变量配置第一个实例
- 1083: [SCOI2005]繁忙的都市
- 1015: [JSOI2008]星球大战starwar
- Tyvj P1813 [JSOI2008]海战训练
- 1820: [JSOI2010]Express Service 快递服务
- 3038: 上帝造题的七分钟2
- 1854: [Scoi2010]游戏
- Javascript字符串
- Codevs3278[NOIP2013]货车运输
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python里运行shell命令或cmd命令
- 玩转 PhpStorm 系列(四):快捷键篇
- HDFS工作机制和原理
- 通过 PHP Mysqli 扩展与数据库交互
- python 中的元类详解
- 我扒了半天源码,终于找到了Oauth2自定义处理结果的最佳方案!
- python 解决多核处理器算力浪费的现象
- python实现单例模式的5种方法
- java序列化和序列化ID的作用
- python函数式编程
- 让Vim打造成强大的IDE,附_vimrc的配置和使用
- python 中面向切面编程AOP和装饰器
- HashMap&ConcurrentHashMap&HashTable
- python中的垃圾回收机制
- python中值传递还是引用传递?