如何在使用不同颜色和宽度的 cmidrule 时省略垂直重新对齐

如何在使用不同颜色和宽度的 cmidrule 时省略垂直重新对齐

问题

假设我想在同一行中设置两种不同颜色的多个规则...我该如何实现呢?

这是一个简单的例子:

\documentclass{article}
\usepackage{colortbl}
\usepackage{booktabs} 


\begin{document}

    \begin{table}[ht]
        \begin{tabular}{llll}
            \toprule
            A & B & alpha & beta\\
            \arrayrulecolor{black} \cmidrule[1pt](l){1-1} \arrayrulecolor{red} \cmidrule[1pt](r){2-2} \arrayrulecolor{black} \cmidrule[1pt](l){3-3} \arrayrulecolor{black} \cmidrule[1pt](r){4-4}
            1 & 5 & 10 &    100\\
            2 & 6 & 11 &    101\\
            2 & 7 & 12 &    102\\
            3 & 8 & 13 &    103\\
            \bottomrule
        \end{tabular}
    \end{table}

\end{document}

实际情况是,每次调用时\arrayrulecolor{},相应的 cmidrule 都会向下移动。

结果

解决办法是改正定位的宏,但是存在问题。

先前解决方案的问题

这里提到的解决办法:当使用不同颜色的 cmidrule 时,如何省略垂直重新调整?不能正确处理不同的宽度

\documentclass{article}
\usepackage{colortbl}
\usepackage{booktabs} 

