Горизонтальные линии переменной ширины с \cline вторгаются в текст ячейки

Горизонтальные линии переменной ширины с \cline вторгаются в текст ячейки

Я пришел, чтобы узнать, как сделать горизонтальную линейку переменной ширины с помощью\hlineиз компаньона LaTeX и с\клинотГоризонтальная линейка с регулируемой высотой, ведущая себя как \cline{nm}. Но проблема с горизонтальным\клинзаключается в том, что правило вторгается в тексты в ячейках ниже\клин. Однако,\hlineпохоже, не имеет этой вторгающейся проблемы. Минимальный рабочий пример ниже показывает различия.

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

Верхняя картинка в основном использовала \hline; нижняя — \cline.

Еще одна проблема с использованием\клинв определении толстой горизонтальной линии (whlineвыше) это то, что\cellcolorкоманда сотрет часть горизонтальной линии, которая находится над ячейкой, независимо от того, насколько толстую я определилwhlineбыть. Используя\hlineв определенииwhlineне вызывает этой проблемы при использовании цветов в ячейке.

Я подозреваю, что вертикальное положение, начиная ниже которого находится территория клетки, для\hlineи для\клинотличается. Для\hline, ячейка начинается ниже нижней границы горизонтальной линейки, тогда как для\клин, ячейка начинается ниже верхней границы правила? Кто-нибудь просветите меня, пожалуйста!

ПРИМЕЧАНИЕ: Я хочу использовать переменную ширину\клин(толстый или тонкий, как показано в примере), но я хочу избежать этих неприятных проблем.

решение1

Обе проблемы связаны. \clineдолжен поддерживать несколько \clines подряд, например:

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

Пример \cline

Поэтому \clineне может двигаться вниз, как \hline, определение \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}}

На последнем этапе \clineвозвращается в исходное вертикальное положение.

Но вертикальный пробел для строки можно добавить после \clines, например:

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

Применительно к вашему примеру, его можно добавить в макрос \whline. Это также исправит проблему с \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}

Результат

решение2

Вот пример Хейко, использующего calspackage в качестве альтернативы:

таблица cals с изменяемыми границами и цветом

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

решение3

Альтернативное решение с tblrокружающей средойtabularrayупаковка:

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

введите описание изображения здесь

решение4

Пакет nicematrixпредоставляет среду {NiceTabular}, и в этой среде команда \clineбыла переопределена для изменения этого поведения.

Итак, ваш код работает так, как и ожидалось в {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}

Вам потребуется несколько компиляций (т.к. nicematrixиспользуются узлы PGF/Tikz).

Вывод вышеуказанного кода

Связанный контент