星期五, 5月 25, 2012

中文直書與 Kindle DX

其實我在兩年前寫了關於 Kindle DX 如何閱讀中文小說的 blog,但是其實後來自己對於這樣子的方法不甚滿意,最主要的原因是。

用橫書看金庸感覺很怪 XD

但是我又是個懶人,於是這問題一直放著,一直到現在 iPad 或者是 Android 平板都有出相應的好讀網站閱讀軟體,我自己用 KDX 也是看英文居多,於是這問題就一直一直放著 ... 直到我開始看 "明朝的那些事兒"。剛開始我是用我自己的 ipod touch 看的 ... Orz,其實非常的耗時 (因為我翻了好多好多頁),後來索性再看看現在 KDX 破解的現況,KDX 現今可以看中文的破解,大抵上來說都是換掉內建的字體,比較好的可以做到英文字體是原本 KDX 內建,中文是黑體,也就是說,可以直接看中文的 mobi 檔,但是,它還是橫書 XD。只是那一瞬間覺得不能再懶下去了,所以乖乖來找解決方案。

如果自己不想去 hack KDX 但是又想看直書,最快的方法,把文字複製到 Word 上貼上,然後設定成直書之後輸出成 PDF 應該就解決了 XD 可惜我比較喜歡用 LaTeX ,所以就使用了一個簡單的方法: 在 XeLaTeX 上的 xeCJK package 配合 fontspec package 可以直接把字旋轉 90 度並中文輸出就可以了。最主要關於字型的設定如下


# use fontspect package
\usepackage{fontspec}
  
# use xeCJK package
\usepackage{xeCJK}     

# set CJK main font and rotate
\setCJKmainfont[Vertical=RotatedGlyphs]{Hei TC}

最主要的設定只有最後一行,其他的都是使用所需要的套件,於是乎,剩下的就是讀出內容,加上 header 和 footer 形成 tex 檔,然後 complie 生成 pdf 檔,丟到 Kindle DX 上,收工。


在 Kindle DX 上的效果如下圖,照片中所使用的字體是 "華康明體 Std W5",實際看起來對比照片略粗




為此,我自己寫了一個簡單的好讀網站的 pdb file 轉成 tex file 的小程式,也符上一個簡單的 XeLaTeX template,皆放在 github 上,如果有使用上的問題,歡迎留言或來信。


github: PDB-TeX-Converter


其中有幾點討論如下。

  1. 為什麼生出來的檔案沒有頁碼 ?
    頁碼在 LaTeX 直書排版上一直是一個很大的問題,但是 Kindle DX 本身就有頁碼,所以直接省略。
  2. 為什麼不讀 updb 檔 ?
    我嘗試搞了幾個晚上之後放棄,我對於編碼實在是不了解,如果可以,我會試試看。
  3. 如何使用 XeLaTeX ?
    這個要講要講很久,在 Mac OSX 上是安裝 MacTeX,在 Linux 上是安裝 TeXLive,在 Windows 上 ... 嗯,應該是 TeXLive,但是我沒研究 XD。如果你使用的是 Mac OSX 或者是在 Linux 從 package manager 直接安裝 TeXLive,這隻小程式在運作上應該不會有問題。目前已知在安裝好 MacTeX 2011 的 Mac OSX 上運作可直接生出 pdf 檔。
  4. 如何知道字體的英文名稱?
    首先,先行建立字體列表,在 command line 中輸入fc-cache -f -c -v接下來,在 command line 中輸入fc-list
    即可看到字體的相對應英文名稱,在上面的範例是 Hei TC,這其實就是 Mac OSX 中的 "黑體 TC"。


---
這個應該是很小眾的需求 XD。


2012/06/07 --- 根據 Josh Ko 的建議,還是使用直向直書模式,不過生出來的 pdf 需手動旋轉頁面。示範圖更新如上,代碼更新已上傳至 github 。

