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

esdd's gravatar image

esdd
17.7k254256
Akzeptiert-Rate: 62%

bearbeitet 03 Jan '14, 13:42

stefan's gravatar image

stefan ♦♦
18.1k143048


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 15 Dez '13, 02:23

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k2815
Akzeptiert-Rate: 53%

bearbeitet 16 Dez '13, 02:42

esdd's gravatar image

esdd
17.7k254256

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, 16:37

esdd's gravatar image

esdd
17.7k254256
Akzeptiert-Rate: 62%

bearbeitet 15 Dez '13, 20:20

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

gestellte Frage: 14 Dez '13, 21:58

Frage wurde gesehen: 13,687 Mal

zuletzt geändert: 03 Jan '14, 13:42