Reglas horizontales de ancho variable con \cline intruyen el texto de la celda

Reglas horizontales de ancho variable con \cline intruyen el texto de la celda

He llegado a aprender cómo hacer una regla horizontal de ancho variable con\hlinedel compañero LaTeX y con\clinadeRegla horizontal con altura ajustable que se comporta como \cline{nm}. Pero el problema con la horizontal.\clinaes que la regla se entromete en los textos de las celdas debajo del\clina. Sin embargo,\hlineNo parece tener este problema de intrusión. El ejemplo de trabajo mínimo a continuación muestra las diferencias.

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

La imagen superior utiliza esencialmente \hline; el de abajo usaba \cline.

Otro problema con el uso\clinaen la definición de la regla horizontal gruesa (línea blancaarriba) es que un\cellcolorEl comando borrará la parte de la regla horizontal que está encima de la celda, sin importar qué tan gruesa haya definido lalínea blancaser. Usando\hlineen la definición delínea blancano causa este problema con el uso de colores en una celda.

Sospecho que la posición vertical, comenzando debajo de la cual está el territorio de una celda, por ejemplo\hliney para\clinadifiere. Para\hline, una celda comienza debajo del límite inferior de la regla horizontal, mientras que para\clina, ¿una celda comienza debajo del límite superior de la regla? ¡Alguien que me ilumine por favor!

NOTA: Quiero usar ancho variable\clina(ya sea grueso o delgado como se muestra en el ejemplo), pero quiero evitar estos problemas molestos.

Respuesta1

Ambos problemas están relacionados. \clinetiene que soportar varios \clines seguidos, por ejemplo:

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

Ejemplo \clina

Por lo tanto, \clineno puede moverse hacia abajo como \hline, la definición de \clinees ( 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}}

En el último paso \clinevuelve a la posición vertical original.

Pero el espacio vertical para la línea se puede agregar después de la \clines, por ejemplo:

\cline{...}\cline{...}\noalign{\vskip\arrayrulewidth}

Aplicado a su ejemplo, se puede agregar a macro \whline. Esto también soluciona el problema con \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

Respuesta2

Aquí está el ejemplo de Heiko usando calsel paquete como alternativa:

tabla de cals con bordes y colores variables

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

Respuesta3

Una solución alternativa con tblrentorno detabularraypaquete:

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

ingrese la descripción de la imagen aquí

Respuesta4

El paquete nicematrixproporciona un entorno {NiceTabular}y, en este entorno, el comando \clinese ha redefinido para cambiar ese comportamiento.

Entonces, su código funciona como se esperaba en {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}

Necesita varias compilaciones (porque nicematrixusa nodos PGF/Tikz).

Salida del código anterior

información relacionada