我正在寻找生成与该图表类似(但更复杂)的东西:
这描述了通信双方之间的网络数据包。我不知道它是否有特定的名称(编辑:消息序列图)。它看起来类似于来自 pgf-umlsd 的序列图,但也存在一些根本区别:
- 箭头呈一定角度,表示数据包从发送方传输到接收方的时间
- 没有序列图中的控制传递
您知道这种图表的名称吗?是否有任何宏可以轻松完成此操作,或者是否可以快速创建?
基本上,我需要的是倾斜的箭头、箭头本身的标签以及箭头的锚点,其他的什么都不需要。
答案1
我的电脑里有一些旧代码。这不是你想要的,但我认为它可以作为一个起点。
首先是最终结果:
我还必须绘制一些链路控制协议示例,并决定创建一些命令来绘制框架(从上图中的 A 到 B)
\newcommand{\tramaok}[2]{%
\draw[trama,->] #2 --++(1.5,-2) node[above right,near start] {#1};
}
丢失帧
\newcommand{\tramaperduda}[2]{%
\path #2 coordinate (a)--++(1.5,-2) coordinate (b) coordinate[midway] (c);
\draw[trama,-] (a) --(c) node[below] {#1};
\draw[trama,->] (c) -- ++(30:.5);
}
及致谢(从下至上)
\newcommand{\ackok}[2]{%
\draw[ack,->] {#2}--++(1.5,2) node[below right,near start] {#1};
}
\newcommand{\ackperdut}[2]{%
\path #2 coordinate (a)--++(1.5,2) coordinate (b) coordinate[midway] (c);
\draw[ack,-] (a) --(c) node[above] {#1};
\draw[ack,->] (c) -- ++(-30:.5);
}
所有这些命令都有两个参数,一个是标签(如果需要),另一个是起点。斜率和距离是固定的。使用这些命令很容易绘制上图:
\tramaok{Tr0}{(0,2)}
\tramaok{Tr0}{(2.5,2)}
\tramaperduda{Tr1}{(5,2)}
\tramaok{Tr0}{(7.5,2)}
\ackok{Ack}{(1.5,0)}
\ackok{Ack}{(4,0)}
\ackok{Ack}{(9,0)}
\timeout{(0,2)}{(2.5,2)}
完整代码如下:
\documentclass[tikz,border=2mm]{standalone}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usetikzlibrary{calc,arrows,positioning}
\begin{document}
\tikzset{
host/.style={rectangle,rounded corners,
thick,draw=#1!60,fill=#1!15},
host/.default=blue,
trama/.style={thick,draw=#1!60,fill=#1!60},
trama/.default=purple,
ack/.style={trama=teal},
}
\newcommand{\tramaok}[2]{%
\draw[trama,->] #2 --++(1.5,-2) node[above right,near start] {#1};
}
\newcommand{\tramaperduda}[2]{%
\path #2 coordinate (a)--++(1.5,-2) coordinate (b) coordinate[midway] (c);
\draw[trama,-] (a) --(c) node[below] {#1};
\draw[trama,->] (c) -- ++(30:.5);
}
\newcommand{\ackok}[2]{%
\draw[ack,->] {#2}--++(1.5,2) node[below right,near start] {#1};
}
\newcommand{\ackperdut}[2]{%
\path #2 coordinate (a)--++(1.5,2) coordinate (b) coordinate[midway] (c);
\draw[ack,-] (a) --(c) node[above] {#1};
\draw[ack,->] (c) -- ++(-30:.5);
}
\newcommand{\timeout}[2]{%
\draw #1 --++(0,5mm);
\draw #2 --++(0,5mm);
\begin{scope}[yshift=2.5mm]
\draw[<->] #1 -- #2 node[above,midway]{\emph{Time-out}};
\end{scope}
}
\begin{tikzpicture}[>=stealth',
font=\small\sffamily]
% S&W amb etiquetes a trames
% Tout curt. Repetició trames.
% No detecta pèrdues de trames
\draw[help lines,->] (-0.2,0) node[host,left] {B}--(11.5,0);
\draw[help lines,->] (-0.2,2) node[host,left] {A}--(11.5,2);
\tramaok{Tr0}{(0,2)}
\tramaok{Tr0}{(2.5,2)}
\tramaperduda{Tr1}{(5,2)}
\tramaok{Tr0}{(7.5,2)}
\ackok{Ack}{(1.5,0)}
\ackok{Ack}{(4,0)}
\ackok{Ack}{(9,0)}
\timeout{(0,2)}{(2.5,2)}
\end{tikzpicture}
\end{document}
答案2
我喜欢 Ignasi 的解决方案,但我决定采纳 Claudio 的评论并使用硕士- 它附带了很好的文档、一些不错的功能,并且运行良好。唯一的问题是你不能直接将其编译为 .pdf,因为它使用普斯特里克绘制图表。
为了保持这些pdflatex
优势,我想出了一个基于 GNU make 的简单工作流程。以下是 Makefile:
all: protokol.pdf
protokol.pdf: ack1.pdf ack2.pdf ack3.pdf ack4.pdf ack5.pdf protokol.tex json/*
pdflatex protokol.tex
%.pdf: %.tex
./processDvi.sh $*
这是processDvi.sh:
#!/bin/sh
latex $1.tex
dvips $1.dvi
ps2eps -l --nohires -f $1.ps
ps2pdf -dEPSCrop -dAutoRotatePages=/None -dUseFlateCompression=true $1.eps
基本上,我所做的就是创建仅包含图表的小型 .tex 文档,并将它们包含在主文档中。Makefile 可能需要一些重构,这样我就不必添加我想要创建的每个新图表,但目前对我来说,这种方法已经足够了。