我正在使用 Tikz 绘制序列图。我首先尝试了tikz-uml
,但它有一些问题,我询问了另一个问题。
我现在正在尝试pgf-umlsd
,但它缺乏对块中替代方案之间的虚线水平线的支持alt
。
这是我目前拥有的:
\documentclass{article}
\usepackage{pgf-umlsd}
\usepackage{tikz}
\usepackage{pgfplots}
\usetikzlibrary{arrows}
\usepackage{pgf-umlsd}
\begin{document}
\begin{sequencediagram}
\newthread{t}{:Thread}
\newinst[1]{i}{:Instance}
\begin{sdblock}{alt}{[condition]}
\begin{call}{t}{if\_true()}{i}{}
\end{call}
\begin{call}{t}{if\_false()}{i}{}
\end{call}
\end{sdblock}
\end{sequencediagram}
\end{document}
我想像这样在两个选项之间画一条虚线。我该怎么做?
我已经找到了\separateline 的定义,但是该线并非在块的边界处开始/结束alt
:
\documentclass{article}
\usepackage{pgf-umlsd}
\usepackage{tikz}
\usepackage{pgfplots}
\usetikzlibrary{arrows}
\usepackage{pgf-umlsd}
\begin{document}
\newcommand{\separateline}[3][dotted, color=black, very thick]{
\stepcounter{seqlevel}
\path
(#2)+(.1,-\theseqlevel*\unitfactor-.8*\unitfactor) node (from) {}
(#3)+(-.1,-\theseqlevel*\unitfactor-.8*\unitfactor) node (to) {};
\draw[#1] (from) -- (to);
}
\begin{sequencediagram}
\newthread{t}{:Thread}
\newinst[1]{i}{:Instance}
\begin{sdblock}{alt}{[condition]}
\begin{call}{t}{if\_true()}{i}{}
\end{call}
\separateline{t}{i}
\begin{call}{t}{if\_false()}{i}{}
\end{call}
\end{sdblock}
\end{sequencediagram}
\end{document}
答案1
如果你查看pgf-umlsd.sty
文件,将会看到 被sdblock
绘制为一个,其角位于和 的rectangle
坐标上。并且这些坐标将随着每个新的 而重新定义。nw
se
sdblock
那么我的建议是在每个 之后立即绘制分隔线sdblock
。如果您希望在块元素之间进行一些分隔,请使用\stepcounter
。
完整的代码可能是:
\documentclass{article}
\usepackage{pgf-umlsd} % Already loads TiKZ and libraries arrows and shadows
\begin{document}
\begin{sequencediagram}
\newthread{t}{:Thread}
\newinst[1]{i}{:Instance}
\begin{sdblock}{alt}{[condition]}
\begin{call}{t}{if\_true()}{i}{}
\end{call}
\stepcounter{seqlevel} %Vertical empty space between `calls`
\begin{call}{t}{if\_false()}{i}{}
\end{call}
\end{sdblock}
\path (nw)--coordinate (aux) (se);
\draw[dashed] (nw|-aux)--(aux-|se);
\end{sequencediagram}
\end{document}