天天看點

使用MetaPost繪制流程圖

小白最近閑來無事,自學了一點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

繼續閱讀