如何正确地对角线划分表格单元格?

如何正确地对角线划分表格单元格?

曾经有许多讨论解决方案的帖子在表格单元格中绘制对角线的任务。还有两个包可以执行此操作,并且使用命令slashbox看起来更好。显然,看起来更好并不意味着好看。我刚刚从其中一个线程中偷了一个 MWE:makecell\diagheadhttps://tex.stackexchange.com/a/11694/13450

\documentclass{standalone}
\usepackage{makecell}
\begin{document}
\begin{tabular}{|l|c|c|}\hline
\diaghead{\theadfont Diag ColumnmnHead II}%
{Diag\\Column Head I}{Diag Column\\Head II}&
\thead{Second\\column}&\thead{Third\\column}\\
\hline
& foo & bar \\
\hline
\end{tabular}
\end{document}

结果是:

MWE 的结果

在这种低分辨率下乍一看还算不错(顺便说一下,情况并非总是如此),但在更高的分辨率下,右下角看起来有些尴尬:

线的终点似乎不在线的交叉处

这些东西甚至在打印时也显示出来,而且看起来不像只偏离一个像素,所以它可能不仅仅是一个渲染问题。

有谁知道为什么会发生这种情况以及如何防止它?(最好不要像建议的那样将整个表格绘制为 TikZ 图片。)


针对约瑟夫的回答进行编辑:

Leo Liu 的 TikZ 解决方案也存在类似问题https://tex.stackexchange.com/a/17748

TikZ 截图两端伸出

看起来它也相当手动,所以也许这只是一个校准问题。但是,每次更改“对角线单元格”(找不到更好的词)的内容时,真的有必要在 Adob​​e Reader 中降低到 6400% 级别来微调参数吗?

答案1

tikz 解决方案给出表格单元格中的对角线由 Leo Liu 提出的问题可以通过考虑节点边框的宽度来修复(即使没有绘制这些边框)。

以下 MWE 给出了正确的结果:

\documentclass[11pt]{article}
\usepackage[T1]{fontenc}
\usepackage{array}
\usepackage{makecell}
\newcolumntype{x}[1]{>{\centering\arraybackslash}p{#1}}
\usepackage{tikz}
\newcommand\diag[4]{%
  \multicolumn{1}{p{#2}|}{\hskip-\tabcolsep
  $\vcenter{\begin{tikzpicture}[baseline=0,anchor=south west,inner sep=#1]
  \path[use as bounding box] (0,0) rectangle (#2+2\tabcolsep,\baselineskip);
  \node[minimum width={#2+2\tabcolsep-\pgflinewidth},
        minimum  height=\baselineskip+\extrarowheight-\pgflinewidth] (box) {};
  \draw[line cap=round] (box.north west) -- (box.south east);
  \node[anchor=south west] at (box.south west) {#3};
  \node[anchor=north east] at (box.north east) {#4};
 \end{tikzpicture}}$\hskip-\tabcolsep}}

\begin{document}
\setlength{\extrarowheight}{0.1cm}
\begin{tabular}{|x{0.5cm}|x{0.5cm}|x{0.5cm}|x{0.5cm}|x{0.5cm}|}\hline
&&&&20\\ \hline
&&&&30\\ \hline
&&&&45\\ \hline
15&12&18&50&\diag{.1em}{.5cm}{$a_i$}{$b_j$}\\ \hline
\end{tabular}
\end{document}

细节:

细节

答案2

makecell软件包使用 LaTeXpicture环境进行绘图。它不使用特殊字体,而是使用存储在适当字体中的预绘制图形元素。但是,这种方法只能提供固定范围的线条斜率(还有其他限制)。这里似乎发生的情况是,它makecell使用最接近的高度/宽度,但这意味着宽度可能会超出一定量,这取决于实际高度/宽度比和最接近的可用线条斜率之间的差异。

具体来说,\diaghead有一个可选的 ratio 参数,用于设置高宽比,但这必须是整数值(尝试)。因此,即使有更多扩展支持(例如包) \diaghead(5,-2.5),代码也不允许我们绕过可用的固定比率。pictureeepic

使用 TikZ 可以避免这个问题,因为线条随后会被绘制成特殊形状,可以是任意角度。(特殊形状的限制取决于驱动程序,而不是可用的字体)。还值得注意的是,TikZ 从一开始就假设浮点值,因此可以正确处理计算。

解决这个问题的方法有很多种表格单元格中的对角线(特别参见Leo Liu 的回答,它只使用 TikZ 来处理分裂细胞)。diagbox包也可用:它使用pict2e来实现分箱。

答案3

使用{NiceTabular}及其nicematrix内置命令\diagbox,您将获得完美的输出,因为对角线规则是由 PGF/Tikz 绘制的。

\documentclass{standalone}
\usepackage{nicematrix}

\begin{document}

\begin{NiceTabular}{|w{l}{4cm}|c|c|}\hline
\rule[-5mm]{15mm}{0cm}
\diagbox{Diag\\ Column Head I}{Diag Column\\Head II}&
\Block{}{Second\\column}&\Block{}{Third\\column}\\
\hline
& foo & bar \\
\hline
\end{NiceTabular}

\end{document}

由于 PGF/Tikz 节点,您需要进行多次编译。

上述代码的输出

使用缩放:

放大规则的交叉点

相关内容