【问题标题】:Automatically adjust LaTeX table width to fit pdf using knitr and Rstudio使用 knitr 和 Rstudio 自动调整 LaTeX 表格宽度以适合 pdf
【发布时间】:2013-05-06 14:38:02
【问题描述】:

使用 Rstudio 和 knitr 制作 pdf 格式的乳胶表格,如何使宽表格适合页面?我基本上是在寻找缩小表格的方法。

对于数字,在 Knitr 中使用 out.width= 非常容易,但对于表格,我似乎找不到方法。

有什么建议吗?

\documentclass{article}

\begin{document}

以下表格太宽,无法容纳 pdf。我希望有一种简单的方法可以缩小它们以适应。在此示例中,我使用了从 xtable()、stargazer() 和 latex() 函数生成的表。

<<message=FALSE>>=
library(xtable)
library(stargazer)
library(Hmisc)
library(tables)
wide.df <- cbind(iris[1:10,],iris[1:10,],iris[1:10,])

@



<<results='asis'>>=
xtable(wide.df)
@


<<results='asis'>>=
stargazer(wide.df,summary=FALSE)
@


<<results='asis'>>=
latex( tabular( Species ~  (Sepal.Length +Sepal.Length +  Sepal.Width +   Petal.Length  +  Petal.Width  )*(mean + sd + mean + mean )          , data=iris)            )

@




\end{document}

按照 Stat-R 的建议,我尝试使用 resizebox 但无法正常工作:

\documentclass{article}
\usepackage{graphicx}
\begin{document}

我尝试使用 reshapebox,但我真的不知道如何让它在 Rstudio/knitr 中工作:

<<message=FALSE>>=
library(xtable)
wide.df <- cbind(iris[1:10,],iris[1:10,],iris[1:10,])
@

\resizebox{0.75\textwidth}{!}{%
<<results='asis'>>=
xtable(wide.df)
@
%}

\end{document}

我得到这个错误:

! File ended while scanning use of \Gscale@box@dd.


sessioninfo()

R version 3.0.0 (2013-04-03)
Platform: i386-w64-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=Danish_Denmark.1252  LC_CTYPE=Danish_Denmark.1252    LC_MONETARY=Danish_Denmark.1252 LC_NUMERIC=C                   
[5] LC_TIME=Danish_Denmark.1252    

attached base packages:
[1] splines   grid      stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] tables_0.7      Hmisc_3.10-1    survival_2.37-4 stargazer_3.0.1 pgirmess_1.5.7  splancs_2.01-32 spdep_0.5-56    coda_0.16-1     deldir_0.0-22  
[10] maptools_0.8-23 foreign_0.8-53  MASS_7.3-26     Matrix_1.0-12   lattice_0.20-15 rgdal_0.8-9     sp_1.0-9        nlme_3.1-109    boot_1.3-9     
[19] xtable_1.7-1    scales_0.2.3    plyr_1.8        reshape2_1.2.2  ggplot2_0.9.3.1

loaded via a namespace (and not attached):
 [1] cluster_1.14.4     colorspace_1.2-2   dichromat_2.0-0    digest_0.6.3       evaluate_0.4.3     formatR_0.7        gtable_0.1.2       knitr_1.2         
 [9] labeling_0.1       LearnBayes_2.12    munsell_0.4        proto_0.3-10       RColorBrewer_1.0-5 stringr_0.6.2      tools_3.0.0 

【问题讨论】:

  • 对我来说,这似乎更像是一个乳胶问题,而不是 rstudio 和 knitr
  • 它可能也适合 tex.stack(...) 并且您提供的精细链接指向我 resizebox() 但是我无法让它在 Rstudio 的 knitr 文档中工作://
  • 这并不能解决您的问题,但您的错误消息的第一个原因是您在表格后注释掉了 (%) 大括号 - % 应该在之后,而不是之前。但是,表格仍然无法编译......我在解决这个问题时遇到了同样的困难

标签: r latex rstudio knitr


【解决方案1】:

您可以像这样将scalebox 参数传递给print.xtable

<<results='asis'>>=
print(xtable(wide.df), scalebox='0.75')
@

这不会自动调整表格大小以适应页面(不幸的是xtable 不支持resizebox 参数),但对于许多应用程序来说,以上可能已经足够了。

您的代码的问题是 xtable 返回包装在 table 环境中的表格,而不仅仅是表格。但是,您必须将 resizebox 包含在 tabular 中。我能看到让它按你想要的方式工作的唯一方法是让 xtable 只返回 tabular,如下所示:

\begin{table}
\resizebox{\textwidth}{!} {
<<results='asis'>>=
print(xtable(wide.df), floating=FALSE)
@
}
\end{table}

