如何在由RStudio和Markdown生成的Word文档中添加分页符

49

我在R Studio中使用R markdown编写Word文档。我可以得到很多东西,但是目前我还没想出如何获取分页符。我找到了一些解决方案,但只适用于渲染的LaTeX/PDF文档,这不是我的情况。


3
据我所知,您无法通过Pandoc支持分页符。 - daroczig
12个回答

47

添加:如需插入分页符,请在包括LaTeX、HTML、Word和ODT格式在内的各种格式中使用\newpage

https://bookdown.org/yihui/rmarkdown-cookbook/pagebreaks.html

Paragraph before page break.

\newpage

First paragraph on a new page.

先前:可以通过使用一个五级标题块(#####)和在 YAML 中定义的 docx 模板来实现。

在 Microsoft Word 中创建 headingfive.docx 后,您选择 Heading 5Modify Style,然后在 Line and Page Breaks 选项卡中选择 Page break before 并保存 headingfive.docx 文件。

Page break before

---
title: 'Making page break using fifth-level header block'
output: 
  word_document:
    reference_docx: headingfive.docx
---

在你的Rmd文档中,你需要在YAML头文件中定义reference_docx,然后你就可以使用分页符 #####

请参见下面链接。

https://www.r-bloggers.com/r-markdown-how-to-insert-page-breaks-in-a-ms-word-document/


5
可以从博客链接中摘录一小部分内容并发布,这样即使将来该网站消失,答案仍然有用。 - Keith Hughitt
1
在这里需要做的关键事情是,在由Rmd生成的Word文档中可以运行,即在“样式”部分中勾选“基于此模板新建文档”——修改...部分。 - Alex Knorre
2
这种技术的唯一“缺陷”是下一页以空白行开头;我认为这是无法避免的,因为它是带有“标题5”样式的文本行,不是您可以隐藏或摆脱的东西。我所做的最好的事情是进一步格式化以减小字体大小,设置为白色,减少行间距等。仍然只有一个空白行。 - r2evans
2
我几年前使用过这个技巧。最新的更新使得使用“\newpage”可以跨越核心文档输出类型工作。https://bookdown.org/yihui/rmarkdown-cookbook/pagebreaks.html - Whalen

19

在John MacFarlane和pandoc的Google小组的其他成员的帮助下,我编写了一个过滤器来实现这一点。请参见: https://groups.google.com/forum/#!topic/pandoc-discuss/FzLrhk0vVbU 简而言之,该过滤器需要查找要替换为分页符的内容。在本例中,\newpage被替换为 <w:p><w:r><w:br w:type=\"page\"/></w:r></w:p> 这使得单个LaTeX标记可以用于PDF和Word输出。 Joel


1
那个讨论看起来很有前途,但是我被那么多的信息和筛选脚本版本搞糊涂了。你能在这里解释一下如何使用吗?这是只需要用 R (.Rmd) 代码就可以完成的事情,还是需要某种 pandoc 代码?(我不知道如何从 R 中打开和配置它)。另外,它是否与平台无关?(我使用的是 Windows 7,但你使用的是 RHEL 6)。非常感谢 @JAllen。 - abu

13
你所尝试的是在使用Pandoc生成的Word文档中强制进行“分页”或“新页面”。我已经在我的环境中找到了一种方法来实现这一点,但我不确定它是否适用于每个环境。
我的环境: * R-studio / Pandoc / MS-WORD,从“*.Rmd”文件开始生成DOCX文件。
在我的RMD文件中,关键思想是我创建了一个类似于模板的文档(MyFormattingDocument.docx),并在该Word文档中调整了像“Heading 1”和/或“Heading 2”和/或“footnote”等其他预定义样式的样式。
(请参见此处:http://rmarkdown.rstudio.com/word_document_format.html#style-reference)以了解样式引用的说明以及如何在您的RMD文件中设置标题信息以指定参考文档。
所以在我的情况下...我在WORD中调整了“Heading 1”的样式,使其在“Heading 1”的段落格式中包含一个强制的“Page Break Before”。如何强制每个“Heading 1”始终“Page Break”在不同版本的Microsoft WORD中有所不同,但如果你遵循WORD文档并修改“Heading 1”样式,那么每个“Heading 1”始终会在其前面有一个分页符。
然后...您将此模板文件保存在您正在使用的目录中,与RMD文件一起工作...它被用作模板。文件的内容将被忽略...所以不用担心...你可以在文件中放置示例文本并测试所有格式是否正常工作...但样式在由RMD文件构建的新Word文档中使用,因此每个“Heading 1”都将有一个分页符。

注意:显然,您可以使用具有从PANDOC标记到样式的一对一映射的任何样式,因此您可以选择仅制作所有“标题3”或其他内容...只需查看您的RMD创建的DOCX中应用的“样式”,然后调整该样式,即使您需要插入一些“虚假”行,其中实际上没有内容,但目的是为了强制在DOCX中显示样式。


8
这里有一份 R 脚本,可以作为 pandoc 过滤器使用,将 LaTeX 分页符(\pagebreak)替换为单词分隔符,参考了 @JAllen 的回答。使用此脚本不需要编译 pandoc 脚本。由于您正在使用 R Markdown,我假设系统中已经安装了 R。
#!/usr/bin/env Rscript

json_in <- file('stdin', 'r')
lat_newp <- '{"t":"RawBlock","c":["latex","\\\\newpage"]}'
doc_newp <- '{"t":"RawBlock","c":["openxml","<w:p><w:r><w:br w:type=\\"page\\"/></w:r></w:p>"]}'
ast <- paste(readLines(json_in, warn=FALSE), collapse="\n")
ast <- gsub(lat_newp, doc_newp, ast, fixed=TRUE)
write(ast, "")

将此文件保存为page-break-filter.R或类似名称,并通过在终端中运行chmod +x page-break-filter.R使其可执行。

然后在R Markdown YAML中包含此过滤器,如下所示:

---
title: "Title
author: "Author"
output:  
  word_document:
    pandoc_args: [
      "--filter", "/path/to/page-break-filter.R"
    ]
---

我按照原样做了,但是它对我不起作用。我收到了这个pandoc错误:Error running filter page-break-filter.R: Error in $: Failed reading: not a valid json value。而且非常奇怪的是,每次我尝试渲染Rmd时,它都会删除page-break-filter.R和一堆其他源文件。当我在YAML中不包括pandoc_args时,这种情况不会发生。 - Oliver

7
你可以使用 R 包 worded。这避免了需要模板 Word 文件的需求。请参阅 https://github.com/davidgohel/worded
需要将 output 参数设置为 worded::rdocx_document,并调用 library(worded)。
---
date: "2018-03-27"
author: "David Gohel"
title: "Document title"
output: 
  worded::rdocx_document
---

```{r setup, include=FALSE}
library(worded)
```

你可以在需要分页的地方添加 <!---CHUNK_PAGEBREAK--->
该软件包使用类似机制提供各种单词格式选项。

1
这个软件包非常不错。它还支持横向屏幕方向。 - Sungpil Han
1
@Whitebeard13 根据链接,它似乎已经更名为Officedown。我不认为它曾经在CRAN上 - 您可以使用devtools :: install_github("davidgohel / officedown")从GitHub下载它。 - anotherfred
@anotherfred 是的,我找到了,所以我删除了我的评论。非常感谢。 - Whitebeard13
@anotherfred 我们可以在 .Rmd 脚本的文本行之间使用 <!---CHUNK_PAGEBREAK---> 吗?虽然安装和加载都成功了,但是没有出现分页符。请参见下面我 .Rmd 脚本的一部分:`....se the information contained in this document. Please ensure that you read the last available version of this document.<!---CHUNK_PAGEBREAK--->

1.介绍

专家论坛的主要目的是形成一个定性和定量...`
- Whitebeard13
出现以下错误: devtools::install_github("davidgohel/officedown") 安装失败:句柄已死 - sullij
显示剩余2条评论

4

R Markdown 1.16引入了一项新功能,允许通过添加一个只包含命令\pagebreak\newpage的段落来插入分页符:

Paragraph before page break.

\pagebreak

First paragraph on a new page.

查看R Markdown菜谱中分页一节。


4
在升级到R 4.0.0版本后,<!---CHUNK_PAGEBREAK---> 解决方案不能再使用了。
相反,我可以使用officer包中的run_pagebreak()函数,并结合officedown包使用。
---
output: word_document
---

```{r settings}
library(officedown)
library(officer)
```

Hello world on page 1

`r run_pagebreak()`

Hello world on page 2

我相信这是最好的解决方案。 - Sungpil Han

2
Sungpil的文章接近解决问题,但并不完全有效。以下是我发现的最佳解决方案: https://scriptsandstatistics.wordpress.com/2015/12/18/rmarkdown-how-to-inserts-page-breaks-in-a-ms-word-document/。更好的是,作者包含了Word模板以使其起作用。R-blogger的链接已经损坏,且头文件格式不正确。我记录了一些注释:
1)您可能需要在Rmd头部中包含Word模板的完整路径,例如:
output: 
    word_document:
      reference_docx: C:/workspace/myproject/mystyles.docx

2) 上面链接中的模板更改了一些默认样式设置,因此您需要将它们改回来。


2

这不是自动化解决方案。但我一直在我的Markdown文档中添加文本“#####分页符”。然后在MS Word中使用查找替换功能,将文本“分页符”替换为“^m”(手动分页符)。


0
在参考的 Word 文档中,按照以下方式修改目录的样式:
  1. 选择目录
  2. 选择“样式”
  3. 在样式中,选择“修改”
  4. 在修改样式中,选择“格式”
  5. 从格式中,选择“段落”
  6. 在段落的“行和分页符”部分,勾选/选择“分页符前面插入分页符”
  7. 点击“确定”并保存参考文档(word_styles.docx),并在 Yaml 中提及相同的文档。

---
输出:
word_document:
reference_docx: "word_styles.docx"
---


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接