用 metapost 画 tcp/ip 详解卷 2 里面的图

最近在分析代码时,我觉得应该画些图,但是找了下没有找到比较好的工具,用 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 来绘制一些专业的图表放到我的博客中,无疑会带来一个非常大的提高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值