我需要找到一个包,或者学习如何制作一个 tex 命令定义,该定义执行的操作与\rowcolors
表格命令非常相似,用于创建具有交替背景颜色条纹的表格,但有几个关键的区别。
首先,虽然这主要是装饰性的,但我非常希望单元格的内容在背景中垂直居中。我注意到,这\rowcolor
往往会在底部留下比顶部更大的边距,当你有一个条纹表时,这看起来很奇怪。所有文本似乎都垂直偏离了它应该在的位置。
更重要的是,我希望能够定义要着色的行组的大小,这样\rowcolors
与每行在两种背景之间交替不同,我希望能够指定要组合在一起的行数。因此,虽然\rowcolors
使用仅 1 行的组大小会很有效,但我希望能够指定要组合在一起的两行、三行或四行的组,例如,每两行、三行或四行分别交替颜色。这个问题,我最初以为是在问与我完全相同的问题,它需要在整个表中进行比我期望的更明确的编码,我想要的是可以轻松定义所有表格的东西,然后轻松返回并指定需要它的表格上的交替颜色组(当然还有用于表格的组的大小)。我在这里链接到的上述问题似乎要求我明确标记每个组的开始,并使用附加命令来实际生成每一行。
我需要能够指定表格的哪一行开始交替颜色,以及为不同的表格设置不同大小的组(或完全关闭它)。这是否在表格开始之前完成或嵌入到交替颜色开始的行中并不重要。
对我来说,解决方案必须在所有相邻的行和列上都使用单一的实心色块,并指定相同的背景,这一点也非常重要。也就是说,不能有常规页面背景的细条将列或行分隔开。我提到这一点是因为我见过这两种情况,\rowcolor
并且\columncolor
表现出这种行为,尽管我开始相信,这可能是我使用哪种工具来呈现生成的 pdf 的问题。
如果我必须为此定义自己的命令,我将不知道如何开始。我完全是 TeX 新手,所以我真的希望这已经存在于某个地方,或者很容易做到,可以在这里简单解释一下。
答案1
我查看了代码\rowcolors
并对其进行了修改,以允许组数大于 1。新命令\groupedRowColors
需要四个强制参数和一个可选参数:
- 第一个强制参数是组大小,即具有相同颜色的连续线的数量。
- 第二个强制参数是起始行,上面的所有行都不会被着色。这对于排除标题很有用。
- 第三和第四个强制参数是要使用的颜色。
如果您不喜欢分组的开始位置,或者想从其他颜色开始,则可以使用可选参数来移动颜色。请注意,整数除法\numexpr
发子弹因此所需的偏移可能与预期不同。(见这个问题。
\documentclass{article}
\usepackage[table]{xcolor}
\usepackage{booktabs}
\makeatletter
\newcommand{\groupedRowColors}[5][0]{% [#1: offset], #2: group size, #3: start line, #4: color 1, #5: color 2
% copied from xcolor.sty
\global\rownum=\z@
\global\@rowcolorstrue
\@ifxempty{#4}%
{\def\@oddrowcolor{\@norowcolor}}%
{\def\@oddrowcolor{\gdef\CT@row@color{\CT@color{#4}}}}%
\@ifxempty{#5}%
{\def\@evenrowcolor{\@norowcolor}}%
{\def\@evenrowcolor{\gdef\CT@row@color{\CT@color{#5}}}}%
% simplified (no check for \if@rowcmd)
\def\@rowcolors{%
\if@rowcolors
\noalign{%
\relax
\ifnum\rownum<#3
\@norowcolor
% I have changed this check:
\else \ifodd \numexpr (\rownum-#1)/#2\relax
\@oddrowcolor
\else
\@evenrowcolor
\fi \fi
}%
\fi
}%
\CT@everycr{\@rowc@lors\the\everycr}%
\ignorespaces
}
\makeatother
\begin{document}
\groupedRowColors{3}{2}{green!10}{blue!10}
\begin{tabular}{cc}
\toprule
Column~1 & Column~2 \\
\midrule
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
\bottomrule
\end{tabular}
\end{document}
编辑:例如longtable
\documentclass{article}
\usepackage[a6paper, landscape]{geometry}
\usepackage[table]{xcolor}
\usepackage{booktabs}
\usepackage{longtable}
\makeatletter
\newcommand{\groupedRowColors}[5][0]{% [#1: offset], #2: group size, #3: start line, #4: color 1, #5: color 2
% copied from xcolor.sty
\global\rownum=\z@
\global\@rowcolorstrue
\@ifxempty{#4}%
{\def\@oddrowcolor{\@norowcolor}}%
{\def\@oddrowcolor{\gdef\CT@row@color{\CT@color{#4}}}}%
\@ifxempty{#5}%
{\def\@evenrowcolor{\@norowcolor}}%
{\def\@evenrowcolor{\gdef\CT@row@color{\CT@color{#5}}}}%
% simplified (no check for \if@rowcmd)
\def\@rowcolors{%
\if@rowcolors
\noalign{%
\relax
\ifnum\rownum<#3
\@norowcolor
% I have changed this check:
\else \ifodd \numexpr (\rownum-#1)/#2\relax
\@oddrowcolor
\else
\@evenrowcolor
\fi \fi
}%
\fi
}%
\CT@everycr{\@rowc@lors\the\everycr}%
\ignorespaces
}
\makeatother
\begin{document}
\groupedRowColors{3}{0}{green!10}{blue!10}
\begin{longtable}{ c c }
\hiderowcolors
\toprule
Column~1 & Column~2 \\
\midrule
\endfirsthead
Column~1 & Column~2 \\
\midrule
\endhead
\midrule
\multicolumn{2}{r@{}}{\footnotesize(to be continued on next page)}
\endfoot
\bottomrule
\endlastfoot
\showrowcolors
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
(\the\rownum,0) & (\the\rownum,1) \\
\end{longtable}
\end{document}
(的定义\groupedRowColors
不变。)
答案2
最新版本(2021-08-10 的 v 6.0)有一个专门针对此类问题的nicematrix
命令\rowlistcolors
(可在 中找到)。\CodeBefore
无论您使用哪种 PDF 查看器,都不会在彩色面板中看到细白线。
\documentclass{article}
\usepackage{xcolor}
\usepackage{booktabs}
\usepackage{nicematrix}
\begin{document}
\begin{NiceTabular}{cc}
\CodeBefore
\rowlistcolors{2}{green!10,=,=,blue!10,=,=}[restart]
\Body
\toprule
Column~1 & Column~2 \\
\midrule
(\arabic{iRow},0) & (\arabic{iRow},1) \\
(\arabic{iRow},0) & (\arabic{iRow},1) \\
(\arabic{iRow},0) & (\arabic{iRow},1) \\
(\arabic{iRow},0) & (\arabic{iRow},1) \\
(\arabic{iRow},0) & (\arabic{iRow},1) \\
(\arabic{iRow},0) & (\arabic{iRow},1) \\
(\arabic{iRow},0) & (\arabic{iRow},1) \\
(\arabic{iRow},0) & (\arabic{iRow},1) \\
(\arabic{iRow},0) & (\arabic{iRow},1) \\
(\arabic{iRow},0) & (\arabic{iRow},1) \\
(\arabic{iRow},0) & (\arabic{iRow},1) \\
(\arabic{iRow},0) & (\arabic{iRow},1) \\
(\arabic{iRow},0) & (\arabic{iRow},1) \\
(\arabic{iRow},0) & (\arabic{iRow},1) \\
\bottomrule
\end{NiceTabular}
\end{document}
您需要多次编译(因为nicematrix
在后台使用 PGF/Tikz 节点)。