Rmarkdown与Word文档的交互

2022-11-15 10:17:45 浏览数 (3)

在Rmarkdown中提供了直接生成Word文档格式的选项,只要在新建rmarkdown时选择Word选项就行了。

默认

但是这样生成的Word文档格式很简单,也不存在自定义选项,相对于生成markdown格式的各种花样,着实是有些简陋了。

今天介绍的这个officedown包为生成更加强大的Word格式提供了超多便利,它可以根据一个预先自己定制好的、含有各种格式的docx格式模板文件,生成一个一模一样格式的Word文档。

比如:目录、标题自动编号、定制统一格式的表格和图片、页码、页眉页脚、分栏、交叉引用!

“这个R包的使用主要分为两步:1. 创建一个模板Rmd文件,根据模板Rmd文件knitr为一个模板docx文件,内含各种样式;2. 使用模板docx文件,生成新的docx文档,会使用模板中设置好的各种样式。

  • 创建模板
    • 表格、图片、列表样式
    • 目录
    • 分栏
    • 横版排布
    • 分页
    • 文字样式
  • 使用模板

创建模板

首先要安装R包:

代码语言:javascript复制
# 2选1
remotes::install_github("davidgohel/officedown")

install.packages('officedown')

创建模板Rmd的方法也很简单,只要在新建rmarkdown时使用officedown包自带的模板即可:

打开这个模板Rmd后,内置了各种样式,比如标题、目录、表格、图片、列表等。

这个包比较复杂地方的就是修改这些样式。

表格、图片、列表样式

模板文档中的表格和代码块

表格/图片标题、id可以在chunk option中修改:

代码语言:javascript复制
# 表格

```{r tab.cap="caption 1", tab.id="mtcars"}
head(mtcars)
```
# 图片

```{r fig.cap="A boxplot", fig.id = "boxplot"}
boxplot(1:8)
```

表格线条的粗细,自动编号,其他样式可以在yaml中修改:

代码语言:javascript复制
---
output:
  officedown::rdocx_document:
    reference_docx: pandoc_template.docx
    tables:
      style: Table
      layout: autofit
      width: 1.0
      caption:
        style: Table Caption
        pre: 'Table '
        sep: ': '
      conditional:
        first_row: true
        first_column: false
        last_row: false
        last_column: false
        no_hband: false
        no_vband: true
    plots:
      style: Normal
      align: center
      caption:
        style: Image Caption
        pre: 'Figure '
        sep: ': '
    lists:
      ol.style: null
      ul.style: null
    mapstyles:
      Normal: ['First Paragraph', 'Author', 'Date']
    page_size:
      width: 8.3
      height: 11.7
      orient: "portrait"
    page_margins:
      bottom: 1
      top: 1
      right: 1.25
      left: 1.25
      header: 0.5
      footer: 0.5
      gutter: 0.5
    reference_num: true
---

目录

模板文档中的目录

模板Rmd中的以下语句是控制目录的:

代码语言:javascript复制
<!---BLOCK_TOC--->
<!---BLOCK_TOC{seq_id: 'fig'}--->
<!---BLOCK_TOC{seq_id: 'tab'}--->

分栏

模板文档中的分栏

模板Rmd中的以下语句用来控制分栏:

代码语言:javascript复制
<!---BLOCK_MULTICOL_START--->

xxxxxxxxxxxxxxxxx 

`r run_columnbreak()`
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla eu pulvinar arcu, quis aliquam dui. In at cursus ante. Vestibulum non sagittis lacus. Duis vitae iaculis dui. Vivamus tempor,

<!---BLOCK_MULTICOL_STOP{widths: [3,3], space: 0.2, sep: true}--->

r run_columnbreak()表示分栏,widths: [3,3], space: 0.2, sep: true表示分栏宽度、文字距离分栏线的距离、是否显示分栏线。

横版排布

默认都是竖版排布的,在模板Rmd中使用以下语句控制横版排布:

代码语言:javascript复制
<!---BLOCK_LANDSCAPE_START--->

### Landscape section

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla eu pulvinar arcu, quis aliquam dui. In at cursus ante. Vestibulum non sagittis lacus. Duis vitae iaculis dui. Vivamus tempor, nibh ut pretium tempus, enim lorem dignissim quam, at euismod massa magna at magna. Sed facilisis dapibus diam nec volutpat. 

```{r, echo=FALSE}
barplot(1:5, col=1:5)
```
<!---BLOCK_LANDSCAPE_STOP--->

效果如下,可以看到上下都是竖排的,只有这一页是横排的:

横版排布

分页

在模板Rmd文件中使用newpage可以实现分页。

文字样式

修改文字样式,需要把这个模板Rmd文件knit为模板docx文件后,在模板docx文件中修改(模板Rmd中提供了一些简单的修改,不如直接在Word里面修改方便)。

修改样式需要在Word里面的样式中修改,不能选中文字直接改,否则的话你根据这个模板docx文件生成的新文档就不会使用自定义样式了。

右键选择修改

修改样式

在以下界面中可以自定义各种样式,写过毕业论文的小伙伴应该都不会陌生...

修改样式

常用的样式就是这些,还有其他的比如交叉引用等,也是可以设置的,大家有兴趣的可以去这个网站[1]继续探索。

自定义样式设置后,就可以根据这个样式生成新的文档了,会自动使用你设置好的样式。

把这个模板Rmd文件knit为一个docx文件,把这个文件重命名为你喜欢的名字(比如template.docx),这个docx文件就是你要用的模板文件了。

使用模板

使用模板就非常简单了!

新建一个Rmd文件(用不用模板都可以),把Rmd文件中最上面的yaml改成以下这样:

代码语言:javascript复制
---
title: "xxxx"
author: "xxxx"
date: 'xxxxxx'
output: 
  officedown::rdocx_document:
    reference_docx: template.docx
---

reference_docx: template.docx就是你刚才自定义的模板文件。

接下来在这个Rmd中写作,最后knitr出来的新的Word文档就会使用你模板中定义好的样式了!

是不是很简单?

如果你经常需要把Rmd文件生成统一格式的docx文档,这种方法的确可以省掉很多流程,一次设置,终生可用!不过样式设置这块确实有些复杂了。不知道大家有没有更简单的方法呢?

参考资料

[1]

officedown: https://davidgohel.github.io/officedown/index.html

0 人点赞