如何正确地为乳胶表中的单元格着色而不弄乱线条?

如何正确地为乳胶表中的单元格着色而不弄乱线条?

我有以下问题:我想按值为单元格着色;nSHD 的值在 (0,1) 范围内,值越小越好,因此我希望接近 0 的值为绿色,而值越大越好,因此我希望值相反(接近 1 的值为绿色,值越小越好),现在的问题是我无法将线条与颜色结合起来,我开始是这样的:

\documentclass{article}


\usepackage{array}
\newcolumntype{?}{!{\vrule width 1.2pt}}
\usepackage{collcell}

\usepackage[dvipsnames,table]{xcolor}


\usepackage{multirow}
\usepackage{multicol}


\usepackage{pgf} % for calculating the values for gradient
%======================================
% Color set related!
\definecolor{high}{HTML}{00994d}  % the color for the highest number in your data set
\definecolor{low}{HTML}{fff51b}  % the color for the lowest number in your data set
\newcommand*{\opacity}{70}% here you can change the opacity of the background color!
%======================================
% Data set related!
\newcommand*{\minval}{0}% define the minimum value on your data set
\newcommand*{\maxval}{0.25}% define the maximum value in your data set!
\newcommand*{\minvall}{0.75}% define the minimum value on your data set
\newcommand*{\maxvall}{1.0}% define the maximum value in your data set!
%======================================
% gradient function!
\newcommand{\grhigh}[1]{
    % The values are calculated linearly between \minval and \maxval
    \ifdimcomp{#1pt}{>}{\maxvall pt}{#1}{
        \ifdimcomp{#1pt}{<}{\minvall pt}{#1}{
            \pgfmathparse{int(round(100*(#1/(\maxvall-\minvall))-(\minvall*(100/(\maxvall-\minvall)))))}
            \xdef\tempa{\pgfmathresult}
            \cellcolor{high!\tempa!low!\opacity} #1
    }}
}
\newcommand{\grlow}[1]{
    % The values are calculated linearly between \minval and \maxval
    \ifdimcomp{#1pt}{>}{\maxval pt}{#1}{
        \ifdimcomp{#1pt}{<}{\minval pt}{#1}{
            \pgfmathparse{int(round(100*(#1/(\maxval-\minval))-(\minval*(100/(\maxval-\minval)))))}
            \xdef\tempa{\pgfmathresult}
            \cellcolor{low!\tempa!high!\opacity} #1
    }}
}


\begin{document}





\renewcommand{\arraystretch}{1.6}

\begin{table}[!htbp]
\centering
\resizebox{\columnwidth}{!}{%
\begin{tabular}{|c|c|c|c|c|c?c|c|c|c?c|c|c|c|}
\hline
\multicolumn{2}{|c|}{$r$} &
\multicolumn{4}{c?}{$10\%$} &
\multicolumn{4}{c?}{$30\%$} &
\multicolumn{4}{c|}{$50\%$} \\
\hline
\multicolumn{2}{|c|}{$n$} & 50  & 100  & 250 & 500 & 50  & 100  & 250 & 500 & 50  & 100  & 250 & 500  \\
\hline
\multirow{2}{*}{$d=10$} & nSHD & \grlow{0.19} & \grlow{0.11} & \grlow{0.04} & \grlow{0.03} & \grlow{0.13} & \grlow{0.1} & \grlow{0.03} & \grlow{0.03} & \grlow{0.18} & \grlow{0.15} & \grlow{0.09} & \grlow{0.08} \\ \cline{2-14}
 & TPR & \grhigh{0.88} & \grhigh{0.94} & \grhigh{0.97} & \grhigh{0.99} & \grhigh{0.96} & \grhigh{0.98} & \grhigh{0.99} & \grhigh{1.0} & \grhigh{0.91} & \grhigh{0.93} & \grhigh{0.95} & \grhigh{0.94} \\
\hline
\multirow{2}{*}{$d=20$} & nSHD   & \grlow{0.11} & \grlow{0.06} & \grlow{0.03} & \grlow{0.02} & \grlow{0.13} & \grlow{0.09} & \grlow{0.06} & \grlow{0.04} & \grlow{0.18} & \grlow{0.14} & \grlow{0.1} & \grlow{0.08} \\ \cline{2-14}
 & TPR & \grhigh{0.94} & \grhigh{0.98} & \grhigh{1.0} & \grhigh{1.0} & \grhigh{0.93} & \grhigh{0.96} & \grhigh{0.98} & \grhigh{0.99} & \grhigh{0.86} & \grhigh{0.92} & \grhigh{0.94} & \grhigh{0.96} \\
\hline
\multirow{2}{*}{$d=30$} & nSHD  & \grlow{0.1} & \grlow{0.06} & \grlow{0.03} & \grlow{0.02} & \grlow{0.12} & \grlow{0.08} & \grlow{0.05} & \grlow{0.03} & \grlow{0.15} & \grlow{0.12} & \grlow{0.09} & \grlow{0.07} \\ \cline{2-14}
& TPR & \grhigh{0.96} & \grhigh{0.97} & \grhigh{0.99} & \grhigh{1.0} & \grhigh{0.93} & \grhigh{0.96} & \grhigh{0.98} & \grhigh{0.99} & \grhigh{0.89} & \grhigh{0.9} & \grhigh{0.95} & \grhigh{0.96} \\
\hline
\end{tabular}
}
\vspace*{2mm}
\caption{Some Caption.} 
\end{table}

\end{document}

这对于颜色来说效果很好,但不能正确绘制线条 - 例如当使用 Adob​​e 打开时它看起来像这样: 缺失的线条

您可以看到垂直线和水平线没有正确绘制;然后我在 StackExchange 上搜索并发现了以下类似的问题:

Adobe 表格和线条显示问题

建议了两种解决方法:首先,使用不起作用的 nicematrix 包,然后绘制两次表格:一次使用颜色,一次不使用颜色;基于这个答案,我尝试了:

\documentclass{article}


\usepackage{array}
\newcolumntype{?}{!{\vrule width 1.2pt}}
\usepackage{collcell}

\usepackage[dvipsnames,table]{xcolor}


\usepackage{multirow}
\usepackage{multicol}


\usepackage{pgf} % for calculating the values for gradient
%======================================
% Color set related!
\definecolor{high}{HTML}{00994d}  % the color for the highest number in your data set
\definecolor{low}{HTML}{fff51b}  % the color for the lowest number in your data set
\newcommand*{\opacity}{70}% here you can change the opacity of the background color!
%======================================
% Data set related!
\newcommand*{\minval}{0}% define the minimum value on your data set
\newcommand*{\maxval}{0.25}% define the maximum value in your data set!
\newcommand*{\minvall}{0.75}% define the minimum value on your data set
\newcommand*{\maxvall}{1.0}% define the maximum value in your data set!
%======================================
% gradient function!
\newcommand{\grhigh}[1]{
    % The values are calculated linearly between \minval and \maxval
    \ifdimcomp{#1pt}{>}{\maxvall pt}{#1}{
        \ifdimcomp{#1pt}{<}{\minvall pt}{#1}{
            \pgfmathparse{int(round(100*(#1/(\maxvall-\minvall))-(\minvall*(100/(\maxvall-\minvall)))))}
            \xdef\tempa{\pgfmathresult}
            \cellcolor{high!\tempa!low!\opacity} #1
    }}
}
\newcommand{\grlow}[1]{
    % The values are calculated linearly between \minval and \maxval
    \ifdimcomp{#1pt}{>}{\maxval pt}{#1}{
        \ifdimcomp{#1pt}{<}{\minval pt}{#1}{
            \pgfmathparse{int(round(100*(#1/(\maxval-\minval))-(\minval*(100/(\maxval-\minval)))))}
            \xdef\tempa{\pgfmathresult}
            \cellcolor{low!\tempa!high!\opacity} #1
    }}
}


\begin{document}





\renewcommand{\arraystretch}{1.6}

\begin{table}[!htbp]
\centering
\resizebox{\columnwidth}{!}{%
\def\tmp{
\begin{tabular}{|c|c|c|c|c|c?c|c|c|c?c|c|c|c|}
\hline
\multicolumn{2}{|c|}{$r$} &
\multicolumn{4}{c?}{$10\%$} &
\multicolumn{4}{c?}{$30\%$} &
\multicolumn{4}{c|}{$50\%$} \\
\hline
\multicolumn{2}{|c|}{$n$} & 50  & 100  & 250 & 500 & 50  & 100  & 250 & 500 & 50  & 100  & 250 & 500  \\
\hline
\multirow{2}{*}{$d=10$} & nSHD & \grlow{0.19} & \grlow{0.11} & \grlow{0.04} & \grlow{0.03} & \grlow{0.13} & \grlow{0.1} & \grlow{0.03} & \grlow{0.03} & \grlow{0.18} & \grlow{0.15} & \grlow{0.09} & \grlow{0.08} \\ \cline{2-14}
 & TPR & \grhigh{0.88} & \grhigh{0.94} & \grhigh{0.97} & \grhigh{0.99} & \grhigh{0.96} & \grhigh{0.98} & \grhigh{0.99} & \grhigh{1.0} & \grhigh{0.91} & \grhigh{0.93} & \grhigh{0.95} & \grhigh{0.94} \\
\hline
\multirow{2}{*}{$d=20$} & nSHD   & \grlow{0.11} & \grlow{0.06} & \grlow{0.03} & \grlow{0.02} & \grlow{0.13} & \grlow{0.09} & \grlow{0.06} & \grlow{0.04} & \grlow{0.18} & \grlow{0.14} & \grlow{0.1} & \grlow{0.08} \\ \cline{2-14}
 & TPR & \grhigh{0.94} & \grhigh{0.98} & \grhigh{1.0} & \grhigh{1.0} & \grhigh{0.93} & \grhigh{0.96} & \grhigh{0.98} & \grhigh{0.99} & \grhigh{0.86} & \grhigh{0.92} & \grhigh{0.94} & \grhigh{0.96} \\
\hline
\multirow{2}{*}{$d=30$} & nSHD  & \grlow{0.1} & \grlow{0.06} & \grlow{0.03} & \grlow{0.02} & \grlow{0.12} & \grlow{0.08} & \grlow{0.05} & \grlow{0.03} & \grlow{0.15} & \grlow{0.12} & \grlow{0.09} & \grlow{0.07} \\ \cline{2-14}
& TPR & \grhigh{0.96} & \grhigh{0.97} & \grhigh{0.99} & \grhigh{1.0} & \grhigh{0.93} & \grhigh{0.96} & \grhigh{0.98} & \grhigh{0.99} & \grhigh{0.89} & \grhigh{0.9} & \grhigh{0.95} & \grhigh{0.96} \\
\hline
\end{tabular}
}
\leavevmode
\rlap{\tmp}%
\begingroup
  \renewcommand*{\cellcolor}[1]{}%
  \tmp
\endgroup
}
\vspace*{2mm}
\caption{Some Caption.} 
\end{table}





\end{document}

一切粗体

我们可以看到,如果绘制表格两次,数字和线条都会变得很粗;有人能解决这个问题吗?

答案1

这是一种使用tabularray包的方法,它不存在线条被单元格颜色覆盖的问题:

\documentclass{article}
\usepackage[margin=2cm]{geometry}

\usepackage{tabularray}
\UseTblrLibrary{functional}

\usepackage{pgf} % for calculating the values for gradient
%======================================
% Color set related!
\definecolor{high}{HTML}{00994d}    % the color for the highest number in your data set
\definecolor{low}{HTML}{fff51b}     % the color for the lowest number in your data set
\pgfmathtruncatemacro{\opacity}{70} % here you can change the opacity of the background color!
%======================================
% Data set related!
\pgfmathsetmacro{\minval}{0}% define the minimum value on your data set
\pgfmathsetmacro{\maxval}{0.25}% define the maximum value in your data set!
\pgfmathsetmacro{\minvall}{0.75}% define the minimum value on your data set
\pgfmathsetmacro{\maxvall}{1.0}% define the maximum value in your data set!
%======================================
% gradient function!
\IgnoreSpacesOn
    \prgNewFunction \grhighlowColor {} {
        \intStepOneInline {3} {\arabic{rowcount}} {
            \intSet \lTmpaInt { \intMathMod {##1} {2} }
            \intCompareTF {\lTmpaInt} = {1} {
                \intStepOneInline {3} {\arabic{colcount}} {
                    \tlSet \lTmpbTl {\cellGetText {##1} {####1}}
                    \fpCompareTF {\lTmpbTl} > {\maxval} { } {
                        \fpCompareTF {\lTmpbTl} < {\minval} { } {
                            \pgfmathparse{int(round(100*(\lTmpbTl/(\maxval-\minval))-(\minval*(100/(\maxval-\minval)))))}
                            \cellSetStyle {##1} {####1} {bg=low!\pgfmathresult!high!\opacity}
                        }
                    }
                }
            } {
                \intStepOneInline {3} {\arabic{colcount}} {
                    \tlSet \lTmpbTl {\cellGetText {##1} {####1}}
                    \fpCompareTF {\lTmpbTl} > {\maxvall} { } {
                        \fpCompareTF {\lTmpbTl} < {\minvall} { } {
                            \pgfmathparse{int(round(100*(\lTmpbTl/(\maxvall-\minvall))-(\minvall*(100/(\maxvall-\minvall)))))}
                            \cellSetStyle {##1} {####1} {bg=high!\pgfmathresult!low!\opacity}
                        }
                    }
                }
            }
        }
    }
\IgnoreSpacesOff

\begin{document}

\begin{table}\footnotesize
\begin{tblr}{
    colspec = { *{2}{c} *{12}{X[c]} },
    hlines, 
    vlines,
    vline{7,11} = {1.2pt},
    process=\grhighlowColor
}
\SetCell[c=2]{} $r$ & &
\SetCell[c=4]{} $10\%$ & & & &
\SetCell[c=4]{} $30\%$ & & & &
\SetCell[c=4]{} $50\%$ & & & \\
\SetCell[c=2]{} $n$ & & 50  & 100  & 250 & 500 & 50  & 100  & 250 & 500 & 50  & 100  & 250 & 500  \\
\SetCell[r=2]{} $d=10$ & nSHD & 0.19 & 0.11 & 0.04 & 0.03 & 0.13 & 0.1 & 0.03 & 0.03 & 0.18 & 0.15 & 0.09 & 0.08 \\ 
 & TPR & 0.88 & 0.94 & 0.97 & 0.99 & 0.96 & 0.98 & 0.99 & 1.0 & 0.91 & 0.93 & 0.95 & 0.94 \\
\SetCell[r=2]{} $d=20$ & nSHD & 0.11 & 0.06 & 0.03 & 0.02 & 0.13 & 0.09 & 0.06 & 0.04 & 0.18 & 0.14 & 0.1 & 0.08 \\ 
 & TPR & 0.94 & 0.98 & 1.0 & 1.0 & 0.93 & 0.96 & 0.98 & 0.99 & 0.86 & 0.92 & 0.94 & 0.96 \\
\SetCell[r=2]{} $d=30$ & nSHD & 0.1 & 0.06 & 0.03 & 0.02 & 0.12 & 0.08 & 0.05 & 0.03 & 0.15 & 0.12 & 0.09 & 0.07 \\ 
& TPR & 0.96 & 0.97 & 0.99 & 1.0 & 0.93 & 0.96 & 0.98 & 0.99 & 0.89 & 0.9 & 0.95 & 0.96 \\
\end{tblr}
\vspace*{2mm}
\caption{Some Caption.} 
\end{table}

\end{document}

在此处输入图片描述

答案2

为了使用 获得完美的输出{NiceTabular}nicematrix不应使用\cline标准 LaTeX 命令(并且尚未被 重新定义)。但是,如果使用命令,则nicematrix无需使用:块中不会绘制水平和垂直规则...\cline\Blocknicematrix

\documentclass{article}

\usepackage{collcell}

\usepackage[dvipsnames,table]{xcolor}

\usepackage{nicematrix,tikz}

\usepackage{pgf} % for calculating the values for gradient
%======================================
% Color set related!
\definecolor{high}{HTML}{00994d}  % the color for the highest number in your data set
\definecolor{low}{HTML}{fff51b}  % the color for the lowest number in your data set
\newcommand*{\opacity}{70}% here you can change the opacity of the background color!
%======================================
% Data set related!
\newcommand*{\minval}{0}% define the minimum value on your data set
\newcommand*{\maxval}{0.25}% define the maximum value in your data set!
\newcommand*{\minvall}{0.75}% define the minimum value on your data set
\newcommand*{\maxvall}{1.0}% define the maximum value in your data set!
%======================================
% gradient function!
\newcommand{\grhigh}[1]{
    % The values are calculated linearly between \minval and \maxval
    \ifdimcomp{#1pt}{>}{\maxvall pt}{#1}{
        \ifdimcomp{#1pt}{<}{\minvall pt}{#1}{
            \pgfmathparse{int(round(100*(#1/(\maxvall-\minvall))-(\minvall*(100/(\maxvall-\minvall)))))}
            \xdef\tempa{\pgfmathresult}
            \cellcolor{high!\tempa!low!\opacity} #1
    }}
}
\newcommand{\grlow}[1]{
    % The values are calculated linearly between \minval and \maxval
    \ifdimcomp{#1pt}{>}{\maxval pt}{#1}{
        \ifdimcomp{#1pt}{<}{\minval pt}{#1}{
            \pgfmathparse{int(round(100*(#1/(\maxval-\minval))-(\minval*(100/(\maxval-\minval)))))}
            \xdef\tempa{\pgfmathresult}
            \cellcolor{low!\tempa!high!\opacity} #1
    }}
}


\begin{document}

\renewcommand{\arraystretch}{1.6}


\NiceMatrixOptions
  {
    custom-line = 
     {
       letter = ? ,
       total-width = 1.2 pt , 
       tikz = { line width = 1.2 pt } 
     }
  }

\begin{table}[!htbp]
\centering
\resizebox{\columnwidth}{!}{%
\begin{NiceTabular}{|c|c|c|c|c|c?c|c|c|c?c|c|c|c|}[hlines]
\Block{1-2}{$r$} &&
\Block{1-4}{$10\%$} &&&&
\Block{1-4}{$30\%$} &&&&
\Block{1-4}{$50\%$} \\
\Block{1-2}{$n$} && 50  & 100  & 250 & 500 & 50  & 100  & 250 & 500 & 50  & 100  & 250 & 500  \\
\Block{2-1}{$d=10$} & nSHD & \grlow{0.19} & \grlow{0.11} & \grlow{0.04} & \grlow{0.03} & \grlow{0.13} & \grlow{0.1} & \grlow{0.03} & \grlow{0.03} & \grlow{0.18} & \grlow{0.15} & \grlow{0.09} & \grlow{0.08} \\ 
 & TPR & \grhigh{0.88} & \grhigh{0.94} & \grhigh{0.97} & \grhigh{0.99} & \grhigh{0.96} & \grhigh{0.98} & \grhigh{0.99} & \grhigh{1.0} & \grhigh{0.91} & \grhigh{0.93} & \grhigh{0.95} & \grhigh{0.94} \\
\Block{2-1}{$d=20$} & nSHD   & \grlow{0.11} & \grlow{0.06} & \grlow{0.03} & \grlow{0.02} & \grlow{0.13} & \grlow{0.09} & \grlow{0.06} & \grlow{0.04} & \grlow{0.18} & \grlow{0.14} & \grlow{0.1} & \grlow{0.08} \\ 
 & TPR & \grhigh{0.94} & \grhigh{0.98} & \grhigh{1.0} & \grhigh{1.0} & \grhigh{0.93} & \grhigh{0.96} & \grhigh{0.98} & \grhigh{0.99} & \grhigh{0.86} & \grhigh{0.92} & \grhigh{0.94} & \grhigh{0.96} \\
\Block{2-1}{$d=30$} & nSHD  & \grlow{0.1} & \grlow{0.06} & \grlow{0.03} & \grlow{0.02} & \grlow{0.12} & \grlow{0.08} & \grlow{0.05} & \grlow{0.03} & \grlow{0.15} & \grlow{0.12} & \grlow{0.09} & \grlow{0.07} \\ 
& TPR & \grhigh{0.96} & \grhigh{0.97} & \grhigh{0.99} & \grhigh{1.0} & \grhigh{0.93} & \grhigh{0.96} & \grhigh{0.98} & \grhigh{0.99} & \grhigh{0.89} & \grhigh{0.9} & \grhigh{0.95} & \grhigh{0.96} \\
\end{NiceTabular}
}
\vspace*{2mm}
\caption{Some Caption.} 
\end{table}

\end{document}

与 一样nicematrix,需要进行多次编译。

上述代码的输出

相关内容