Ich habe auf golatex.de eine Frage gelesen, die mich auch interessiert, an der ich mich versuchen werde und sie daher hier als Archiv-Frage poste.

Es möchte ein Baumdiagramm erstellt werden, in dessen Knoten längere Texte stehen können. Weiterhin sollen die Pfeile Beschriftungen kriegen. Eine Skizze von Filos92:

Baum-Diagramm

Ansatz:

Open in writeLaTeX
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{blindtext}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
  \node {\blindtext};
\end{tikzpicture}
\end{document}

Wie kann man das angehen?

gefragt 21 Mär '14, 12:17

Felix's gravatar image

Felix
1.3k525666
Akzeptiert-Rate: 47%

bearbeitet 21 Mär '14, 12:17


Zum einen muss für die entsprechenden Knoten eine text width angegeben werden, damit ein Zeilenumbruch innerhalb der Knoten erfolgt. In breiten Knoten kann man Blocksatz verwenden, in schmaleren ist es besser den Text linksbündig zu setzen.

Zum anderen gibt die Option level distance in der Voreinstellung den Abstand zwischen den Zentren aufeinanderfolgender Ebenen an und müsste entsprechend groß gewählt werden. Stellt man für die Noden anchor=north ein und verwendet die Option growth parent anchor=south dann entspricht level distance dem Abstand der Ebenen. Gleichzeitig werden die Noden oben ausgerichtet.

Zu beachten ist außerdem, dass die Beschriftung der Kante zu einer Node erst dann eingefügt werden kann, wenn der Zweig unterhalb dieser Node vollständig ist.

Die Anker für die Verbindungslinien kann man über parent anchor und child anchor festlegen.

Open in writeLaTeX
\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{microtype}
\usepackage{tikz}
\usepackage[ngerman]{babel}
\usepackage{blindtext}

\begin{document}
\begin{tikzpicture}[
  every node/.style={draw,thick,
    align=justify, % Blocksatz in Noden
    anchor=north% Anker der child node für level distance
    },
  level distance=1.5cm,
  level 1/.style={sibling distance=.5\linewidth},
  level 2/.style={sibling distance=3cm},
  growth parent anchor=south,% Anker der parent node für level distance
  parent anchor=south,child anchor=north% Anker für Verbindungslinie
  ]
  \node[text width=.8\linewidth](Start){\scalebox{4}{Text}\\ 
      \ldots nun spalten wir das Produkt in zwei Teile 
      und behandeln beide Teile unterschiedlich}
    child{node[text width=0.4\linewidth]{\blindtext}
%
      child{node{Text 3}
        edge from parent node[above left, draw=none]{Probe 3}}
      child{node{Text 4}
        edge from parent node [above right, draw=none]{Probe 4}}
%
      edge from parent node[above left, draw=none]{Probe 1}
    }
%%
    child{node[text width=0.4\linewidth]{{\Huge Text}\\ \blindtext}
%
      child[sibling distance=4cm]{node[ text width=3.5cm,align=left]
        {ein etwas längerer Text}
        edge from parent node[above left, draw=none]{Probe 5}}
      child[sibling distance=4cm]{node{ein breiter Text}
        edge from parent node [above right, draw=none]{Probe 6}}
%
      edge from parent node[above right, draw=none]{Probe 2}
    }
  ;
\end{tikzpicture}
\end{document}

alt text


Mit der graphdrawing Bibliothek

Der Code wird bei Verwendung der graphdrawing Library deutlich übersichtlicher. Allerdings funktioniert die nur mit LuaLaTeX

Open in writeLaTeX
\documentclass{scrartcl}
\usepackage{fontspec}
\usepackage{microtype}
\usepackage{tikz}
\usetikzlibrary{babel,quotes,graphs,graphdrawing}
\usegdlibrary{trees}
\usepackage[ngerman]{babel}
\usepackage{blindtext}

\begin{document}
\begin{tikzpicture}
  \graph[
    tree layout,
    left anchor=north, right anchor=south,
    nodes={draw,thick,align=justify,anchor=north},
    level sep=1.5cm,sibling sep=.07\linewidth,
    every edge/.style={/tikz/graphs/left anchor=south}
    ]
  {
    Start/"
    \scalebox{4}{Text}\\ 
      \ldots nun spalten wir das Produkt in zwei Teile und behandeln beide Teile unterschiedlich
     "[text width=.8\linewidth]
    -- 
      {
        A/"\blindtext"[>"Probe 1"',text width=0.4\linewidth]
        -- 
          {
            Text1[>"Probe 3"'],
            Text2[>"Probe 4"]
          }
      , B/"{\Huge Text\\} \blindtext "[>"Probe 2",text width=0.4\linewidth]
       -- 
        {
          ein etwas längerer Text[>"Probe 5"', text width=3.2cm,align=left],
          ein breiter Text[>"Probe 6"];
        }
      };
  };

\end{tikzpicture}
\end{document}

alt text

Bisher ist es mir nicht gelungen die Verbindungen vom south Anker des Elternknotens zum north Anker des Kindes zeichnen zu lassen.

Permanenter link

beantwortet 21 Mär '14, 21:36

esdd's gravatar image

esdd
17.7k254256
Akzeptiert-Rate: 62%

bearbeitet 21 Mär '14, 21:54

Für längere Texte ist wichtig, dass der Node eine Absatzbox enthält. Man muss sie nicht mit \parbox oder minipage selber machen, was auch geht, doch TikZ verwendet sie schon, wenn man eine Breite vorgibt. Man kann auch ausrichten lassen, beispielsweise mit der Option text justified oder align=center, wie in folgendem kleinen Beispiel.

Open in writeLaTeX
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{blindtext}
\usepackage{microtype}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[
  level distance=4cm,
  every node/.style={rectangle, draw, text width=5.4cm, font=\tiny, text justified},
  level 1/.style={sibling distance=6cm},
  level 2/.style={sibling distance=3cm, nodes={text width=1.2cm, align=center},level distance=2.5cm},
]
\node {\blindtext}
  child {node {\blindtext}
    child {node {mehr Text}}
    child {node {mehr Text}}
  }
  child {node {\blindtext}
    child {node {mehr Text}}
    child {node {mehr Text}}
  };
\end{tikzpicture}

Text-Knoten im Baum

Permanenter link

beantwortet 21 Mär '14, 21:21

Felix's gravatar image

Felix
1.3k525666
Akzeptiert-Rate: 47%

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:

×728
×117
×53
×4

gestellte Frage: 21 Mär '14, 12:17

Frage wurde gesehen: 17,823 Mal

zuletzt geändert: 21 Mär '14, 21:54