Regras horizontais de largura variável com texto de célula de intrusão \cline

Regras horizontais de largura variável com texto de célula de intrusão \cline

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}

Imagem superior usada essencialmente \hline; o de baixo usou \cline.

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. \clinetem que suportar vários \clines 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}

Exemplo \cline

Portanto, \clinenã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 \clinevolta à posição vertical original.

Mas o espaço vertical para a linha pode ser adicionado após o \clines, 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}

Resultado

Responder2

Aqui está o exemplo de Heiko usando calspackage como alternativa:

tabela cals com bordas e cores variáveis

\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 tblrambiente detabularraypacote:

\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}

insira a descrição da imagem aqui

Responder4

O pacote nicematrixfornece um ambiente {NiceTabular}e, neste ambiente, o comando \clinefoi 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 nicematrixusa nós PGF/Tikz).

Saída do código acima

informação relacionada