2016-06-07 100 views
22

当使用knitr和一起创建word文档时,您可以使用现有文档来设置输出风格。Knitr&Rmarkdown docx表

举例来说,在我的YAML头:

output: 
    word_document: 
    reference_docx: style.docx 
    fig_caption: TRUE 

这种风格我创建了一个默认的表格样式中 - 这里的目标是要在正确的风格kable表输出。

当我编织word文档并使用style.docx时,表格不是根据表格进行风格化。

到目前为止,使用样式检查器一直没有帮助,不确定默认表格样式是不正确的样式修改。

示例代码:

```{r kable} 
n <- 100 
x <- rnorm(n) 
y <- 2*x + rnorm(n) 
out <- lm(y ~ x) 
library(knitr) 
kable(summary(out)$coef, digits=2, caption = "Test Captions") 
``` 

我没有程式化的文件我可以上传测试不幸。

TL; DR:想stylise从rmarkdown表输出,并自动knitr(通过kable)

更新:到目前为止,我还发现,在DOCX改变“紧凑”的风格会改变文本内容的表格自动 - 但这不能解决整个表格样式,如单元格颜色和对齐方式。

更新2:经过更多研究和创建样式后,我发现knitr似乎没有访问段落样式的问题。但是,表格样式不属于该样式类别,似乎不适用于我的个人测试。

更新3:包装了ReporteRs包 - 虽然它能够生成所需的表格,但所需的语法很费力。更多的是风格被自动应用。

更新4:您不能更改TableNormal样式,也不能设置Table Normal样式工作。 XML方法不是我们正在寻找的。我有一个VBA宏,可以做到这一点,只是想尽可能地移除这个过程。

+0

这与'kable'无关,因为'pandoc'完成从降价到docx的转换。您可以尝试在参考docx文件中创建一个'TableNormal'表格样式。 – daroczig

+1

对@达罗齐格来说,这本质上是一个'pandoc'问题,可能是一个重复的http://stackoverflow.com/questions/17858598/add-styling-rules-in-pandoc-tables-for-odt-docx-output -table-边界。这篇文章只涉及到边框,但我怀疑底层的xml可能会被黑客攻击以获得更复杂的格式化...... – joemienko

+0

我在reference_docx的风格方面有类似的问题。也许这是同一个问题? https://github.com/rstudio/rmarkdown/issues/668 – sebastianmm

回答

10

这本质上是the answer that recommends TableNormalthis post on rmarkdown.rstudio.com和我自己的实验相结合,以显示如何使用TableNormal风格来定制像那些kable生成的表格:

RMD

--- 
output: 
    word_document 
--- 

```{r} 
knitr::kable(cars) 
``` 
  • 点击RStudio中的“编织字”。 →文档将在Word中打开,但没有任何自定义样式。
  • 在该文档中(而不是在新文档中),添加所需的样式。 This article解释了基本知识。关键是不适用直接款式而是修改款式。见this article on support.office.com on Style basics in Word
  • 具体来说,要设计一个表格,您需要添加一个表格样式。我的Word版本是非英文的,但根据上面链接的文章,表格样式可通过“设计”选项卡的“表格工具”上下文选项卡上获得。
  • 选择TableNormal作为样式名称并定义所需的样式。在我的实验中,大多数风格都起作用,但有些却没有。 (向第一列添加颜色并使第一行变为粗体是没有问题的;突出显示第二行被忽略。)此答案中的最后一个屏幕截图说明了此步骤。
  • 保存文档,例如如styles.docx
  • 修改标题在RMD文件中使用的参考DOCX(见here;不要搞砸了压痕 - 我花了10分钟发现这个错误):

    --- 
    output: 
        word_document: 
        reference_docx: styles.docx 
    --- 
    
  • 针织再次DOCX - 现在应该应用这种风格。

按照我上述的步骤产生这样的输出:

Output

这里用来定义TableNormal表格样式对话框的屏幕截图。遗憾的是,在德国,但也许有人可以提供它的英文版:

Table Style


由于这似乎并不适用于大多数用户(任何人,但我...),我建议我们测试这系统地。本质上,有4个步骤可能出错:

  • 错误的RMD(不太可能)。
  • 最初生成的DOCX的差异。
  • TableNormal样式在DOCX中的差异。
  • 参考DOCX如何用于格式化最终DOCX的差异。

