2014年8月16日 星期六

蕭邦和詹森

女兒唸的女中,每年有招一班美術班,不限男女,所以偶爾會在路上看到穿著女中制服的大男生,也往往引起路人側目。

八月初學校公佈新生編班名單,美術班名單中赫然出現「蕭邦」的名字,引起大家的好奇。看名字應該是位大男生,開學後應該會被全校女生行注目禮。

這不禁讓我想到,當年在成功嶺受訓時,連上有位名叫「詹森」的同學,其人能言善道,極有異性緣。如今不知人在何方。

2014年7月20日 星期日

pdflatex 的使用

我用 pdflatex 好一段時間了。pdflatex 的優點是可以直接將 LaTex 檔案轉成 pdf 檔,省略傳統從 LaTex 到 dvi,再從 dvi 到 ps 或 pdf 的轉換步驟和可能遇到的麻煩

不過 pdflatex 要求所有的圖檔格式必須為 pdf。之前我曾寫過如何用 Visio 產生 eps 圖檔格式。用 Visio 產生 pdf 檔格式的方法如下。首先必須安裝 PDF printer driver,如 PDFill PDF&Image Writer 或 Bullzip PDF Printer,然後將圖檔用列印的方式印成整頁的 pdf 檔。最後用 PDFill PDF Tools 這個工具程式中的 Rotate or Crop PDF Pages 功能,將整頁的 pdf 檔裁切成吻合圖檔大小的 pdf 檔 (目的類似將 ps 檔裁切成 eps 檔)。

Matlab 或一些其他程式本來可以輸出 eps 檔案格式,現在則要花額外功夫將 eps 檔案轉換成 pdf 格式。網路上有各式各樣的工具宣稱可以達到這個目的。因為我要轉換的皆是 Matlab 輸出的 eps 格式圖檔,所以採用的方案是以 Matlab 的 m 檔寫的程式。只要下載這個壓縮檔並置於欲轉換檔案的目錄中解壓縮,然後進入 Matlab,切換工作目錄至此目錄,執行 eps2pdf xxx.eps xxx.pdf,即可將 xxx.eps 轉換成 xxx.pdf 檔存放在同一目錄中。

圖檔都轉換成 pdf 格式後,在 LaTex 檔案中要加入 graphicx 這個  package,並設定使用 pdflatex,如下面這列所寫的:

\usepackage[pdftex]{graphicx}

載入圖形檔的指令仍為 \includegraphics,但檔案名稱的附加檔名可以不要加 pdf。如:

\includegraphics*[width=2.6in]{xxx}

可以載入 xxx.pdf 圖檔。



Win 7 下的 Generic PostScript Printer Driver

Adobe 的網頁上有 Generic PostScript Printer Driver,在將圖檔轉成 ps 或 eps 檔時,是很有效的工具。可是此驅動程式無法直接在 Win 7 下安裝。

網路上有人解決了此問題。首先將這個壓縮檔下載並解壓縮。然後在 Win 7 中新增印表機(選擇新增本地印表機/使用現有的連接埠/從磁片安裝,選取剛剛下載後已解壓縮的 Generic_Adobe_PostScript)。安裝好後就多了一個Adobe Generic PostScript Driver的印表機了。

2014年3月1日 星期六

使用 align 取代 eqnarray

論文中常需要垂直對齊多列的式子。例如,在一連串方程式的推導過程中,希望每列的等號都出現在同一垂直位置,比較美觀。在 LaTex 中,傳統上是使用 eqnarray 指令來達成這樣的目的。

其實使用 align 可完全取代 eqnarray,而且效果更好。不過使用上需要先加入 amsmath 這個 package。即
\usepackage{amsmath}

2014年1月9日 星期四

C語言很容易藏bug

今天 trace 學生寫的 C 程式碼,發現學生犯了一個嚴重的錯誤。我用下面這個例子說明:

int i;
for (i = 0; i < 10, i != 3, i != 5; i++)
   printf("%d ", i);


學生的想法是印出除了 3 與 5 外所有 0 到 9 之間的整數。C 語言允許這樣寫,但結果不是學生所想的那樣子。上面程式的執行結果會是

0 1 2 3 4

原因我用下面這句英文來解釋。

The value of a multiple-statement expression is the value of the last statement in the expression.

後來學生送來更正後的版本,意思就像下面的程式碼:

int i;
for (i = 0; i < 10 && i != 3 && i != 5; i++)
   printf("%d ", i);


雖然更正了誤將逗號當 and 用的錯誤,這個版本仍然不會印出除了 3 與 5 外所有 0 到 9 之間的整數。執行結果如下:

 0 1 2

原因出在紅色字體部分是 C 語言迴圈繼續執行的條件,而非每次 iteration 中是否要執行 loop body 的條件。一旦這個條件不滿足,迴圈就結束了,而非只是 skip 此次 iteration。