然后手动围绕它编写 LaTeX 代码。

【讨论】:

  • 感谢您的出色解决方案。只是想知道是否有办法仅在表格宽度大于\textwidth 时使用\textwidth?在自动报告中,有时表格很大,有时很小。使用全文宽度生成笨拙的巨大字体表。
【解决方案2】:

更新以反映过去几年代码的变化,以及人们通常使用 .RMarkdown 而不是 Rnw 文件格式工作的偏好。

R 中的kableExtra 包是调整表格大小的最简单方法。您可以使用函数kable_styling(latex_options = "scale_down") 缩放表格的宽度。这将强制表格与页面宽度一致。

   kable(iris[1:5,],
          format = "latex", booktabs = TRUE) %>%
          kable_styling(latex_options = "scale_down")

有关 kableExtra 包的更多示例,请在此处查看该包:https://haozhu233.github.io/kableExtra/awesome_table_in_pdf.pdf

这是一个 MWE 示例:

---
title: "MWE"
author: "Mikey Harper"
date: "7 November 2017"
output: pdf_document
---

```{r setup, include=FALSE}
library(kableExtra)
library(magrittr)
knitr::opts_chunk$set(echo = TRUE)
```

```{r}
# Build the dataframe
wide.df <- cbind(iris[1:10,],iris[1:10,],iris[1:10,])
```

```{r}
# Basic table
knitr::kable(wide.df)
```

```{r}
# Scaled Table
knitr::kable(wide.df, format = "latex", booktabs = TRUE) %>%
          kable_styling(latex_options = "scale_down")
```

【讨论】:

  • 如果其他人在使用此方法时无法定位表格,还有来自kableExtra"hold_postion""HOLD_position" 的额外latex_options 可用。
  • 我花了一个非常令人沮丧的小时试图让它工作。我需要 header-includes: - \usepackage{booktabs} 在我的脑海中(用于投影仪输出),如答案 here 中所述
  • 有没有办法以当前字体扩展表格,并且在表格填充宽度间隙时不调整字体?
【解决方案3】:

以下是您可以采取的一些典型步骤来缩小表格大小。

\setlength{\tabcolsep}{1pt}

\resizebox{\linewidth}{!}{   %% <-- The most effective way to fit a table / figure
\begin{tabular}
...
...
\end{tabular}
} %resizebox

对于文本,使用\sf 模式使文本更加可见。

