metapost畫流程圖的幾種選擇metaflow or box?

最近幾天老闆要出國,很多事兒着急弄完,所以比較忙,沒睡一個好覺,反正一句話:夠蛋疼的了!難得有點時間,說說最近用metapost畫流程圖的一點感受吧。

    首先說明一點,很多人都不建議用metapost畫流程圖,當然這麼說肯定是有道理的,比如被廣泛推薦的Context,或是其他專門用來畫流程圖的工具,甚至有人問latex提供了畫流程圖的宏包爲什麼還要單獨用別的工具畫流程圖,這裏我堅持用metapost的原因很簡單,因爲我最近在學這個東東,用它畫出來的圖感覺非常漂亮,所以我確定畫個流程圖肯定是沒有問題的,至於你要用別的工具,我也很贊同,反正達到效果就行了。

    首先,要介紹的是metaflow,從名字也看得出來,這是一個畫流程圖的專用包,是由Kevin Hamlen寫的一個工具包,具體介紹可以參見他的home page,地址在這裏:http://www.utdallas.edu/~hamlen/projects.html,我嘗試了用這個工具畫我需要的流程圖,但是遇到了一些小問題(這個後面來講),先說說怎麼用吧,首先當然是下載需要的metaflow.mp mftext.tex,這兩個文件就是Kevin Hamlen的勞動成果,下載完事兒了直接放到你的mp文件同一文件夾下就OK了,比如我是這麼幹的:

wKioL1RbL8zDq_MEAAFDMnaWyds943.jpg

    其中chart.mp是我自己寫的畫流程圖的mp文件,當然也能看到生成的eps和pdf文件了,這是後話,重要的還是把代碼貼上來吧

input metaflow

prologues := 2;

filenametemplate "%j-%c.eps";

verbatimtex

\documentclass[10pt]{article}

\renewcommand\familydefault{\sfdefault}

\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了,因爲你不可能短時間用到非常熟練,這玩意兒對於用慣了的人來說確實非常方便,但是對於新手,很難記這麼多字符對應的意義。

    下面說說我使用的時候碰到的問題,就是流程中的文字總超出邊界,比如下面這個圖:

wKiom1RbMlLA5GbDAACjTP-uGuo440.jpg

    很明顯,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);


    最後貼一個效果圖吧,這是我論文裏面用到的一個流程圖,大家看下效果

wKiom1RbNwyynfQgAAO9Cs57cQo511.jpg


    我感覺還是比較好看的,大家覺的怎樣,歡迎提建議。

    好啦,又是吃飯時間了,走起~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章