【问题标题】:Improving a Tikz Diagram改进 Tikz 图
【发布时间】:2010-08-07 23:16:11
【问题描述】:

我刚刚完成了我在 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 -- botKerntopUser -- botUser);这些是使用xshift=7mm 在 x 轴上手动对齐的,以便在两个节点之间。

我使用\phantom{p} 来确保标签“硬件”与其他两个标签具有相同的基线。

【问题讨论】:

  • 仅供参考,这种问题可以在TeX/LaTeX Stack Exchange site 上找到一个很好的归宿,现在处于公开测试阶段。如果您愿意,可以关闭此问题并将其重新发布到其他网站。

标签: latex tikz pgf


【解决方案1】:

要构建树结构,请咨询pgfmanual.pdf让树生长

对于线条,我将创建代表两个节点中间的节点,然后像您一样使用垂直坐标系。您也可以使用current bounding box 来识别“边界”。

要正确对齐基线,请指定 text heighttext depth。在您的情况下,例如样式为every label。但如你所见,我将标签作为节点在下面......

\begin{tikzpicture}[水平距离=35mm,节点距离=15mm,文字高度=1.5ex,文字深度=0.25ex]

\begin{scope}[每个节点/.style={圆角,矩形,厚,最小宽度=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]
  子 {node (app2) {Application}}
  子{节点(app1){应用程序}};
\结束{范围}

\begin{scope}[level 1/.style={兄弟距离=15mm,nodes={fill=yellow!70,draw=yellow!35}}]
\node[right= of stack,draw=orange!50,fill=orange!20] (ohci) {OHCI} [grow=right]
  子{节点{设备}}
  子{节点{设备}}
  子{节点{设备}};
\结束{范围}
\结束{范围}

\node[below=0mm of app1] (用户空间) {用户空间};
\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] (当前边界框.north -| between1) -- (当前边界框.south -| between1);
\draw[dashed] (当前边界框.north -| between2) -- (当前边界框.south -| between2);

\结束{tikzpicture}

【讨论】:

  • \path 和\draw 命令(app1 -- stack) 和(ohci) -- (stack) 有什么区别;我可以看到将 \path 更改为 \draw 会导致“双线”。难道只是为了获取坐标以备后用?
  • @Freddie:\path 命令只是构造一个路径。 \draw 命令也构造了一个路径,但还绘制了路径。 \path 命令只是为了获取坐标,\draw 命令同时做两件事。这是一个黑客。我真的很想把所有东西都放在一棵树上,但这是不可能的。应该是这样,但是如果我尝试在左侧增长两个节点,在右侧增长一个节点,则左侧节点的布局就像左侧有三个节点一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
相关资源
最近更新 更多