NiceTabular:填充块旁边的垂直线悬垂

NiceTabular:填充块旁边的垂直线悬垂

我使用该nicematrix包创建了一个表格。除了一点之外,它看起来相当不错:我在多行上使用了一个填充块,其中包含一些旋转的内容。但是块旁边的垂直线没有完全闭合。底部有一个小悬垂。为什么会这样?我该如何防止这种情况?

在此处输入图片描述

\documentclass{scrreprt}

\usepackage{booktabs}
\usepackage{makecell}
  \renewcommand\theadfont{\bfseries}
\usepackage{nicematrix}
  \newcommand{\nicewidth}{\dimexpr .064\textwidth-\tabcolsep}

\begin{document}

\centering
\begin{NiceTabular}{wc{\nicewidth}|*{4}{wc{\nicewidth}}}
  \Block{2-2}{} & & \Block[fill=blue!15]{1-*}{\thead{Columns}} \\[-\aboverulesep]
  \cmidrule{3-5}
  & & \thead{X} & \thead{Y} & \thead{Z} \\
  \Block[fill=blue!15]{*-1}{\rotate\thead{Rows}} & \thead{A} & ax & ay & az \\
  & \thead{B} & bx & by & bz \\
  & \thead{C} & cx & cy & cz \\
  & \thead{D} & dx & dy & dz
\end{NiceTabular}

\end{document}

多谢!

