我使用该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
\Block
left
right
top
bottom
\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
。该键的值必须是以逗号分隔的 、 和 列表north
。east
角south
总是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
您需要进行多次编译。