问题
假设我想在同一行中设置两种不同颜色的多个规则...我该如何实现呢?
这是一个简单的例子:
\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
是以下列表核心价值对。截至目前,有两个键:color
和width
;#2
包含r
,l
或两者(用于指定修剪);#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 节点)。