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 環境
排版結果




2012年12月27日 星期四

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

這篇是為了改進「在文件中放入程式碼 -- (2)」而寫的。如果這篇看不懂,請先看前述的文章。

在「在文件中放入程式碼 -- (2)」這個文章中,我只放了 5 個 Program Listing, 但我需要對每個 Program Listing 做設定。這實在是一件很累人的事情。假設我想要修改某個設定,一次套用到這 5 個 Program Listing 裡面,那我就必須要逐一點開各個設定框,再修改設定值。

通常 LaTeX 不會希望使用者用這麼耗時的方法去修改一個很多地方都會用到的設定。因此,LyX 提供了一個地方,可以設定全域 (Global) Program Listing 參數。

點選 Document -> Settings... 之後,跳出選單,找到如下圖的設定, 自行輸入設定值。(這裡我就照抄前份文件的設定).

接著刪除掉各個 Program Listing 裡面的設定, 變成空白!這樣,以後文章插入的 Program Listing, 都會套用全域的設定值。

如果某個 Program Listing 就是要特別不一樣的話,那就在自己的 Program Listing 做自己的設定。

例如,前份文件的範例檔,我想把 Listing 1 的部份,修改為:(1). 註解字要變成 cyan 的顏色, (2). 外框要有陰影效果, 我只要輸入以下的 Local 設定即可。這裡的 Local 設定,會蓋掉 Global 的設定,因而達到「微調」的效果。

這部份的範例檔案可以在此下載

2012年10月22日 星期一

在 LyX 中使用本機的中文字型

之前介紹使用 LyX 製作中文文件時,如果沒有特別安裝字型,只使用 LaTeX-CJK 的字型的話,就只有兩種中文字體 (bsmi, bkai) 可以選擇。
如果想要直接使用自己電腦上已有的中文字體的話,那該怎麼辦呢?

這時候就可以用 XeTeX 了。

我本來以為在 LyX 中使用 XeTeX 很麻煩,但這幾天試了一下,發現其實很簡單。
以下我以在 Linux (Ubuntu 12.04) 環境為例,從安裝字體開始,逐一解釋我的步驟。

安裝中文字體

在 Linux 中要安裝中文字體,可以安裝 cwTTF 系列字體。我是從這個專案網站下載 5 個 .ttf 的檔案,點開後 (如圖1), 按右下角的「Install」,即可將字體安裝到 ~/.fonts 目錄下。
我總共安裝了「明體、楷體、黑體、圓體、仿宋體」五種中文字體。
圖 1.  Ubuntu 內的字體瀏覽器
注意: 當 LyX 內要指定中文字體名稱時,要使用如圖1 右上角 Name: 後面接的名稱,而不是 ~/.fonts 內的檔案名稱!

2012年9月9日 星期日

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

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

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

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

2012年8月31日 星期五

如何更改一些固定的名稱

在製作中文 LaTeX 文件的時候,常常需要修改一些內定的名稱。例如: Section 1, Content, Figure 1, Table 1 ...  等等。

在 LyX 中要對整個文件進行「改名」的設定,需要在 Preamble 區中輸入命令。

在 LyX 的功能選單上選擇 Document, Settings..., 接著選擇左方的 LaTeX Preamble, 如下圖

一開使如果沒有輸入過資料,應該是一片空白的。

修改固定名稱的語法很簡單, 語法為:

 \renewcommand{舊名稱}{新名稱}

這裡的 「舊名稱」 是要輸入下面列出的專有名稱 (標準 LaTeX 文件):

\abstractnameAbstract
\alsonamesee also (makeidx package)
\appendixnameAppendix
\bibnameBibliography (report,book)
\ccnamecc (letter)
\chapternameChapter (report,book)
\contentsnameContents
\enclnameencl (letter)
\figurenameFigure (for captions)
\headtonameTo (letter)
\indexnameIndex
\listfigurenameList of Figures
\listtablenameList of Tables
\pagenamePage (letter)
\partnamePart
\refnameReferences (article)
\seenamesee (makeidx package)
\tablenameTable (for caption)

例如,如果想將文件中所有的圖名稱 Figure. 1 改為縮寫 Fig. , 則可以輸入:
\renewcommand{\figurename}{Fig.}

有些文件樣板有自己特有的「舊名稱」,這時候如果要改變,需要查一下相關說明文件才能知道了。

參考資料: http://www.tex.ac.uk/cgi-bin/texfaq2html?label=fixnam

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) 只要設定正確的話,就可以得到如下的結果。

2012年6月24日 星期日

LyX 簡易入門

這篇簡介文章提供給已經用慣 Word, 想要試用 LyX, 或是第一次剛接觸 LyX,卻徬徨不知如何下手的人。

雖然 LyX 的手冊,或是其他參考文件都已經有很詳細指引,但幾乎都是英文的。而中文的資料,幾乎都是大陸的,字體設定也大多針對簡體字。因此, 我想自己寫個簡易的入門,不僅自己留作紀錄, 也作為有興趣的人參考。

雖然我用的平台是 Linux, 但與 Windows 版本沒有差別,因此使用 Windows 的人也可以照著試做。以下範例所使用的 LyX 版本是 2.0.3 版的。