Pregunta

Me acaban de terminar mi primer diagrama de la TikZ. Parece como quería hacerlo, pero estoy satisfecho con la forma en que tengo 'codificados' que:

\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}

Las cosas que me siento incómodo con son:

Cómo he movido manualmente la "Aplicación" y los nodos "dispositivo" utilizando yshift al espacio aparte uno del otro; Estoy seguro de que debe haber una forma más elegante de producir un simple árbol-como la estructura

Las líneas (topKern -- botKern y topUser -- botUser) que va desde la parte superior de la imagen a la parte inferior; éstos están alineados manualmente en el eje x a estar entre dos nodos utilizando xshift=7mm.

Mi uso de \phantom{p} para asegurar la etiqueta "Hardware" tiene la misma línea base que las otras dos etiquetas.

¿Fue útil?

Solución

Para construir una estructura de árbol, consulte pgfmanual.pdf, Hacer árboles crecer .

Para las líneas, me gustaría crear nodos que representan en medio de dos nodos, y luego usar el sistema de coordenadas perpendiculares como lo hizo. También se puede utilizar para identificar current bounding box la "frontera".

Para alinear correctamente las líneas de base, especifique text height y text depth. En su caso, por ejemplo, en el every label estilo. Pero como ves, hice las etiquetas como nodos siguientes ...

\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}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top