
Mein Ziel ist es, eine Tabelle zu erstellen, die so aussieht:
Das Gute bisher: Es ist mir gelungen, diesen Tisch herzustellen.
Das Schlechte daran: Ich kann dies nicht in eine normale \begin{table}\end{table}-Umgebung einbinden, da die Boundingbox der Tabelle nicht sichtbar ist. Der gesamte Text läuft über die Tabelle
Hoffentlich kann das jemand lösen. Entweder indem er mir eine alternative Möglichkeit zum Erstellen dieser Tabelle gibt oder indem er den Fehler in meinem Code behebt.
Der folgende Code verwendet Material aus anderen Antworten, die ich hier gefunden habe:abgerundete Eckenzeigt, wie man abgerundete Ecken um eine Tabelle herum macht. Das Problem ist: Ich möchte meine erste Zeile mit der Spaltenüberschrift ÜBER der Zeile mit abgerundeten Ecken.
Meine Lösungsidee war einfach: Ich passe einfach den Ausschnitt der Tabelle so an, dass ich eine abgerundete Ecke der ersten Spalte erhalte, sofort nach oben gehe und dann auf die andere Seite gehe:
------------------------------
R-| heading cols |
|first grey col value cols |
| |
R---------------------------------
An den Stellen der R's möchte ich abgerundete Ecken hinzufügen.
Der Code, den ich erstellt habe, ist ziemlich lang, ich werde ihn hier hinzufügen. Er ist eigenständig. Diese Clipping-Idee stammt aus dem ersten Link. Außerdem füge ich ein Tikzmark A hinzu, weil ich möchte, dass der Clipping-Pfad automatisch mit dem unteren Rand der ersten Zeile verbunden wird. Diese Idee wurde von diesem Beispiel inspirierttikznode an der Ecke hinzufügenUm die y-Koordinaten dieses Punktes A zu erhalten, habe ich diese Idee verwendetY-Koordinate extrahieren
Hier ist der Code, der eigenständig ausgeführt werden sollte
\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}
Dieser Code funktioniert und generiert die Tabelle, die ich gerade gezeigt habe.
ABER anscheinend wird die Größe der Tabelle beim Einbinden von \begin{table} überhaupt nicht erkannt. Wenn ich Text um die Tabelle herum setzen würde (indem ich blindtext und begin{table} auskommentiere), läuft dieser über die Tabelle hinaus. Ich vermute, dass es entweder mit der Overlay-Option zu tun hat oder dass ich die Savebox verwende. Leider kann ich das nicht lösen. Es sieht so aus:
Wer weiß, wie ich dieses Skript so reparieren kann, dass ich es in einer Tabellenumgebung ordnungsgemäß verwenden kann?
Alle Hinweise sind willkommen!
Grüße
Eelco
BEARBEITEN:
Der Vorschlag von Marmot, das Overlay zu entfernen und als Boundary-Box zu verwenden, funktioniert. Jetzt ist zumindest eine Tabelle schön in die Tabellenumgebung eingefügt.
Allerdings tritt ein neues Problem auf: Wenn ich zwei oder mehr Tabellen einbinden möchte, bekommen die Tabellen jedes Mal, wenn ich den Code ausführe, eine andere Position. Sie können beispielsweise Folgendes tun:
\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}
Dadurch werden zwar drei Tabellen erstellt, jede in ihrer eigenen Umgebung, aber sie erhalten jedes Mal, wenn ich den Code ausführe, einen anderen Speicherort. Auch die AUX-Datei ändert sich bei jedem Durchlauf. Wahrscheinlich hat das mit den globalen Variablen XCoord und YCoord zu tun, die ich verwende, kombiniert mit dem Savebox-Trick. Aber ich brauche diese, um den Speicherort der oberen Zeile zu finden und sie richtig zuzuschneiden. Daher ist diese Lösung, die ich mir ausgedacht habe, immer noch nicht verwendbar.
Weiß jemand, wie man das löst?
EDIT2:
Der Vorschlag von Marmot, die ExtractCoordinate-Zeile wegzulassen, funktioniert nicht, da ich sie brauche, um die Position des unteren Endes der ersten Zeile zu ermitteln. Ich habe dieses Beispiel hier gefundentikznode an der Ecke hinzufügenund hierY-Koordinate extrahieren
Wenn ich ExtractCoordinate weglasse (wie von Marmot vorgeschlagen), sieht die Tabelle folgendermaßen aus:
Wie man sieht, liegt die obere abgerundete Ecke nun immer genau auf halber Höhe der Tabelle. Sie sollte sich am unteren Ende der ersten Zeile (mit den Titelspalten) befinden.
Wenn ich diese Zeile mit ExtractCoordinate weglasse, behebt das tatsächlich das Problem der springenden Tabellen. Aber dann bräuchte ich eine alternative Möglichkeit, die Y-Koordinate aus meinem Tikzmark A zu extrahieren. Irgendeine Idee?
EDIT3:
An diesem Punkt habe ich das obige Beispiel fast zum Laufen gebracht: Das einzige, was dazu erforderlich ist, ist, einen alternativen Weg zu finden, um die Y-Koordinate des Tikzmarks zu extrahieren, da der Trick bei ExtractCoordinate darin besteht, die Tabellen durcheinander zu bringen.
Aber um vollständig zu sein, habe ich auch einen alternativen Ansatz für die Erstellung solcher Tabellen, der auf dieser Idee basierttabellarisch mit abgerundeten Ecken
Mein Code sieht folgendermaßen aus:
\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}
Das einzige Problem ist, dass ich die Spaltentitel explizit mithilfe des Overlays in newtcolorbox hinzufügen muss, was mir nicht gefällt, da ich die Anzahl der Spalten in der Definition festlege (in diesem Fall nur zwei Spalten). Aber das war die einzige Möglichkeit, den Spaltentitel über die Zeile mit den abgerundeten Ecken zu bringen. Falls jemand eine bessere Möglichkeit kennt, dies zu tun, wäre das auch großartig
EDIT4:
Ignasis Antwort ist die bisher beste. Trotzdem habe ich versucht, einige Formate der Tabelle zu variieren, von denen ich weiß, dass ich sie brauchen werde, wie z. B. die Spaltenbreite zu fixieren. Das Beispiel, das ich ausprobiert habe, sieht so aus
\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}
Das Ergebnis sieht so aus
Wie Sie sehen, ist die Spalte im Osten nicht mehr rechtsbündig ausgerichtet und auch die erste Zeile mit dem Titel sollte unten in der Zeile ausgerichtet sein. Irgendeine Idee, wie man das beheben kann?
BEARBEITEN 5:
Parallel zur Lösung von Ignasis mit der Matrixumgebung habe ich versucht, meinen ersten Versuch mithilfe der Savebox zu reparieren. Wie Marmot anmerkte, muss ich ExtractCoord loswerden. Das habe ich getan. Meine Lösung sieht jetzt so aus
\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}
Bei einer Tabelle funktioniert das wieder einwandfrei. Bei zwei Tabellen erhält LaTeX immer zwei abwechselnde Lösungen für die Tabellenpositionen: eine mit den beiden Tabellen auf einer Seite, eine mit den beiden Tabellen als separate Seiten. Ich denke, es hat mit der Savebox zu tun, deshalb habe ich versucht, einen zusätzlichen Parameter hinzuzufügen, mit dem ich für jede Tabelle eine Savebox definieren kann. Leider funktioniert das nicht. Wenn ich die Aux-Dateien zweier aufeinanderfolgender Durchläufe von xelatex vergleiche, zeigt ein Diff beider Dateien die folgende Ausgabe:
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}
Der dritte Durchlauf wird wieder eine AUX-Datei haben, die der des ersten Durchlaufs entspricht. Wenn dies gelöst werden kann, bevorzuge ich diese Lösung vor allem, da sie eine ursprüngliche tabellarische Umgebung verwendet. Wenn es nicht gelöst werden kann, greife ich auf die Matrixlösung zurück, die eine großartige Alternative ist
Antwort1
Ich schlage diesen Kurzcode vor, basierend aufpstricks
\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}
Antwort2
Der folgende Code verwendet einen Befehl TikZ matrix
zum Erstellen der Tabelle und einen zusätzlichen Befehl zum Zeichnen des Hintergrunds.
Der matrix
Stil ist bereits definiert, daher können Sie eine Syntax verwenden, um den Inhalt zu definieren ( letzte Zeile tabular
nicht vergessen ).\\
Der Hintergrund wird mit einem Befehl gezeichnet \tableback
, der drei Parameter verwendet: Matrixname, Anzahl der Zeilen und Anzahl der Spalten.
Das ist alles.
\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
Update: Versuch, das Problem zu lösen
Um die Spaltenbreite deklarieren zu können, müssen wir text height
die Parameter vergessen und eine gewünschte Spalte text depth
deklarieren .text width
Aber sobald wir vergessen text depth
, sind Knoten mit Nachkommen ( jpq
) falsch ausgerichtet. Daher habe ich den Verweis von west
in geändert south west
und hinzugefügt execute at begin cell={\vphantom{j}}
, um die richtige Ausrichtung wiederherzustellen.
\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}
Update 2: Frage zu Ausrichtungen in Kommentaren
Um zu verstehen, was mit Ausrichtungen passiert, müssen Sie verstehen, dass a matrix
nicht a ist tabular
. A matrix
ordnet nur nodes
auf einem Raster an, aber Knoten behalten ihre Größe. Siehe folgendes Bild, in dem Knoten ihre Grenzen zeigen.
Wie Sie sehen, zeigen die Spalten 1, 2 und 3 Knoten mit minimaler Größe und zentriertem Inhalt, und ihre Ausrichtung nach links, Mitte oder rechts wird mit erzwungen anchors
. Die vierte Spalte hat jedoch eine text length
definierte Ausrichtung, daher sind die Ausrichtung des Ankers und des inneren Inhalts des Knotens unterschiedlich. In diesem Fall müssen Sie einen align
Wert festlegen, um die richtige Ausrichtung für diese Spalte zu erzwingen.
Der Code für die Abbildung lautet:
\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}
Antwort3
Mit {NiceTabular}
ist nicematrix
es ganz einfach.
\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}
Sie benötigen mehrere Kompilierungen (aufgrund der PGF/Tikz-Knoten).
Antwort4
Ich bin dankbar für alle Antworten, die ich bisher erhalten habe. Mithilfe Ihrer Eingaben konnte ich meine ursprüngliche Lösung korrigieren. Ich denke, diese Lösung ist immer noch der einfachste Weg, diese abgerundeten Tabellen zu erstellen, da sie auf einer normalen Tabellenumgebung basiert.
Der Grund für das seltsame Verhalten des nicht konvergierenden Latex-Codes war die Verwendung des Tizkmark in Kombination mit dem Kommando, um ein Tikzmark in einen Knoten (cs:pic) umzuwandeln.
Um dies zu beheben, verwende ich nicht mehr das Tikzmark, um einen Standort in der ersten Tabellenzelle hinzuzufügen, sondern stattdessen einen normalen Tikz-Knoten. Es scheint alles so zu funktionieren, wie ich es möchte. Der Code sieht jetzt so aus
\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}
Das Ergebnis sieht so aus
Genau so, wie ich es will. Das Gute an diesem Code ist, dass Sie einfach tabular durch rndtable ersetzen können; der Rest bleibt im Vergleich zu einem normalen tabular gleich. Das Einzige ist, dass die erste Zelle den Cornercell-Tikz-Knoten enthalten muss, der einen Knoten (A) in die erste Zelle platziert. Dieser Knoten wird im Makro verwendet, um zur untersten Tabellenzeile der ersten Reihe zu gelangen.
Es gibt einen Haken: Wenn Sie mehrzeilige Spalten haben (wie in der zweiten Tabelle), ist die Zeilentiefe nicht mehr der gültige Abstand zwischen dem unteren Rand des Textes und der Zeilenlinie. Um dies zu beheben, habe ich ein optionales Argument hinzugefügt, das eine zusätzliche Verschiebung nach unten ermöglicht. Vielleicht wäre es besser, den gesamten Text der ersten Zeile am unteren Rand der Zellen auszurichten, aber im Moment konnte ich nicht herausfinden, wie das geht.
BEARBEITEN: Um die oberste Zeile der zweiten Tabelle an der unteren auszurichten, verwende ich jetzt b als Tabellenspezifizierer:
\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}
Auf diese Weise wird der Spaltentitel unten ausgerichtet und Sie müssen den Offset nicht mehr angeben