我正在使用xcolor
带有表格选项的包来为表格的每隔一行着色(非常好的指导这里)。这只需要一行,而且通常很棒。但是,在我的论文中,我多次发现自己只想为行的子集着色(例如,不为前 N 列着色)。(在下面的例子中,它遮住了垂直设置的单词。)有没有办法使用此包(或具有类似复杂性的另一个包)来做到这一点,希望 tikz 表不是唯一的答案?
梅威瑟:
\documentclass{article}
\usepackage[table]{xcolor}
\usepackage{booktabs,multirow,graphicx}
\definecolor{lightgray}{gray}{0.94}
\begin{document}
\begin{table}
\begin{tabular}{clr}
\toprule
Alg. & Dataset & Result \\
\midrule
\parbox[t]{2mm}{\multirow{4}{*}{\rotatebox[origin=c]{90}{BFS}}}
& soc-ork & 1.61\\
& soc-lj & 2.95\\
& h09 & 1.60\\
& i04 & 14.72\\
\bottomrule
\end{tabular}
\rowcolors{2}{lightgray}{white}
\begin{tabular}{clr}
\toprule
Alg. & Dataset & Result \\
\midrule
\parbox[t]{2mm}{\multirow{4}{*}{\rotatebox[origin=c]{90}{BFS}}}
& soc-ork & 1.61\\
& soc-lj & 2.95\\
& h09 & 1.60\\
& i04 & 14.72\\
\bottomrule
\end{tabular}
\end{table}
\end{document}
答案1
{NiceTabular}
使用of nicematrix
(最新版本:2021-01-01 的 5.8)可以轻松做到这一点。
\documentclass{article}
\usepackage{xcolor}
\usepackage{booktabs,graphicx}
\usepackage{nicematrix}
\definecolor{lightgray}{gray}{0.94}
\begin{document}
\begin{table}
\begin{NiceTabular}{clr}[code-before = {\rowcolors{2}{lightgray}{}[cols=2-]} ]
\toprule
Alg. & Dataset & Result \\
\midrule
\Block{4-1}{\rotate BFS}
& soc-ork & 1.61 \\
& soc-lj & 2.95 \\
& h09 & 1.60 \\
& i04 & 14.72\\
\bottomrule
\end{NiceTabular}
\end{table}
\end{document}
您需要多次编译(因为nicematrix
使用 PGF/Tikz 节点)。
答案2
\documentclass{article}
\usepackage[table]{xcolor}
\usepackage{booktabs,multirow,graphicx}
\definecolor{lightgray}{gray}{0.94}
\begin{document}
\begin{table}
\begin{tabular}{clr}
\toprule
Alg. & Dataset & Result \\
\midrule
\multirow{4}{*}{\rotatebox[origin=c]{90}{BFS}}
& soc-ork & 1.61\\
& soc-lj & 2.95\\
& h09 & 1.60\\
& i04 & 14.72\\
\bottomrule
\end{tabular}
\rowcolors{2}{lightgray}{white}
\begin{tabular}{clr}
\toprule
Alg. & Dataset & Result \\
\midrule
% \multirow{7}{*}{\rotatebox[origin=c]{90}{BFS}}
& soc-ork & 1.61\\
& soc-lj & 2.95\\
& h09 & 1.60\\
\multirow{-4}{*}{\rotatebox[origin=c]{90}{BFS}}
& i04 & 14.72\\
\bottomrule
\end{tabular}
\end{table}
\end{document}
编辑
\newcommand\ccg[1]{\cellcolor{white}{#1}} % for cells in second column
\rowcolors{2}{lightgray}{white}
\begin{tabular}{clr} \toprule
Alg. & Dataset & Result \\ \midrule
& soc-ork & 1.61 \\
\ccg{} & soc-lj & 2.95 \\
& h09 & 1.60 \\
\multirow{-4.5}{*}{\rotatebox[origin=c]{90}{BFS}}
\ccg{} & i04 & 14.72 \\ \bottomrule
\end{tabular}
注意在多行中使用小数进行精细控制
答案3
我将提供第三种方法来解决这个问题,更适合现实世界的情况。
我主要使用中型数字表,可能有 40 到 60 行,15 到 25 列,有些只有文本。有些数据是手动输入的,严格遵循“一次性”规则: 同一数据仅一次允许在此过程中手动输入。
大多数情况下,表格是在电子表格中生成的,或者从统计包或数据库导入的。其他列经过计算、重新排序,单元格突出显示以与合作者共享结果等。有些列将是内部一致性检查或永远不会公开的评论。
使用 LaTeX 进行高质量排版是一项漫长工作的最后一步。只有表格的子集会被发布。
你绝对想不到直接在 LaTeX 代码中输入数据。这太容易出错,而且违反了“一次性”规则。
我发现的最佳替代方案是 excel2latex 插件。 https://ctan.org/tex-archive/support/excel2latex?lang=en
一旦与同事和老板就最终的发布格式达成一致,就很容易获得(几乎)最终的代码。所有数字和文本数据都将无错误地导出。有时您可能需要添加收尾工作,例如将数字数据与小数点对齐,包括另一个包等。
例如,为了生成示例代码,我花了 10 分钟来创建 Excel 表,花了 15 秒来导出代码并包含package rotating
.
如您所见,自动生成的代码与其他答案中提出的代码略有不同,但它非常简单,易于编辑,最终结果几乎相同。 (您可以尝试使用和不使用 booktab 选项)。
\documentclass{article}
\usepackage[table]{xcolor}
\usepackage{booktabs,multirow}
\usepackage{rotating}
\begin{document}
% Table generated by Excel2LaTeX from sheet 'Sheet1'
\begin{table}[htbp]
\centering
\caption{Add caption}
\begin{tabular}{clr}
\toprule
Alg. & Dataset & Result \\
\midrule
\multirow{4}[2]{*}{\begin{sideways}BFS\end{sideways}} & soc-ork & 1.61 \\
& \cellcolor[rgb]{ .816, .808, .808}soc-lj & \cellcolor[rgb]{ .816, .808, .808}2.95 \\
& h09 & 1.60 \\
& \cellcolor[rgb]{ .816, .808, .808}i04 & \cellcolor[rgb]{ .816, .808, .808}14.72 \\
\bottomrule
\end{tabular}%
\label{tab:addlabel}%
\end{table}%
\end{document}
在我参与的上一份报告中,项目经理在查看打印的草稿时,决定某一列应按升序而不是降序排序。只需几分钟即可完成该任务,而不需要花一天或更长时间在 LaTeX 代码中手动输入所有数据并在输出时检查每个数字。
我探索了几种替代工具。参见
其中一些是在线的。一个有希望的新网站是https://www.latex-tables.com。
它可以导入 Excel 文件和其他格式,在某些情况下很有用。
目前我将坚持使用 excel2latex,因为我的表格工作流程的核心是在 excel 中完成的。