【问题标题】:Knitr & Rmarkdown docx tablesKnitr & Rmarkdown docx 表
【发布时间】:2016-10-06 21:55:35
【问题描述】:

当同时使用 knitrrmarkdown 创建 word 文档时,您可以使用现有文档来设置输出样式。

例如在我的 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:想要自动对 rmarkdown 和 knitr 的表格输出进行样式化(通过 kable)

更新:到目前为止,我发现更改 docx 中的“紧凑”样式会自动更改表格的文本内容 - 但这并不能解决整体表格样式,例如单元格颜色和对齐。

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

更新 3: 涉足 ReporteRs 包 - 虽然它能够根据需要生成表格,但这样做所需的语法很费力。而是自动应用样式。

更新 4: 您无法更改 TableNormal 样式,也无法设置 Table Normal 样式。 XML 方法不是我们想要的。我有一个 VBA 宏可以解决问题,如果可能的话,我只想删除该进程。

【问题讨论】:

  • 这与kable 无关,因为pandoc 进行了从markdown 到docx 的转换。您可以尝试在参考 docx 文件中创建TableNormal 表格样式。
  • 就@daroczig 而言,这本质上是pandoc 问题,并且可能与stackoverflow.com/questions/17858598/… 重复。那篇文章只涉及边框,但我怀疑底层 xml 可能会被黑客入侵以获得更精细的格式......
  • 我对 reference_docx 的样式有类似的问题。也许这是同一个问题? github.com/rstudio/rmarkdown/issues/668
  • @zacdav 这是事后的结果,但如果你可以的话,我强烈建议您将knitr 与 pdflatex 一起使用。 Latex 需要更多时间才能弄清楚,但是已经提出了大量问题的信息。通常你需要做的任何事情都已经完成,然后你复制/粘贴。
  • @Prevost 这是专门用 word 完成的,因为客户需要这种格式。

标签: r knitr r-markdown docx pandoc


【解决方案1】:

这本质上是the answer that recommends TableNormalthis post on rmarkdown.rstudio.com 和我自己的实验的组合,以展示如何使用TableNormal 样式来自定义像kable 生成的表格:

RMD

---
output:
  word_document
---

```{r}
knitr::kable(cars)
```
  • 在 RStudio 中单击“Knit Word”。 → 文档在 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 - 现在应该应用样式。

按照我上面描述的步骤产生以下输出:

这里是用于定义TableNormal 的表格样式对话框的屏幕截图。不幸的是它是德语的,但也许有人可以提供它的英文版本:


由于这似乎不适用于大多数用户(除我之外的任何人......),我建议我们系统地测试它。基本上,有 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 容器内)是否存在显着差异?请分享您的文件和确切的版本信息。

如果有许多用户运行这些测试,应该可以找出导致问题的原因。

【讨论】:

  • 这似乎不适用于 Word 上的英文版本,如果您注意到更新 4,我已经尝试过这个。此后,我按照您提供的答案使用全新的文档再次尝试了它,但它不起作用。 drive.google.com/file/d/0B9p9Rsa-Y-hRNVJDZDlCWDNDbWs/…
  • @zacdav 我注意到更新 4,但假设您做错了什么。有趣的是,如果我使用您上传到 Google Drive 的 DOCX 文件作为参考 DOCX,我会得到 this output(第一列中的红色背景)。所以你创建的参考文档在我的系统上工作——很奇怪。我会尽快用不同版本的 Word 进行检查;目前我正在使用 Office 2010。
  • 是的,这很有趣。到目前为止,我已经在 4 个系统上尝试过,但都没有成功。然而,所有人都使用 Office 365。
  • 这在我的计算机(Office 2016)上也不起作用。如果我没有收到任何其他答案,您将因努力和详细程度而获得奖金。
  • 我很想知道是否有人成功地尝试过这个以及他们使用的语言/系统。我还没有看到这项工作。
【解决方案2】:

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

并且我已经测试了较新的版本,发现有一个新添加的隐藏样式,叫做“Table”。按照@CL. 的建议更改reference.docx 中的“表格”样式现在可以了。

另外,看看pandoc的v2.0发行说明的这个条目:

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

【讨论】:

    【解决方案3】:

    截至 2021 年,我可能无法获得任何其他建议的答案。

    但是,我确实发现了 {officedown} 包,除其他外,它支持 .docx 文档中的表格样式。你可以用remotes::install_github("davidgohel/officedown")安装{officedown}

    要使用{officedown}.Rmd 渲染为.docx,您必须替换

    output:
      word_document
    

    在您的文档标题中使用

    output:
      officedown::rdocx_document
    

    除此之外,{officedown} 包必须加载到您的.Rmd 中。

    word_document 输出格式一样,{officedown} 允许我们使用模板文档中的样式和设置,同样使用reference_docx 参数。

    使用参考文档styles.docx.Rmd 的最小示例可能如下所示:

    ---
    date: "2038-01-19"
    author: "The Reasonabilists"
    title: "The end of time as we know it"
    output: 
      officedown::rdocx_document:
        reference_docx: styles.docx
    ---
    
    ```{r setup, include = FALSE}
    # Don't forget about me: I'm important!
    library(officedown)
    ```
    

    {officedown} 允许我们更进一步,指定表格样式的名称以用于文档的前面事项。这种表格样式可以是我在styles.docx 中创建的自定义样式,也可以是我喜欢的 Word 内置样式之一。

    假设我创建了一个样式My Table

    我可以告诉{officedown} 在我的前面事项中使用这种表格样式:

    output: 
      officedown::rdocx_document:
        reference_docx: styles.docx
        tables:
          style: My Table
    

    综上所述,编织最小的.Rmd

    ---
    date: "2038-01-19"
    author: "The Reasonabilists"
    title: "The end of time as we know it"
    output: 
      officedown::rdocx_document:
        reference_docx: styles.docx
        tables:
          style: My Table
    ---
    
    ```{r setup, include = FALSE}
    # Don't forget about me: I'm important!
    library(officedown)
    ```
    
    ```{r}
    head(mtcars)
    ```
    

    导致.docx 文档看起来像:

    【讨论】:

      【解决方案4】:

      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)
      ```
      

      输出:

      【讨论】:

      • 我可以确认这也适用于 Word 2016 的英文版。此解决方案的一个小问题是项目符号也使用“紧凑”样式格式化。我还没有找到独立格式化表格和项目符号的方法。
      • 嗯,也许我们应该编织一个新的默认文档并将这些样式与我们自己的参考样式文件合并。我再看看。
      【解决方案5】:

      您需要有一个reference_docx: style.docx,其中包含“表格”样式。 (见@Liang Zhang的解释和上面的链接)。

      1. 使用 pandoc (source) 创建基础参考文档。在命令行(或 Windows 上的 cmd.exe)中运行: pandoc -o custom-reference.docx --print-default-data-file reference.docx
      2. 在这个新创建的reference.docx 文件中,找到创建的表(带标题的基本 1 行表)。
      3. 选中表格后,点击“表格设计”,找到“修改表格样式”:

      1. 根据需要修改表格的样式并在您的 RMD 文档中使用此参考文档(请参阅@CL 的第一个答案。)。

      使用此参考文档,您还可以更改表格和图形标题样式。

      【讨论】:

        【解决方案6】:

        我能够让我的单词输出使用我在参考 .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
        

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-03
          • 1970-01-01
          • 1970-01-01
          • 2016-05-29
          • 1970-01-01
          • 2021-02-06
          • 1970-01-01
          • 2023-03-25
          相关资源
          最近更新 更多