在指定尺寸后使用xtable和knitr时的额外花括号

时间:2015-11-11 17:40:35

标签: r latex knitr r-markdown xtable

我正在使用knitr创建一个R Markdown文档,并且使用xtable创建表时遇到了麻烦。我的表非常大,我正在尝试使用size语句中的print命令来减小大小。我遇到的问题是该命令似乎添加了两个额外的花括号,它们显示在PDF中,一个在表之前,一个在之后。

有没有人知道解决这个问题的方法?

MWE:

---
output:
  pdf_document:
    keep_tex: yes
tables: true
---

```{r, results='asis', echo=FALSE}

library(xtable)

my.df <- data.frame(matrix(c(1:18),nrow=2))

glossaryprint <- xtable(my.df, caption="Summary of Terms")

print(glossaryprint,
      comment=FALSE,
      floating=FALSE,
      size="footnotesize"
)

```

2 个答案:

答案 0 :(得分:5)

注意: xtable 1.8-2已解决问题和此答案的主题问题。

虽然问题已通过解决方法自行解答,但我认为对其他用户而言,更多细节可能会有所帮助。

会发生什么?

要了解此处发生的情况,我们需要仔细查看文档从RMD到PDF的转换步骤。步骤是:

RMD --> MD --> TEX --> PDF

让我们按相反的顺序查看文件:

  • PDF :(由TEX pdflatex生成)

PDF output

  • TEX :(由MD pandoc生成)

    % …
    \{\footnotesize
    
    \begin{tabular}{rrrr}
      \hline
     & X1 & X2 & X3 \\ 
      \hline
    1 &   1 &   3 &   5 \\ 
      2 &   2 &   4 &   6 \\ 
       \hline
    \end{tabular}
    
    \}
     % …
    
  • MDRMD生成knitr

    ---
    output:
      pdf_document:
        keep_tex: yes
    ---
    
    {\footnotesize
    \begin{tabular}{rrrr}
      \hline
     & X1 & X2 & X3 \\ 
      \hline
    1 &   1 &   3 &   5 \\ 
      2 &   2 &   4 &   6 \\ 
       \hline
    \end{tabular}
    }
    
  • RMD :(源文件)

    ---
    output:
      pdf_document:
        keep_tex: yes
    ---
    
    ```{r, results='asis', echo=FALSE}
    
    library(xtable)
    
    mytable <- xtable(data.frame(matrix(c(1:6), nrow = 2)))
    
    print(mytable,
          comment = FALSE,
          floating = FALSE,
          size = "footnotesize"
    )
    ```
    

回想一下:问题是,PDF中有明显的花括号。它们来自哪里?

  • 它们是TEX文件(\{\})中转义的花括号的结果。
  • 这些花括号也存在于MD文件中,但它们不会被转义。

所以我们现在知道两件事:我们看到花括号因为它们被转义并且被pandoc转义。

但为什么这些花括号存在呢?指定print.xtable时,size会输出它们。目标是创建一个组并仅在该组中应用size。 (使用floating = TRUE时,不需要花括号分组,因为figure环境中设置了size。无论如何都会打印花括号。)

为什么pandoc会逃脱那对花括号,但是所有其他花括号(例如在\begin{tabular}中)都没有转义?这是因为pandoc应该转义特殊字符,这些特征字面意思是但是留下raw LaTeX unescaped。但是,pandoc 不知道外部花括号是LaTeX命令而不是文本。

(使用floating = TRUE问题不会发生,因为花括号位于被识别为LaTeX的figure环境中。)

解决方案

在理解了问题之后,我们能做些什么呢?一个解决方案已经posted by the OP:弃用size中的print.xtable,并手动插入footnotesize命令:

    ---
    output:
      pdf_document:
        keep_tex: yes
    ---

    ```{r, results='asis', echo=FALSE}

    library(xtable)

    mytable <- xtable(data.frame(matrix(c(1:6), nrow = 2)))

    cat("\\begin{footnotesize}")

    print(mytable,
          comment = FALSE,
          floating = FALSE
    )

    cat("\\end{footnotesize}")
    ```

但是,从长远来看,如果xtable(当前版本:1.8-0)生成的LaTeX代码在pandoc转换后仍然存在,那将会很不错。这很简单:print.xtable检查是否设置了size,如果是,请在大小规范之前插入{,在表格末尾插入}

if (is.null(size) || !is.character(size)) {
  BSIZE <- ""
  ESIZE <- ""
}
else {
  if (length(grep("^\\\\", size)) == 0) {
    size <- paste("\\", size, sep = "")
  }
  BSIZE <- paste("{", size, "\n", sep = "")
  ESIZE <- "}\n"
}

此小修改将{替换为\begingroup,将}替换为\endgroup

if (is.null(size) || !is.character(size)) {
  BSIZE <- ""
  ESIZE <- ""
}
else {
  if (length(grep("^\\\\", size)) == 0) {
    size <- paste("\\", size, sep = "")
  }
  BSIZE <- paste("\\begingroup", size, "\n", sep = "")
  ESIZE <- "\\endgroup\n"
}

对于LaTeX,这没什么区别,但是当pandoc识别出\begingroup(与{相反)时,它应该解决问题。我在xtable中报告了此as a bug,希望此问题将在以后的版本中修复。

答案 1 :(得分:1)

我能够通过在print语句中不包含size参数来解决这个问题,而是直接在chunk之前和之后。

\begin{footnotesize}

#chunk

\end{footnotesize}