Frage

Ich habe gerade meine erste Diagramm in tikz fertig. Es sieht aus, wie ich es wollte, aber ich bin nicht glücklich damit, wie ich ‚codiert‘ es:

\begin{tikzpicture}
[node distance=14mm,
 item/.style={rounded corners,rectangle,
   thick,
   minimum width=20mm, minimum height=10mm}]

\node[item,draw=blue!50,fill=blue!20] (stack) {1394 Stack};
\node[item,left=of stack,draw=green!50,fill=green!20,yshift=-9mm] (app1) {Application};
\node[item,left=of stack,draw=green!50,fill=green!20,yshift=9mm] (app2) {Application};
\node[item,right=of stack,draw=orange!50,fill=orange!20] (ohci) {OHCI};
\node[item,right=of ohci,yshift=-15mm,draw=yellow!70,fill=yellow!35] (dev1) {Device};
\node[item,right=of ohci,yshift=0mm,draw=yellow!70,fill=yellow!35] (dev2) {Device};
\node[item,right=of ohci,yshift=15mm,draw=yellow!70,fill=yellow!35] (dev3) {Device};

\draw[thick] (app1) -- (stack)
             (app2) -- (stack)
             (stack) -- (ohci)
             (ohci) -- (dev1)
             (ohci) -- (dev2)
             (ohci) -- (dev3);

\node[xshift=7mm,yshift=1mm] (topUser) at (app1.east |- dev3.north) {};
\node[xshift=7mm,yshift=-1mm,label=above left:User space] (botUser) at (app1.east |- dev1.south) {};
\draw[dashed] (topUser) -- (botUser);

\node[xshift=7mm,yshift=1mm] (topKern) at (stack.east |- dev3.north) {};
\node[xshift=7mm,yshift=-1mm,label=above left:Kernel space,
label=above right:Hardware\phantom{p}] (botKern) at (stack.east |- dev1.south) {};
\draw[dashed] (topKern) -- (botKern);
\end{tikzpicture}

Die Dinge, die ich unbequem bin mit sind:

Wie ich die „Anwendung“ von Hand bewegt und „Gerät“ Knoten mit yshift Platz sie voneinander; Ich bin sicher, dass es eine elegantere Art und Weise sein, eine einfache Baumstruktur zur Herstellung

Die Linien (topKern -- botKern und topUser -- botUser) aus dem oberen Teil des Bildes nach unten gehen; Diese werden manuell auf der x-Achse ausgerichtet unter Verwendung von xshift=7mm zwischen zwei Knoten sein.

Meine Verwendung von \phantom{p} das Label „Hardware“, um sicherzustellen, hat die gleiche Grundlinie wie die beiden anderen Labels.

War es hilfreich?

Lösung

eine Baumstruktur erstellen, konsultieren pgfmanual.pdf, machen Bäume wachsen .

Für die Linien, würde ich Knoten schaffen, in der Mitte von zwei Knoten, die, und verwenden Sie dann die senkrechte Koordinatensystem wie Sie. Sie können auch verwenden current bounding box die „Grenze“ zu identifizieren.

Um align Basislinien korrekt, geben Sie text height und text depth. In Ihrem Fall zum Beispiel im Stil every label. Aber wie Sie sehen, habe ich die Etiketten als Knoten unter ...

\begin{tikzpicture}[level distance=35mm,node distance=15mm,text height=1.5ex,text depth=0.25ex]

\begin{scope}[every node/.style={rounded corners,rectangle,thick,minimum width=20mm, minimum height=10mm}]
\begin{scope}[level 1/.style={sibling distance=19mm,nodes={fill=green!20,draw=green!50}}]
\node[draw=blue!50,fill=blue!20] (stack) {1394 Stack} [grow=left]
  child {node (app2) {Application}}
  child {node (app1) {Application}};
\end{scope}

\begin{scope}[level 1/.style={sibling distance=15mm,nodes={fill=yellow!70,draw=yellow!35}}]
\node[right= of stack,draw=orange!50,fill=orange!20] (ohci) {OHCI} [grow=right]
  child {node {Device}}
  child {node {Device}}
  child {node {Device}};
\end{scope}
\end{scope}

\node[below=0mm of app1] (userspace) {User space};
\node at (userspace -| stack) (kernel) {Kernel};
\node at (userspace -| ohci) (hardware) {Hardware}; 

\path (app1) -- (stack) node[coordinate,midway] (between1) {};
\draw (ohci) -- (stack) node[coordinate,midway] (between2) {};

\draw[dashed] (current bounding box.north -| between1) -- (current bounding box.south -| between1);
\draw[dashed] (current bounding box.north -| between2) -- (current bounding box.south -| between2);

\end{tikzpicture}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top