我正在使用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"
)
```
答案 0 :(得分:5)
注意: xtable
1.8-2已解决问题和此答案的主题问题。
虽然问题已通过解决方法自行解答,但我认为对其他用户而言,更多细节可能会有所帮助。
要了解此处发生的情况,我们需要仔细查看文档从RMD到PDF的转换步骤。步骤是:
RMD --> MD --> TEX --> PDF
让我们按相反的顺序查看文件:
PDF
:(由TEX
pdflatex
生成) TEX
:(由MD
pandoc
生成)
% …
\{\footnotesize
\begin{tabular}{rrrr}
\hline
& X1 & X2 & X3 \\
\hline
1 & 1 & 3 & 5 \\
2 & 2 & 4 & 6 \\
\hline
\end{tabular}
\}
% …
MD
(RMD
生成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}