对于行组是否存在类似 \rowcolors 的东西?

对于行组是否存在类似 \rowcolors 的东西?

我需要找到一个包,或者学习如何制作一个 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 节点)。

上述代码的输出

相关内容