Ich habe einen multinomialen Verarbeitungsbaum mit TikZ erstellt. Darin habe ich mehrere Rechtecke, die ich in der Höhe begrenzen will (Anmerkung: es folgen mehrere dieser Bäume nacheinander und sie sollten alle auf eine Seite; die Abstände zwischen den Rechtecken rechts in der Abbildung werden verringert, nachdem das Problem mit der Höhe gelöst ist). Wie ich eine minimale Höhe festlege, habe ich herausgefunden. Jedoch nicht, wie ich die Höhe maximal begrenze. Ich kann durch text height=.15cm die Höhe verringern, allerdings rutscht der Text dann nach oben und ist nicht mehr vertikal mittig in dem Rechteck.

Wie kann ich also die Höhe minimieren und dabei einen vertikal mittig ausgerichteten Text in dem Rechteck erhalten?

Open in writeLaTeX
\documentclass[12pt]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}

\usepackage{kpfonts} % http://www.tug.dk/FontCatalogue/kpserif/

\usepackage{fixltx2e}
\usepackage{pgfplots}

\begin{document}

% level distance = Länge der Verbindungen
% sibling distance = vertikaler Abstand der child-Knoten
\tikzstyle{level 1}=[level distance=3.0625cm, sibling distance=2.25cm]
\tikzstyle{level 2}=[level distance=3.0625cm, sibling distance=1.5cm]
\tikzstyle{level 3}=[level distance=3.0625cm, sibling distance=1cm]

