2013年8月24日 星期六

用 LaTeX 畫(非正規)甘特圖

有位朋友的公司主管,想要做計畫稽核,因此開始導入甘特圖 (Gantt chart),希望底下的部屬能將平日負責的案件進度,畫在甘特圖上,主管也好追蹤進度。

由於主管與部屬分屬不同兩地,因此該主管便希望能利用 Google Doc 裡面的功能,建立甘特圖。因此該主管開始嘗試著使用 Gantter for Google Driver 這個 web 界面的應用程式,並且推廣給部屬們使用。

原本這是美事一樁,善用現成的資源,提高生產力。但後來,事情開始轉變了。

不知道是該主管的主管看不懂,還是其他管理單位的人員看不懂甘特圖,他們後來決定放棄現成的甘特圖不用,要自己發明一套「新甘特圖」。而且因為 Google Doc 上沒有其他現成軟體可以支援這種「新甘特圖」,因此主管便要求部屬們「腦力激盪」,用 Google Doc 裡面的試算表畫出「新甘特圖」。

什麼叫做「新甘特圖」呢?



原本的甘特圖長這樣 (by Gantter for Google Driver):



而「新甘特圖」長這樣 (by Google Doc 試算表):

簡單來說,就是把進度表「壓縮」成一列。(如果進度之間有重疊,再畫成 2 列)

老實說,當我第一次看到朋友努力的用 Google 試算表畫這樣的圖時,差點暈倒。因為試算表根本不是拿來這樣用的!而且他們不僅是只有3種進度,而是有12種進度,每種進度還要賦予不同的顏色, 光選正確的顏色就可以讓你花掉一些時間了。
而且一個人手上也不僅只有 1 個案件,可能會多達 5~6 個案件。而且幾乎是2~3天就會修訂一次進度。我很難想像光是在那邊改顏色、調整表格大小,要花掉多少的時間?(而且重點是:新圖會比甘特圖易懂嗎?)

後來,我想到了是否可以用 LaTeX 來繪製這種 非正規甘特圖?
(我不敢稱為「新甘特圖」,因為這種圖看起來並沒有比甘特圖更好)

當然,首先要先看看能否畫出正規的甘特圖。搜尋了一下 TeX 的套件庫,果然找到了一個套件: pgfgantt . 這個套件可以支援畫出正規的甘特圖。我嘗試的照著說明文件的範例在 LyX 裡執行,果然可以。而且是只用 pdflatex 編譯方式就可以了!
(還有另外一個套件 pst-gantt 的套件也是可以畫甘特圖, 但是我稍微比較一下效果,感覺 pgfgantt 比較好用,所以就選擇 pgfgantt 了)

為了推廣給朋友用,我改為撰寫純文字的 .tex 檔案,這樣以後也比較好教他如何修改純文字文件就好了。而不用再安裝 LyX 了。

先按照說明文件的範例,畫出正規的甘特圖。

%%  此程式為範例測試程式
%%  作者: Mingyi Wu
%%  日期: 2013/8/23

\documentclass[a4paper,landscape]{article}
\usepackage{CJKutf8}
\usepackage{clock}
\usepackage{pgfgantt}

\begin{document}
\begin{CJK}{UTF8}{bsmi}%

\begin{ganttchart}[
 time slot format=isodate,  %使用 yyyy-m-d 的格式
 x unit = 6.5mm
 ]%
 {2013-8-20}{2013-9-7}  % 整個圖的 起始日期, 結束日期

 % 產生 Gantt 圖的日曆表頭
 \gantttitlecalendar{year, month=name, day, weekday=shortname} \\

 \ganttgroup{A案件}{2013-8-23}{2013-9-5} \\
 \ganttbar{進度1}{2013-8-23}{2013-8-27} \\
 \ganttlinkedbar{進度2}{2013-8-28}{2013-8-30} \ganttnewline
 \ganttbar{進度3}{2013-9-2}{2013-9-5}
 \ganttlink{elem2}{elem3}
\end{ganttchart}

\end{CJK}
\end{document}

輸出結果如下圖。很簡單的一張圖,該有的元素都有了。

要畫出非正規的甘特圖,需要修改3個地方:
  1. 首先,先移除掉連線,而且將 3 個進度排在同一列。這步驟很簡單,只需要使用一般的 \ganttbar 命令就好,不要用帶有連結線線功能的 \ganttlinkedbar 或 \ganttlink 命令。
  2. 畫完一個進度,不需要換行,因此「進度2」就會排在「進度1」的右側。換行的指令是兩個反斜線「\\」或是 \ganttnewline 指令,不需要換行的地方就刪掉。
  3. 「進度n」的標示,要標示在框線內,因此要加入 inline 的選項:  \ganttbar[inline] 。
也因此主要繪製的命令修改為:
\ganttgroup{A案件}{2013-8-23}{2013-9-5} \\
\ganttbar[inline]{進度1}{2013-8-23}{2013-8-27}
\ganttbar[inline]{進度2}{2013-8-28}{2013-8-30}
\ganttbar[inline]{進度3}{2013-9-2}{2013-9-5}

再排版一次,結果果然出現我所希望的非正規甘特圖的模樣了。
剩下的,就只是調整美化的工作了,例如把 title bar, gantt bar 加高,畫出直線,週末直線變紅色,設定不同進度有不同的顏色,把一些英文的敘述變中文等等。
這部份太瑣碎,而且說明文件中也已經寫的很清楚,我就不詳述了。

總之,奮戰了一陣子微調程式碼之後,終於出現了稍微好看一點的結果。


我將程式碼 copy 到 Windows 上,在 Windows 上安裝最簡易版的 MikTeX (不足的套件設定為自動下載安裝),編譯,一樣成功輸出 PDF 文件。

不過呢,最後朋友覺得改程式碼很麻煩,所以還是回去用 Google Doc 的試算表了。 Orz...

但我還是學到了如何使用 pgfgantt 這個套件,在此做個紀錄,以後有需要用 LaTeX 畫甘特圖的時候,就可以馬上拿出來用了!

下載原始碼 Gantt.zip

沒有留言:

張貼留言