小白最近闲来无事,自学了一点metapost,主要用它来绘制拓扑图或流程图。小白最近在写自己从工作以来的所学,写成了一份PDF的电子文档(小白不太会使用MS Word)。小白又不想使用JPEG或PNG格式的图片作为插图,因为它们不是矢量的图形,放大后图形就显得不够美观。
好了,废话不多说了,直接来个例子吧,这个插图来自是小白上学时的一本书《操作系统教程》。附代码如下:
<code># cat GnuLinux.mp</code>
<code>verbatimtex</code>
<code>\documentclass[10pt]{article}</code>
<code>\usepackage{CJK}</code>
<code>\AtBeginDocument{\begin{CJK}{UTF8}{gbsn}}</code>
<code>\AtEndDocument{\end{CJK}}</code>
<code>\begin{document}</code>
<code>etex</code>
<code> </code>
<code>input boxes;</code>
<code>% system variables</code>
<code>ahangle := 40;</code>
<code>% fig0 is linux virtual </code><code>file</code> <code>system topo</code>
<code>outputtemplate := </code><code>"vfs.mps"</code><code>;</code>
<code>beginfig(0);</code>
<code> </code><code>boxit.a(btex 用户进程 etex);</code>
<code> </code><code>boxit.b(btex 系统调用界面 etex);</code>
<code> </code><code>boxit.c(btex VFS etex);</code>
<code> </code><code>boxit.d(btex Ext3 etex);</code>
<code> </code><code>boxit.e(btex Buffer Cache etex);</code>
<code> </code><code>boxit.f(btex 设备驱动程序 etex);</code>
<code> </code><code>boxit.g(btex 硬盘控制器 etex);</code>
<code> </code><code>boxit.minix(btex Minix etex);</code>
<code> </code><code>boxit.nfs(btex NFS etex);</code>
<code> </code><code>boxit.sysv(btex Sysv etex);</code>
<code> </code><code>boxit.direc(btex 目录cache etex);</code>
<code> </code><code>boxit.inode(btex Inode cache etex);</code>
<code> </code><code>boxit.hard(btex etex);</code>
<code> </code><code>% Len is the box's length</code>
<code> </code><code>% Hig is the box's hight</code>
<code> </code><code>numeric Len;</code>
<code> </code><code>numeric Hig;</code>
<code> </code><code>Len := 65;</code>
<code> </code><code>Hig := 14pt;</code>
<code> </code><code>a.e - a.w = (Len,0); a.n - a.s = (0,Hig);</code>
<code> </code><code>b.e - b.w = (Len,0); b.n - b.s = (0,Hig);</code>
<code> </code><code>c.e - c.w = (Len,0); c.n - c.s = (0,Hig);</code>
<code> </code><code>d.e - d.w = (35,0); d.n - d.s = (0,Hig);</code>
<code> </code><code>minix.e - minix.w = (35,0); minix.n - minix.s = (0,Hig);</code>
<code> </code><code>nfs.e - nfs.w = (35,0); nfs.n - nfs.s = (0,Hig);</code>
<code> </code><code>sysv.e - sysv.w = (35,0); sysv.n - sysv.s = (0,Hig);</code>
<code> </code><code>e.e - e.w = (Len,0); e.n - e.s = (0,Hig);</code>
<code> </code><code>f.e - f.w = (Len,0); f.n - f.s = (0,Hig);</code>
<code> </code><code>g.e - g.w = (Len,0); g.n - g.s = (0,Hig);</code>
<code> </code><code>direc.e - direc.w = (Len,0); direc.n - direc.s = (0,Hig);</code>
<code> </code><code>inode.e - inode.w = (Len,0); inode.n - inode.s = (0,Hig);</code>
<code> </code><code>% Dis is the hight between the boxes</code>
<code> </code><code>numeric Dis;</code>
<code> </code><code>Dis := 20;</code>
<code> </code><code>a.s - b.n = (0,30);</code>
<code> </code><code>b.s - c.n = (0,Dis);</code>
<code> </code><code>c.s - d.</code><code>ne</code> <code>= (5,Dis);</code>
<code> </code><code>d.se - e.n = (-5,Dis);</code>
<code> </code><code>c.s - nfs.nw = (-5,Dis);</code>
<code> </code><code>d.w - minix.e = (10,0);</code>
<code> </code><code>sysv.w - nfs.e = (10,0);</code>
<code> </code><code>e.s - f.n = (0,Dis);</code>
<code> </code><code>f.s - g.n = (0,30);</code>
<code> </code><code>c.w - direc.e = (Dis,0);</code>
<code> </code><code>c.e - inode.w = (-Dis,0);</code>
<code> </code><code>hard.c = g.c;</code>
<code> </code><code>hard.e - hard.w = (100,0);</code>
<code> </code><code>hard.n - hard.s = (0,34);</code>
<code> </code><code>drawboxed(a,b,c,d,e,f,g,minix,nfs,sysv,direc,inode,hard);</code>
<code> </code><code>% draw the connectors</code>
<code> </code><code>drawarrow a.s -- b.n;</code>
<code> </code><code>drawarrow b.s -- c.n;</code>
<code> </code><code>drawarrow c.s -- minix.n;</code>
<code> </code><code>drawarrow c.s -- d.n;</code>
<code> </code><code>drawarrow c.s -- nfs.n;</code>
<code> </code><code>drawarrow c.s -- sysv.n;</code>
<code> </code><code>pair A[];</code>
<code> </code><code>A[1] = 1</code><code>/5</code><code>[e.nw,e.</code><code>ne</code><code>];</code>
<code> </code><code>A[2] = 2</code><code>/5</code><code>[e.nw,e.</code><code>ne</code><code>];</code>
<code> </code><code>A[3] = 3</code><code>/5</code><code>[e.nw,e.</code><code>ne</code><code>];</code>
<code> </code><code>A[4] = 4</code><code>/5</code><code>[e.nw,e.</code><code>ne</code><code>];</code>
<code> </code><code>drawarrow minix.s -- A[1];</code>
<code> </code><code>drawarrow d.s -- A[2];</code>
<code> </code><code>drawarrow nfs.s -- A[3];</code>
<code> </code><code>drawarrow sysv.s -- A[4];</code>
<code> </code><code>drawarrow e.s -- f.n;</code>
<code> </code><code>drawarrow f.s -- g.n;</code>
<code> </code><code>drawarrow c.w -- direc.e;</code>
<code> </code><code>drawarrow c.e -- inode.w;</code>
<code> </code><code>% draw the outline</code>
<code> </code><code>pair B[];</code>
<code> </code><code>B[1] = direc.w - (5,-56);</code>
<code> </code><code>B[2] = inode.e - (-5,-56);</code>
<code> </code><code>B[3] = inode.e - (-5,119);</code>
<code> </code><code>B[4] = direc.w - (5,119);</code>
<code> </code><code>draw B[1] -- B[2] -- B[3] -- B[4] -- cycle dashed evenly;</code>
<code> </code><code>label.rt(btex 硬件层 etex,hard.e);</code>
<code> </code><code>label.rt(btex Linux内核层 etex,b.e+(15,0));</code>
<code> </code><code>label.rt(btex 系统调用 etex,a.se+(15,-5));</code>
<code>endfig;</code>
<code>end</code>
小白觉得这些代码有些臃肿,因为是刚学,所以小白也只能做到这样了。后续还需多加练习,才能写出比较紧凑、高效的代码。
如何编译呢,在windows或gnu/linux系统上(需要安装相关TeX),
<code># mpost -tex=latex GnuLinux</code>
<code>或</code>
<code># mpost -tex=latex GnuLinux.mp</code>
<code># mptopdf vfs.mps</code>
效果图为:
<a href="http://s3.51cto.com/wyfs02/M01/6F/58/wKioL1WZ-XihD8ORAAHeWyvwb8Y279.jpg" target="_blank"></a>
版权声明:原创作品,如需转载,请注明出处。否则将追究法律责任
本文转自 bigstone2012 51CTO博客,原文链接:http://blog.51cto.com/lavenliu/1671243