2009/11/1

Xetex 48小時心得 -- 上

記錄下我的使用過程
參考文件 :  蔡老師寫的易懂好用入門手冊 蔡老師寫的易懂好用安裝手冊

============================================================
第一步,安裝

原本想裝 Tex live 2008,但是因為用ISO安裝的話在建立功能表捷徑時會因為中文出錯,放棄。

最後是安裝MiKTex,下載MiKTeX 2.8 Net Installer,使用完整安裝,大約要1.5G,安裝時間很久...

============================================================
第二步,開新文章

建立整個文件的骨架

\documentclass[10pt, a4paper]{article} %字型 10pt,紙張A4
\begin{document}
\end{document

\documentclass 的設定參考 大家學Latex 、http://www.mackichan.com/index.html?techtalk/542.htm~mainFramehttp://www.nada.kth.se/~carsten/latex/class.html,都是搜尋就能找到的。

============================================================
第三步,測試中文

因為看到Xetex原生支援unicode就決定使用他了。看過入門參考後,知道要在設定區中設定想要使用的package。參考手冊中使用CJK-Latex,不過我使用的是xeCJK,這兩個package,只要是使用完整安裝都會自動安裝好,看個人需要使用。使用xeCJK的原因,它是基於CJK套件在xetex上開發,搜尋 "xeCJK 宏包 孙文昌"可以找到作者寫的簡中手冊,之後會常常用到。

Travels in TEX Land: A first attempt to use XETEX (with Windows XP),這篇的p. 3 有給幾個參考,再加上 the fontspec package 這一篇,就可以知道我們先需要引入的package

\usepackage{xunicode}
\usepackage{xltxtra}

不使用 fontspec 是因為他不支援中英文字型分開設定。接著就是引入

\usepackage{xeCJK}

參考xeCJK作者的使用手冊,就可以知道該怎麼設定字型。

%設定中文字型
\setCJKmainfont{PMingLiU} %新細明體

%設定英文字型
\setmainfont{Times New Roman}

接下來看著入門手冊打一些中文進去試試看,整個 test.tex 檔長這樣,

\documentclass[10pt, a4paper]{article} %字型 10pt,紙張A4
\usepackage{xunicode}% provides unicode character macros
\usepackage{xltxtra} % provides some fixes/extras
\usepackage{xeCJK}
%設定中文字型
\setCJKmainfont{PMingLiU} %新細明體
%設定英文字型
\setmainfont{Times New Roman}
\begin{document}

ABCDEFGHIJKLMNOPQRSTUVWXYZ            abcdefghijklmnopqrstuvwxyz1234567890
龍龜許公蓋 fsafdsafd

\end{document}

使用 cmd 編譯,

xelatex test

就會產生 test.pdf,每次編譯之前要關掉pdf。

============================================================
第四步,輸入文章內容

參考入門手冊,輸入章節內容,\par 表示斷行,也可以用一個空白行代替

\section{噗噗噗}

噗噗噗噗噗噗噗噗噗噗噗噗噗噗噗
噗噗噗噗噗噗噗噗噗噗噗噗噗噗噗
噗噗噗噗噗噗噗噗噗噗噗噗噗噗噗

\subsection{哇嗚哇}
哇嗚哇哇嗚哇哇嗚哇哇嗚哇
\par
   
    \subsection{跳替跳}
    跳替跳跳替跳跳替跳跳替跳
    \par
   
    \subsubsection{跑跑跑}       
    跑跑跑
    \par

============================================================
第五步, 使用 Bibtex自動產生參考文獻

依照入門手冊以及參考http://en.wikibooks.org/wiki/LaTeX/Bibliography_Management,我使用 JabRef。

@INPROCEEDINGS{Guibas1978,
  author = {Guibas, Leo J. and Sedgewick, Robert},
  title = {A dichromatic framework for balanced trees},
  booktitle = {SFCS '78: Proceedings of the 19th Annual Symposium on Foundations
    of Computer Science},
  year = {1978},
  pages = {8--21},
  address = {Washington, DC, USA},
  publisher = {IEEE Computer Society},
  doi = {http://dx.doi.org/10.1109/SFCS.1978.3}
}

使用 JabRef 建一個 Reference.bib,把上面這段輸入進去Reference.bib,並把Reference.bib 與 test.tex 放在同一個資料夾下,在 \end{document} 前輸入

\bibliographystyle{abbrv} %放最後,會自己產生引用的頁面
\bibliography{Reference}
\end{document}

style參考http://amath.colorado.edu/documentation/LaTeX/reference/faq/bibstyles.html ,之後在文章中加入

\cite{Guibas1978}

編譯第一次,顯示訊息 "LaTeX Warning: There were undefined references."為正常現象,之後不一定每次都會出現。

xelatex test

編譯第二次,不可以有副檔名 .tex

bibtex test

編譯第三次,產生 test.pdf。。

xelatex test

注:引用多個時 \cite{key1, key2, ...}。另外的工具 Natbib

注:引用的部分有問題的話,手動修改 .bbl 中有問題的地方,再重新編譯一次。

============================================================
結束

test.tex

test.pdf


2009/10/27

Xetex初體驗

昨天灌好MiKTex 2.8後,看到XeTeX直接支援unicode相當的開心,以為不用再作複雜的設定就可以打中文,但是,在編輯器中打的中文轉到pdf檔時卻是亂碼...

到處找ㄚ找ㄉ,在(http://sites.google.com/site/mailboxpublic/texlive2007cjkchinesehowto)中說,一切就不過只是字型的問題。OK,那我又不知道Latex裝了啥字型,那只好又去到處翻資料。只見google出來的東西都是CJK相關的,讓我一直以為我必須自己去轉字型,還好看了MiKTeX中的packagemanager有找到很多他裝的字型,不必自己動手。那現在問題就剩下該去找出字型的名稱了。

XeTeX官網上,Documentation and example中,文件的P. 3&4說明了xetex對字型的處理方式,加上直接google "xetex chinese"中看到的例子,由此才解決了我的問題,其實字型名稱也能寫中文...= =

執行:xelatex test.tex

test.tex::

\documentclass{article}


\usepackage{fontspec}% provides font selecting commands
\usepackage{xunicode}% provides unicode character macros
\usepackage{xltxtra} % provides some fixes/extras\setmainfont[Mapping=tex-text]{新細明體}
\setmonofont{Courier}
\setsansfont{Helvetica}

\begin{document}

\def\line{ABCDEFGHIJKLMNOPQRSTUVWXYZ\\
            abcdefghijklmnopqrstuvwxyz1234567890}

\line 龜龜許公蓋 fsafdsafd


\end{document}

----------------------------------------------------------------------------

The fontspec package 對於設定xetex中的字型有很清楚的說明

如果可以早點找到這個網站的話,我就不用打上面那一大段了...。另外裡面也提到為什麼寫英文會比較好,因為不能讓 serif 與 sans serif 使用同一個中文名稱,,英文就沒問題了。


2009/10/19

宿舍突然停水了

前天晚上宿舍的預室突然沒有冷水可以洗澡,只剩超燙的熱水能用,那個時候呢,在浴室等了好久都沒冷水就放棄了。

之後的一個小時裡,又去看了兩、三次浴室還是沒有冷水,心裡只想到"慘了沒冷水,根本不能洗澡。",原本還以為是停水,不過洗手檯還是有冷水,不過那時候只想到應該是管路的問題,但是我又不是水電工,根本不會修,只好在洗手台洗洗頭就完事。

在最後一次去浴室看有沒有冷水時,跟在曬衣服的室友講沒有冷水這件事,後來他就跑去試試看了,不過出乎意料的事發生了,我原本以為他會跟我一樣試了幾下就放棄,但是遲遲不見他回來。

結果當他回來時竟然是洗完澡的樣子!問他做了甚麼,他就拿了洗衣桶出來,一看,立刻就明白了,當時只覺得自己真是阿呆,這麼簡單的方法竟然沒想到。

之後回過頭來在想一想後發現,也許這個地方就是我思考的盲點;隔天早上,就聽到有人跟應該是宿舍管理員的講有甚麼地方壞掉;沒錯,在那個時候大家都可以發現到大概是哪裡出現問題,但是該怎麼解決呢?

有很多人跟我一樣,當發現沒有冷水時就是離開,如果這個問題當作一個研究上的問題時,就像是我們都知道某個問題很困難(沒有冷水),除了專家(水電工)以外沒人能解決,但是我卻忘了,其實在我手邊就有著雖然不完美,但是足以滿足即時需求的工具(水桶)可用。

只考慮問題就放棄思考替代方案的腦袋真是廢物,這點要好好改進。

2009/9/3

C# 逼逼聲

來源 MSDN Link

Console.Beep() : 使用 PCSpeaker, 不經過音效卡
System.Media.SystemSounds.Beep.Play() : 使用音效卡

SystemSounds的種類 :

Asterisk (燒完光碟時聽到)
Beep (點到不可以點的地方)
Exclamation (打開東西時?)
Hand
Question (沒聲音@@)

2009/7/31

Databinding : Communication between Target and Source

A CodeProject Article

這兩天在網路上到處搜尋有關Databinding的文章,通常找到的東西講的都跟這篇codeproject上的內容一樣。都是講解怎麼樣顯示資料,都沒講到怎麼樣讓這些被顯示的資料可以被使用者變更後記錄起來。

<TextBox Name="Tbx" Text="{Binding Path=Test1}" MouseLeave="Tbx_MouseLeave"></TextBox>

上面這段code,照著文章中的範例可以成功的顯示出,Test1 property在一個class instance中的值。

那要怎麼讓使用者在Textbox中輸入文字後可以改變Test1的值ㄋ?為了找這個答案讓我找的手都長繭,

<TextBox Name="Tbx" Text="{Binding Path=Test1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" MouseLeave="Tbx_MouseLeave"></TextBox>

只要加上紅色的部分就可以讓使用者變更Test1的值,藍色的部分可以不加,因為預設就是這個值,要注意的是這只能接收使用者的修改不能反映程式內的修改,要顯式經由程式修改的值,必須實作 INotifyPropertyChanged才行,就像一開始的文章中所說的。至於如何判斷輸入的東西要如何過濾,我不知道,需要再找。

MSDN中UpdateSourceTrigger的說明可以設定的值

2009/7/28

Threadsafe events

http://www.codeproject.com/Articles/37474/Threadsafe-Events.aspx

想做一個功能,很多個thread在不同時間會發出一個event,這些event都由同一個event handler來處理。

因為擔心這樣做不是thread-safe,到處找了很久,在codeproject上找到的這篇是我看到整理最清楚剛好提供了我想知道的資訊。

讀完後的心得:不要在raise event後,讓event handlers有機會離開。

因此有機會出錯的情況是很多個event handler對一個raised event,而很多個raised event對一個event handler則沒有這個問題;另外很多個raised event在event handler內處理時會被block住,一次只處理一個raised event。