2012/08/08 --- 根據 anynomous 的建議,天火藏書排版系統是現有的方案,而我自己也已經建立了一個新專案為 convert2tex ,主要是可以把 epub/ txt/ pdb (限好讀網站格式)轉換成 tex 檔和支援簡體轉繁體。雖然現在已經是 stable,但還在補強中,修好就會上傳並說明關於這個專案。(可能會很久很久 XDXD)

16 則留言:

匿名 提到...

http://ebook.cdict.info
目前網路上最快的方法...

yen3 提到...

@anonymous

謝謝你跟我說。我試過,所以我才會自己寫 XD

最大的原因是版型不合 XD (KDX 是 9 吋)。其實他的 header 和 footer 處理的相當完整,雖然我覺得有點花 XD。

另外一方面,一次只能上傳一個檔,對我這種懶人是很不好的 XD 所以我寧願自己寫一個。

當然,我知道我做的有所缺失,不過以私人用途來說,也蠻足夠了。

匿名 提到...

最近看到他可以處理九吋的電子書啊..
還可以選雙欄顯示 @@"
我弄錯了嗎?

yen3 提到...

@anonymous

你沒有弄錯喔,是我看錯了,謝謝你的指正 :)。

那麼這個程式其實會變成有點蔽帚自珍 (笑)。我最近還在撰寫一個專案是關於 epub/txt/mobi (限好讀格式) 轉成 tex 檔。專案網址是 https://github.com/yen3/convert2tex ,現在已經可以用了,但是我還在做一些加強。

謝謝你告訴我 :)。

匿名 提到...

epub 跟 mobi 耶..這很難耶...
不過為什麼只限定好讀格式?
epub mobi 不是通用格式嗎?

不太瞭解,latex 指令好多,看一看就昏頭了。

yen3 提到...

因為我寫錯了 ... 對不起 ... Orz

我指的是 epub, txt 和 好讀的 pdb 格式。pdb 格式只限定好讀的原因是,我還沒有看到其他網站在用 pdb XD。

epub 和 mobi 的確是通用格式,但是沒打算要對 mobi 支援,因為通常可以處理 epub 之後,可以使用 Cailbre 將 epub 轉成 mobi。另外一個原因是,網路上最常見的格式是 epub ,所以也不急著做 XD。

至於 latex 指令格式很多 ... 我也不知道怎麼辦 XD。

匿名 提到...

昨天試了一下,好像沒正常工作。看起來跑去 s2t.py 就死了。不是很瞭解。訊息如下:

./convert2tex.py 11A9a.epub
Parse text content from epub/ pdb file: 11A9a.epub
Translate Simple Chinese to Tranditional Chinese: 11A9a.epub
/convert2tex/s2t.py:37: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
if t_string[i] in w_dic:
/convert2tex/s2t.py:47: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
if s[i:j] in dic:

Latex 是很難懂,我比較知道的是字型,排版很多受限於字型,一般 TTF 只有 65535 個字,要支援超過這個字數。就絕對有動過手腳。字只要一歪,怎麼排怎麼醜。一般的字型很多連 BMP 都不全了。很慘的。

yen3 提到...

這個 warning 指的是在簡轉繁時的字串比較編碼方式並不一樣,所以可能會出錯。因為是 warning,我猜還是有可能產生轉換後的檔案。

我上傳修正,但不確定可行性,如果問題依舊存在,可以請你將這個 epub 檔案寄給我嗎 (信箱: yen3rc 在 gmail) ?,謝謝你。

至於字型其實我也不懂,不過 XeLaTex 可以用 OpenType Font,而我查到的 Open Type 可以支援超過 65535 個字。 我倒是不知道 TTF 有這麼多問題,受教了。

匿名 提到...

Parse text content from epub/ pdb file: 11A9a.epub
Translate Simple Chinese to Tranditional Chinese: 11A9a.epub

這次執行結果,沒有錯誤訊息,不過畫面上出現這個後就跑了一個小時,實在等不下去只好停掉。其實這本書是繁體的,不知道為什麼要轉繁體而且又跑不完。在好讀可以找到,關鍵字是:冰與火。你可以找來試試看,也許是我的系統有問題。(默)

