Seite 1 von 1

Rhomben in TIKZ gleich breit

Verfasst: Mi 20. Nov 2013, 21:00
von dagruess
Hallo zusammen,

ich schreibe gerade meine Diplomarbeit mit Tex und muss hierfür ein Flussdiagramm erstellen. Dabei sollten die Rhomben immer gleich breit sein - unabhängig von der Menge enthaltenen Texts. Die Höhe der Rhomben kann gerne variieren. Im Moment kenne ich keine Möglichkeit, dies ohne langes Herumprobieren mit text width und aspect einzustellen.

Gibt es außerdem eine Möglichkeit, die Abstände der einzelnen Formen voneinander im Voraus festzulegen? Im Moment mache ich das über die Koordinaten, was bedeutet, dass ich bei einer Änderung am Anfang sämtliche Formen neu positionieren muss.

Anbei ein (hoffentlich aussagekräftiges) Minimalbeispiel, um mein Anliegen zu verdeutlichen.

Schon mal vielen Dank für eure Hilfe.
\documentclass[paper=a4,fontsize=12pt,]{scrreprt}
\usepackage[utf8]{inputenc}					
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}	
\usepackage{pgfplots}						
	 \pgfplotsset{width=16cm,compat=1.5}
\usepackage{tikz}
\usetikzlibrary{patterns,calc, arrows, shapes.geometric,shapes}
\usepackage {flowchart}


\begin {document}
\begin {tikzpicture}

\node (decision1) at (0,0cm) [draw,diamond, aspect=2.2,inner sep=0pt,
text width=3cm,
minimum height=0.6cm,
text centered,
] 
{\small Einzeiliger Text};

\node (decision2) at (0,-3cm) [draw,diamond, aspect=2.2, inner sep=0pt,
text width=3cm,
minimum height=0.6cm,
text centered,
] 
{\small Hier sollte ein \\dreizeiliger Text steh};

\node (decision3) at (0,-6cm) [draw,diamond, aspect=2.2,inner sep=0pt,
text width=3cm,
minimum height=0.6cm,
text centered,
] 
{\small Hier sollte ein \\vierzeiliger Text \\stehen. Hier sollte ein vi};
\end {tikzpicture}
\end {document}

Dimensionen bestimmen

Verfasst: Mi 20. Nov 2013, 21:34
von localghost
Gib minimale Werte für Breite und Höhe an. Die Abstände von Knoten lassen sich mit der Bibliothek positioning relativ zu einander als Optionen für die Umgebung tikzpicture angeben.
\documentclass[
  paper=a4,
  fontsize=12pt,
  ngerman
]{scrreprt}
\usepackage[T1]{fontenc}
\usepackage{selinput}
\SelectInputMappings{
  adieresis={ä},
  germandbls={ß}
}
\usepackage{babel}
\usepackage{tikz}
\usetikzlibrary{positioning,shapes.geometric}

\begin {document}
  \begin {tikzpicture}[
    node distance=4cm,
    decision/.style={
      draw,
      diamond,
      aspect=2.2,
      inner sep=0pt,
      text width=3cm,
      minimum width=18em,
      minimum height=18ex,
      text centered,
      font=\small
    }
  ]
    \node[decision]                    (decision1) at (0,0)  {Einzeiliger Text};
    \node[decision,below of=decision1] (decision2)           {Hier sollte ein \\dreizeiliger Text steh};
    \node[decision,below of=decision2] (decision3)           {Hier sollte ein \\vierzeiliger Text \\stehen. Hier sollte ein vi};
  \end {tikzpicture}
\end {document}

Thorsten

Verfasst: Mi 20. Nov 2013, 21:55
von dagruess
Hallo Thorsten,

danke für die schnelle Antwort. Die Positionierung ist super. In deinem Code sind die Rhomben aber auch alle gleich hoch, was dann sehr viel Platz kostet. Kann man, bei gleicher Breite, deren Höhe auch dem Text anpassen?

Daniel

