0

Tikz で最初の図を完成させました。私が望んでいたように見えますが、「コード化」した方法に不満があります:

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

私が不快に思う点は次のとおりです。

「アプリケーション」ノードと「デバイス」ノードを手動で移動して、yshiftそれらを互いに離す方法。単純なツリーのような構造を生成するよりエレガントな方法があるに違いないと確信しています

線 (topKern -- botKernおよびtopUser -- botUser) は、画像の上から下に移動します。これらは、 を使用して 2 つのノード間になるように x 軸上で手動で位置合わせされxshift=7mmます。

を使用し\phantom{p}て、ラベル「ハードウェア」が他の 2 つのラベルと同じベースラインを持つようにします。

4

1 に答える 1

1

ツリー構造を構築するにはpgfmanual.pdfMaking Trees Growを参照してください。

線については、2 つのノードの中間を表すノードを作成し、垂直座標系を使用します。current bounding boxまた、「境界」を識別するために使用できます。

ベースラインを正しく配置するには、 と を指定text heightしますtext depth。あなたの場合、たとえば style every label. しかし、ご覧のとおり、ラベルを以下のノードとして作成しました...

\begin{tikzpicture}[レベルの距離=35mm、ノードの距離=15mm、テキストの高さ=1.5ex、テキストの深さ=0.25ex]

\begin{scope}[every node/.style={角丸,rectangle,thick,最小幅=20mm, 最小高さ=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]
  子 {ノード (app2) {アプリケーション}}
  子 {ノード (app1) {アプリケーション}};
\end{スコープ}

\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]
  子 {ノード {デバイス}}
  子 {ノード {デバイス}}
  子 {ノード {デバイス}};
\end{スコープ}
\end{スコープ}

\node[app1 の 0mm 以下] (ユーザー空間) {ユーザー空間};
\node at (userspace -| stack) (kernel) {Kernel};
\node at (ユーザー空間 -| ohci) (ハードウェア) {ハードウェア};

\path (app1) -- (スタック) ノード[座標、中間] (Between1) {};
\draw (ohci) -- (スタック) ノード[座標、中間] (before2) {};

\draw[dashed] (現在の境界 box.north -| between1) -- (現在の境界 box.south -| between1);
\draw[dashed] (現在の境界 box.north -| between2) -- (現在の境界 box.south -| between2);

\end{tikzpicture}
于 2010-08-08T10:58:55.087 に答える