使用 xcolor。\rowcolors
与 booktabs 一起使用。\midrule
我遇到了一些奇怪的行为。说得更清楚一点:重点是不是这些桌子是否或者为何看上去如此丑陋……
在 MWE 中,有 5 个相等的表,存在两个主要问题:
- 表格的行号不以 1 开头,并且
- 行号有时会受到
\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}
答案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}