因此,我建议使用相同的最小RMD以上(full code on pastebin)公布,找出结果一开始就有所不同:

的三个文件有以下几种系统上生成:Windows 7中/ R 3.3.0/RStudio 0.99.896/pandoc 1.15.2/Office 2010的

我得到的系统上相同的结果Windows 7/R 3.2.4/RStudio 0.99.484/pandoc 1.13.1/Office 2010.

我想最可能的罪魁祸首是pandoc和Office版本。不幸的是,我目前无法测试其他配置。现在看到以下内容会很有趣:对于不工作的用户,会发生什么...

  • ...如果您从我的initial.docx开始?
  • 如果这不起作用,如果您使用我的reference.docx作为参考文件,该怎么办?
  • 如果什么都不起作用,在生成的XML文件(DOCX容器内)中是否有引人注目的差异?请分享您的文件和确切的版本信息。

随着大量用户运行这些测试,应该有可能找出导致问题的原因。

+1

这似乎不适用于Word上的英文版本,如果您注意到更新4,我已经尝试过这一点。自从我提供了答案之后,我用全新的文档再次尝试了它,但它不起作用。 https://drive.google.com/file/d/0B9p9Rsa-Y-hRNVJDZDlCWDNDbWs/view?usp=sharing – zacdav

+0

@zacdav我注意到更新4,但认为你做错了什么。有趣的是,如果我使用DOCX文件作为参考DOCX上传到Google Drive,则会得到[此输出](https://drive.google.com/open?id=0Bw4KQj8EqSdEWGFsTm5VMnhGbWM)(第一栏为红色背景)。所以您创建的参考文档适用于我的系统 - 非常奇怪。我会尽快用一个不同版本的Word来检查它;目前我正在使用Office 2010. –

+0

是的,这很有趣。到目前为止,我已经在4个系统上尝试过这种方法,但都没有成功但是,所有使用Office 365。 – zacdav

0

TableNormal对我也不适用。

在我的荷兰语版本的Word 2016(Office 365)上,我发现我可以使用样式Compact来标记表格。

输入(refdoc.docx包含Compact风格):

--- 
title: "Titel" 
subtitle: "Ondertitel" 
author: "`r Sys.getenv('USERNAME')`" 
output: 
    word_document: 
    toc: true 
    toc_depth: 2 
    fig_width: 6.5 
    fig_height: 3.5 
    fig_caption: true 
    reference_docx: "refdoc.docx" 
--- 

而且RMarkdown:

# Methoden {#methoden} 
```{r} 
kable(cars) 
``` 

输出:

img

0

我能得到我的话输出使用默认的表格样式我在一个参考.docx中定义。

而不是'TableNormal',它默认的表格样式是'Table'。

我发现了这个,通过编织与kable的rmarkdown。

--- 
date: "December 1, 2017" 
output: 
    word_document: 
    reference_docx: Template.docx 
--- 
`r knitr::kable(source)` 

然后我查看了生成的文档的XML,看看它默认的样式。

require(XML) 

docx.file <- "generated_doc.docx" 

## unzip the docx converted by Pandoc 
system(paste("unzip", docx.file, "-d temp_dir")) 
document.xml <- "temp_dir/word/document.xml" 

doc <- xmlParse(document.xml) 
tblStyle <- getNodeSet(xmlRoot(doc), "//w:tblStyle") 

tblStyle 

我定义了“表格”样式,在参考文档中放置了一些颜色和边框。这适用于整个文档中的一种标准表格样式,我还没有找到一种方法来使用不同的样式。

即使在打开参考文档并对其进行编辑之后,这仍然保持正确。

3

这实际上是a known issue。幸运的是,它在v2.0或更多版本的pandoc中得到解决。

而且我测试了更新的版本,发现有一个新增的Hiden风格叫做“Table”。按照MS Berends的建议,改变reference.docx的“桌子”风格现在可以。

另外,看看这个条目pandoc的v2。0版本说明:

使用Table,而不是Table Normal的表格样式(#3275)。 Table Normal是默认的表格样式,不能修改。

相关问题