我想知道如何在LaTeX
表格中每 5 行或 10 行后添加一个空行。这是我的 MWE.Rnw
格式。任何帮助都将不胜感激。谢谢!
\documentclass{article}
\usepackage{longtable}
\begin{document}
\listoftables
<< label=LongTable, results='asis', echo = FALSE >>=
library(xtable)
set.seed(12345)
MatrixData <- matrix(rnorm(1000), ncol = 10)
print(
xtable(
x = MatrixData
, caption = "Example of longtable spanning several pages"
#, label = "tab:MatrixData"
, align = c("l|", rep("r", ncol(MatrixData)))
, digits = c(rep(3, ncol(MatrixData)+1))
)
, table.placement = "H"
, caption.placement = "top"
, include.rownames = TRUE
, include.colnames = TRUE
, size = "small"
, tabular.environment = 'longtable'
, floating = FALSE
, add.to.row = list(pos = list(0),command =
paste("\\hline \\endfirsthead" , # First caption
"\\caption[]{Example of longtable spanning several pages} \\label{tab:MatrixData} \\\\ \\hline", # Additional captions
paste("&", 1:ncol(MatrixData),collapse=" "), # Column names
"\\\\ \\hline ",
"\\endhead",
"\\hline \\multicolumn{11}{r}{\\textit{Continued}} \\
\\endfoot
\\endlastfoot",collapse=" ")))
@
\end{document}
答案1
以下解决方案设置了一个源自仅使用 LaTeX 提供所需功能blocktable
的环境。longtable
实施说明
首先,需要几个计数器:
\newcounter{@tabrow}
\newcounter{@emptyrow}
\newcounter{@modulus}
\newcounter{@default@blocksize}
@tabrow
每行都会递增以确定当前行号,而@emptyrow
将保存 的倍数@modulus
(因此设置为一个块/块应包含的行数;准确地说是@modulus+1
)。最后提到的是通过 内部设置的\@setblocksize
:
\newcommand{\@setblocksize}[1]{%
\setcounter{@modulus}{#1}
\setcounter{@emptyrow}{\the@modulus}
\stepcounter{@modulus}
}
@default@blocksize
@modulus
保存在没有指定可选参数时将给出的全局默认值(见下文blocktable
:)。
核心宏是,\empty@or@void@line
它扩展为一个空行,即&...&\\
,如果\the@tabrow
是的倍数\the@modulus
,则扩展为零,如果不是,则扩展为零:
\def\empty@or@void@line{%
\ifnum\the@tabrow=\the@emptyrow
\addtocounter{@emptyrow}{\the@modulus}%
\@colseps\ltx@LT@tabularcr
\fi}
它会添加到每次出现的中,\\
说:
\def\LT@tabularcr{\ltx@LT@tabularcr\empty@or@void@line}
如图所示,在\empty@or@void@line
内部,空行通过 进行构建,\@colseps\ltx@LT@tabularcr
其中\ltx@LT@tabularcr
是 的存储版本,\LT@tabularcr
并\@colseps
包含正确数量的s,这是在's (包含列数!)&
的帮助下通过辅助命令完成的:longtable
\LT@cols
\newcommand\build@colseps{%
\@tempcnta\@ne
\loop
\advance\@tempcnta by 1
\g@addto@macro\@colseps{&}
\ifnum\@tempcnta<\the\LT@cols\repeat
}
核心功能应用于blocktable
基于以下内容的新环境longtable
:
\newenvironment{blocktable}[2][\the@default@blocksize]
{\@setblocksize{#1}\build@colseps\longtable{@{\stepcounter{@tabrow}}#2}}
{\endlongtable \gdef\@colseps{} \setcounter{@tabrow}{0}}
它整合了之前完成的所有工作。它还清理了@tabrow
计数和\@colseps
宏——它们之前也被分配为空。
为了确保阻塞/分块从正确的行开始,以下几行总结了解决方案代码:
\g@addto@macro\endfirsthead{\setcounter{@tabrow}{1}}
\g@addto@macro\endhead{\setcounter{@tabrow}{1}}
\g@addto@macro\endfoot{\setcounter{@tabrow}{1}}
\g@addto@macro\endlastfoot{\setcounter{@tabrow}{1}}
例子
数字
在完整代码之前,这里有一个使用默认块大小 5 生成的示例图片:
完整代码
\documentclass{article}
\usepackage{booktabs}
\usepackage{longtable,array}
\makeatletter
\newcounter{@tabrow}
\newcounter{@emptyrow}
\newcounter{@modulus}
\newcounter{@default@blocksize}
\setcounter{@default@blocksize}{5}
\def\@colseps{}
\let\ltx@LT@tabularcr=\LT@tabularcr
\def\empty@or@void@line{%
\ifnum\the@tabrow=\the@emptyrow
\addtocounter{@emptyrow}{\the@modulus}%
\@colseps\ltx@LT@tabularcr
\fi}
\def\LT@tabularcr{\ltx@LT@tabularcr\empty@or@void@line}
\newenvironment{blocktable}[2][\the@default@blocksize]
{\@setblocksize{#1}\build@colseps\longtable{@{\stepcounter{@tabrow}}#2}}
{\endlongtable \gdef\@colseps{} \setcounter{@tabrow}{0}}
\newcommand\build@colseps{%
\@tempcnta\@ne
\loop
\advance\@tempcnta by 1
\g@addto@macro\@colseps{&}
\ifnum\@tempcnta<\the\LT@cols\repeat
}
\newcommand{\@setblocksize}[1]{%
\setcounter{@modulus}{#1}
\setcounter{@emptyrow}{\the@modulus}
\stepcounter{@modulus}
}
\newcommand{\defaultBTblocksize}[1]{\setcounter{@default@blocksize}{#1}}
\g@addto@macro\endfirsthead{\setcounter{@tabrow}{1}}
\g@addto@macro\endhead{\setcounter{@tabrow}{1}}
\g@addto@macro\endfoot{\setcounter{@tabrow}{1}}
\g@addto@macro\endlastfoot{\setcounter{@tabrow}{1}}
\makeatother
%\defaultBTblocksize{10}
\begin{document}
\listoftables
\begin{blocktable}{ccc}
\caption{Boring example table}\\
\toprule
\textbf{col1} & \textbf{col2} & \textbf{col3}\\
\midrule
\endfirsthead
foo & bar & baz\\
foo & bar & baz\\
foo & bar & baz\\
foo & bar & baz\\
foo & bar & baz\\
foo & bar & baz\\
foo & bar & baz\\
foo & bar & baz\\
foo & bar & baz\\
foo & bar & baz\\
foo & bar & baz\\
foo & bar & baz\\
foo & bar & baz\\
foo & bar & baz\\
foo & bar & baz\\
foo & bar & baz\\
foo & bar & baz\\
\bottomrule
\end{blocktable}
\end{document}
评论
- 我不使用 knitr,因此我没有使用从外部数据文件生成的表(如 OP 的 mwe 中)来测试解决方案,但当您声明时它应该可以毫无问题地工作
tabular.environment = 'blocktable'
。 - 插入实际的空白行时,需要注意的是,插入的材料
@{...}
也会影响遗漏的行(在我看来这不是可取的),并且行号是错误的,需要一些技巧。# - 为了不使这个答案超载,我将一个替代解决方案与旧解决方案合并打包到 github 存储库中:https://github.com/giannotr/blocktable(作为一个名为 的包
blocktable
。这不是官方软件包而且它既没有得到适当的记录,也没有经过测试。选择“emptyline”选项即可获得原始解决方案)。
答案2
由于您正在使用,最简单的方法是使用参数knitr
添加\\
每第十行。add.to.row
print.xtable
这是一个非常粗略的代码;一般情况下您还需要检查是否MatrixData
有超过 10 行。
\documentclass{article}
\usepackage{longtable}
\begin{document}
\listoftables
<< label=LongTable, results='asis', echo = FALSE >>=
library(xtable)
set.seed(12345)
MatrixData <- matrix(rnorm(1000), ncol = 10)
caption <- paste("\\hline \\endfirsthead" , # First caption
"\\caption[]{Example of longtable spanning several pages} \\label{tab:MatrixData} \\\\ \\hline", # Additional captions
paste("&", 1:ncol(MatrixData),collapse=" "), # Column names
"\\\\ \\hline ",
"\\endhead",
"\\hline \\multicolumn{11}{r}{\\textit{Continued}} \\
\\endfoot
\\endlastfoot",collapse=" ")
positions <- seq(from=10, to=dim(MatrixData)[1], by=10)
print(
xtable(
x = MatrixData
, caption = "Example of longtable spanning several pages"
#, label = "tab:MatrixData"
, align = c("l|", rep("r", ncol(MatrixData)))
, digits = c(rep(3, ncol(MatrixData)+1))
)
, table.placement = "H"
, caption.placement = "top"
, include.rownames = TRUE
, include.colnames = TRUE
, size = "small"
, tabular.environment = 'longtable'
, floating = FALSE
, add.to.row =
list(pos = as.list(c(0,positions)),
command = c(caption,rep("\\\\",length(positions)))))
@
\end{document}