
Aprendi como fazer uma régua horizontal de largura variável com\hlinedo companheiro LaTeX e com\clinedeRégua horizontal com altura ajustável comportando-se como \cline{nm}. Mas o problema com a horizontal\clineé que a regra se intromete nos textos nas células abaixo do\cline. No entanto,\hlinenão parece ter esse problema intrusivo. O exemplo mínimo de trabalho abaixo mostra as diferenças.
\documentclass{article}
\usepackage{array}
\begin{document}
\newcolumntype{I}{!{\vrule width 3pt}}
\newlength\savedwidth
\newcommand\whline{\noalign{\global\savedwidth\arrayrulewidth\global\arrayrulewidth 6pt}%
\hline
\noalign{\global\arrayrulewidth\savedwidth}}
\begin{tabular}{|cIc|c|}\hline
A & B & C \\ \hline
X & Y & Z \\ \whline
100 & 10 & 1 \\ \hline
\end{tabular}
\renewcommand\whline[1]{\noalign{\global\savedwidth\arrayrulewidth\global\arrayrulewidth 6pt}%
\cline{#1}
\noalign{\global\arrayrulewidth\savedwidth}}
\begin{tabular}{|cIc|c|}\hline
A & B & C \\ \hline
X & Y & Z \\ \whline{1-3}
100 & 10 & 1 \\ \hline
\end{tabular}
\end{document}
Outro problema com o uso\clinena definição da regra horizontal espessa (linhaacima) é que um\cellcolorO comando apagará a parte da régua horizontal que está acima da célula, não importa a espessura que eu tenha definido alinhaser. Usando\hlinena definição delinhanão causa esse problema ao usar cores em uma célula.
Suspeito que a posição vertical, começando abaixo da qual está o território de uma célula, por\hlinee para\clinedifere. Para\hline, uma célula começa abaixo do limite inferior da regra horizontal, enquanto para\cline, uma célula começa abaixo do limite superior da regra? Alguém me esclareça, por favor!
OBSERVAÇÃO: Eu quero usar largura variável\cline(grosso ou fino como o exemplo mostrou), mas quero evitar esses problemas intrusivos.
Responder1
Ambos os problemas estão relacionados. \cline
tem que suportar vários \cline
s seguidos, por exemplo:
\documentclass{article}
\begin{document}
\begin{tabular}{*{5}{c}}
1 & 2 & 3 & 4 & 5\\
\cline{1-1}\cline{3-3}\cline{5-5}
A & B & C & D & E
\end{tabular}
\end{document}
Portanto, \cline
não é possível descer como \hline
, a definição de \cline
é ( latex.ltx
):
\def\cline#1{\@cline#1\@nil}
\def\@cline#1-#2\@nil{%
\omit
\@multicnt#1%
\advance\@multispan\m@ne
\ifnum\@multicnt=\@ne\@firstofone{&\omit}\fi
\@multicnt#2%
\advance\@multicnt-#1%
\advance\@multispan\@ne
\leaders\hrule\@height\arrayrulewidth\hfill
\cr
\noalign{\vskip-\arrayrulewidth}}
Na última etapa \cline
volta à posição vertical original.
Mas o espaço vertical para a linha pode ser adicionado após o \cline
s, por exemplo:
\cline{...}\cline{...}\noalign{\vskip\arrayrulewidth}
Aplicado ao seu exemplo, ele pode ser adicionado a macro \whline
. Isso também corrige o problema com \cellcolor
:
\documentclass{article}
\usepackage{array}
\usepackage{colortbl}
\begin{document}
\newcolumntype{I}{!{\vrule width 3pt}}
\newlength\savedwidth
\newcommand\whline[1]{%
\noalign{%
\global\savedwidth\arrayrulewidth\global\arrayrulewidth 6pt%
}%
\cline{#1}%
\noalign{\vskip\arrayrulewidth}%
\noalign{\global\arrayrulewidth\savedwidth}%
}
\begin{tabular}{|cIc|c|}\hline
A & B & C \\ \hline
X & \cellcolor{red}Y & Z \\ \whline{1-3}
\cellcolor{green}100 & 10 & 1 \\ \hline
\end{tabular}
\end{document}
Responder2
Aqui está o exemplo de Heiko usando cals
package como alternativa:
\documentclass{article}
\usepackage{xcolor}
\usepackage{cals}
\begin{document}
\begin{calstable}
\colwidths{{10mm}{10mm}{10mm}}
\makeatletter
\brow
\cell{A}
\def\cals@borderL{2pt}\cell{B}\let\cals@borderL=\relax
\cell{C}
\erow
\brow
\def\cals@borderB{3pt}
\cell{X}
\def\cals@borderL{2pt}\def\cals@bgcolor{red}
\cell{Y}\let\cals@borderL=\relax\def\cals@bgcolor{}
\cell{Z}
\erow
\let\cals@borderB=\relax
\brow
\def\cals@bgcolor{green}\cell{100}\def\cals@bgcolor{}
\def\cals@borderL{2pt}\cell{10}\let\cals@borderL=\relax
\cell{1}
\erow
\end{calstable}
\end{document}
Responder3
Uma solução alternativa com tblr
ambiente detabularray
pacote:
\documentclass{article}
\usepackage{tabularray}
\begin{document}
\begin{tblr}{|c|[3pt]c|c|}
\hline
A & B & C \\
\cline[3pt]{1-2}
X & Y & Z \\
\hline[6pt]
100 & 10 & 1 \\
\hline
\end{tblr}
\end{document}
Responder4
O pacote nicematrix
fornece um ambiente {NiceTabular}
e, neste ambiente, o comando \cline
foi redefinido para alterar esse comportamento.
Portanto, seu código funciona conforme o esperado em {NiceTabular}
.
\documentclass{article}
\usepackage{nicematrix}
\begin{document}
\newcolumntype{I}{!{\vrule width 3pt}}
\newlength\savedwidth
\newcommand\whline[1]
{\noalign{\global\savedwidth\arrayrulewidth\global\arrayrulewidth 6pt}%
\cline{#1}
\noalign{\global\arrayrulewidth\savedwidth}}
\begin{NiceTabular}{|cIc|c|}
\hline
A & B & C \\ \hline
X & Y & Z \\ \whline{1-3}
100 & 10 & 1 \\ \hline
\end{NiceTabular}
\end{document}
Você precisa de várias compilações (porque nicematrix
usa nós PGF/Tikz).