2012年7月10日 星期二

在文件中放入程式碼 -- (1)

在文件中,如果要放入程式碼內容,用 LaTeX/LyX 是非常方便的。使用方法如下:

1. 先從選單中選 Insert -> Program Listing


2. 接著在出現的白底框中,輸入程式碼, 如下圖。如果您要用複製、貼上的方法時,貼上時請記得按住 Shift 鍵, 這樣才能貼上 Plain Text, 不會所有文字聯成一行。


3. 其實到這邊就算完成了。如果想要「美化」一下的話,再繼續下面的設定。插入程式碼,使用的是 LaTeX 的 Listings 的 Package,這個 Package 有非常多的選項可以選擇,在 LyX 中,要調整這些設定還滿容易的。空白處點滑鼠右鍵,選擇 Settings ..., 如下圖。

接著跳出的選單,列出幾個最常用的設定選項, 如下圖。


Placement 中的 Float 如果有打勾,下方空格就要設定「t/b/p/h」其中一個。t 代表放在此頁頂端(top), b 代表放在此頁底端(bottom), p 代表放在單獨一頁 (separate), h 代表就放在這裡(here)。上圖用的是 t, 代表這個程式碼要放在此頁的最頂端。

Language 的部份, 可以指定你放的程式碼是屬於何種語言 (也有 Matlab Code), 如果選定了語言,該程式關鍵字的部份會加粗。

Line Numbering 則指定是否要顯示行號。顯示行號對於在文章中要解說程式碼功能時,非常好用。Step則是指定每隔幾行要顯示,如果設定 5, 代表只有1,6,11,... 這幾行會印行號。如果起始行不想從 1 開始,該怎麼辦呢?這就算是「進階功能」,等一下說明。

Range 則是指定要印出的程式範圍。假設你貼了一個 100 行的程式,如果覺得要全部印出太大,只想印出 50~60 行就夠了,這樣可以在 First line 設 50, Last line 設 60, 則輸出的文件就只有這 11 行了。其他完整的程式碼,還是會存在 LyX 中。如果哪天你要輸出完整 Code, 把這個設定刪掉即可印出完整程式碼了。

右邊的 Style 就是設定一些字體、樣式,這邊看個人需要設定。

OK, 這些設定都完成後,輸出看看!你會看到如下圖的樣子... 
沒有任何「進階設定」的輸出文件樣子
我相信你一定不會滿意這樣的輸出結果!因為內容跟程式碼混在一起,看不出來。程式碼最好加個框,要有標題,要能夠加標籤,這樣文章中才能引用。這些額外的「進階功能」,藏在 Settings... 的 Advanced 設定中。請再開啟「進階設定」表,如下圖。


這裡分成左右兩個區域,左邊區域是說明,右邊空白處是讓你填寫自己的設定。由於 Listing 的 Package 設定眾多,全部做成 GUI 介面的話實在沒有必要,因此折衷的方法就是這裡提供說明,你按照說明的方式自行輸入設定值。當然,這裡列出的命令,也已經涵蓋了 Main Settings 裡的功能了。

先在右方的空白處輸入一個問號「 ? 」, 你就會看到左方視窗跳出說明,說明你可以用的參數有哪些。最常用的,應該就是把程式碼「加框」了。因此我用 frame=lines 這個命令,將程式碼這個範圍加上「上、下」線框。如果你想要加個方框,可以用 frame=single. 注意看下圖,在輸入 frame 之後,左方空白就已經跳出說明,說明你打的參數有哪些值可以設定。

要詳細知道每個參數代表什麼意義的話,就必須翻閱 Listing 的 Package 說明文件了。

第二個常用的功能是加上「標題」。這裡有兩種方法:

  1. caption={ 輸入你自己的標題 }
  2. title={ 輸入你自己的標題 }
第 1 種方法會像圖、表格一樣,會有個 Listing 的開頭, 如下圖; 如果是第 2 種方法,就只有標題,而不會有 Listing 的開頭文字了。

如果你在文件中,想要交互參照這個 Program Listing, 那麼你不應該用上述兩種方法放標題。
你需要在輸入程式碼一開始的地方,選用 Insert -> Caption 的功能放入標題。如下圖

這樣會多出一個標題框,讓你輸入標題,而這個標題框,就可以加入 label, 因此在文章中你就可以用 cross-reference。如下圖。
(請切記,如果 Advanced Setting 中如果有設定標題,這裡的標題框就沒有作用了!還有,Advanced Setting 裡面的 Caption 如果需要輸入底線「_」, 請加個反斜線「\_」,這樣才不會出現 compile error。)

其他的設定,請自行探索嘗試了!

輸出的結果如下圖。可以看到 Listing 1 的確放到此頁的頂端了!而且也有行號,外框為上下線。最後補充一下,Listint 2 的外框左邊方,右邊圓,用的是 frame=single, frameround=ttff
的設定。ttff 分別代表 右上、右下、左下、左上 四個角落,是方(f) 還是圓(t)。
輸出的 PDF 文件

對了!關於如果程式碼的行號若不要從 1 開始編號的話,或是程式想要分成 2 段,而行號想要繼續前面那段程式碼的行號的話,該怎麼做呢?這部份就留給有興趣的人去翻閱說明文件了!(參考 2.6 Line Numbers) 只要設定正確的話,就可以得到如下的結果。

沒有留言:

張貼留言