Verfasst: Do 21. Nov 2013, 08:40
von esdd
Wenn die Höhe variieren darf, dann muss aus meiner Sicht keine minimale Höhe vorgegeben werden. Bei der minimalen Breite musst du allerdings beachten, dass diese wirklich nur der Minimalwert ist. Fügst du mehr Text ein, so dass mehr Zeilen in einem Rhombus notwendig sind, dann kann dieser auch breiter werden.

Mit zum Beispiel below of=... wird der Abstand zwischen den Mittelpunkten der Elemente vorgegeben. Wenn du statt dessen den Abstand zwischen den äußeren Punkten der Rhomben vorgeben möchtest, dann verwende below=of ... Nur für letzteres wird die Bibliothek positioning benötigt. Siehe auch: Was ist der Unterschied zwischen right of= und right=of in TikZ?.
\documentclass[ 
   fontsize=12pt, 
   ngerman 
]{scrreprt} 
\usepackage[T1]{fontenc} 
\usepackage{selinput} 
\SelectInputMappings{ 
   adieresis={ä}, 
   germandbls={ß} 
} 
\usepackage{babel} 
\usepackage{tikz} 
\usetikzlibrary{positioning,shapes.geometric} 

\begin {document} 
   \begin {tikzpicture}[ 
     %node distance=4cm, 
     decision/.style={ 
       draw, 
       diamond, 
       aspect=2.2, 
       inner sep=0pt, 
       text width=3cm, 
       minimum width=18em, 
       %minimum height=18ex, 
       text centered, 
       font=\small 
     } 
   ] 
     \node[decision]                     (decision1)  {Einzeiliger Text}; 
     \node[decision,below= of decision1] (decision2)  {Hier sollte ein dreizeiliger Text stehen.}; 
     \node[decision,below= of decision2] (decision3)  {Hier sollte ein vierzeiliger Text stehen. Er steht da.}; 
   \end {tikzpicture} 
\end {document}
Gruß
Elke

Verfasst: Mo 25. Nov 2013, 14:33
von dagruess
Genau das ist mein Problem - ich möchte - wie das ja in MS Office problemlos möglich ist - eine bestimmte Breite vorgeben können und die Höhe dabei dem enthaltenen Text anpassen.

Auch wenn ich keine Höhe angebe, variiert die Breite. Um bei gleicher Breite die Höhe variiernen zu können, muss ja auch der Aspekt variabel sein.

In meinem Diagramm habe ich momentan mehrere Entscheidungsrhomben, die nur eine Zeile Text enthalten und je einen mit zwei drei und vier Zeilen. Um ein gleichmäßiges Bild zu erzeugen und um das Bild noch auf eine Seite packen zu können hätte ich gerne die oben beschiebene Form.

Verfasst: Di 26. Nov 2013, 10:23
von esdd
Hier ist ein Vorschlag, bei dem aspect berechnet wird:
\documentclass[margin=5mm]{standalone} 

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

\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][]{%
  \sbox\mybox{\pgfinterruptpicture\parbox{\diamondtextbreite}{\centering \strut#2}\endpgfinterruptpicture}%
  \setlength\Boxhoehe{\dimexpr\ht\mybox+\dp\mybox\relax}%
  \pgfmathsetmacro\aspect{(\diamondbreite-\diamondtextbreite)/\the\Boxhoehe}
  \node[decision,#1]{\usebox\mybox};
}


\begin {document}
\begin{tikzpicture}
  \renewcommand\diamondbreite{4cm}
  \renewcommand\diamondtextbreite{2cm}
  \tikzDiamondBox[name=decision1]{Mein Text}
  \tikzDiamondBox[below=of decision1,name=decision2]{Hier sollte ein dreizeiliger Text stehen.}
  \tikzDiamondBox[below=of decision2]{Hier sollte dann ein wirklich vierzeiliger Text stehen.}
\end {tikzpicture} 
\end {document}
Gruß
Elke

Verfasst: Mo 2. Dez 2013, 08:18
von dagruess
Hallo Elke,

das ist genau das, was ich mir vorgestellt habe. Vielen Dank!

Daniel

Verfasst: So 15. Dez 2013, 15:49
von esdd
Noch besser geht es mit diesem Vorschlag: Rhomben mit konstanter Breite mit TikZ zeichnen
Damit kann dann alternativ zur Breite auch die Höhe fest vorgeben werden.