帶有 \cline 的可變寬度水平線侵入單元格文本

帶有 \cline 的可變寬度水平線侵入單元格文本

我開始學習如何製作可變寬度的水平尺\h行來自 LaTeX 伴侶並與\cline高度可調的水平尺,其行為類似 \cline{nm}。但橫向的問題\cline是該規則侵入了下面單元格中的文本\cline。然而,\h行似乎沒有這個入侵問題。下面的最小工作範例顯示了差異。

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

使用時還有一個問題\cline在粗水平標尺的定義中(哀嚎上面)是一個\細胞顏色命令將擦除單元格上方的水平線部分,無論我定義的厚度有多厚哀嚎成為。使用\h行在定義中哀嚎在單元格中使用顏色不會導致此問題。

我懷疑垂直位置,從下面開始是細胞的領土,對於\h行並為\cline不同。為了\h行,單元格從水平線的底部邊界下方開始,而對於\cline,單元格從規則的頂部邊界下方開始?請任何人賜教!

筆記:我確實想使用可變寬度\cline(像範例所示的厚或薄),但我想避免這些侵入性問題。

答案1

這兩個問題都是相關的。\cline必須支援\cline連續幾個 s,例如:

\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移回原來的垂直位置。

但可以在 s 之後添加該行的垂直空間\cline,例如:

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

應用於您的範例,可以將其新增至 Macro 中\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

這是 Heiko 使用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 節點)。

上述程式碼的輸出

相關內容