In diesem Minimalbeispiel habe ich eine TikZ-Matrix samt gezeichneten Linien, nur zur Strukturerkennung:

Open in writeLaTeX
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
  \matrix [matrix of nodes, nodes={draw, minimum width=2em},
    row sep=-\pgflinewidth, column sep=-\pgflinewidth] {
         & A, B, C &   \\
    D    & E       & F \\
    G, H &         & I \\ };
\end{tikzpicture}
\end{document}

Bisher verbreitern die Zellen einfach ihre Spalte:

TikZ Tabelle Zellen verschoben

minimum width für alle Nodes zu erhöhen (4.5 em im folgenden), begradigt die Tabelle, macht aber keine verbundenen Zellen.

TikZ Tabelle einfach

Wie kann ich erreichen, dass die Zellen mit "A, B, C" und "G, H" jeweils 3 bzw. 2 Spalten überspannen?

gefragt 13 Mär '14, 04:21

Felix's gravatar image

Felix
1.3k225366
Akzeptiert: 89%

bearbeitet 13 Mär '14, 09:30

esdd's gravatar image

esdd
14.2k53251


Wenn für alle Spalten gleich breit sind, dann lässt könnte man das wie unten stehend lösen. Die gleiche Breite kann man durch Vorgabe von text width erreichen. Den benötigten Wert kann man zum Beispiel aus dem breitesten Zelleninhalt ermitteln.

Open in writeLaTeX
\documentclass[tikz,margin=5mm]{standalone}
\usetikzlibrary{matrix}
\newlength\textbreite

\newcommand\mc[2]{%
  |[
      draw=none,
      xshift=(-\iabst-.5\pgflinewidth),yshift=(-\iabst-.5\pgflinewidth),
      inner ysep=0pt
  ]|%
  \makebox[\textbreite][l]{%
    \pgfmathsetlength\textbreite{#1*(\textbreite+2*\iabst)-2*\iabst}
    \tikz\node[draw,inner ysep=\iabst]{%
      \makebox[\textbreite]{#2}%
    };%
  }%
}%

\usepackage{blindtext}
\begin{document}

\settowidth\textbreite{breites Wort}% Ermitteln der Textbreite
\begin{tikzpicture}
  \newcommand\iabst{0.3em} % Abstand zwischen Text und Zellenrand
  \matrix [matrix of nodes,
      nodes={
        draw=gray!30,
        text width=\textbreite,
        align=center,
        inner sep=\iabst,
        },
      row sep=-\pgflinewidth, column sep=-\pgflinewidth
    ] {
   \mc{3}{ABC}\\
    D & E& F \\
   \mc{2}{GH}& & breites Wort\\
  };
\end{tikzpicture}
\end{document}

alt text


Soll nur die erste (oder letzte) Zeile über die ganze Tabellenbreite gehen, dann kann man diese auch nachträglich einfügen. Dabei spielt die Breite der einzelnen Spalten keine Rolle mehr:

Open in writeLaTeX
\documentclass[tikz,margin=5mm]{standalone}
\usetikzlibrary{matrix,calc}

\begin{document}
\begin{tikzpicture}
  \matrix (m)[matrix of nodes,
    draw, 
    nodes={minimum width=2em},
    ] {
    D&E&F\\
    G &ein paar Worte& I \\
  };
  \path 
    let \p1=(m.east),\p2=(m.west),\n1={\x1-\x2-\pgflinewidth} in 
    (m.north) 
    node[draw, anchor=south, minimum width=\n1,yshift=-\pgflinewidth]
    {Ein breiter Titel};
\end{tikzpicture}
\end{document}

alt text


Es gibt aber auch die Möglichkeit Inhalte nachträglich in die Matrix einzufügen, wenn man den entsprechenden Platz vorsieht. Damit sich der Aufwand in Grenzen hält, gebe ich eine ausreichend große, einheitliche Zellenhöhe vor.

Open in writeLaTeX
\documentclass[tikz,margin=5mm]{standalone}
\usetikzlibrary{matrix,calc}

\tikzset{
  zusatz/.style={draw=green!30, anchor=south west, minimum width=#1,yshift=-\pgflinewidth,minimum height=2em
  }
}
\begin{document}
\begin{tikzpicture}
  \newcommand\hoehe{2em}
  \matrix (m)[matrix of nodes,draw,
    nodes={draw=gray!30,minimum height=\hoehe,font=\strut},
    row sep=-\pgflinewidth, column sep=-\pgflinewidth
    ] {
    XD&E&F\\
    &&R\\
    A&B&C\\[\hoehe]
    G &ein paar Worte& IXX \\
  };
  \path 
    let \p1=(m-4-2.east),\p2=(m-1-1.west),\n1={\x1-\x2-\pgflinewidth} in 
    (m-1-1.west|-m-3-1.north)node[zusatz=\n1]{zwei Spalten};
  \path 
    let \p1=(m-4-3.east),\p2=(m-1-1.west),\n1={\x1-\x2-\pgflinewidth} in 
    (m-1-1.west|-m-4-3.north)node[zusatz=\n1]{drei Spalten};
\end{tikzpicture}
\end{document}

alt text

Permanenter link

beantwortet 13 Mär '14, 08:25

esdd's gravatar image

esdd
14.2k53251

bearbeitet 13 Mär '14, 10:32

Sehr gut! Da sich bei mehreren Tabellen die Breiten wohl unterscheiden, ziehe ich \pgfmathsetlength\textbreite vllt. in das \mc-Makro hinein. Oder definiere einen Befehl \SetzeBreite, der das mit drin hat, \SetzeBreiteRelativ mit \settowidh, da könnte ich den Inhalt der breitesten Zelle reintun. Wenn mir nur bessere Namen einfielen. :-)

(13 Mär '14, 08:37) Felix

@Felix: Ich hab das jetzt mit dem \settowidth umgesetzt und zwei weitere Vorschläge ergänzt. Welchen Weg man wählt, hängt aber doch sehr vom konkreten Ziel und den Randbedingungen ab.

(13 Mär '14, 10:42) esdd
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs füge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×492
×185
×51
×27

Frage gestellt: 13 Mär '14, 04:21

Frage wurde angeschaut: 4,233 Mal

Zuletzt aktualisiert: 13 Mär '14, 10:42