2013年1月3日 星期四

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

補充說明, 如果程式碼中有註解, 而且是「中文」的註解, 這時後只能使用「在文件中放入程式碼 -- (2) (3)」兩份文件提到的方式,用插入檔案的方式,並且在 Program Listing 的 setting 中額外輸入一個選項:
extendedchars=false
才能順利 compile 文件及顯示中文
listings 套件可以處理程式碼內,包含 ASCII Code 128~255 的字元 (extended ASCII),但是需要你「明白」的告訴 listings 「你要把這些字元正確的印出來」, 因此有這個 extendedchars 選項。
如果設定 true, 代表程式碼中有 ASCII 128~255 的字元要顯示。但中文字都是復合編碼, 因此需要明白設定 false 才能避免 listings 套件去處理這些字元。

如果註解的中文,想要變換顏色,這時候要設定 texcl=true, 啟動「讓註解跳脫(escape) 到 LaTeX 去處理」。
開啟這個設定後,當 listings 套件遇到註解符號後,註解字符會印出來,接著會將後面(到行尾)的所有內容交由 LaTeX 去處理,LaTeX 就可以用顏色套件,套用你所設定的樣式後印出。
這時候要特別注意,如果註解中有出現反斜線的字眼,這會被視為 LaTeX 的命令!如果是無意放進去的,可能會導致排版異常。
一般來說, 開啟 texcl 功能設定後,extendedchars 使用預設值即可。
但如果是如 C++ 這種語言,可以接受 // 為註解,也可以接受 /*  */ 為註解的語言,這時候就要設定 extendedchars=false 才行了。
只是 C++ 程式碼中如果有「/* ... */」這種註解,中間的中文不會變色,目前無解中,所以建議採用「//」 這種註解方式。

假設我希望程式中中文註解字的顏色要換成紅色,這時可以這麼設定:
commentstyle={\color{red}}
texcl=true

目前我自己試驗過覺得一個還不錯的設定值, 紀錄於此。
backgroundcolor={\color{yellow!30}}  %設定背景顏色為 30% 黃色
basicstyle={\scriptsize}    %設定文字的樣式
breaklines=true             %設定長文字行的時候要自動換行
columns=flexible            %設定字符寬度為可變的
commentstyle={\color{red}}  %設定註解顏色為紅色
extendedchars=false         %不處理 extended ASCII 字元
frame=single                %加外框
keywordstyle={\color{blue}} %程式碼的關鍵字以藍色字體顯示
language={PSTricks}         %程式碼的語言
numbers=left                %行號標注在左方
numberstyle={\scriptsize\color[rgb]{0.5,0.5,1.0}\oldstylenums} %行號字體
tabsize=4                   %程式碼中 Tab 鍵的空格數
texcl=true                  %開啟 LaTeX comment line 功能


排版結果如下圖:


「在文件中放入程式碼 -- (1)」中所使用的方法,無法用這裡的設定放入中文註解。後來我發現,原來是 LyX 的「先天限制」。

因為,當在 LyX 插入一個 Programming List 的時候,LyX 會自動加入 \inputencoding{latin1} ,這會讓程式碼內有任何 UTF8 編碼的文字,都無法處理。
我不知道新版 LyX 會不會改進,但到 2.0.6 版都有這個問題。

多了這行 \inputencoding{latin1} 使得程式碼內不能放中文註解
目前我的解決辦法就是,自己插入 TeX Code, 輸入程式碼,就可以使用中文註解了。
\begin{lstlisting}
  ... 程式碼
\end{lstlisting}
自行建立 lstlisting 環境
排版結果