如何在由RStudio&amp ;;生成的word文档中添加分页符降价

时间:2014-07-10 08:47:06

标签: r markdown rstudio pandoc

我在R Studio中使用R markdown编写Word文档。我可以得到很多东西,但目前我还没弄清楚如何才能获得分页符。我找到了解决方案,但仅针对渲染的乳胶/ pdf文档,这不是我的情况。

11 个答案:

答案 0 :(得分:22)

使用第五级标头块(#####)和YAML中定义的docx模板有一种更简单的方法。

在Microsoft Word中创建headingfive.docx后,选择Modify Style的{​​{1}},然后在Heading 5标签中选择Page break before并保存{{ 1}}文件。

Page break before

Line and Page Breaks

在您的headingfive.docx文档中,您在YAML标题中定义了--- title: 'Making page break using fifth-level header block' output: word_document: reference_docx: headingfive.docx --- ,现在您可以使用分页Rmd

请参阅下文。

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

答案 1 :(得分:14)

在John MacFarlane和pandoc google小组的其他人的帮助下,我整理了一个过滤器来做到这一点。请参阅: https://groups.google.com/forum/#!topic/pandoc-discuss/FzLrhk0vVbU 简而言之,过滤器需要寻找替换为openxml for pagebreak的内容。在这种情况下 \newpage 正在被取代 <w:p><w:r><w:br w:type=\"page\"/></w:r></w:p> 这允许对pdf和word输出解释单个乳胶标记。 乔尔

答案 2 :(得分:12)

您要做的是在Pandoc生成的word文档中强制使用“分页符”或“新页面”。我已经找到了在我的环境中执行此操作的方法,但我不确定它是否适用于所有环境。

我的环境: * R-studio / Pandoc / MS-WORD以“* .Rmd”文件开头并生成DOCX文件。

在我的RMD文件中,关键的想法是我已经创建了类似于TEMPLATE文档(MyFormattingDocument.docx)的内容,并且在该单词文档中我调整了STYLES,例如“标题1”和/或“标题2”和/或“脚注”或我想要调整的任何其他预定义样式。

(参见:http://rmarkdown.rstudio.com/word_document_format.html#style-reference)有关样式参考的说明以及如何在RMD文件中设置标题信息以指定参考文档。

在我的情况下SOOOO ...我在WORD中调整了“标题1”样式,在“标题1”的段落格式中包含一个强制的“分页符前”。在不同版本的Microsoft WORD中,你究竟如何强制每个“标题1”总是“分页”是不同的但是如果你按照WORD文档修改“标题1”样式那么每个“标题1”总是会有一个分页符号之前它

那么......你将这个模板文件保存在你使用RMD文件的某个目录中......并且它被用作模板。文件的内容被忽略....所以不要担心...你可以将示例文本放在这个文件中并测试格式化是否全部有效......内容被忽略但是样式在新版本中使用将由RMD文件构建的word文档,然后每个“标题1”将在它之前休息。

注意:显然你可以对任何具有PANDOC MARKUP一对一映射的样式做同样的事情,这样你就可以只做所有“Heading 3”或者其他......只需看看你的RMD创建DOCX正在应用“STYLE”然后调整该样式,即使您需要插入一些基本上为空白内容的“假”行,仅仅是为了强制样式出现在DOCX中

答案 3 :(得分:5)

这是一个R脚本,可以用作pandoc过滤器,用@ JAllen上面的答案替换LaTeX中断(\pagebreak)。有了这个,你不需要编译一个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"
    ]
---

答案 4 :(得分:4)

更新到R 4.0.0时,<!---CHUNK_PAGEBREAK--->解决方案对我而言不再有效。

相反,我可以使用run_pagebreak()包中的officer函数,但仍可以与officedown包结合使用:

---
output: word_document
---

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

Hello world on page 1

`r run_pagebreak()`

Hello world on page 2

答案 5 :(得分:4)

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

Paragraph before page break.

\pagebreak

First paragraph on a new page.

另请参阅 R Markdown 说明书中的 pagebreaks 部分。

答案 6 :(得分:2)

您可以使用R软件包worded。这避免了模板字文件的需要。参见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--->添加到文档中。

该程序包允许使用类似的机制进行各种单词格式设置。

答案 7 :(得分:1)

Sungpil的文章很接近,但没有成功。这是我找到的最佳解决方案: https://scriptsandstatistics.wordpress.com/2015/12/18/rmarkdown-how-to-inserts-page-breaks-in-a-ms-word-document/

更好的是,作者使用了Word模板来完成这项工作。 R-blogger的模板链接已损坏,标题格式错误。我做了一些笔记:

1)您可能需要在Rmd标头中包含单词模板的完整路径,如下所示:

output: 
    word_document:
      reference_docx: C:/workspace/myproject/mystyles.docx

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

答案 8 :(得分:0)

我的解决方案不是很强大,但可以为我们中的一些人工作。 假设您在word文档中的每个1级标题之前需要分页符,我在yaml字段reference_docx:中使用的格式模板中定义了此分页符。 在本文档中,您将修改标题1格式(或等效格式)以在标题之前插入分页符。不要忘记使用在RStudio中使用knitr(pandoc)渲染的第一个docx来启动模板。

答案 9 :(得分:0)

这不是一个自动化的解决方案。但我一直在向我的降价文档中添加“##### page break”文本。然后在MS Word中使用find-replace将文本“分页符”替换为“^ m”(手动分页符)。

答案 10 :(得分:-4)

好的,我在降价文档中找到了这个。

  

水平规则/分页符

     

三个或更多星号***或短划线---