\rowcolors 命令(xcolor,选项 [table])和不同的表格环境

\rowcolors 命令(xcolor,选项 [table])和不同的表格环境

使用 xcolor。\rowcolors与 booktabs 一起使用。\midrule我遇到了一些奇怪的行为。说得更清楚一点:重点是不是这些桌子是否或者为何看上去如此丑陋……

在 MWE 中,有 5 个相等的表,存在两个主要问题:

  1. 表格的行号不以 1 开头,并且
  2. 行号有时会受到\midrule命令的影响(但不会受到\hline
  • 表 1 使用 tabularx 正确着色,但行从 17 开始。我怀疑这是行数 + 列数的两倍,但我无法证明这一点。不知道这里发生了什么。通常情况下,除非显示行号,否则您甚至不会意识到有什么问题。(虽然我能够创建一个从 22 开始的表,从而反转着色方案,但我不记得我为此做了什么。)
  • 表 2,与表 1 相同,但位于\global\rownum=-1最后一行的末尾。现在行号与预期一致。
  • 表 3,使用 longtable。末尾不需要行号校正,但如果没有第 3 行之后的代码,\global\advance\rownum by -1您将获得与表 4 中所示的相同结果。
  • 表 4 使用 xltabular,显示了导致此问题的原因:\midrule影响行数,或者可能更准确地说,表算法将行误解为一行。因此行是 1、2、3、5、6... 此外,与 longtable 相反,xltabular 需要在最后一行末尾进行更正才能获得正确的行号。
  • midrule表5,与表4相同,只是在第3行末尾添加了rownum的修正。

虽然我实际上“解决”了这些问题,但我有一种不太好的感觉。我是不是做错了什么?如果是这样,是什么?还是有虫子在四处潜伏?如果是这样,谁在捣乱?我的 TeXically 还不足以弄清楚。
我也玩过 的顺序\usepackage,但没有任何效果。(顺便说一下,我使用的是 texlive 2018 和 Win7pro 或 10pro。使用 pdflatex 和 lualatex 编译会产生相同的输出。)

谢谢任何提示。

以下是 MWE 及其输出的图像。

代码中标记了更改,添加了新的输出图片。

解决问题的最终版本。输入:乌尔丽克·菲舍尔,2017年4月:\noalign{\global\rownum=1}

\documentclass [b5paper]{article} 
\listfiles
\usepackage {booktabs}
\usepackage {xltabular}
\usepackage [table]{xcolor}
% patch according to Zarko
%%%% was good input, but did not really help in real live -> removed again
%%%%\newcounter{tabrows}
%%%%\expandafter\let\csname c@tabrows\endcsname\rownum
% end patch

%%%% still valid
% also removed all `\global\rownum=-1` commands and 
%%%% no longer needed, as long as same coloring scheme for all tables
%%%%      added `\rowcolors` in front all each table

\begin {document}
\vspace*{-7 \baselineskip} % to place all on one page
\rowcolors {1}{gray!20}{}  % odds grey, evens white

% --- using tabularx -----------------------------------------------------------
\centering
\begin {tabularx}{0.6\textwidth}{@{}ccX@{}}
   %%%% this table does NOT start row numbers at 1
   % code added
   \toprule  
   % end added
   \rowcolor {red!10!white}
   Table 1 &  \textbf{tabularx} & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
   \midrule
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
\end {tabularx}

\vspace{\baselineskip}
%%%%\rowcolors {1}{gray!20}{}  % odds grey, evens white
\begin {tabularx}{0.6\textwidth}{@{}ccX@{}}
   \noalign{\global\rownum=1} % could also be 2 or any arbitrary value
   \rowcolor {red!10!white}
   Table 2 &  \textbf{tabularx} & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
   \midrule
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
\end {tabularx}

% --- using longtable ----------------------------------------------------------
%%%%\rowcolors {1}{gray!20}{}  % odds grey, evens white
\begin {longtable}{@{}ccp{3.5cm}@{}}
   % code added
   \toprule\endhead   % \endhead because of underfull \vbox waring 
   % end added
   \noalign{\global\rownum=1}
   \rowcolor {red!10!white}
   Table 3 &  \textbf{longtable} & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum \global\advance\rownum by -1\\
   \midrule
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
\end {longtable}

% --- using xltabular ----------------------------------------------------------
\rowcolors {1}{gray!20}{}  % odds grey, evens white
\begin {xltabular}{0.6\textwidth}{@{}ccX@{}}
   % code added
   \toprule\endhead
   % end added
   \noalign{\global\rownum=1}
   \rowcolor {red!10!white}
   Table 4 &  \textbf{xltabular} & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
   \midrule
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
\end {xltabular}

\rowcolors {1}{gray!20}{}  % odds grey, evens white
\begin {xltabular}{0.6\textwidth}{@{}ccX@{}}
   \noalign{\global\rownum=1}
   \rowcolor {red!10!white}
   Table 5 &  \textbf{xltabular} & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum \global\advance\rownum by -1\\
   \midrule
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
   S1 & S2 & Row \# \the\rownum\\
\end {xltabular}
\end {document}

MWE 的结果

修改后的结果

答案1

{NiceTabular}实际上,这不是问题的答案,但也许您会感兴趣,在的环境中nicematrix,您还可以使用 命令\rowcolors(在 中可用\CodeBefore)和一个行计数器(LaTeX 计数器iRow),并且当与 结合使用时,您可以直接获得预期的结果booktabs

\documentclass{article} 
\usepackage{booktabs}
\usepackage{nicematrix}

\begin{document}
\centering
\begin{NiceTabular}{@{}ccc@{}}
\CodeBefore
   \rowcolors{1}{gray!20}{}
\Body
   Table 1 &  \textbf{NiceTabular} & Row \# \arabic{iRow}\\
   S1 & S2 & Row \# \arabic{iRow}\\
   S1 & S2 & Row \# \arabic{iRow}\\
   \midrule
   S1 & S2 & Row \# \arabic{iRow}\\
   S1 & S2 & Row \# \arabic{iRow}\\
   S1 & S2 & Row \# \arabic{iRow}\\
   S1 & S2 & Row \# \arabic{iRow}\\
\end{NiceTabular}
\end{document}

您需要多次编译(因为nicematrix在后台使用 PGF/Tikz 节点)。

上述代码的输出

答案2

与此同时,我偶然发现了输入来自 Ulrike Fischer,重置\rownum \noalign{\global\rownum=1}longtable 或 xltabular 中的页眉/页脚。我已经相应地编辑了我的 MWE,并在适当的位置 添加了代码。

此解决方案似乎适用于具有任意标题的实际表格,而补丁则不行。我的 MWE 中未输入命令\hiderowcolors(紧接着表格的前言部分)和\showrowcolors(在页眉/页脚的最后结尾之后),而这些命令很可能在实际应用中是需要的。

我的问题的第二部分并没有真正解决。但由于这个小技巧\global\advance\rownum by -1至少纠正了问题的可见方面(不改变颜色),所以我就此打住。

答案3

您可以尝试新的 LaTeX3 包tabularray:一切都按预期进行。

\documentclass[b5paper]{article} 

\usepackage[a6paper,margin=1.5cm]{geometry}
\usepackage{xcolor}
\usepackage{tabularray}
\UseTblrLibrary{booktabs}

\begin{document}

\begin{longtblr}[
  caption = {Long Table},
  label = {tblr:test},
]{
  width = 0.7\textwidth,
  colspec = {@{}ccX@{}},
  row{odd} = {gray9},
  row{1} = {red9},
  rowhead = 1,
}
  \toprule
  Head & Head & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
  \midrule
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
  \midrule
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
  \midrule
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
  \midrule
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
  \midrule
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
  \midrule
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
  \midrule
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
  \midrule
    S1 & S2   & Row \# \arabic{rownum} \\
    S1 & S2   & Row \# \arabic{rownum} \\
  \bottomrule
\end{longtblr}

\end{document}

在此处输入图片描述

相关内容