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

Code, hier editierbar zum Übersetzen:
\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}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

alt text

gefragt 14 Dez '13, 21:58

esdd's gravatar image

esdd
17.8k284257
Akzeptiert-Rate: 62%

bearbeitet 03 Jan '14, 13:42

stefan's gravatar image

stefan ♦♦
18.4k163148


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

Code, hier editierbar zum Übersetzen:
\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
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Output

alt textalt text

Permanenter link

beantwortet 15 Dez '13, 02:23

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k3815
Akzeptiert-Rate: 53%

bearbeitet 16 Dez '13, 02:42

esdd's gravatar image

esdd
17.8k284257

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:

Code, hier editierbar zum Übersetzen:
\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}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

alt text

Permanenter link

beantwortet 15 Dez '13, 16:37

esdd's gravatar image

esdd
17.8k284257
Akzeptiert-Rate: 62%

bearbeitet 15 Dez '13, 20:20

Deine Antwort
[Vorschau ausblenden]

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

Frage-Themen:

×731
×12

gestellte Frage: 14 Dez '13, 21:58

Frage wurde gesehen: 14,774 Mal

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

Willkommen, erstes Mal hier? Schau mal unter FAQ!

×