[tikZ] Blöcke integrieren Thema ist als GELÖST markiert

Tabellen und Grafiken erstellen und anordnen


olpo

[tikZ] Blöcke integrieren

Beitrag von olpo »

Hallo,

ich möchte einen Block (rectangle) in einen anderen integrieren. Geht das so, das ich die dann als einen Block verschieben kann? Im Prinzip, als hätte der innere Block den äußeren als Rahmen. Oder geht das nicht, und ich muss die beiden Blöcke übereinander zeichnen, was das verschieben schwieriger machen würde.

Also, ich bin ganz neu bei TikZ.
Falls mein Vorhaben nicht klar ist, oder was ich mit verschieben meine, einfach nachfragen.

DANKE

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Wie kann ich TikZ Nodes verschachteln?

Wenn Du konkeretere Hilfe benötigst, dann erstelle ein Minimalbeispiel

Gruß
Elke

Felix
Forum-Century
Forum-Century
Beiträge: 210
Registriert: Sa 25. Jan 2014, 13:57

Beitrag von Felix »

Hi olpo!

Wenn ich TikZ-Fragen hab, frag ich auch gern dort auf TeXwelt.de, vllt. hast Du das gesehen beim Klicken auf Elke's Links. Das war ja sogar meine Frage. :-o Inspiration.

Nach längerer Zeit gucke ich grad mal wieder hier rein und sehe Deine. Also man kann ein tikzpicture innerhalb ein zweites packen. Oder man speichert in einer TeX-Box und verwendet die. Oder, ganz neu mit TikZ 3.0, man verwendet das pic-Feature.

Felix

olpo

Beitrag von olpo »

gut, Danke.


Ich bin jetzt so weit, daß ich innere Blöcke habe.

1.) Wie kann ich den inneren Block positionieren? Ich hätte ihn gern etwas weiter unten und nicht mittig.

2.) Ich möchte noch die Beschriftung "Block 1" in die obere linke Ecke schieben. Muss ich dafür extra einen durchsichtigen node machen und da positionieren, oder geht das auch einfacher?

3.) Der Pfeil sollte die inneren Blöcke verbinden. Kann ich die Pfeilspitzen dort "andocken", oder kann ich nur mit der minimum height probieren, bis es passt?
\documentclass[12pt,a4paper]{article}
\usepackage[ngerman]{babel}
\usepackage{tikz}
\usetikzlibrary{positioning, arrows, shapes}
\begin{document}

\begin{figure}
 \centering
 \begin{tikzpicture}[scale=1.0, transform shape, on grid, node distance=0.5em, nodes=draw]

  \node(b1)[rectangle, minimum height=12em, minimum width=7em, align=center]{
   Block\_1\\
   \begin{tikzpicture}
    \node(i1)[rectangle, minimum height=3em, minimum width=4em, align=center]{
     Innen\_1
    };
   \end{tikzpicture}
  };

  \node(b2)[rectangle, minimum height=12em, minimum width=7em, align=center, xshift=15.5em]{
   Block\_2\\
   \begin{tikzpicture}
    \node(i2)[rectangle, minimum height=3em, minimum width=4em, align=center]{
     Innen\_2
    };
   \end{tikzpicture}
  };

  \node[double arrow, align=center, xshift=7.25em,yshift=-2.5em, rotate=0, minimum width=2.5em, minimum height=8em, right=of b1](verbindung){};

 \end{tikzpicture}
\end{figure}
\end{document}

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Vorschlag:
\documentclass[12pt,a4paper]{article} 
\usepackage[ngerman]{babel} 
\usepackage{tikz} 
\usetikzlibrary{positioning,shapes} 
\begin{document} 
\begin{figure} 
  \centering 
  \begin{tikzpicture}[
      nodes=draw,
      innen/.style={minimum height=3em, minimum width=4em,align=center,anchor=north},
      block/.style={minimum height=12em, minimum width=7.5em},
      beschriftung/.style={draw=none,anchor=north west},
      pfeil/.style={double arrow, minimum width=2.5em}
    ] 
    \node[block](b1){};
    \node[beschriftung] at (b1.north west){Block\_1};
    \node[innen](i1)at(b1){Innen\_1};
%
    \node[block,right=6.5em of b1](b2){};
    \node[beschriftung] at (b2.north west){Block\_2};
    \node[innen](i2)at (b2){Innen\_2};
