最近幾天老闆要出國,不少事兒着急弄完,因此比較忙,沒睡一個好覺,反正一句話:夠蛋疼的了!可貴有點時間,說說最近用metapost畫流程圖的一點感覺吧。
html
首先說明一點,不少人都不建議用metapost畫流程圖,固然這麼說確定是有道理的,好比被普遍推薦的Context,或是其餘專門用來畫流程圖的工具,甚至有人問latex提供了畫流程圖的宏包爲何還要單獨用別的工具畫流程圖,這裏我堅持用metapost的緣由很簡單,由於我最近在學這個東東,用它畫出來的圖感受很是漂亮,因此我肯定畫個流程圖確定是沒有問題的,至於你要用別的工具,我也很贊同,反正達到效果就好了。
ide
首先,要介紹的是metaflow,從名字也看得出來,這是一個畫流程圖的專用包,是由Kevin Hamlen寫的一個工具包,具體介紹能夠參見他的home page,地址在這裏:http://www.utdallas.edu/~hamlen/projects.html,我嘗試了用這個工具畫我須要的流程圖,可是遇到了一些小問題(這個後面來說),先說說怎麼用吧,首先固然是下載須要的metaflow.mp和 mftext.tex,這兩個文件就是Kevin Hamlen的勞動成果,下載完事兒了直接放到你的mp文件同一文件夾下就OK了,好比我是這麼幹的:工具
其中chart.mp是我本身寫的畫流程圖的mp文件,固然也能看到生成的eps和pdf文件了,這是後話,重要的仍是把代碼貼上來吧
post
input metaflowlua
prologues := 2;spa
filenametemplate "%j-%c.eps";設計
verbatimtex3d
\documentclass[10pt]{article}orm
\renewcommand\familydefault{\sfdefault}htm
\input mftext
\begin{document}
etex
beginfig(1)
z1c = (0,0);
draw rect1(btex he etex);
putitem2 20right of 1;
draw oval2(btex result etex);
drawarrow connector(1,2,right,right);
putitems(2,3) like (1,2);
%z3s = (55,30);
draw diamond3(btex evaluation etex);
drawarrow connector(2,3,right,right);
drawarrow connector1(3,1,down,up);
z4um = point 1.5 of cp1;
drawopen rect4(btex revise etex);
putitems(3,5) like (1,2);
drawopen rect5(btex successful etex);
drawarrow connector(3,5,right,right);
endfig;
verbatimtex
\end{document}
etex
end
注意紅色的兩行,這是對metaflow的引用,個人理解是至關於將metaflow.mp和 mftext.tex的代碼直接替換這兩行,固然這樣理解未必徹底是對的,但至少是這麼個意思。
下面寫的就是重點了,注意看z1c = (0,0);其實這只是定義一箇中心點在(0,0)的點而已,可是每一個字符都是有意義的:Z表示定義的是點,1表示這個點的標識,c表示定義的是其中心點,雖然乍看起來這樣寫是絕對的精簡和方便,可是對與初學者來講簡直就是蛋疼,第一遍看代碼我就徹底看不懂啊,雖而後來逐漸接觸的多了就能理解每一個字符的具體意思了,可是仍是對這種極其精簡的年作法表示恨不能接受,因此若是你不是常常用這種工具畫圖的話,你仍是別用metaflow了,由於你不可能短期用到很是熟練,這玩意兒對於用慣了的人來講確實很是方便,可是對於新手,很難記這麼多字符對應的意義。
下面說說我使用的時候碰到的問題,就是流程中的文字總超出邊界,好比下面這個圖:
很明顯,evaluste最後的倆字符都超出邊界了,很不美觀啊,固然,這裏最值得懷疑的就是我還沒真的學會用這個東東,因此代碼有問題沒有進行相應的設定,若是哪位大神知道這麼修正,請留言告訴我下,或是我之後能解決這個問題了,也會進行相應的補充的。
metaflow就說到這裏,下面要說的是另外一個東東,來自metapost的原做者John_Hobby(我暫且這麼認爲吧,由於在他寫的A User's Manual for MetaPost中我居然找到了關於box的詳細介紹,因此推測box應該就是他寫的),其實box的設計原本不是用來畫流程圖的,可是卻很是容易用來畫流程圖,廢話很少說,直接下載boxes.mp和rboxes.mp,下載地址在這裏http://ctan.mackichan.com/obsolete/systems/msdos/metapost/mpinputs/,下載完之後的處理方式和metaflow相似,直接放到同一文件夾中就能夠了,直接上代碼:
\input rboxes
beginfig(501);
pair disx,disy;
disx:=(11,0);
disy:=(0,17);
rboxit.a(btex $L$ hears beep at $t_{beep,L}$ etex);
a.n = (0,0);
drawboxed(a);
rboxit.b(btex \begin{tabular}{c} $L$ promoted to leader \\by $A$, with $t_{beep,L}$ \\corresponding to $t_{beep,A}$ \end{tabular} etex);
b.nw = a.ne+disx;
drawboxed(b);
boxit.c(btex \begin{tabular}{c} $X_L = (X_A \cap N_L) \cup \{A\}$ \\$\Lambda_L = N_L - X_L$ \end{tabular} etex);
c.w=b.e+disx;
drawboxed(c);
drawarrow b.e--c.w;
...............
代碼太長,就不全貼出來了,注意這裏只有一個\input rboxes,而沒有\input boxes,其實緣由很簡單,最開始我寫了\input boxes,結果編譯出錯,而後我就查看了rboxes.mp文件,結果人家第一句就是\input boxes,我也是醉了,調了半天居然是這種緣由。。。。。。
好吧,又到了說問題的時候了,此次碰到的問題是無法用box畫菱形,雖然見過各類變化,可是沒能變換出菱形(也就是流程圖中的斷定),不知道哪位大神可以提供個解決方案,最終我選擇了畫一條封閉路徑本身畫一個菱形,可是顯然不是最好的結果,至少對於內部文字的處理方式和縮放大小的把握不像box那樣智能了,要知道,box是不會出現metaflow中那種文字出界的問題的。研究了一下午,我仍是決定本身寫一個diamond.mp,像box同樣本身封裝一個,不過如今還沒寫完,等寫完會發出來的。
這裏順便提醒一句,不少人不知道在box中的文字怎樣換行,這裏提供一個別人介紹的解決方案,那就是在box內部構建一個表格,具體代碼好比下面這個:
rboxit.n(btex \begin{tabular}{c} (3b) Promote $P$ \\to leader with \\ $[t_{beep,L}, X_L]$ \end{tabular} etex);
最後貼一個效果圖吧,這是我論文裏面用到的一個流程圖,你們看下效果
我感受仍是比較好看的,你們覺的怎樣,歡迎提建議。
好啦,又是吃飯時間了,走起~~~