本來想說自己轉會不會比較快不用轉 TXT 再轉 PDF ,不過還是放棄。另外今天看到天火藏書也支援 epub 格式了,而且還支援圖片,試轉了幾個檔案都正常。

另外 OpenType 的確支援超過 65535 個字喔,不過做成 PDF 的話跟 TTF 比起來會比較肥大,速度比較慢。至於字型現在很多 OpenType 都是從 TTF 轉過去的,原生的很少,所以外觀差不多。(笑)

yen3 提到...

對不起,現在才回你的意見,我上傳了更新的程式碼,你可以重新下載一次,關於簡轉繁的問題,預設是開啟的,我現在把這個功能變成可選擇。

簡單來說,如果不需要簡轉繁可以打

./convert2tex.py 11A9a.epub

如果需要簡轉繁的話就打

./convert2tex.py -s 11A9a.epub

我相信這樣子應該可以避免掉速度過慢的問題(雖然簡轉繁的模組我也重新寫了一下。)。

對不起,我的方法讓你不滿意,不過如果想要我持續修改我還是蠻願意的喔。天火藏書做的比較接近一般人的使用,而我做的,比較沒那麼容易讓人使用,這是我的問題。而且我的轉檔還不支援圖片 XDXD。

還是很謝謝你願意花這麼多時間使用我寫的東西 :)。

匿名 提到...

DIY 有 DIY 的樂趣,雖然不瞭解在做什麼,不過可以大致瞭解流程,還是很有趣的。其實我也搞不清楚是不是我的有問題,怎麼這麼多災多難。其實我不是在抱怨你作的不好用,而是覺得怎麼好像別人都沒問題就我有問題。手工也有手工的好處,我可以隨時排一些資料來看。

我用了新的之後還是有問題。

./convert2tex.py 11A9a.epub
Parse text content from epub/ pdb file: 11A9a.epub
Convert symbol to support vertial writing: 11A9a.epub
Traceback (most recent call last):
File "./convert2tex.py", line 187, in
main()
File "./convert2tex.py", line 178, in main
tex_fn = convert_file(fn, s2t, vertial_writing_convert)
File "./convert2tex.py", line 129, in convert_file
content = convert_vertial_symbol(content)
File "./convert2tex.py", line 106, in convert_vertial_symbol
content = content.replace(k, v)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 4: ordinal not in range(128)

真的搞不懂是不是我自己的問題啊。對了,我是用 Linux ,你是用 Mac 是不這樣的關係,所以我搞不定啊。抱歉喔,如果你覺得是我的系統問題,那就不用麻煩改了,一直麻煩你很抱歉。

匿名 提到...

KindleGen新版其實已經可以支援直書了

yen3 提到...

不會啦,對不起,這幾天我又跑去參加 FLOLAC 12 了,所以一直沒空修,對不起,我希望我這幾天有空可以看一看,謝謝你的說明。

程式有人用很開心喔,一直麻煩你幫我抓 bug ,這才是我比較抱歉的。

匿名 提到...

您好,我使用

\setCJKmainfont[Vertical=RotatedGlyphs]{PMingLiU}

方式來排直書,版面設定是landscape,生成PDF後再用pdftk旋轉PDF,初步看來OK。但我看以下會轉成:

Source:《中文直書》

Output:







看您的範例是有轉成







看樣子是轉成直書之前,要先針對這些括弧符號進行轉換,把原始文件中的橫排括弧符號先轉成直排括弧符號後再透過XeLaTeX輸出PDF,接著旋轉PDF。

請問您是這樣處理的嗎?

yen3 提到...

對不起,我去當兵了,現在才回

我是這樣子處理的沒錯。我是一律先轉成 UTF-8 再用暴力法一個一個去轉,表是在 convert2tex.py Line 96 ~ 104。

至於如何判別符號的這個問題,通常我都是直接複製貼上到程式碼去耶 ... 很懶的解法 XD。

對不起,我對編碼不熟,有問題希望下次我可以快點回 XD。

匿名 提到...

原來是當兵喔~ XD

感謝說明!