【讨论】:

    【解决方案4】:

    像在老式的 80 字符宽 VT100 终端上那样自动将宽表拆分为多个部分怎么样?这对于 LaTex/docx/odt 表通常是一个很好的做法,默认设置在 pander:

    > set.caption('Hello Fisher!')
    > pander(wide.df)
    
    ---------------------------------------------------------
     Sepal.Length   Sepal.Width   Petal.Length   Petal.Width 
    -------------- ------------- -------------- -------------
         5.1            3.5           1.4            0.2     
    
         4.9             3            1.4            0.2     
    
         4.7            3.2           1.3            0.2     
    
         4.6            3.1           1.5            0.2     
    
          5             3.6           1.4            0.2     
    
         5.4            3.9           1.7            0.4     
    
         4.6            3.4           1.4            0.3     
    
          5             3.4           1.5            0.2     
    
         4.4            2.9           1.4            0.2     
    
         4.9            3.1           1.5            0.1     
    ---------------------------------------------------------
    
    Table: Hello Fisher! (continued below)
    
    
    -----------------------------------------------------
     Species   Sepal.Length   Sepal.Width   Petal.Length 
    --------- -------------- ------------- --------------
     setosa        5.1            3.5           1.4      
    
     setosa        4.9             3            1.4      
    
     setosa        4.7            3.2           1.3      
    
     setosa        4.6            3.1           1.5      
    
     setosa         5             3.6           1.4      
    
     setosa        5.4            3.9           1.7      
    
     setosa        4.6            3.4           1.4      
    
     setosa         5             3.4           1.5      
    
     setosa        4.4            2.9           1.4      
    
     setosa        4.9            3.1           1.5      
    -----------------------------------------------------
    
    Table: Table continues below
    
    
    ----------------------------------------------------
     Petal.Width   Species   Sepal.Length   Sepal.Width 
    ------------- --------- -------------- -------------
         0.2       setosa        5.1            3.5     
    
         0.2       setosa        4.9             3      
    
         0.2       setosa        4.7            3.2     
    
         0.2       setosa        4.6            3.1     
    
         0.2       setosa         5             3.6     
    
         0.4       setosa        5.4            3.9     
    
         0.3       setosa        4.6            3.4     
    
         0.2       setosa         5             3.4     
    
         0.2       setosa        4.4            2.9     
    
         0.1       setosa        4.9            3.1     
    ----------------------------------------------------
    
    Table: Table continues below
    
    
    --------------------------------------
     Petal.Length   Petal.Width   Species 
    -------------- ------------- ---------
         1.4            0.2       setosa  
    
         1.4            0.2       setosa  
    
         1.3            0.2       setosa  
    
         1.5            0.2       setosa  
    
         1.4            0.2       setosa  
    
         1.7            0.4       setosa  
    
         1.4            0.3       setosa  
    
         1.5            0.2       setosa  
    
         1.4            0.2       setosa  
    
         1.5            0.1       setosa  
    --------------------------------------
    

    请参阅?panderOptions 中的?pandoc.tabletable.split.table 了解更多详情。

    【讨论】:

    • 有没有办法在这样做时重复列?假设我有一个包含 100 列的表。在每个拆分中,我想重复第 1 列和第 2 列。
    【解决方案5】:

    LaTeX 包tabulary 更适合将表格适合页面宽度。例如,可以告诉它断线。但是不知道能不能和xtable一起使用。

    【讨论】:

      【解决方案6】:

      另一个选项可能是这样的:

      my_wrap <- function(x, width) {
        x_split <- strwrap(x, width = width, simplify = FALSE)
        x_split <- lapply(x_split, paste, collapse = " \\\\ ")
        vapply(x_split, function(s) sprintf("\\begin{tabular}[x]{@{}c@{}}%s\\end{tabular}", s),
               character(1))
      }
      

      应用于所有宽的列

      【讨论】:

        【解决方案7】:

        以下对我来说很好用:

            print(xtable(wide.df), scalebox='0.75', floating=FALSE)
        

        这对于 R Markdown 中的表格特别有用。

        【讨论】:

        • 它对我不起作用。我使用函数 kable 和 r{results = 'asis"}。
        【解决方案8】:

        基于huxtable 的解决方案(我的包):

        library(huxtable)
        h <- as_hux(iris)
        width(h) <- 0.5
        

        这并不能保证表格不会超过指定的宽度,如果 所以它会溢出。可能的解决方案包括更改字体大小:

        font_size(h) <- 8
        

        或者拆分表:

        h1 <- h[, 1:5]
        h2 <- h[, -(1:5)]
        

        【讨论】:

          【解决方案9】:

          我在 Stargazer 中有一个丑陋但有效的方法来执行此操作。它看起来比上述方法要长,但如果您要报告回归输出,这对您来说可能是一个更简单的工作流程,就像对我一样。

          函数“WrapPageWidthLatex”将调整大小框代码附加/前置到 stargazer 输出。它假定您设置了 float = FALSE 并且我设置了许多其他选项来节省表中的空间。剩下的只是清理结果输出。 “include=FALSE”有助于抑制文档中烦人的观星者引用信息。 “float = FALSE”有助于抑制乳胶代码,否则会使它变成浮点数。这使得附加所需代码变得更加容易。 "column.sep.width = "0pt"" 和 "font.size="tiny"" 有助于缩小列,从而减少重新缩放的需要。


          title: "StackOverflow Example"
          author: "Bkay"
          date: "6/15/2020"
          output:
            beamer_presentation:
              keep_tex: true 
          header-includes:
             - \usepackage{dcolumn}  
          ---
          
          ```{r setup, include=FALSE}
          knitr::opts_chunk$set(echo = FALSE)
          library(stargazer)
          ```
          
          
          ## Slide with R Output
          ```{r rcodehere, results='asis', warning = FALSE, echo=FALSE}
          WrapPageWidthLatex <- function(InputCode){
              OutputCode = append("\\resizebox{\\textwidth}{!}{", InputCode)
              OutputCode = rlang::prepend("}", OutputCode)    
              return(OutputCode)
          }
          x = -10:10
          xsqr = x^2
          y = 2 + x*3 + 0.2 * xsqr + rnorm(length(x))
          
          model1 = lm(y ~ x)
          model2 = lm(y ~ x + xsqr)
          
          cat(
              WrapPageWidthLatex(
                  capture.output(
                      stargazer(
                          model1, model2,
                          align=TRUE, 
                          omit.stat=c("adj.rsq", "ser", "f"), 
                          font.size="tiny", 
                          header=FALSE, 
                          column.sep.width = "0pt", 
                          float = FALSE, 
                          type="latex"
                          )
                      )
                  )
              )    
          
          ```
          

          输出:

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-12-14
            • 2014-06-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-04
            • 2017-02-10
            • 1970-01-01
            相关资源
            最近更新 更多