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, 09:21

Felix's gravatar image

Felix
1.3k525667
Akzeptiert-Rate: 47%

bearbeitet 13 Mär '14, 14:30

esdd's gravatar image

esdd
17.8k284257


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, 13:25

esdd's gravatar image

esdd
17.8k284257
Akzeptiert-Rate: 62%

bearbeitet 13 Mär '14, 15: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, 13: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, 15:42) esdd
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

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ügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×731
×256
×76
×58

gestellte Frage: 13 Mär '14, 09:21

Frage wurde gesehen: 15,255 Mal

zuletzt geändert: 13 Mär '14, 15:42