Mit TikZ sollen Rhomben gezeichnet werden, deren Höhe sich automatisch so anpasst, dass die Rhomben unabhängig vom Inhalt immer gleich breit sind.

\documentclass[margin=2mm]{standalone} 
\usepackage{tikz} 
\usetikzlibrary{positioning,shapes.geometric} 
\tikzset{decision/.style={draw,diamond,text width=3cm,align=center}}

\begin {document} 
\begin{tikzpicture}[node distance=0.5cm] 
   \node[decision](decision1){Mein Text}; 
   \node[decision,below=of decision1](decision2){Hier sollte ein mehrzeiliger Text stehen.}; 
   \node[decision,below=of decision2]{Hier sollte dann ein langer Text stehen, der noch mehr Zeilen braucht.}; 
\end {tikzpicture}

\end {document}

alt text

gefragt 14 Dez '13, 15:58

esdd's gravatar image

esdd
14.2k53251
Akzeptiert: 87%

bearbeitet 03 Jan '14, 07:42

stefan's gravatar image

stefan ♦♦
5.8k12234


Wie auch immer die Definition für „elegant“ in diesem Fall lautet, hier ist eine alternatives Diamond-Shape, das auf diamond basiert und sich nur in der Definition des \outernortheast-„Anchors“ von dieser unterscheidet.

Ist stretch Diamond to width gesetzt, wird der in /pgf/minimum width gespeicherte Wert als fixe Rhombus-Breite interpretiert und der aspect dementsprechend gesetzt. Es wird dabei kein besonderer Test durchgeführt. Ist die Rhombus-Breite nur wenig größer als die Text-Breite inklusiver des doppelten inner xseps, so kann es zu sehr hohen TikZ-Pictures oder zu Problem kommen, wenn der aspect eben gegen ∞ geht.

Ist die minimum width sogar kleiner als die Breite, ist der eigentliche Rhombus einfach zu klein.

Für stretch Diamond to height gilt Entsprechendes.

Code

\documentclass[margin=2mm,tikz]{standalone} 
\usetikzlibrary{shapes.geometric,chains,backgrounds}
\makeatletter
\newif\ifpgf@sh@Diamond@to@width
\newif\ifpgf@sh@Diamond@to@height
\pgfset{stretch Diamond to width/.is if=pgf@sh@Diamond@to@width}
\pgfset{stretch Diamond to height/.is if=pgf@sh@Diamond@to@height}
\pgfdeclareshape{Diamond}{%
  \savedanchor\outernortheast{% from tikzlibrary.shapes.geometric.code.tex with adaptions
    %
    % Calculate width and height of the inner rectangle
    %
    \pgf@xa=.5\wd\pgfnodeparttextbox%
    \pgfmathsetlength\pgf@xc{\pgfkeysvalueof{/pgf/inner xsep}}%
    \advance\pgf@xa by\pgf@xc%
    \pgf@ya=.5\ht\pgfnodeparttextbox%
    \advance\pgf@ya by.5\dp\pgfnodeparttextbox%
    \pgfmathsetlength\pgf@yc{\pgfkeysvalueof{/pgf/inner ysep}}%
    \advance\pgf@ya by\pgf@yc%
    %
    % Calculate width and height of diamond
    %
    \pgfmathsetlength\pgf@xb{\pgfkeysvalueof{/pgf/minimum width}}%
    \pgfmathsetlength\pgf@yb{\pgfkeysvalueof{/pgf/minimum height}}%
    \pgf@xb=.5\pgf@xb \pgf@yb=.5\pgf@yb
    \ifpgf@sh@Diamond@to@width
      \pgfmathsubtract@{\pgf@sys@tonumber\pgf@xb}{\pgf@sys@tonumber\pgf@xa}%
      \pgfmathdivide@{\pgfmathresult}{\pgf@sys@tonumber\pgf@ya}%
      \pgfsetshapeaspect{\pgfmathresult}%
    \else\ifpgf@sh@Diamond@to@height
      \pgfmathsubtract@{\pgf@sys@tonumber\pgf@yb}{\pgf@sys@tonumber\pgf@ya}%
      \pgfmathdivide@{\pgf@sys@tonumber\pgf@xa}{\pgfmathresult}%
      \pgfsetshapeaspect{\pgfmathresult}%
    \fi\fi
    \pgf@x=\pgf@xa%
    \advance\pgf@x by\pgfshapeaspect\pgf@ya%
    \pgf@y=\pgfshapeaspectinverse\pgf@xa%
    \advance\pgf@y by\pgf@ya%
    \ifpgf@sh@Diamond@to@width\else\ifpgf@sh@Diamond@to@height\else
      %
      % Check against minimum height/width
      %  
      \ifdim\pgf@x<\pgf@xb%
        % yes, too small. Enlarge...
        \pgf@x=\pgf@xb%
      \fi% 
      \ifdim\pgf@y<\pgf@yb%
        % yes, too small. Enlarge...
        \pgf@y=\pgf@yb%
      \fi%
    \fi\fi
    %
    % Add outer border
    %
    \pgfmathsetlength\pgf@xa{\pgfkeysvalueof{/pgf/outer xsep}}%
    \advance\pgf@x by\pgf@xa%
    \pgfmathsetlength\pgf@ya{\pgfkeysvalueof{/pgf/outer ysep}}%
    \advance\pgf@y by\pgf@ya%
  }%
  \savedanchor\text{%
    \pgf@x=-.5\wd\pgfnodeparttextbox%
    \pgf@y=-.5\ht\pgfnodeparttextbox%
    \advance\pgf@y by.5\dp\pgfnodeparttextbox%
  }%
  \inheritanchor[from=diamond]{text}%
  \inheritanchor[from=diamond]{center}%
  \inheritanchor[from=diamond]{mid}%
  \inheritanchor[from=diamond]{base}%
  \inheritanchor[from=diamond]{north}%
  \inheritanchor[from=diamond]{south}%
  \inheritanchor[from=diamond]{west}%
  \inheritanchor[from=diamond]{east}%
  \inheritanchor[from=diamond]{north east}%
  \inheritanchor[from=diamond]{south east}%
  \inheritanchor[from=diamond]{north west}%
  \inheritanchor[from=diamond]{south west}%
  \inheritanchorborder[from=diamond]%
  \inheritbackgroundpath[from=diamond]}
