我正在尝试使用 TikZ 绘制 UML 状态图。我尝试过tikz-uml
,但我对它处理状态节点的方式并不满意。虽然我喜欢 TikZ 的多种节点放置选项(与上方相对放置、选择锚点),但我不知道如何使用来做到这一点tikz-uml
。此外,它还让我的文本延伸到节点之外。
简要查看 的tikz-uml
实现(我仍然是 TeX 新手),我了解到实际上是在标题节点和内容节点周围绘制一个圆角矩形fitting
,其中包含库,随后添加了一条分隔状态名称的线。因此,我尝试拥有自己的实现,在一个 TikZ 图片中绘制标题和内容,然后将其放在节点内。这样,我希望保留我已经习惯的普通 TikZ 节点的简单放置。这是代码和问题,我为分隔而绘制的线错误地放置在节点上方(注意:渲染两次以获得与我相同的线条位置):
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-uml}
\usepackage[margin=0cm,nohead]{geometry}
\usepackage[active,tightpage]{preview}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}
\PreviewEnvironment{tikzpicture}
\begin{document}
\begin{tikzpicture}
\node[draw, rounded corners](box){
\begin{tikzpicture}[remember picture]
\node[draw=red](caption) {titel};
\node[below=0 of caption] {\begin{tabular} ccontent\\more content\end{tabular}};
\end{tikzpicture}
};
\draw (caption.south -| box.west) -- (caption.south -| box.east);
\end{tikzpicture}
\end{document}
为了显示线条的位置,标题框用红色绘制,线条应位于其下边缘,与输出类似tikz-uml
。线条实际上是外部黑色节点上方的黑条,绘制在图像上边缘附近。
为了进行比较,这里是我尝试过的tikz-uml
以及结果(只需用这个替换上面外部 tikzpicture 内的所有内容即可测试):
\begin{umlstate}[x=-3, y=-4, name=discard, do=clear all valid bits]{discard}
\end{umlstate}
答案1
您可以将状态节点变成“多部分”节点。为此,您需要加载shapes.multipart
TikZ 库。然后,您应该能够使用您习惯的所有放置选项。
结果:
代码:
\documentclass[border=1cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.multipart}
\begin{document}
\begin{tikzpicture}
\node[rectangle split, rectangle split parts=2, draw, rounded corners]{%
\tikz\node[draw=red, rectangle, rounded corners]{titel};
\nodepart{two}
\begin{tabular}{c}
content \\ more content
\end{tabular}
};
\end{tikzpicture}
\end{document}
PS. 您也可以将状态节点设为matrix
,但这样就很难得到所需的水平线(请参阅这讨论)。