喂食
\documentclass{standalone}
\usepackage{colortbl}
\begin{document}
\(\begin{array}{l|l|l||l|l|l}
\rowcolor[gray]{.9}
11 & 12 & 13 & 14 & 15 & 16\\
21 & 22 & 23 & 24 & 25 & 26
\end{array}\)
\end{document}
导致标题的背景颜色被双垂直线打断:
在组成双线的两行之间,背景颜色为白色。是错误还是功能?就我的特定输出而言,这是不想要的;有没有办法让上排两行之间的空间也变成彩色?我试过了https://tex.stackexchange.com/a/137394,但截至今天,那里的解决方案似乎对我的输入没有影响。
是的,我知道我们可以使用 nicematrix 包并\begin{NiceArray}{l|l|l||l|l|l}[colortbl-like]\rowcolor[gray]{.9} …\end{NiceArray}
以额外运行为代价,这就是为什么我的问题colortbl
只涉及此。
答案1
在 TeX Live 2020 上,使用 colortbl 2020/01/04 v1.0e 颜色表列 (DPC),这是 David Carlisle (DPC) 在他的回答“colortbl 中 \doublerulesepcolor 的问题”只要\doublerulesepcolor
被调用,并且因此 的\CT@drsc@
定义与\relax
之前不同, 就可以正常工作\begin{array}
。 如果这样做,那么使用 hack,您还可以申请\doublerulesepcolor
在 -environment 中明确指定颜色array
。
\documentclass{standalone}
\usepackage{colortbl}
\makeatletter
% The hack by David Carlisle, the author of colortbl, see
% <https://tex.stackexchange.com/a/137394>
\let\old@mkpream\@mkpream
\def\@mkpream{%
\ifx\CT@drsc@\relax\else\let\CT@drsc@ @\fi
\let\CT@arc@\relax
\old@mkpream}
\makeatother
\begin{document}
%\pagecolor{yellow}%
\(%
\doublerulesepcolor{green}%<-something to make sure \CT@drsc@ is defined different from \relax
\begin{array}{l|l|l||l|l|l}
\rowcolor[gray]{.9}
\doublerulesepcolor[gray]{.9}%
11 & 12 & 13 & 14 & 15 & 16\\
\doublerulesepcolor{white}%
21 & 22 & 23 & 24 & 25 & 26
\end{array}%
\)
\end{document}
2022年8月12日附录:
如果某些背景颜色已经生效,例如由于
\pagecolor
,那么明确设置颜色“白色”与\doublerulesepcolor
不在双重规则的规则之间的水平/垂直空间设置另一种颜色相比,会产生不同的效果。对于某些打印机来说,明确将“白色”设置为(背景)颜色或设置不使用(其他)(背景)颜色会有所不同。
例如,如果您将打印作业从 PC 发送到彩色打印机(该打印机在纸上打印内容),并且在 pdf 文件中某些文本的背景颜色明确设置为“白色”,那么通常不会在白纸上打印白色背景颜色。因此,使用这些设备,背景实际上不是白色,而是背景是要打印的纸张的颜色。(老实说,我不知道喷墨打印机(更不用说彩色激光打印机)是否能产生白色,我对此表示怀疑,但也许我错了。)但是,如果您使用在有机玻璃板上打印的机器,那么也会打印白色背景颜色,并且在 pdf 文件中设置为打印白色(背景)颜色或设置为根本不使用(背景)颜色会产生差异。
如果您不想将文本颜色切换为“白色”,而是希望指定根本不使用其他颜色,则可以重新定义命令\CT@drsc@
,使其不改变文本颜色,然后以文本颜色绘制规则,但从代表绘制规则的命令的标记流中取出那些标记,并用标记替换它们,以创建相应的水平/垂直空格/ \hskip
s/ \vskip
s。
以下是第一次尝试。但是,我只是粗略地浏览了 colortbl 的源代码,因此不能保证它确实始终正常工作。比我更有经验的人可以更好地判断这一点。
“关闭”颜色的更好策略可能是为每种颜色元素引入一个标志,例如 \if-switch 或\@firstoftwo
/\@secondoftwo
东西,它决定是否应该做任何彩色的事情或者只应该插入相应的\hskip
/ 。\vskip
\documentclass{standalone}
\usepackage{colortbl}
\makeatletter
%----------------------------------------------------------------------
% The hack by David Carlisle, the author of colortbl, see
% <https://tex.stackexchange.com/a/137394>
\let\old@mkpream\@mkpream
\def\@mkpream{%
\ifx\CT@drsc@\relax\else\let\CT@drsc@ @\fi
\let\CT@arc@\relax
\old@mkpream}
%----------------------------------------------------------------------
\newcommand\CT@drsc@NoDoublerulesepcolor{%
\@ifnextchar\vrule{%
\@firstoftwo{%
\@ifnextchar{w}{\expandafter\hskip\@gobblewidth}%
{\expandafter\hskip\@gobble}%
}%
}{%
\@ifnextchar\hrule{%
\@firstoftwo{%
\@ifnextchar{h}{\expandafter\vskip\@gobbleheight}%
{\expandafter\vskip\@gobble}%
}%
}{%
\@ifnextchar\leaders{\@gobbleto@height}{}%
}%
}%
}%
\def\@gobblewidth width{}%
\def\@gobbleheight height{}%
\def\@gobbleto@height\leaders\hrule\@height#1{\leaders\vbox to#1{}}%
\newcommand\NoDoublerulesepcolor{\noalign{\global\let\CT@drsc@\CT@drsc@NoDoublerulesepcolor}}
\newcommand\InitDoublerulesepcolor{%
\gdef\CT@drsc@{}%
\global\let\CT@drsc@\CT@drsc@NoDoublerulesepcolor
}
\makeatother
\begin{document}
%\pagecolor{yellow}%
\(%
\InitDoublerulesepcolor
\begin{array}{l|l|l||l|l|l}
\rowcolor[gray]{.9}
\doublerulesepcolor[gray]{.9}%
11 & 12 & 13 & 14 & 15 & 16\\
\NoDoublerulesepcolor
\hline
\hline
21 & 22 & 23 & 24 & 25 & 26
\end{array}%
\)
\end{document}
如果使用命令\pagecolor
设置页面的背景颜色,则两个示例的行为会有所不同:
对于第一个示例,第二个表行中的双规则之间的颜色无论如何都是白色的,因为颜色“白色”是明确设置的,这可能不是你想要的(!!!)。
在第二个示例中,第二个表行中的双规则之间的颜色是页面的背景颜色,因为使用了包含指定高度的空框而不是(彩色)规则\hskips
。\vskips
\leaders
(顺便说一下,对于我的第二个例子,我很惊讶地发现使用一个空的\vbox
,因此宽度为 0pt 的盒子可以解决\leaders
问题\hfill
。宽度为 0pt 的盒子应该可以无限次地放入水平空间……可能我忽略了 TeXbook 中的某些内容……)
第一个例子的输出\pagecolor{yellow}
:
第二个示例的输出\pagecolor{yellow}
:
答案2
原因在于背景颜色的工作方式(不仅在 中colortbl
,而且在tabularray
其他包中也是如此)——即它为单个单元格着色,而不是为整行着色。由于双垂直线之间的空间不在单元格中,因此您无法为其赋予背景颜色。
一种可能的解决方法是做一些丑陋的事情,例如用 替换||
,|@{}c@{}|
并在双线出现的位置设置一个空列,然后用 在一行中的双行之间插入间距\hspace*{2pt}
。
(请注意,这尚未测试,可能不起作用,并且我给出的尺寸可能是错误的。)
答案3
通过{NiceTabular}
及其nicematrix
键colortbl-like
,您可以直接获得预期的输出。
\documentclass{article}
\usepackage{nicematrix}
\NiceMatrixOptions{exterior-arraycolsep}
\begin{document}
\(\begin{NiceArray}{l|l|l||l|l|l}[colortbl-like]
\rowcolor[gray]{.9}
11 & 12 & 13 & 14 & 15 & 16\\
21 & 22 & 23 & 24 & 25 & 26
\end{NiceArray}\)
\end{document}
您需要多次编译(因为nicematrix
在后台使用 PGF/Tikz 节点)。
评论
默认情况下,{NiceArray}
不会将 放在\arraycolsep
数组的两侧。
在的文档中amsmath
,我们读到:
数组在每一侧添加的 \arraycolsep 的额外空间是一种浪费,因此我们在 [在 {matrix} 中] 将其删除(也许我们应该将其从数组中删除,但这是一项更艰巨的任务)。
这就是为什么我决定在 中删除它们{NiceArray}
。但是 中有一个键\NiceMatrixOptions
可以回滚到类似于 的行为{array}
。