Horizontale Linien variabler Breite mit \cline dringen in den Zellentext ein

Horizontale Linien variabler Breite mit \cline dringen in den Zellentext ein

Ich habe gelernt, wie man eine horizontale Linie mit variabler Breite erstellt mit\hlineaus dem LaTeX-Begleiter und mit\clineausHorizontales Lineal mit einstellbarer Höhe, das sich wie \cline{nm} verhältAber das Problem mit der horizontalen\clineist, dass die Regel in die Texte in den Zellen unter dem\cline. Jedoch,\hlinescheint dieses störende Problem nicht zu haben. Das minimale funktionierende Beispiel unten zeigt die Unterschiede.

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

Im oberen Bild wurde im Wesentlichen \hline verwendet; im unteren Bild wurde \cline verwendet.

Ein weiteres Problem bei der Verwendung\clinein der Definition der dicken horizontalen Linie (wolfgangoben) ist, dass ein\ZellenfarbeBefehl löscht den Teil der horizontalen Linie, der über der Zelle liegt, unabhängig davon, wie dick ich die Linie definiert habe.wolfgangzu sein. Verwenden\hlinein der Definition vonwolfgangDieses Problem tritt nicht auf, wenn in einer Zelle Farben verwendet werden.

Ich vermute, dass die vertikale Position, unterhalb derer sich das Territorium einer Zelle befindet, für\hlineund für\clineunterscheidet sich. Für\hlinebeginnt eine Zelle unterhalb der unteren Grenze der horizontalen Linie, während für\cline, eine Zelle beginnt unterhalb der oberen Grenze der Regel? Kann mich bitte jemand aufklären?

NOTIZ: Ich möchte variable Breite verwenden\cline(entweder dick oder dünn, wie im Beispiel gezeigt), aber ich möchte diese störenden Probleme vermeiden.

Antwort1

Beide Probleme hängen zusammen. \clinemuss mehrere \clines hintereinander unterstützen, zB:

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

Beispiel \cline

Daher \clinekann sich nicht wie nach unten bewegen \hline, die Definition von \clineist ( 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}}

Im letzten Schritt \clinekehrt man in die vertikale Ausgangsposition zurück.

Der vertikale Abstand für die Zeile kann jedoch nach dem \cline„s“ hinzugefügt werden, zB:

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

Auf Ihr Beispiel angewendet, kann es zu Makro hinzugefügt werden \whline. Dies behebt auch das Problem mit \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}

Ergebnis

Antwort2

Hier ist Heikos Beispiel, in dem calsals Alternative das Paket verwendet wird:

cals-Tabelle mit variablen Rändern und Farben

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

Antwort3

Eine alternative Lösung mit tblrUmgebung vontabularrayPaket:

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

Bildbeschreibung hier eingeben

Antwort4

Das Paket nicematrixstellt eine Umgebung bereit {NiceTabular}, und in dieser Umgebung \clinewurde der Befehl neu definiert, um dieses Verhalten zu ändern.

Ihr Code funktioniert also wie erwartet in {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}

Sie benötigen mehrere Kompilierungen (da nicematrixPGF/Tikz-Knoten verwendet werden).

Ausgabe des obigen Codes

verwandte Informationen