我有一个像这样生成的 LaTeX 表格,
\begin{table}[ht]
\begin{center}
\begin{tabular}{rrrrrrr}
\hline
& 1 & 2 & 3 & 4 & 5 & 6 \\
\hline
1 & 181.21 & 169.01 & 130.03 & 135.93 & 142.31 & 108.11 \\
2 & 106.80 & 130.71 & 186.43 & 126.46 & 167.28 & 137.91 \\
3 & 162.69 & 198.98 & 188.33 & 184.30 & 147.02 & 197.38 \\
4 & 132.42 & 150.50 & 148.69 & 134.31 & 129.52 & 172.72 \\
\hline
\end{tabular}
\end{center}
\end{table}
但是当我在 MiKTeX 中编译它时出现以下错误
! Undefined control sequence.
l.1 \begin
{table}[ht]
?
Process interrupted by user
我想要一个根据我在 pdfTeX 下编译的表格。我第一次使用 LaTeX,有人能给我一些建议吗?
答案1
由于您是从 R 生成表格,因此我假设您使用 R 的xtable
包来生成表格。这个包有一些不足之处,但仍然相当有用。
这是一个示例 R 会话,展示了如何使用该包。
R-会话
data(tli)
## Demonstrate aov
## Taken from help(aov) in R 1.1.1
## From Venables and Ripley (1997) p.210.
N <- c(0,1,0,1,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,0,1,1,0,0)
P <- c(1,1,0,0,0,1,0,1,1,1,0,0,0,1,0,1,1,0,0,1,0,1,1,0)
K <- c(1,0,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,0,1,1,1,0,1,0)
yield <- c(49.5,62.8,46.8,57.0,59.8,58.5,55.5,56.0,62.8,55.8,69.5,55.0,
+ 62.0,48.8,45.5,44.2,52.0,51.5,49.8,48.8,57.2,59.0,53.2,56.0)
npk <- data.frame(block=gl(6,4), N=factor(N), P=factor(P), K=factor(K), yield=yield)
npk.aov <- aov(yield ~ block + N*P*K, npk)
op <- options(contrasts=c("contr.helmert", "contr.treatment"))
npk.aovE <- aov(yield ~ N*P*K + Error(block), npk)
options(op)
使用 xtable 生成表格
## Standard xtable use
print(xtable(summary(npk.aov)))
% latex table generated in R 2.12.2 by xtable 1.5-6 package
% Fri Aug 12 16:00:48 2011
\begin{table}[ht]
\begin{center}
\begin{tabular}{lrrrrr}
\hline
& Df & Sum Sq & Mean Sq & F value & Pr($>$F) \\
\hline
block & 5 & 343.29 & 68.66 & 4.45 & 0.0159 \\
N & 1 & 189.28 & 189.28 & 12.26 & 0.0044 \\
P & 1 & 8.40 & 8.40 & 0.54 & 0.4749 \\
K & 1 & 95.20 & 95.20 & 6.17 & 0.0288 \\
N:P & 1 & 21.28 & 21.28 & 1.38 & 0.2632 \\
N:K & 1 & 33.13 & 33.13 & 2.15 & 0.1686 \\
P:K & 1 & 0.48 & 0.48 & 0.03 & 0.8628 \\
Residuals & 12 & 185.29 & 15.44 & & \\
\hline
\end{tabular}
\end{center}
\end{table}
该命令的输出是分段LaTeX 代码,而不是完整的工作文档。它旨在被剪切并粘贴到现有的 LaTeX 文档中。这就是您收到错误的原因。至少,文档应如下所示:
\documentclass{article}
\begin{document}
...
\end{document}
然后您将表格代码插入到该...
位置。然后使用 进行编译pdflatex
。
这将生成下表:
标准 xtable 输出的问题
标准输出存在许多问题xtable
。
- 它会产生一个浮动的
{table}
环境 - 它封闭
tabular
在一个{center}
环境中 - 它使用标准
\hline
作为分隔符
虽然浮动表格环境在将表格包含到较大的 LaTeX 文档中时很有用,但如果您只生成单个表格,则没有必要。此外,浮动环境会将xtable
表格封闭在一个{center}
环境中,从而在表格和文档的其他元素之间留下过多的额外空间。最后,它会使用\hline
表格规则,导致表格看起来很拥挤。
尽管会损失一些自动生成功能,但大多数问题都是可以解决的。
前两个问题是相互关联的。该print.xtable
函数有两个参数,一个参数表示表格是否应该浮动,另一个参数定义包裹表格的环境。因此,我们可以修改初始命令以按以下方式打印表格,以抑制这两个问题:
## Revised R print command
print(xtable(summary(npk.aov)),floating=FALSE,latex.environments=NULL)
这将生成以下 LaTeX 代码:
% latex table generated in R 2.12.2 by xtable 1.5-6 package
% Fri Aug 12 16:29:29 2011
\begin{tabular}{lrrrrr}
\hline
& Df & Sum Sq & Mean Sq & F value & Pr($>$F) \\
\hline
block & 5 & 343.29 & 68.66 & 4.45 & 0.0159 \\
N & 1 & 189.28 & 189.28 & 12.26 & 0.0044 \\
P & 1 & 8.40 & 8.40 & 0.54 & 0.4749 \\
K & 1 & 95.20 & 95.20 & 6.17 & 0.0288 \\
N:P & 1 & 21.28 & 21.28 & 1.38 & 0.2632 \\
N:K & 1 & 33.13 & 33.13 & 2.15 & 0.1686 \\
P:K & 1 & 0.48 & 0.48 & 0.03 & 0.8628 \\
Residuals & 12 & 185.29 & 15.44 & & \\
\hline
\end{tabular}
如果需要让表浮动,那么您应该floating=FALSE
从命令中删除参数,但保留latex.environments=NULL
。
然而,这仍然使我们的桌子显得拥挤不堪。
使用booktabs
制作表格
高质量表格的黄金标准是booktabs
包装,并xtable
提供布尔值来精确地执行此操作。
最终的 R 打印命令
print(xtable(summary(npk.aov)),floating=FALSE,latex.environments=NULL,booktabs=TRUE)
这将生成以下更加漂亮的表格:(您需要将其添加\usepackage{booktabs}
到 LaTeX 文档的序言中。)
如果您希望表格浮动(因为您将它包含在较大的 LaTeX 文档中,那么您应该消除该参数,然后floating=FALSE
添加latex.environments=NULL)
。在您的 LaTeX 源中,您需要手动添加以使表格居中。\centering
\begin{table}
答案2
这是使用latex
函数的另一种方法Hmisc
。一方面,它只处理矩阵和数据框;另一方面,它本身知道booktabs
,可以直接或通过其子程序 进行调整format.df
,并且随标准安装一起提供。使用npk.aov
与 Alan Munn 相同的示例,我可以使用以下代码生成大致相同的表格
> latex(summary(npk.aov)[[1]], cdec=c(0,2,2,2,4), na.blank=TRUE,
booktabs=TRUE, table.env=FALSE, center="none", file="", title="")
输出
% latex.default(summary(npk.aov)[[1]], cdec = c(0, 2, 2, 2, 4), na.blank = TRUE, booktabs = TRUE, table.env = FALSE, center = "none", file = "", title = "")
%
\begin{tabular}{lrrrrr}
\toprule
\multicolumn{1}{l}{}&\multicolumn{1}{c}{Df}&\multicolumn{1}{c}{Sum Sq}&\multicolumn{1}{c}{Mean Sq}&\multicolumn{1}{c}{F value}&\multicolumn{1}{c}{Pr(\textgreater F)}\tabularnewline
\midrule
block &$ 5$&$343.29$&$ 68.66$&$ 4.45$&$0.0159$\tabularnewline
N &$ 1$&$189.28$&$189.28$&$12.26$&$0.0044$\tabularnewline
P &$ 1$&$ 8.40$&$ 8.40$&$ 0.54$&$0.4749$\tabularnewline
K &$ 1$&$ 95.20$&$ 95.20$&$ 6.17$&$0.0288$\tabularnewline
N:P &$ 1$&$ 21.28$&$ 21.28$&$ 1.38$&$0.2632$\tabularnewline
N:K &$ 1$&$ 33.13$&$ 33.13$&$ 2.15$&$0.1686$\tabularnewline
P:K &$ 1$&$ 0.48$&$ 0.48$&$ 0.03$&$0.8628$\tabularnewline
Residuals &$12$&$185.29$&$ 15.44$&$$&$$\tabularnewline
\bottomrule
\end{tabular}
其结果与艾伦得到的结果几乎相同:
一个可能重大的变化是它将所有的数字都包装在数学模式中,这可能是也可能不是你想要的。
答案3
关于如何在 LaTeX 中使用 R 输出的一个老问题,没有人提及旧的Sweave
和新的knitr
?
解决方案:您不需要直接处理 R 生成的 LaTeX 块,只需编写完整的 LaTeX 文档。如前所述,这意味着从...开始
\documentclass{someclass}
% maybe the next R and LaTeX code will need some preamble here
\begin{document}
Some text ...
并以……结束本文。
\end{document}
现在使用 (R noweb) 扩展保存它.Rnw
,并在其中写入 R 代码以生成用 或<<>>=
和<<name, options>>=
分隔的两行之间的表格@
。如果您使用 R 函数Sweave
或较新的Knitr
包将文件转换.Rnw
为真实.tex
文件(带有/不带有 R 输出和/或带有/不带有 R 代码,则可能的选项会有所不同,具体取决于选项。最后,文件由或您选择的 TeX 引擎.tex
处理 以生成文件)。pdflatex
.pdf
Compile PDF进行两种文件转换的简单方法是在编辑文件时使用 Rstudio 按钮编辑文件.Rnw
。
注意:避免混合使用 Knirt 和 Sweave 选项(有些很常见,但有些不兼容)。由于 Knitr 较新且功能更强大,目前我的建议是忘记 Sweave,只关注 Knitr。
注意:不仅xtable
包可以制作 LaTex 表格:至少您也可以使用 knitr
其本身,它具有kable
功能(kableExtra
看起来也像是一个不错的表格)以及包 stargazer
和Hmisc
。
example.Rnw
在这个小文件中使用knitr
(*)进行一点比较 。
(*) 您无法使用 编译此示例,Sweave
因为一些 R 块选项以及kable
函数是 所特有的knitr
。使用 Rstudio,您可以在 > > > Weave Rnw files using:中从使用 切换Sweave
到(将其更改为)。knitr
ToolsGlobal OptionsSweaveSweaveknitr
\documentclass{article}
\usepackage[margin=1em,paperheight=8cm,paperwidth=12cm]{geometry}
\usepackage{booktabs,lipsum}
\begin{document}
<<echo=F,message=F,warning=F,comment="">>=
library(xtable)
library(stargazer)
library(kableExtra)
library(Hmisc)
data("mtcars") # some example data
df <-mtcars[1:3, 1:6]
@
<<echo=F,results="asis">>=
print(xtable(df,caption="Example with \\texttt{xtable}"),
booktabs=T, caption.placement="top")
stargazer(df, summary=F,
title="Example with \\texttt{stargazer}")
kable(df, booktabs = T,
caption = "Example with \\texttt{kable} and \\texttt{kableExtra}")
latex(df, file = '', caption="Example with \\texttt{Hmisc}")
@
\end{document}
编辑(2024):
如今,另一种可能性是 Quarto。其理念相同(文本中的 R 块与 集成Knitr
),但文本源是简单的 markdown(但可能包含 LaTeX 代码),块语法不同:在这种情况下,转换过程是带有 R 块的 markdown(.qmd)→仅 markdown(.md)→仅 LaTeX(.tex)→PDF。示例:
---
format: pdf
---
This will be also a \LaTeX{} document.
```{r}
#| echo: false
#| results: asis
data("mtcars")
knitr::kable(mtcars[1:3, 1:6])
```
注意:Quarto 基于较旧的 Rmarkdown,因此非常相似,但也存在一些差异。还要注意避免混淆 Rmarkdown 和 Quarto 语法。您可以使用 Rstudio 或 VScode 以及适当的插件或任何文本编辑器和控制台命令来编辑和编译 Qurto 文档。