\newcommand{\corcmidrule}[1][2pt]{% \corcmidrule[<len>]
    \\[\dimexpr-\normalbaselineskip-\belowrulesep-\aboverulesep-#1\relax]%
}

\begin{document}

    \begin{table}[ht]
        \begin{tabular}{llll}
            \toprule
            A & B & alpha & beta\\
            \arrayrulecolor{black}\cmidrule[1pt](l){1-1} 
            \corcmidrule[2pt]\arrayrulecolor{black}\cmidrule[2pt](r){2-2} 
            \corcmidrule[5pt]\arrayrulecolor{black}\cmidrule[5pt](l){3-3} 
            \corcmidrule[1pt]\arrayrulecolor{black}\cmidrule[1pt](r){4-4}
            1 & 5 & 10 &    100\\
            2 & 6 & 11 &    101\\
            2 & 7 & 12 &    102\\
            3 & 8 & 13 &    103\\
            \bottomrule
        \end{tabular}
    \end{table}

\end{document}

在此处输入图片描述

这有什么问题?考虑一下如果没有宏它会是什么样子:

\documentclass{article}
\usepackage{colortbl}
\usepackage{booktabs} 

\newcommand{\corcmidrule}[1][2pt]{% \corcmidrule[<len>]
    \\[\dimexpr-\normalbaselineskip-\belowrulesep-\aboverulesep-#1\relax]%
}

\begin{document}

    \begin{table}[ht]
        \begin{tabular}{llll}
            \toprule
            A & B & alpha & beta\\
            \arrayrulecolor{black}\cmidrule[1pt](l){1-1} 
            \cmidrule[2pt](r){2-2} 
            \cmidrule[5pt](l){3-3} 
            \cmidrule[1pt](r){4-4}
            1 & 5 & 10 &    100\\
            2 & 6 & 11 &    101\\
            2 & 7 & 12 &    102\\
            3 & 8 & 13 &    103\\
            \bottomrule
        \end{tabular}
    \end{table}
    
\end{document}

在此处输入图片描述

看来这些是正确的调整。

\begin{table}[ht]
    \begin{tabular}{llll}
        \toprule
        A & B & alpha & beta\\
                         \arrayrulecolor{black}\cmidrule[1pt](l){1-1} 
        \corcmidrule[1pt]\arrayrulecolor{black}\cmidrule[2pt](r){2-2} 
        \corcmidrule[3pt]\arrayrulecolor{black}\cmidrule[5pt](l){3-3} 
        \corcmidrule[5pt]\arrayrulecolor{black}\cmidrule[1pt](r){4-4}
        1 & 5 & 10 &    100\\
        2 & 6 & 11 &    101\\
        2 & 7 & 12 &    102\\
        3 & 8 & 13 &    103\\
        \bottomrule
    \end{tabular}
\end{table}

一个更大的例子

\begin{table}[ht]
    \begin{tabular}{lllll}
        \toprule
        A & B & alpha & beta & gamma\\
        \arrayrulecolor{black}\cmidrule[1pt](l){1-1} 
        \corcmidrule[1pt]\arrayrulecolor{black}\cmidrule[2pt](){2-2} 
        \corcmidrule[2pt]\arrayrulecolor{black}\cmidrule[2pt](){3-3} 
        \corcmidrule[2pt]\arrayrulecolor{black}\cmidrule[5pt](){4-4} 
        \corcmidrule[5pt]\arrayrulecolor{black}\cmidrule[1pt](){5-5}
        1 & 5 & 10 &    100 & 1\\
        2 & 6 & 11 &    101 & 1\\
        2 & 7 & 12 &    102 & 1\\
        3 & 8 & 13 &    103 & 1\\
        \bottomrule
    \end{tabular}
\end{table}

这能放进宏里吗?需要拉动前一个规则的宽度。

答案1

这里是一条命令的编程,它可能在 的\MyRule环境中完成这项工作。{NiceTabular}nicematrix

的语法\MyRule如下:\MyRule[#1](#2){#3-#4}

参数#1#2是可选的。

  • #1是以下列表核心价值对。截至目前,有两个键:colorwidth
  • #2包含rl或两者(用于指定修剪);
  • #3是第一列的编号;
  • #4是最后一列的编号。

\documentclass{article}
\usepackage{nicematrix}
\usepackage{tikz}

\ExplSyntaxOn

\keys_define:nn { MyRule }
  {
    color .tl_set:N = \l__MyRule_color_tl , 
    color .value_required:n = true ,
    width .dim_set:N = \l__MyRule_width_dim ,
    width .value_required:n = true ,
    width .initial:n = \arrayrulewidth ,
    style .value_required:n = true ,
    style .tl_set:N = \l__MyRule_style_tl
  }

\NewDocumentCommand { \MyRule } { O { } D ( ) { } m }
  {
    \exp_args:Nx \__MyRule_i:nnnn 
    { \int_use:c { c@iRow } } { #1 } { #2 } { #3 } 
  }

\cs_new_protected:Nn \__MyRule_i:nnnn
  {
    \tl_gput_right:Nn \g_nicematrix_code_after_tl 
      { \__MyRule_ii:nnnn { #1 } { #2 } { #3 } { #4 } }
    \peek_remove_spaces:n { }
  }

\cs_new_protected:Nn \__MyRule_ii:nnnn
  {
    \group_begin:
    \keys_set:nn { MyRule } { #2 }
    \__MyRule_iii:w #4 \q_stop
    \begin { tikzpicture }
    \pgfsetlinewidth { \l__MyRule_width_dim }
    \tl_if_empty:NF \l__MyRule_color_tl    
      { \pgfsetstrokecolor { \l__MyRule_color_tl } }
    \tl_if_in:nnTF { #3 } { l }
      { \dim_set:Nn \l_tmpa_dim { 1 mm } }
      { \dim_zero:N \l_tmpa_dim }
    \tl_if_in:nnTF { #3 } { r }
      { \dim_set:Nn \l_tmpa_dim { 1 mm } }
      { \dim_zero:N \l_tmpa_dim }
    \tl_if_empty:NF \l__MyRule_line_style_tl
      { \tikzset { every~path/.style = \l__MyRule_style_tl  } }
    \draw ([xshift=\l_tmpa_dim,yshift=-\l__MyRule_width_dim/2] #1 
             -| \int_use:N \l_tmpa_int ) --
          ([xshift=-\l_tmpa_dim,yshift=-\l__MyRule_width_dim/2] #1 
             -| \int_use:N \l_tmpb_int )  ;
    \end { tikzpicture }
    \group_end:
  }

\cs_new_protected:Npn \__MyRule_iii:w #1 - #2 \q_stop
  {
    \int_set:Nn \l_tmpa_int { #1 }
    \int_set:Nn \l_tmpb_int { #2 + 1 }
  }

\ExplSyntaxOff


\begin{document}

\renewcommand{\arraystretch}{1.4}
\begin{NiceTabular}{ccccc}
AAA & BBBBBB & CCC & DDDDDDD & EEEE \\
\MyRule[color=red](r){2-2} \MyRule[color=blue,width=1pt](lr){3-3} \MyRule[width=2pt](l){4-5}
QQQQQ & CCCC & DDDDDDD & JJJJJJJJ & KKK\\
\MyRule[color=red,style=dotted,width=1pt]{2-3}
QQQQQ & CCCC & DDDDDDD & JJJJJJJJ & QQQQQ
\end{NiceTabular}

\end{document}

您需要多次编译(因为nicematrix使用 PGF/Tikz 节点)。

上述代码的输出

相关内容