無需越獄,中英混排的 Kindle 電子書也能擁有好看的排版
需求分析與解決思路
排版問題一直是 Kindle 的頑疾,而其在字體選用方面的不作為又特為尤甚。因此,更換字體一直是 Kindle 用戶折騰的主要動力之一。早先,這一需求經常通過越獄並替換系統字體來實現。但隨著 Kindle 越獄難度的加大,加上替換文件容易導致的諸多故障,嘗試這種方法的成本已經越來越高了。
另外一種更為方便和安全的方式,則是利用 Calibre 這一強大的管理、編輯工具對電子書進行處理,在其中嵌入自定義字體。但直接應用這種方法得到的排版效果其實也並不完善,因為 Calibre一次只能嵌入一個字體文件,在顯示粗體和西文部分時,就會出現字體缺失或效果不佳的問題(很多中文字體附帶的西文質量是十分平庸的)。
實際上,對於常見的中西文混排電子書,想要實現最好的排版效果,需要給中英文分別設置不同的字體。
下圖是原電子書的顯示效果、使用 Calibre 直接嵌入字體的效果、以及嵌入多種字體效果的對比。請特別注意西文和粗體、斜體的顯示效果。
本文的目的,即在於說明如何利用 Calibre 的命令行支持,通過在電子書中嵌入自定義的 CSS 和字體文件,以實現更完善的排版效果。
前期準備和字體選擇
要使用本文方法修改電子書文件,需要提前準備的條件有:
- 安裝 Calibre;
- 待修改的電子書文件(如果該電子書是從商店購買,則需要先行移除其 DRM 保護);
- 將需要嵌入的中西文字體文件(
.ttf
或.otf
,不支持.ttc
)放在同一文件夾中(例如~/Documents/KindleFonts
)。
字體的推薦並非本文重點,且中文互聯網上已有不少較為完善的討論(例如 這篇 和 這篇)。至於免費字體的推薦和獲取,則可參看我 之前的文章。這裡只提出幾點建議供讀者參考:
- 襯線體/宋體總體上更適合長文閱讀(前提是解析度足夠高,但這對較新的 Kindle 不是問題);
- 中文和西文字體在風格和粗細程度上應當盡量接近;
- 電子墨水屏的顯示效果看起來偏淡,因此盡量選擇略粗的字體;
- 嵌入的字體以夠用為原則,不要數量過多或體積過大,否則容易導致 Kindle 無法打開或死機;
- 從尊重版權角度出發,請始終注意電子書和字體的正規來源,並且不要傳播修改後的文件。
例如,如果從獲取和使用最為便利的開源字體中選擇,IBM 推出的 IBM Plex Serif 和 Adobe/Google 製作的思源宋體就是一組較為協調的搭配。但考慮到電子書屏幕的上述顯示特點以及兩種字體的字重差異,比起直接選用思源宋體常規體和粗體,更好的做法是以其 Medium 字重(比 Regular 稍粗一些)作為常規體、以 Heavy 字重作為粗體。下文也將以這一組合為例進行演示。
?? 你可以 下載 我準備好的這兩種字體進行嘗試。
CSS 的編寫
Kindle 等閱讀器讀取和顯示電子書的原理和瀏覽器顯示網頁幾乎是一樣的,都是以 html 文件為內容載體,而通過 CSS 來決定顏色、字體、排版等顯示特性。為了讓 Kindle 在顯示時能正確調用嵌入的字體,就要同時嵌入相對應的 CSS,用於說明使用了哪些字體、分別應當在什麼地方使用。
例如,如果準備嵌入上文提及的 IBM Plex Serif 配思源宋體的組合,並讓中文字體加粗一檔,所用到的 CSS 應如下圖所示(已經放在上文提供字體壓縮包中的 KindleFonts.css
內):
可以看到,這段 CSS 主要分為兩大部分:
首先,用 @font-face
來聲明將要嵌入的字體文件的各項屬性(上圖第 1—36 行)。這本不是必須的(因為字體文件本身已經記載了這些信息),但當需要改變字體原有的屬性時(如將較粗字體當作常規體來用),就要藉助 @font-face
來進行修改。這裡拿出上面代碼中涉及中文粗體的部分來具體說明:
@font-face { font-family: "Source Han Serif"; font-style: normal; font-weight: normal; src: url(SourceHanSerifCN-Medium.otf);}
上面這段代碼的作用是將名為 SourceHanSerifSC-Medium.otf
的字體文件重新定義為「Source Han Serif」家族中的常規體。其中:
font-family
:字體家族名稱,可以任意填寫,易於識別即可;font-style
:字體樣式,取值為normal
(常規體)或italic
(斜體);font-weight
:字重,取值為normal
(常規體)或bold
(粗體);src
:字體文件的路徑,此處填寫字體文件名即可。
每有一個要嵌入的字體文件,都要配以對應的一段 @font-face
代碼。
接著,用 CSS 選擇器「告訴」Kindle 在哪些地方使用嵌入的字體(上圖第 36 行以下)。在 font-family
屬性中列舉字體時要注意順序,把西文字體放在中文字體之前;否則,Kindle 在顯示時就會調用中文字體自帶的西文,這不符合我們的目的。
最後,將寫好的代碼保存為一個 .css
文件(例如 ~/Documents/KindleFonts/KindleFonts.css
),記下其路徑備用。
命令的構建
完成上述準備後,就可以著手構建用來嵌入字體的終端命令了。該命令的結構如下:
$ /Applications/calibre.app/Contents/MacOS/ebook-convert 原始電子書文件路徑 ~/Desktop/temp.htmlz --extra-css "$(cat 自定義CSS文件路徑 | tr
, )" && zip -urj0 ~/Desktop/temp.htmlz 字體所在文件夾路徑 && /Applications/calibre.app/Contents/MacOS/ebook-convert ~/Desktop/output.htmlz ~/Desktop/output.azw3 --language zh-Hans && rm ~/Desktop/temp.htmlz
其中,原始電子書文件路徑
、自定義 CSS 文件路徑
和字體所在文件夾路徑
在上面的步驟中都已經準備好,填入對應位置即可。
註:如果你不確定文件路徑的寫法,可以將其拖入終端窗口來顯示(macOS),或點擊右鍵選擇「屬性」(Windows)來查看。
一個填寫完整的命令如下圖所示(?? 下載):
對該命令中其餘部分的解釋如下:
/Applications/calibre.app/Contents/MacOS/ebook-convert
:Calibre 格式轉換模塊的路徑。在 macOS 上,該可執行文件位於 Calibre 的.app
包中。在 Windows 和 Linux 上,該文件可在 Calibre 的安裝目錄中找到。此命令的基本用法為ebook-convert 原始文件 目標文件.目標格式 [-參數]
--extra-css "$(cat 自定義CSS文件路徑 | tr
:去除 CSS 文件中的換行和 tab(為了符合終端命令的語法要求)並嵌入到電子書中。
, )"temp.htmlz
:上述思路中用於「中轉」的電子書文件。htmlz
格式本質上就是一個 zip 壓縮包,內容是電子書中的資源文件。zip -urj0
:將自定義字體文件夾中的文件(-rj
)更新到(-u
)用於中轉的htmlz
格式電子書中,且不壓縮其大小(-0
);output.azw3
:最終生成的 Kindle 電子書文件,本命令中將其放在桌面。如果你使用非 Kindle 閱讀器,也可以將其後綴名改為.epub
以生成 ePub 格式的電子書。--language zh-Hans
:指定電子書語言,這影響到 Kindle 中字體菜單中提供的選項。如果你是用本文方法轉換英文電子書,不要使用該參數。rm ~/Desktop/temp.htmlz
:刪除用於中轉的htmlz
格式電子書。
執行命令並稍等片刻,即可在桌面看到輸出的 output.azw3
文件。這就是嵌入了字體的電子書。將其拷貝到 Kindle 設備上後,在字體菜單中選擇新出現的「出版方字體」選項,即可看到效果。
延伸應用
在實際使用中,如果每次都要根據上述步驟重新編寫一次命令,未免顯得麻煩。其實,由於想要嵌入的字體一般相對固定,每次操作中需要改變的只有電子書文件的路徑而已。為此,只需將原命令中的電子書路徑改為變數 "$1"
,就可以將其當作一段 shell 腳本,放在各類效率工具中反覆利用。
例如,你可以用 Automator 將其變為一個服務項,從而通過在電子書上點擊右鍵直接調用:
?? Automator 服務下載
或者,可以將其製作成 LaunchBar 動作,通過快捷鍵調用:
?? LaunchBar 動作下載
順帶提及,本方法的幕後主角 ebook-convert
是一個極其強大的命令,可以實現 Calibre 圖形界面的一切格式轉換選項。你可以參閱其 文檔來進一步定製出適合自己需求的命令。
> 了解更多 Kindle 使用技巧,就在專題 別讓你的 Kindle 吃灰 ??
推薦閱讀:
※Kindle paper white2 和kindle paper3哪個性價比高?
※如何評價亞馬遜 2017 新款 Kindle Oasis ?
※kindle只顯示電池加感嘆號,怎麼破?
※史上最強的Kindle來了,你會入坑嗎?
※Kindle 5 和 Kindle Touch / Paperwhite 哪個閱讀體驗更好?
TAG:Kindle | Kindle使用技巧 | 中文字體 |