colortbl:为什么双垂直线会打断背景颜色?

colortbl:为什么双垂直线会打断背景颜色?

喂食

\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@,使其不改变文本颜色,然后以文本颜色绘制规则,但从代表绘制规则的命令的标记流中取出那些标记,并用标记替换它们,以创建相应的水平/垂直空格/ \hskips/ \vskips。

以下是第一次尝试。但是,我只是粗略地浏览了 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}及其nicematrixcolortbl-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}

相关内容