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

Andr%C3%A9's gravatar image

André
93151933
Akzeptiert: 77%


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 02 Aug '14, 20:42

esdd's gravatar image

esdd
14.2k53251

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

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

Frage gestellt: 02 Aug '14, 13:00

Frage wurde angeschaut: 2,502 Mal

Zuletzt aktualisiert: 04 Aug '14, 03:32