2012年9月9日 星期日

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

之前介紹過如何在文章中放入程式碼,但我用的方式是在文件中放入一個區塊,並將程式碼貼上。這種方法對於一次要附上「一堆」程式碼的時候,非常不方便。尤其是程式可能正在修改中,常常會更動內容,要時常「複製」「貼上」到 LyX 中根本是不可能的事情。

因此,這部份介紹如何使用「插入」的方式連結欲放入的程式碼。

這裡的技巧是某次我要 trace 一個程式,整個程式碼多達 10 多個副程式,就算用一般程式編輯器來列印,也要「開啟」「列印」按10多次,而且如果我修改了某個程式碼列印出的樣式(例如改變紙張大小、邊界、文字等等),也無法改一次 10 幾個檔案全部套用。
後來我想到將程式碼貼到 Word 中再列印,但 Word 裡面很難加上程式行號,把關鍵字標注出來,所以試了一下就放棄了。
後來我想到利用 LyX 來列印程式碼,發現還滿好用的,所以在此介紹一下。



首先,開啟一個空白 LyX 檔案,設定 Document class 為 KOMA+Beamer (這是隨便選的,但後來發現選這個 class 好像能避免掉一些麻煩,所以先選擇這個。)
接著, 選擇工具列 Insert > File > Child Documents... 出現如下圖的視窗
LyX 中的 Insert Child Document 視窗
將 Include Type 選成「程序列表」(Program Listing) 之後,就可以按 Browse... 選擇所想要插入的程式碼, 例如: HelloWord.cpp 等等。之後您可以按 OK 離開,編譯文件,就可以看到初步的成果了。
同樣地,如果不做任何設定,製作出來的文件實在不太好看。所以接著我們要來做一些「美化」的工作。這些美化工作就是要在上圖視窗中的 More parameters 中設定。有沒有覺得這個字眼很眼熟?是的, 這個區塊的功能跟前一篇放入程式碼的文章中提到的那個區塊功能是一樣的!

在文件的 「程序列表」灰色區塊上,按滑鼠右鍵選擇 Settings... 又會看到如上圖的視窗。

我以插入一個叫做 FinancialAidAward.h 的檔案為例,下圖是我美化的設定。

解釋一下,Caption 是程式碼最上方要列印的標題。通常這邊我都直接 copy 檔名。
Label 設定則是文章中需要參照這個程式碼的時候,需要用到的標籤。
至於 More Parameters 中的設定,這部份就跟前一份文件中介紹的一樣。只不過,前一份文件中,我只有輸入少少的 3 項設定,這裡怎麼多了一大堆呢?

這是因為前份文件中介紹的 Program Listing Settings 視窗就可以選擇大部分的美化設定,所以 More parameters 就不太需要自行輸入,但這裡就需要輸入自己的設定。

問題來了,這裡面設定這麼多,我怎麼知道要設定什麼東西?這裡有個小技巧!我們按照前文件的步驟,先插入一個 Program Listing 的區域,然後開啟設定畫面。按照自己想要的格式設定一下,如下圖。

我把語言部份設定為 C++, 行號靠左, 字體最小(Smallest), 程式的文字使用小字 (Smaller), 字體是打字機字體, Break long lines 最好要打勾,沒勾的話若有一行程式超過頁寬,不會自動換行,超過的部份就印不出來了。其他的設定就看個人需要。

這邊設定完之後,按 OK 之後,回到主程式。這時候請開啟顯示 LaTeX 原始碼的視窗, 從工具列 View > View Source, 開啟後,就可以看到如下的視窗。主視窗下方會多一個視窗, 顯示 LaTeX 的 source code.

這裡就是技巧所在了!
LaTeX Source 中,有一段
    \begin{lstlisting}[ .... ] 
把這個中括號包起來的部份,選起來,複製。
接著再回到下圖中,在空白處貼上!


這時候可以看到,大部分的設定都貼上了!大概只剩下外框及註解設定,需要自己動手加一下:
   frame=single
   commentstyle={\color{blue}}
其中的 commentstyle 如果不想設定,可以不用設定,預設是以斜體字來做註解字。這裡的設定是將程式中的註解字體換成藍色。如果想換其他顏色,把 blue 換成其他顏色即可。

OK, 設定完成之後,可以先編譯一次看看輸出結果,如果覺得滿意,就可以複製、貼上,再改一下檔名,這樣就可以貼上很多個程式碼檔案。如下圖,我貼了5個程序列表, 分別對應 5 個不同的程式。


第一行的 \lstlistoflistings 是在文件最前面做個目錄,如果程式碼很多頁的時候,參考起來比較方便。

最後,看看完成之後的輸出成果:


上述文件的原始檔案可以在此下載參考

沒有留言:

張貼留言