%
    \node[pfeil,right=0pt of i1,minimum height=10em](verbindung){};
  \end{tikzpicture} 
\end{figure} 
\end{document}
minimum height für den Pfeil kann man auch bestimmen lassen. Eine Möglichkeit wäre
\documentclass[12pt,a4paper]{article} 
\usepackage[ngerman]{babel} 
\usepackage{tikz} 
\usetikzlibrary{positioning,shapes,calc} 
\newlength\vecx
\newlength\vecy
\newlength\dist
\begin{document} 
\begin{figure} 
  \centering 
  \begin{tikzpicture}[
      nodes=draw,
      innen/.style={minimum height=3em, minimum width=4em,align=center,anchor=north},
      block/.style={minimum height=12em, minimum width=7.5em},
      beschriftung/.style={draw=none,anchor=north west},
      pfeil/.style={double arrow, minimum width=2.5em}
    ] 
    \node[block](b1){};
    \node[beschriftung] at (b1.north west){Block\_1};
    \node[innen](i1)at(b1){Innen\_1};
%
    \node[block,right=6.5em of b1](b2){};
    \node[beschriftung] at (b2.north west){Block\_2};
    \node[innen](i2)at (b2){Innen\_2};
%
    \coordinate(Dist)at($(i2.west)-(i1.east)$);
    \pgfextractx{\vecx}{\pgfpointanchor{Dist}{center}}
    \pgfextracty{\vecy}{\pgfpointanchor{Dist}{center}}
    \pgfmathsetlength\dist{veclen(\vecx,\vecy)}
    \node[pfeil,right=0pt of i1,minimum height=\dist](verbindung){};
  \end{tikzpicture} 
\end{figure} 
\end{document}
Gruß
Elke

olpo

Beitrag von olpo »

Sehr sehr schön.
Genau so muss das sein, mit parametrischer Positionierung.

Jetzt versuche ich noch aus dem Doppelpfeil zwei einzelne zu machen. Ich kriege den zweiten aber nicht richtig gesetzt.

\documentclass[12pt,a4paper]{article}
\usepackage[ngerman]{babel}
\usepackage{tikz}
\usetikzlibrary{positioning, arrows, shapes, calc}
\newlength\vecx 
\newlength\vecy 
\newlength\dist 
\begin{document}


\begin{figure} 
  \centering 
  \begin{tikzpicture}[ 
      nodes=draw, 
      innen/.style={minimum height=3em, minimum width=4em,align=center,anchor=north, yshift=-1em}, 
      block/.style={minimum height=12em, minimum width=7.5em}, 
      beschriftung/.style={draw=none,anchor=north west, xshift=0.5em, yshift=-0.5em}, 
      pfeil/.style={single arrow, minimum width=2.5em} 
    ] 
    \node[block](b1){}; 
    \node[beschriftung] at (b1.north west){Block\_1}; 
    \node[innen](i1)at(b1){Innen\_1}; 
% 
    \node[block,right=6.5em of b1](b2){}; 
    \node[beschriftung] at (b2.north west){Block\_2}; 
    \node[innen](i2)at (b2){Innen\_2}; 
% 
    \coordinate(Dist)at($(i2.west)-(i1.east)$); 
    \pgfextractx{\vecx}{\pgfpointanchor{Dist}{center}} 
    \pgfextracty{\vecy}{\pgfpointanchor{Dist}{center}} 
    \pgfmathsetlength\dist{veclen(\vecx,\vecy)} 
    \node[pfeil,right=0pt of i1,minimum height=\dist, yshift=1em, rotate=0](rechts){}; 
    \node[pfeil,left=0pt of i2,minimum height=\dist, yshift=-1em, rotate=180](links){}; 
  \end{tikzpicture} 
\end{figure} 
\end{document}

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

left=0pt of i2 fügt den Pfeil bei i2.west mit anchor=east ein. Erst danach wird um 180° rotiert, weshalb der Pfeil auf der "falschen" Seite landet. Ergänze deshalb anchor=west, nach left=...
\node[pfeil,left=0pt of i2,anchor=west,minimum height=\dist, yshift=-1em, rotate=180](links){}; 
Alternativ geht auch
\node[pfeil,anchor=west,minimum height=\dist, yshift=-1em, rotate=180](links)at(i2.west){}; 
Gruß
Elke

Antworten