最近在分析代码时,我觉得应该画些图,但是找了下没有找到比较好的工具,用 visio 画出来的图太丑,有点不能接受。
之前在阅读 tcp/ip 详解卷 2 的时候,书中的配图很多并且看上去非常专业。网上搜索了一圈,没有搜到该书上的图是用什么工具画的,又翻了翻 latex 入门教程,找到了一个 metapost 绘图语言。
网上搜了一圈,发现这个语言能够用来绘制一些专业图表,但是没有找到类似于函数调用的图表。
简单的学习了下这个语言,在 latex 的 doc 目录中有 metapost 的帮助文档,并且不同的 mp 组件也有单独的 pdf 帮助文档。翻阅 pdf 我发现可以使用 metaobj.mp 中的一些宏来画出 tcp/ip 详解卷 2 中的一些图。
pdf 中有一个示例代码,以为复制后直接使用 mpost 编译就能通过,结果却发现想的太简单了。
搞了几个小时终于算初窥门径,写了如下代码来绘制 tcp/ip 详解卷 2 中的一个类似的图。
相关代码如下:
input rboxes;
input sarith;
input graph;
prologues := 3;
beginfig(52);
verbatimtex \def\stk#1#2{$\displaystyle{\matrix{#1\cr#2\cr}}$} etex
circleit.a(btex $\ \ sysctl\ \ \ $ etex);
circleit.b(btex $net\_sysctl$ etex);
circleit.c(btex $ip\_sysctl$ etex);
circleit.d(btex $udp\_sysctl$ etex);
circleit.e(btex $icmp\_sysctl$ etex);
a.dx=a.dy=b.dx=b.dy=c.dx=c.dy=d.dx=d.dy=e.dx=e.dy;
a.c = (0, 3.5cm);
b.c = (0, 2cm);
c.c = (2cm, 0);
d.c = (-2cm, 0);
e.c = (0, -0.5cm);
fill bpath.b withcolor 0.5[black,white];
drawboxed(a, b, c, d, e);
drawarrow a.c {dir 180} -- b.c cutbefore bpath.a cutafter bpath.b;
draw b.c --(0,1cm) cutbefore bpath.b;
label.rt(btex $pr\_sysctl$ etex, 0.7[b.c, (0, 1cm)]);
drawarrow (0, 1cm){left} .. d.c cutafter bpath.d;
label.lft(btex $IPCTL_FORWARDING$ etex, 1.8d.c);
drawarrow (0, 1cm){right} .. c.c cutafter bpath.c;
label.rt(btex $UDPCTL_CHECKSUM$ etex, 1.8c.c);
drawarrow (0, 1cm){down} -- origin;
label.bot(btex $ICMPCTL_MASKREPL$ etex, 2e.c);
endfig
end
生成的图表如下所示:
其中解决的问题后面再补充。上面这张图的完成让我非常开心,它标志着我又将进入一个新的阶段,我非常期待,也希望能够用 metapost 来绘制一些专业的图表放到我的博客中,无疑会带来一个非常大的提高。