在 LaTeX 表中每 5 行或 10 行后附加一个空行

在 LaTeX 表中每 5 行或 10 行后附加一个空行

我想知道如何在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}

评论

  1. 我不使用 knitr,因此我没有使用从外部数据文件生成的表(如 OP 的 mwe 中)来测试解决方案,但当您声明时它应该可以毫无问题地工作tabular.environment = 'blocktable'
  2. 插入实际的空白行时,需要注意的是,插入的材料@{...}也会影响遗漏的行(在我看来这不是可取的),并且行号是错误的,需要一些技巧。#
  3. 为了不使这个答案超载,我将一个替代解决方案与旧解决方案合并打包到 github 存储库中:https://github.com/giannotr/blocktable(作为一个名为 的包blocktable这不是官方软件包而且它既没有得到适当的记录,也没有经过测试。选择“emptyline”选项即可获得原始解决方案)。

答案2

由于您正在使用,最简单的方法是使用参数knitr添加\\每第十行。add.to.rowprint.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}

相关内容