(本主题与以下内容相关线

答案1

我编写了一个新版本(v. 5.13 of 2021/03/23),其中包含命令的nicematrix键。该键将、和之间的 (逗号分隔的) 值列表作为参数。borders\Blockleftrighttopbottom

\documentclass{scrreprt}
\usepackage{booktabs}
\usepackage{makecell}
\renewcommand\theadfont{\bfseries}
\usepackage{nicematrix}
\newcommand{\nicewidth}{\dimexpr .064\textwidth-\tabcolsep}
 
\begin{document}
\centering
\begin{NiceTabular}{wc{\nicewidth}*{4}{wc{\nicewidth}}}
  & & \Block[fill=blue!15,borders={bottom}]{1-*}{\thead{Columns}} \\
  & & \thead{X} & \thead{Y} & \thead{Z} \\
  \Block[fill=blue!15,borders=right]{*-1}{\rotate\thead{Rows}} & \thead{A} & ax & ay & az \\
  & \thead{B} & bx & by & bz \\
  & \thead{C} & cx & \Block[fill=blue!15,borders={bottom,right}]{2-2}{}cy & cz \\
  & \thead{D} & dx & dy & dz \\
\end{NiceTabular}
\end{document}

上述代码的输出

答案2

我同意这是一个问题但是这不是一个错误nicematrix

垂直规则在预期位置之后稍微结束(实际上是 0.5 \arrayrulewidth),以便在使用水平规则时有一个完美的角落。

一种解决方案是使用 Tikz 在 中绘制垂直\CodeAfter规则{NiceTabular}

也许您想要一种更加自动化的方法。

这是可能的。我在下面的代码中写了一个新命令\NewBlock。该命令执行标准命令的工作\Block,但还有一个名为的新键borders。该键的值必须是以逗号分隔的 、 和 列表northeastsouth总是west正确绘制的。

该程序不使用 的内部结构nicematrix

\documentclass{scrreprt}
\usepackage{booktabs}
\usepackage{makecell}
\renewcommand\theadfont{\bfseries}
\usepackage{nicematrix,tikz}
\newcommand{\nicewidth}{\dimexpr .064\textwidth-\tabcolsep}

\makeatletter
\ExplSyntaxOn

\clist_new:N \l__Max_borders_clist

\keys_define:nn { Max } { borders .clist_set:N = \l__Max_borders_clist }

\NewDocumentCommand { \MyBlock } { O { } m m }
  {
    \keys_set_known:nnN { Max } { #1 } \l_tmpa_tl
    \exp_args:NNV \Block [ \l_tmpa_tl ] { #2 } { #3 }
    \tl_if_empty:NF \l__Max_borders_clist
      {
        \__Max_cut_on_hyphen:n #2 \q_stop
        \tl_gput_right:Nx \g_nicematrix_code_after_tl 
          { 
             \__Max:nnnnn
               { \int_use:N \c@iRow } 
               { \int_use:N \c@jCol }
               { \int_eval:n { \c@iRow + \l_tmpa_int } }
               { \int_eval:n { \c@jCol + \l_tmpb_int } } 
               { \l__Max_borders_clist }
          }
      }
  }


\cs_new_protected:Nn \__Max:nnnnn
  { 
    \int_compare:nNnTF { #3 } > { 99 }
      { \int_set:Nn \l_tmpa_int { \c@iRow + 1 } }
      { \int_set:Nn \l_tmpa_int { #3 } }
    \int_compare:nNnTF { #4 } > { 99 }
      { \int_set:Nn \l_tmpb_int { \c@jCol + 1 } }
      { \int_set:Nn \l_tmpb_int { #4 } }
    \clist_if_in:nnT { #5 } { east }  
      { 
        \tikz \draw ([yshift=0.5\arrayrulewidth]#1-|\int_use:N\l_tmpb_int) 
          -- ([yshift=0.5\arrayrulewidth]\int_use:N\l_tmpa_int-|\int_use:N\l_tmpb_int) ; 
      }
    \clist_if_in:nnT { #5 } { west }  
      { 
        \tikz \draw ([yshift=0.5\arrayrulewidth]#1-|#2) 
          -- ([yshift=0.5\arrayrulewidth]\int_use:N\l_tmpa_int-|#2) ; 
      }
    \clist_if_in:nnT { #5 } { south }  
      { 
        \clist_if_in:nnTF { #5 } { west } { \bool_set_true:N \l_tmpa_bool } { \bool_set_false:N \l_tmpa_bool }
        \use:x 
          { 
            \exp_not:N  \tikz \exp_not:N \draw 
            ( 
              [ xshift = { \bool_if:NTF \l_tmpa_bool { - 0.5 \arrayrulewidth } { 0.5 \arrayrulewidth } } ]
              \int_use:N \l_tmpa_int -| #2
            ) 
          }
        -- 
          (
            [ xshift = 0.5 \arrayrulewidth ]
            \int_use:N \l_tmpa_int -| \int_use:N \l_tmpb_int 
          ) 
          ; 
      }
    \clist_if_in:nnT { #5 } { north }  
      { 
        \clist_if_in:nnTF { #5 } { west } { \bool_set_true:N \l_tmpa_bool } { \bool_set_false:N \l_tmpa_bool }
        \use:x 
          { 
            \exp_not:N  \tikz \exp_not:N \draw 
            ( 
              [ xshift = { \bool_if:NTF \l_tmpa_bool { - 0.5 \arrayrulewidth } { 0.5 \arrayrulewidth } } ]
              #1 -| #2
            ) 
          }
        -- ( [ xshift = 0.5 \arrayrulewidth ] #1 -| \int_use:N \l_tmpb_int ) ; 
      }
  }

\cs_new_protected:Npn \__Max_cut_on_hyphen:n #1 - #2 \q_stop 
  {
    \str_if_eq:nnTF { #1 } { * } 
      { \int_set:Nn \l_tmpa_int { 100 } }
      { \int_set:Nn \l_tmpa_int { #1 } }
    \str_if_eq:nnTF { #2 } { * } 
      { \int_set:Nn \l_tmpb_int { 100 } }
      { \int_set:Nn \l_tmpb_int { #2 } }
  }

\ExplSyntaxOff
\makeatother

\begin{document}
\centering
\begin{NiceTabular}{wc{\nicewidth}*{4}{wc{\nicewidth}}}
  & & \MyBlock[fill=blue!15,borders={south}]{1-*}{\thead{Columns}} \\
  & & \thead{X} & \thead{Y} & \thead{Z} \\
  \MyBlock[fill=blue!15,borders=east]{*-1}{\rotate\thead{Rows}} & \thead{A} & ax & ay & az \\
  & \thead{B} & bx & by & bz \\
  & \thead{C} & cx & \MyBlock[fill=blue!15,borders={south,east}]{2-2}{}cy & cz \\
  & \thead{D} & dx & dy & dz \\
\end{NiceTabular}
\end{document}

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

上述代码的输出

相关内容