\begin{tikzpicture}[grow=right,sloped,
myrectangle/.style={rectangle,rounded corners,draw,minimum width=4.25cm,minimum height=.6cm, text height=.15cm}]
\node[myrectangle] {neu}
  child {node[circle,draw]{~}
    child {node[circle,draw]{~}
      child {node[myrectangle,xshift=3.0625cm] {"`neu"'}
      }
      edge from parent
      node[below] {1--\textit{b}}
    }
    child {node[circle,draw]{~}
      child {node[circle,draw]{~}
        child {node[myrectangle] {"`alt"'}
        }
        edge from parent
        node[below] {1--\textit{g}}
      }
      child {node[circle,draw]{~}
        child {node[myrectangle] {"`uralt"'}
        }
        edge from parent
        node[above] {\textit{g}}
      }
      edge from parent
      node[above] {\textit{b}}
    }
    edge from parent
    node[below] {1-\textit{D}}
  }
  child {node[circle,draw]{~}
    child {node[myrectangle,xshift=6.125cm] {"`neu"'}
    }
    edge from parent
    node[above] {\textit{D}}
  };
\end{tikzpicture}

\end{document}

gefragt 02 Aug '14, 19:00

Andr%C3%A9's gravatar image

André
986262836
Akzeptiert-Rate: 33%


Wenn ich dich richtig verstehe, möchtest du, dass die rechteckigen Knoten eine möglichst geringe Höhe haben? Du könntest dafür

Open in writeLaTeX
 minimum height=\ht\strutbox+\dp\strutbox,
 inner ysep=0pt

Dann sind die Nodes so hoch wie eine strutbox. Wird eine kleinere Schriftgröße gewählt und soll die Boxhöhe entsprechend geringer sein, muss man die Schriftgrößenänderung über die Option node font vornehmen, also zum Beispiel mit node font=\footnotesize. Wenn Du etwas mehr Abstand zur Schrift haben möchtest, dann erhöhe minimum height etwas, in dem Du zum Beispiel einen Millimeter dazu addierst.

alt text

Code:

Open in writeLaTeX
\documentclass[12pt]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{kpfonts}
\usepackage{fixltx2e}
\usepackage{tikz}

% level distance = Länge der Verbindungen
% sibling distance = vertikaler Abstand der child-Knoten
\tikzset{
  mytree/.style={
    level distance=3.0625cm,
    level 1/.style={sibling distance=2.25cm},
    level 2/.style={sibling distance=1.5cm},
    level 3/.style={sibling distance=1cm},
  }
}

\begin{document}
\begin{tikzpicture}[
  grow=right,
  sloped,
  myrectangle/.style={rectangle,rounded corners,draw,minimum width=4.25cm,
      minimum height=\ht\strutbox+\dp\strutbox,
      inner ysep=0pt
    },
  mycircle/.style={circle,draw},
  mytree
  ]
\node[myrectangle] {neu}
  child {node[mycircle]{}
    child {node[mycircle]{}
      child {
        child {node[myrectangle] {"`neu"'}
        }
      }
      edge from parent
      node[below] {1--\textit{b}}
    }
    child {node[mycircle]{}
      child {node[mycircle]{}
        child {node[myrectangle] {"`alt"'}
        }
        edge from parent
        node[below] {1--\textit{g}}
      }
      child {node[mycircle]{}
        child {node[myrectangle] {"`uralt"'}
        }
        edge from parent
        node[above] {\textit{g}}
      }
      edge from parent
      node[above] {\textit{b}}
    }
    edge from parent
    node[below] {1-\textit{D}}
  }
  child {node[mycircle]{}
    child {
      child {
        child{node[myrectangle] {"`neu"'}
        }
      }
    }
    edge from parent
    node[above] {\textit{D}}
  };
\end{tikzpicture}
\end{document}

Ich habe in deinem Code ein paar weitere Änderungen vorgenommen. Insbesondere habe ich leere childs an den Stellen eingefügt, an denen Nodes "fehlen". Dadurch entfällt das händische Verschieben einzelner Knoten.


Du kannst aber auch eine schriftunabhängige minimum height vorgeben, den Inhalt mit Hilfe von \raisebox vertikal zentrieren und anschließend Höhe und Tiefe des Ergebnisses über die optionalen Argumente von \raisebox "verstecken". Ist der Text dann aber größer als die vorgegebene minimum height, dann steht er über. Das sieht man gut im folgenden Beispiel:

alt text

Open in writeLaTeX
\documentclass[12pt]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}

\usepackage{kpfonts}

\usepackage{fixltx2e}
\usepackage{tikz}

% level distance = Länge der Verbindungen
% sibling distance = vertikaler Abstand der child-Knoten
\tikzset{
  mytree/.style={
    level distance=3.0625cm,
    level 1/.style={sibling distance=2.25cm},
    level 2/.style={sibling distance=1.5cm},
    level 3/.style={sibling distance=1cm},
  }
}

\newcommand\mytext[1]{%
  \raisebox{\dimexpr-.5\height+.5\depth\relax}[0pt][0pt]{#1}}

\begin{document}

\begin{tikzpicture}[
  grow=right,
  sloped,
  myrectangle/.style={
    rectangle,rounded corners,draw,minimum width=4.25cm,
    minimum height=6mm,inner ysep=0pt
    },
  mycircle/.style={
    circle,draw,
  },
  mytree
  ]
\node[myrectangle] {\mytext{neu}}
  child {node[mycircle]{}
    child {node[mycircle]{}
      child {
        child {node[myrectangle,node font=\tiny] {\mytext{"`neu"'}}
        }
      }
      edge from parent
      node[below] {1--\textit{b}}
    }
    child {node[mycircle]{}
      child {node[mycircle]{}
        child {node[myrectangle,node font=\huge] {\mytext{"`alt"'}}
        }
        edge from parent
        node[below] {1--\textit{g}}
      }
      child {node[mycircle]{}
        child {node[myrectangle] {\mytext{"`uralt"'}}
        }
        edge from parent
        node[above] {\textit{g}}
      }
      edge from parent
      node[above] {\textit{b}}
    }
    edge from parent
    node[below] {1-\textit{D}}
  }
  child {node[mycircle]{}
    child {
      child {
        child{node[myrectangle] {\mytext{"`neu"'}}
        }
      }
    }
    edge from parent
    node[above] {\textit{D}}
  };
\end{tikzpicture}

\end{document}
Permanenter link

beantwortet 03 Aug '14, 02:42

esdd's gravatar image

esdd
17.8k284257
Akzeptiert-Rate: 62%

Super, herzlichen Dank! Das hätte ich nicht hinbekommen.

(04 Aug '14, 09:32) André
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
×3

gestellte Frage: 02 Aug '14, 19:00

Frage wurde gesehen: 12,420 Mal

zuletzt geändert: 04 Aug '14, 09:32