我的任务是制作一张如下所示的表格:
到目前为止的好事是:我已经成功制作了这张表。
缺点:我无法将其包含在正常的 \begin{table}\end{table} 环境中,因为看不到表格的边界框。所有文本都覆盖在表格上
希望有人能解决这个问题。要么给我一个创建此表的替代方法,要么修复我代码中的错误
下面的代码使用了我在这里找到的其他答案中的内容:圆角演示如何使表格周围有圆角。问题是:我希望第一行的列标题在上方有圆角。
我的解决方法很简单:只需调整表格的剪辑,使第一列变成圆角,立即向上,然后转到另一侧:
------------------------------
R-| heading cols |
|first grey col value cols |
| |
R---------------------------------
我想在 R 的位置添加圆角。
我想到的代码很长,我会在这里添加它。它是独立的。这个剪辑想法来自第一个链接。另外,我添加了一个 tikzmark A,因为我希望剪辑路径自动连接到第一行的底部。这个想法受到这个例子的启发在角落添加 tikznode为了得到这个点A的y坐标,我用了这个想法提取 y 坐标
这是代码,可以独立运行
\documentclass{article}
\usepackage[dvipsnames,table]{xcolor}
\usepackage{array}
\usepackage{environ}
\usepackage{blindtext}
\usepackage{tikz}
\usepackage{etex}
\usetikzlibrary{calc, tikzmark}
\definecolor{lichtgrijs}{RGB}{236,236,236}
\newcolumntype{L}{>{\columncolor{lichtgrijs}}l}
\newsavebox{\tablebox}
\NewEnviron{rndtable}[1]{%
\addtolength{\extrarowheight}{1ex}%
\savebox{\tablebox}{%
\begin{tabular}{#1}%
\BODY%
\end{tabular}}%
\begin{tikzpicture} [overlay, remember picture]
\ExtractCoordinate{$(pic cs:A)$}
\begin{scope}
\useasboundingbox;
\clip[rounded corners=1ex]
(0,-\dp\tablebox) --
(\wd\tablebox,-\dp\tablebox) --
(\wd\tablebox,\ht\tablebox)
{
[rounded corners=0ex]--
(1ex,\ht\tablebox) --
(1ex,\YCoord-\RowDepth)}--
%(1ex,\ht\tablebox-3ex)}--
(0,\YCoord-\RowDepth) --
cycle;
\node at (0,-\dp\tablebox) [anchor=south west,inner sep=0pt]{\usebox{\tablebox}};
\end{scope}
\end{tikzpicture}
}
\begin{document}
\setlength\arrayrulewidth{1.2pt}
\edef\RowDepth{\the\dimexpr\arraystretch\dimexpr.3\baselineskip\relax\relax}
\newdimen\XCoord
\newdimen\YCoord
\newcommand*{\ExtractCoordinate}[1]{\path (#1); \pgfgetlastxy{\XCoord}{\YCoord};}%
%\blindtext[10]
%\begin{table}[tbp]
% \caption{bla}
\begin{rndtable}{Llr}
\rowcolor{white}
\tikzmark{A}
\textbf{Label} & \textbf{Naam} & \textbf{Leeftijd}\\
\arrayrulecolor{lichtgrijs} \hline
GK & Paul Robinson & 45\\
LB & Lucus Radebe & 23\\
DC & Michael Duberry & 84\\
DC & Dominic Matteo & 22\\
RB & Didier Domi & 34\\
MC & David Batty & 5\\
MC & Eirik Bakke & 58\\
MC & Jody Morris & 75\\
FW & Jamie McMaster & 13\\
ST & Alan Smith & 70\\
ST & Mark Viduka & 30\\
\arrayrulecolor{lichtgrijs}\hline
\end{rndtable}
%\end{table}
%\blindtext[10]
\end{document}
该代码可以运行并生成我刚刚展示的表格。
但是,显然当我包含 \begin{table} 时,表格的大小根本无法识别。如果我将文本放在表格周围(通过取消注释 blindtext 和 begin{table}),文本就会超出表格。我怀疑这与覆盖选项或我使用的保存框有关。不幸的是,我无法解决这个问题。它看起来像这样:
谁知道我该如何修复这个脚本,以便可以在表格环境中正确使用它?
任何提示都值得赞赏!
问候
埃尔科
编辑:
Marmot 建议移除覆盖并使用 useasboundingbox,这个建议可行。现在至少可以将表格很好地放入表格环境中。
然而:出现了一个新问题;当我想包含两个或更多表格时,每次运行代码时表格都会获得另一个位置。例如,你可以这样做
\blindtext[1]
\begin{table}[tbp]
\caption{First table}
\begin{rndtable}{Llr}
\rowcolor{white}
\tikzmark{A}
\textbf{Label} & \textbf{Naam} & \textbf{Leeftijd}\\
\arrayrulecolor{lichtgrijs} \hline
GK & Paul Robinson & 45\\
MC & Jody Morris & 75\\
FW & Jamie McMaster & 13\\
ST & Alan Smith & 70\\
ST & Mark Viduka & 30\\
\arrayrulecolor{lichtgrijs}\hline
\end{rndtable}
\end{table}
\blindtext[1]
\begin{table}[tbp]
\caption{Another table}
\begin{rndtable}{Llr}
\rowcolor{white}
\tikzmark{A}
\textbf{Label} & \textbf{Naam} & \textbf{Leeftijd}\\
\arrayrulecolor{lichtgrijs} \hline
GK & Paul Robinson & 45\\
LB & Lucus Radebe & 23\\
DC & Michael Duberry & 84\\
MC & Jody Morris & 75\\
FW & Jamie McMaster & 13\\
ST & Alan Smith & 70\\
ST & Mark Viduka & 30\\
\arrayrulecolor{lichtgrijs}\hline
\end{rndtable}
\end{table}
\blindtext[1]
\begin{table}[tbp]
\caption{Last table}
\begin{rndtable}{Llr}
\rowcolor{white}
\tikzmark{A}
\textbf{Label} & \textbf{Naam} & \textbf{Leeftijd}\\
\arrayrulecolor{lichtgrijs} \hline
GK & Paul Robinson & 45\\
LB & Lucus Radebe & 23\\
DC & Michael Duberry & 84\\
MC & Jody Morris & 75\\
FW & Jamie McMaster & 13\\
ST & Alan Smith & 70\\
ST & Mark Viduka & 30\\
\arrayrulecolor{lichtgrijs}\hline
\end{rndtable}
\end{table}
这确实会生成三个表,每个表都在自己的环境中,但每次运行代码时它们都会获得另一个位置。此外,辅助文件每次运行时都会发生变化。这可能与我使用的全局变量 XCoord 和 YCoord 以及 savebox 技巧有关。但我需要它们才能找到上行的位置并正确剪辑它。所以我想出的这个解决方案仍然不可用。
有人知道如何解决这个问题吗?
编辑2:
Marmot 建议省略 ExtractCoordinate 行,但这行不通,因为我需要它来获取第一行底部的位置。我在这里找到了这个例子在角落添加 tikznode和这里提取 y 坐标
如果我省略 ExtractCoordinate (如 Marmot 所建议的),表格如下所示:
如您所见,上方圆角现在始终位于表格的正中间。它应该位于第一行(包含标题列)的底部。
确实,如果我用 ExtractCoordinate 省略此行,它就可以解决跳转表的问题。但这样我就需要另一种方法从我的 tikzmark A 中提取 y 坐标。有什么想法吗?
编辑3:
此时我几乎已经让上面的例子工作了:它唯一需要做的就是找到另一种方法来提取 tikzmark 的 y 坐标,因为 ExtractCoordinate 的技巧会弄乱表格。
但为了完整起见,我还有另一种方法来制作这样的表格,它基于这个想法带圆角的表格
我的代码如下:
\documentclass{article}
\usepackage[dvipsnames,table]{xcolor}
\usepackage{array}
\usepackage{blindtext}
\usepackage{tikz}
\usepackage{etex}
\usepackage[most]{tcolorbox}
\usepackage{tabularx}
\usetikzlibrary{calc, tikzmark}
\definecolor{lichtgrijs}{RGB}{236,236,236}
\newcolumntype{L}{>{\columncolor{lichtgrijs}}l}
\newcolumntype{Y}{>{\raggedleft\arraybackslash}X}
\newtcolorbox{twocoltable}[4][]{%
tabularx*={\renewcommand{\arraystretch}{1.2}}%
{>{\columncolor{lichtgrijs}\hsize=#3\linewidth}X>{\hsize=#4\linewidth}Y},
enlarge top initially by=1.5em,
enlarge bottom finally by=0em,
enhanced,
fontupper=\footnotesize,
breakable,
colframe=lichtgrijs,
colback=white,
arc=1mm,
outer arc=1mm,
clip upper,
rightrule=0pt,
sharp corners=east,
width=1\linewidth,
overlay=%
{
\node[anchor=south east] (ycoltit) at %
([xshift=-0cm, yshift=0.0\baselineskip]frame.north east)%
{{\footnotesize\textbf{#2}}};
},
#1
}
\begin{document}
\blindtext
\begin{table}[tbp]
\caption{Last table}
\begin{twocoltable}%
{\textbf{Leeftijd}}{0.8}{0.2}
Paul Robinson & 45\\
Lucus Radebe & 23\\
Michael Duberry & 84\\
Jody Morris & 75\\
Jamie McMaster & 13\\
Alan Smith & 70\\
Mark Viduka & 30\\
\end{twocoltable}
\end{table}
\blindtext
\end{document}
唯一的问题是我需要使用 newtcolorbox 中的覆盖层明确添加列标题,我不喜欢这样做,因为我在定义中固定了列数(在本例中只有两列)。但这是让列标题位于圆角线上方的唯一方法。如果有人知道更好的方法,那也很好
编辑4:
Ignasis 的回答是目前为止最好的。不过,我还是尝试改变一些我知道我会需要的表格格式,比如固定列宽。我尝试的示例如下所示
\begin{table}
\centering
\begin{tikzpicture}
\matrix[mymatrix,
column 3/.style={nodes={anchor=center}},
column 4/.style={nodes={anchor=east}, text width=2cm}] (A) {
Label & Naam & Leeftijd & Length in centimeters\\
MC & Jody Morris & 75 & 174\\
FW & Jamie McMaster & 13 & 184\\
ST & Alan Smith & 70 & 150\\
ST & Mark Viduka & 30 & 190\\ };
\tableback{A}{5}{4}
\end{tikzpicture}
\caption{Shorter on}
\end{table}
结果如下
如您所见,东边的列不再与右侧对齐,并且标题的第一行也应该与行底部对齐。有什么办法可以解决这个问题吗?
编辑5:
在解决矩阵环境中的 Ignasis 问题的同时,我尝试使用 savebox 修复我的第一次尝试。正如 Marmot 指出的那样,我需要摆脱 ExtractCoord。这就是我所做的。我的解决方案现在看起来像这样
\documentclass{article}
\usepackage[dvipsnames,table]{xcolor}
\usepackage{array}
\usepackage{environ}
\usepackage{blindtext}
\usepackage{tikz}
\usepackage{etex} % required for savebox
%\usetikzlibrary{calc, tikzmark}
\usetikzlibrary{tikzmark}
\definecolor{lichtgrijs}{RGB}{236,236,236}
\newcolumntype{L}{>{\columncolor{lichtgrijs}}l}
%\renewcommand{\tikzmark}[2][]{%
% \tikz[remember picture,overlay]\coordinate[#1](#2);%
%}
%
\NewEnviron{rndtable}[2][\tablebox]{%
\addtolength{\extrarowheight}{1ex}%
\def\locbox{#1}
\savebox{\locbox}{%
\begin{tabular}{#2}%
\BODY%
\end{tabular}}%
\begin{tikzpicture} [remember picture]
\def\radius{1mm};
\edef\RowDepth{\the\dimexpr\arraystretch\dimexpr.3\baselineskip\relax\relax}
\coordinate (southwest) at (0,-\dp\locbox);
\coordinate (southeast) at (\wd\locbox,-\dp\locbox);
\coordinate (northeast) at (\wd\locbox,\ht\locbox);
\coordinate (northwest) at (0,\ht\locbox);
\coordinate (Pt) at ([xshift=\radius]northwest);
\coordinate (A) at (pic cs:A);
\coordinate (cellborder) at ([yshift=-\RowDepth]A);
\coordinate (Pb) at (cellborder -| Pt);
\coordinate (west) at (Pb -| northwest);
\begin{scope}
\clip[rounded corners=\radius]
(southwest) --
(southeast) --
(northeast)
{
% make straight corners for the cutout
[rounded corners=0ex]--
(Pt) --
(Pb)
}--
(west) --
cycle;
\node at (0,-\dp\locbox) [anchor=south west,inner sep=0pt]{\usebox{\locbox}};
% debugging circels
%\draw[red, fill] (Pt) circle[radius=2pt];
%\draw[green, fill] (A) circle[radius=2pt];
%\draw[blue, fill] (cellborder) circle[radius=2pt];
%\draw[yellow, fill] (Pb) circle[radius=2pt];
%\draw[orange, fill] (west) circle[radius=2pt];
\end{scope}
\end{tikzpicture}
}
\begin{document}
\setlength\arrayrulewidth{1.2pt}
\blindtext[1]
\newsavebox{\tablebox}
\begin{table}[tbp]
\caption{First table}
\begin{rndtable}[\tablebox]{Llr}
\rowcolor{white}
\tikzmark{A}
\textbf{Label} & \textbf{Naam} & \textbf{Leeftijd}\\
\arrayrulecolor{lichtgrijs} \hline
GK & Paul Robinson & 45\\
MC & Jody Morris & 75\\
FW & Jamie McMaster & 13\\
ST & Alan Smith & 70\\
ST & Mark Viduka & 30\\
\arrayrulecolor{lichtgrijs}\hline
\end{rndtable}
\end{table}
\blindtext[1]
\newsavebox{\otherbox}
\begin{table}[tbp]
\caption{Second table}
\begin{rndtable}[\otherbox]{Llr}
\rowcolor{white}
\tikzmark{A}
\textbf{Label} & \textbf{Naam} & \textbf{Leeftijd}\\
\arrayrulecolor{lichtgrijs} \hline
GK & Paul Robinson & 45\\
MC & Jody Morris & 75\\
FW & Jamie McMaster & 13\\
ST & Alan Smith & 70\\
ST & Mark Viduka & 30\\
\arrayrulecolor{lichtgrijs}\hline
\end{rndtable}
\end{table}
\blindtext[1]
\end{document}
对于一张表格,这再次正常工作。对于两张表格,LaTeX 不断获得表格位置的两个交替解决方案:一个将两个表格放在一页上,另一个将两个表格放在单独的页面中。我认为这与保存框有关,这就是为什么我尝试添加一个额外的参数,以便我可以为每个表格定义一个保存框。不幸的是,这不起作用。如果我比较 xelatex 两次后续运行的辅助文件,两个文件的差异将显示以下输出:
9,13c9,13
< \@writefile{lot}{\contentsline {table}{\numberline {2}{\ignorespaces Second table}}{1}}
< \savepicturepage{pgfid3}{1}
< \pgfsyspdfmark {pgfid3}{9192734}{33349459}
< \savepicturepage{pgfid4}{1}
< \pgfsyspdfmark {pgfid4}{8799518}{30733844}
---
> \@writefile{lot}{\contentsline {table}{\numberline {2}{\ignorespaces Second table}}{2}}
> \savepicturepage{pgfid3}{2}
> \pgfsyspdfmark {pgfid3}{9192734}{41880784}
> \savepicturepage{pgfid4}{2}
> \pgfsyspdfmark {pgfid4}{8799518}{39265169}
第三次运行将再次获得与第一次运行相同的辅助文件。如果可以解决这个问题,我首先会选择这个解决方案,因为它利用了原始的表格环境。如果无法解决,我将求助于矩阵解决方案,这是一个很好的替代方案
答案1
我提出这个简短的代码基于pstricks
\documentclass{article}
\usepackage[dvipsnames,table]{xcolor}
\usepackage{array, booktabs, caption}
\usepackage{blindtext}
\usepackage{pst-node}
\definecolor{lichtgrijs}{RGB}{236,236,236}
\begin{document}
\blindtext[10]
\begin{table}[tbp]
\centering
\caption{bla}
\setlength{\belowrulesep}{0pt}
\setlength\arrayrulewidth{1.2pt}
\begin{tabular}{llr}
\rowcolor{white}
\textbf{Label} & \textbf{Naam} & \textbf{Leeftijd}\\
\arrayrulecolor{lichtgrijs}
\cmidrule[1.2pt]{2-3}
\pnode[-6pt, 0.96em]{A} \pnode{R1}\phantom{GK}&\pnode[-6pt, 0.96em]{B} Paul Robinson & 45\\
\pnode{R2} & Lucus Radebe & 23\\
\pnode{R3} & Michael Duberry & 84\\
\pnode{R4} & Dominic Matteo & 22\\
\pnode{R5} & Didier Domi & 34\\
\pnode{R6} & David Batty & 5\\
\pnode{R7} & Eirik Bakke & 58\\
\pnode{R8} & Jody Morris & 75\\
\pnode{R9} & Jamie McMaster & 13\\
\pnode{R10}& Alan Smith & 70\\
\pnode[-6pt, -1.52ex]{C} \pnode{R11} & \pnode[-6pt, -1.52ex]{D}Mark Viduka & 30\\
\arrayrulecolor{lichtgrijs}\cmidrule[1.2pt]{2-3}
\end{tabular}
\pscustom[linestyle=none, fillstyle=solid, fillcolor=lichtgrijs]{\psline[linearc=0.2](B)(A)(C)(D)\closepath}
\foreach \i/\txt in {1/GK, 2/LB, 3/DC, 4/DC, 5/RB, 6/MC, 7/MC, 8/MC, 9/FW, 10/ST, 11/ST}{\rput[Bl](R\i){\txt}}
\end{table}
\blindtext[10]
\end{document}
答案2
以下代码使用来TikZ matrix
构建表格并使用附加命令来绘制背景。
样式matrix
已经定义,因此您可以使用tabular
语法来定义内容(不要忘记\\
最后一行)。
背景用使用三个参数的命令绘制\tableback
:矩阵名称、行数和列数。
就这样。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix, positioning, backgrounds}
\definecolor{lichtgrijs}{RGB}{236,236,236}
\tikzset{
mymatrix/.style={%
matrix of nodes,
nodes={anchor=west, text height=1.5ex, text depth=.25ex},
row 1/.style={font=\bfseries},
column 3/.style={nodes={anchor=east}},
}
}
\newcommand{\tableback}[3]{
\begin{scope}[on background layer]
\filldraw[thick, lichtgrijs,rounded corners] (#1-1-1.south east)-| (#1-#2-1.west)|-(#1-#2-1.south)[sharp corners]-|cycle;
\draw[lichtgrijs,thick] (#1-1-1.south east)--(#1-1-#3.south east) (#1-#2-1.south east)--(#1-#2-#3.south east);
\end{scope}
}
\begin{document}
\begin{table}
\centering
\begin{tikzpicture}
\matrix[mymatrix] (A) {
Label & Naam & Leeftijd \\
GK & Paul Robinson & 45\\
LB & Lucus Radebe & 23\\
DC & Michael Duberry & 84\\
DC & Dominic Matteo & 22\\
RB & Didier Domi & 34\\
MC & David Batty & 5\\
MC & Eirik Bakke & 58\\
MC & Jody Morris & 75\\
FW & Jamie McMaster & 13\\
ST & Alan Smith & 70\\
ST & Mark Viduka & 30\\ };
\tableback{A}{12}{3}
\end{tikzpicture}
\caption{A nice table made with a TikZ array}
\end{table}
\end{document}
更新:尝试解决EDIT 4
问题
为了能够声明列宽,我们需要忘记text height
参数并在所需的列中text depth
声明。text width
但一旦我们忘记了text depth
,具有后代(jpq
)的节点就会错位。因此,我将引用从 改为west
并south west
添加execute at begin cell={\vphantom{j}}
以恢复正确的对齐。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix, positioning, backgrounds}
\definecolor{lichtgrijs}{RGB}{236,236,236}
\tikzset{
mymatrix/.style={%
matrix of nodes,
nodes={anchor=south west},
row 1/.style={font=\bfseries},
column 3/.style={nodes={anchor=south east}},
execute at begin cell={\vphantom{j}}
}
}
\newcommand{\tableback}[3]{
\begin{scope}[on background layer]
\filldraw[thick, lichtgrijs,rounded corners] (#1-1-1.south east)-| (#1-#2-1.west)|-(#1-#2-1.south)[sharp corners]-|cycle;
\draw[lichtgrijs,thick] (#1-1-1.south east)--(#1-1-#3.south east) (#1-#2-1.south east)--(#1-#2-#3.south east);
\end{scope}
}
\begin{document}
\begin{table}
\centering
\begin{tikzpicture}
\matrix[mymatrix,
column 3/.style={nodes={anchor=south}},
column 4/.style={nodes={anchor=south east, text width=2cm}}] (A) {
Label & Naam & Leeftijd & Length in centimeters\\
MC & Jody Morris & 75 & 174\\
FW & Jamie McMaster & 13 & 184\\
ST & Alan Smith & 70 & 150\\
ST & Mark Viduka & 30 & 190\\ };
\tableback{A}{5}{4}
\end{tikzpicture}
\caption{Shorter on}
\end{table}
\end{document}
更新 2:评论中关于对齐的问题
要理解对齐会发生什么,您需要了解 amatrix
不是 a tabular
。 A仅在网格上matrix
排列,但节点保持其大小。参见下图,其中节点显示其边框。nodes
如您所见,第 1、2 和 3 列显示内容居中的最小尺寸节点,并使用 强制其向左、居中或向右对齐anchors
。但第四列已text length
定义,因此节点的锚点和内部内容对齐是不同的。在这种情况下,您需要固定一个align
值以强制此列向右对齐。
图中代码为:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix, positioning, backgrounds}
\definecolor{lichtgrijs}{RGB}{236,236,236}
\tikzset{
mymatrix/.style={%
matrix of nodes,
nodes={draw, anchor=south west},
row 1/.style={font=\bfseries},
column 3/.style={nodes={anchor=south east}},
execute at begin cell={\vphantom{j}}
}
}
\newcommand{\tableback}[3]{
\begin{scope}[on background layer]
\filldraw[thick, lichtgrijs,rounded corners] (#1-1-1.south east)-| (#1-#2-1.west)|-(#1-#2-1.south)[sharp corners]-|cycle;
\draw[lichtgrijs,thick] (#1-1-1.south east)--(#1-1-#3.south east) (#1-#2-1.south east)--(#1-#2-#3.south east);
\end{scope}
}
\begin{document}
\begin{table}
\centering
\begin{tikzpicture}
\matrix[mymatrix,
column 3/.style={nodes={anchor=south}},
column 4/.style={nodes={text width=2cm, align=right}},
row 1 column 4/.style={nodes={align=center}}] (A) {
Label & Naam & Leeftijd & Length in centimeters\\
MC & Jody Morris & 75 & 174\\
FW & Jamie McMaster & 13 & 184\\
ST & Alan Smith & 70 & 150\\
ST & Mark Viduka & 30 & 190\\ };
\tableback{A}{5}{4}
\end{tikzpicture}
\caption{Shorter on}
\end{table}
\end{document}
答案3
有了{NiceTabular}
,nicematrix
就非常容易了。
\documentclass{article}
\usepackage{nicematrix,tikz}
\begin{document}
\begin{table}[tbp]
\begin{NiceTabular}{llr}
\CodeBefore
\begin{tikzpicture} [line width = 1.2 pt, gray!15]
\filldraw (last-|2) -- (2-|2) [rounded corners] -- (2-|1) -- (last-|1) -- (last-|2) ;
\draw (2-|2) -- (2-|last) (last-|2) -- (last-|last) ;
\end{tikzpicture}
\Body
\RowStyle[bold]{}
Label & Naam & Leeftijd\\
\RowStyle[cell-space-top-limit=1mm]{}
GK & Paul Robinson & 45\\
LB & Lucus Radebe & 23\\
DC & Michael Duberry & 84\\
DC & Dominic Matteo & 22\\
RB & Didier Domi & 34\\
MC & David Batty & 5\\
MC & Eirik Bakke & 58\\
MC & Jody Morris & 75\\
FW & Jamie McMaster & 13\\
ST & Alan Smith & 70\\
ST & Mark Viduka & 30\\
\end{NiceTabular}
\end{table}
\end{document}
您需要多次编译(因为 PGF/Tikz 节点)。
答案4
我很感谢到目前为止我得到的所有答案;在你们的帮助下,我能够修复我最初的解决方案。我认为这个解决方案仍然是制作这些圆角表最简单的方法,因为它基于正常的表格环境。
不收敛的 latex 代码出现奇怪行为的原因是使用 tizkmark 与 commando 结合在节点中转换 tikzmark(cs:pic)。
为了解决这个问题,我不再使用 tikzmark 在第一个表格单元格中添加位置,而是使用普通的 tikz 节点。一切似乎都按我想要的方式运行。代码现在看起来像这样
\documentclass{article}
\usepackage[dvipsnames,table]{xcolor}
\usepackage{array}
\usepackage{environ}
\usepackage{blindtext}
\usepackage{tikz}
\usepackage{etex} % required for savebox
%\usetikzlibrary{calc, tikzmark}
\definecolor{lichtgrijs}{RGB}{236,236,236}
\newcolumntype{L}{>{\columncolor{lichtgrijs}}l}
\newcolumntype{B}{>{\columncolor{lichtgrijs}}b}
\newcolumntype{M}{>{\centering\arraybackslash}m}
% this defines the distance of the cell characters and the row line
\edef\RowDepth{\the\dimexpr\arraystretch\dimexpr.3\baselineskip\relax\relax}
% the tablebox only needs to be defined once
\newsavebox{\tablebox}
% this node must be used in the top left corner of every tabular using the
% rndtable
\newcommand{\cornercell}[1]{
\tikz[remember picture]{\node[%shape=rectangle, draw,
anchor=south west, inner sep=0pt](A){#1};}
}
\NewEnviron{rndtable}[2][0pt]{%
% the rndtable draws a tabular with the first column grey with rouned
% corners
\addtolength{\extrarowheight}{1ex}%
\savebox{\tablebox}{%
\begin{tabular}{#2}
\BODY
\end{tabular}%
}
\begin{tikzpicture} [remember picture]
% Define the cardinal points of the table
\def\radius{1mm};
\coordinate (southwest) at (0,-\dp\tablebox);
\coordinate (southeast) at (\wd\tablebox,-\dp\tablebox);
\coordinate (northeast) at (\wd\tablebox,\ht\tablebox);
\coordinate (northwest) at (0,\ht\tablebox);
\coordinate (Pt) at ([xshift=\radius]northwest);
% with respect to node A create a point at the table line
% In case we need an offset downwards, this can be given optionally
\coordinate (cellborder) at ([yshift=-\RowDepth-#1]A.south west);
\coordinate (Pb) at (cellborder -| Pt);
\coordinate (west) at (Pb -| northwest);
\begin{scope}
% draw the clipping frame with the rouned corners saving the
% to row. Everythin outside this frame is clipped
\clip[rounded corners=\radius]
(southwest) --
(southeast) --
(northeast)
{
% make straight corners for the cutout
[rounded corners=0ex]--
(Pt) --
(Pb)
}--
(west) --
cycle;
% draw the table from the savedbox
\node at (southwest) [anchor=south west,inner sep=0pt]{\usebox{\tablebox}};
% debugging circels
%\draw[red, fill] (cellborder) circle[radius=2pt];
\end{scope}
\end{tikzpicture}
}
\begin{document}
\setlength\arrayrulewidth{1.2pt}
%
\blindtext[1]
%
\begin{table}[tbp]
\caption{First table}
\label{tab:first}
\begin{rndtable}{Llr}
\rowcolor{white}
\cornercell{\textbf{Label}} & \textbf{Naam} & \textbf{Leeftijd}\\
\arrayrulecolor{lichtgrijs} \hline
GK & Paul Robinson & 45\\
MC & Jody Morris & 75\\
FW & Jamie McMaster & 13\\
\arrayrulecolor{lichtgrijs}\hline
\end{rndtable}
\end{table}
%
\begin{table}[tbp]
\caption{Second table with narrow last column and heigh head line}
\label{tab:second}
\begin{rndtable}[0.68\baselineskip]{LlrM{2cm}}
\rowcolor{white}
\cornercell{\textbf{Label}} & \textbf{Naam} & \textbf{Leeftijd}
& \textbf{Length in centimeter} \\
\arrayrulecolor{lichtgrijs} \hline
GK & Paul Robinson & 45 & 178\\
MC & Jody Morris & 75 & 182\\
FW & Jamie McMaster & 13 & 150\\
\arrayrulecolor{lichtgrijs}\hline
\end{rndtable}
\end{table}
Reference to \ref{tab:first} and \ref{tab:second} table.
\blindtext[1]
\end{document}
结果如下
正是我想要的。此代码的好处在于,您只需将 tabular 替换为 rndtable;与普通表格相比,其余部分保持不变。唯一的问题是,第一个单元格需要包含 cornercell tikz 节点,该节点将节点 (A) 放置在第一个单元格中。此节点在宏中用于获取第一行的底部表格行。
有一个问题:如果您有多行列(例如第二个表格),RowDepth 不再是文本底部到行线之间的有效距离。为了解决这个问题,我添加了一个可选参数以允许额外的向下移动。也许将第一行的所有文本与单元格底部对齐会更好,但目前我找不到如何做到这一点。
编辑:为了将第二个表的顶行调整到底部,我现在使用 b 作为表格说明符:
\newcolumntype{G}{>{\columncolor{lichtgrijs}\raggedright\arraybackslash}b}
\newcolumntype{L}{>{\raggedright\arraybackslash}b}
\begin{rndtable}{G{2cm}llL{2cm}}
\rowcolor{white}
\cornercell{\textbf{Label}} & \textbf{Naam} & \textbf{Leeftijd}
& \textbf{Length in centimeter} \\
\arrayrulecolor{lichtgrijs} \hline
GK & Paul Robinson & 45 & 178\\
MC & Jody Morris & 75 & 182\\
FW & Jamie McMaster & 13 & 150\\
\arrayrulecolor{lichtgrijs}\hline
\end{rndtable}
这样,列标题就会在底部对齐,您不必再指定偏移量