\makeatother
\tikzset{decision/.style={draw,Diamond,text width=+3cm,align=center}}
\newcommand*\auxA[2]{% fixed inner seps
  \draw[dashed] ([shift={(-.3333em,-.3333em-#2\baselineskip)}]#1.text) rectangle
                ([shift={(-.3333em,-.3333em-#2\baselineskip)},
                               rotate around=180:(#1.center)]#1.text);}
\begin{document} 
\begin{tikzpicture}[gridded,start chain=going below, node distance=+0pt, nodes={on chain},
    stretch Diamond to width, decision/.append style={minimum width=+5cm}] 
  \node[decision] (n1) {Mein Text};
  \node[decision] (n2) {Hier sollte ein mehrzeiliger Text stehen.}; 
  \node[decision] (n3)
    {Hier sollte dann ein langer Text stehen, der noch mehr Zeilen braucht.};
  \auxA{n1}{0}\auxA{n2}{2}\auxA{n3}{4}
\end{tikzpicture}
\begin{tikzpicture}[gridded,start chain=going right, node distance=+0pt, nodes={on chain},
    stretch Diamond to height, decision/.append style={minimum height=+5cm}] 
  \node[decision] (n1) {Mein Text};
  \node[decision] (n2) {Hier sollte ein mehrzeiliger Text stehen.}; 
  \node[decision] (n3)
    {Hier sollte dann ein langer Text stehen, der noch mehr Zeilen braucht.};
  \auxA{n1}{0}\auxA{n2}{2}\auxA{n3}{4}
\end{tikzpicture}
\end{document}

Output

alt textalt text

Permanenter link

beantwortet 14 Dez '13, 20:23

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k1415

bearbeitet 15 Dez '13, 20:42

esdd's gravatar image

esdd
14.2k53251

Wenn die Breite der Rhomben gleich bleiben und dafür die Höhe angepasst werden soll, muss für jede dieser Noden die Option aspect, mit der das Verhältnis von Breite und Höhe festgelegt wird, entsprechend angepasst werden. Dafür kann man die Ähnlichkeit zwischen dem roten und dem blauen Dreieck in der folgenden Skizze nutzen:

alt text

Der Text (oder sonstige Inhalt) einer Rhombus Node wird immer in einer rechteckigen Box (in der Skizze gestrichelt) gesetzt, deren Breite man vorgeben kann und hier auch vorgeben muss. Die Gesamthöhe dieser rechteckigen Box, die dann vom konkreten Inhalt abhängt, kann man bestimmen. Wegen der bereits erwähnten Dreiecksähnlichkeit lässt sich aspect dann auch einfach als Verhältnis der Gesamthöhe des Inhaltes zur Differenz aus gewünschter Rhombenbreite und vorgegebener Textbreite berechnen. Damit ändert sich die Höhe des Rhombus immer um den gleichen Faktor wie die Höhe der rechteckigen Box und die Rhombenbreite bleibt gleich.

Hier ist eine mögliche Umsetzung:

\documentclass[margin=2mm]{standalone}

\usepackage{tikz} 
\usetikzlibrary{positioning,shapes.geometric,backgrounds}

\tikzset{decision/.style={draw,inner sep=0pt,diamond,minimum width=\diamondbreite,aspect=\aspect}}

\newbox\mybox 
\newlength\Boxhoehe

\newcommand\diamondbreite{2cm} 
\newcommand\diamondtextbreite{1cm} 
\newcommand\aspect{1}

\newcommand\tikzDiamondBox[2][]{% 
   % Abspeichern des Inhaltes in \mybox
   \sbox\mybox{\pgfinterruptpicture\parbox{\diamondtextbreite}{\centering \strut#2}\endpgfinterruptpicture}% 
   % Gesamthöhe von \mybox (also des Inhaltes) ermitteln
   \setlength\Boxhoehe{\dimexpr\ht\mybox+\dp\mybox\relax}
   % Berechnen von \aspect
   \pgfmathsetmacro\aspect{(\diamondbreite-\diamondtextbreite)/\the\Boxhoehe}
   % Ausgabe
   \node[decision,#1]{\usebox\mybox}; 
}

\begin {document} 
\begin{tikzpicture}[node distance=0cm,gridded] 
   \renewcommand\diamondbreite{5cm} 
   \renewcommand\diamondtextbreite{3cm} 
   \tikzDiamondBox[name=decision1]{Mein Text} 
   \tikzDiamondBox[below=of decision1,name=decision2]{Hier sollte ein mehrzeiliger Text stehen.} 
   \tikzDiamondBox[below=of decision2]{Hier sollte dann ein langer Text stehen, der noch mehr Zeilen braucht.} 
\end {tikzpicture}

\end {document}

alt text

Permanenter link

beantwortet 15 Dez '13, 10:37

esdd's gravatar image

esdd
14.2k53251

bearbeitet 15 Dez '13, 14:20

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
×8

Frage gestellt: 14 Dez '13, 15:58

Frage wurde angeschaut: 3,912 Mal

Zuletzt aktualisiert: 03 Jan '14, 07:42