用Markdown來寫自由書籍-開源技術的方案

larrycai發表於2011-12-31

{{ page.title }}

背景

隨著網際網路的進步和技術積累,國內技術圈交流的氣氛越來越濃,微博部落格上到處可見有質量的技術貼,但是有時候想系統閱讀時卻不是很方便,如果能夠整理成冊自由分享該有多好。雖然少數人有幸通過出版社出書了,但代價太大,也不能普及大眾,現在技術那麼發達,有沒有辦法自己自助出版呢?

看了圖靈社群的文章為什麼寫作自由書籍?,作為愛書之人,我為什麼不能想個辦法來解決呢?

技術無極限,辦法現在有好幾種,在本文中,我就介紹用現在流行的Markdown格式的方式來產生專業的書籍,而且還可以做到利用網際網路,不需要本地機器參與的完美方案。如果你喜歡微軟的Word,覺得用它已經足夠了,那我們不是同道,不用往下看了。

markdown能做出什麼效果呢?

多說無益,先來看看效果吧。下面是我去年寫的一本小冊子:跟我學企業敏捷開發 在PDF閱讀器中的效果。注意還有完整的目錄和頁首。

Markdown產生的書

書的內容就全是用markdown格式寫的,上圖相對應的檔案內容(6.2節)片斷如下。

## Cucumber 簡介 ##
Cucumber(英文:黃瓜)(官方網站是<http://cukes.info/>)是一個例項化需求的極佳實現伴侶。它是基於Ruby的開源測試工具,得益於Ruby便於建立和使用DSL的特性,它可以通過自然語言(文字文字)來描述需求(業務層),並通過關鍵字驅動和正規表示式匹配告訴去做哪些事情(驅動層),在執行自動化測試結束以後,還會給出詳細的報告。

Insert 18333fig0601.png
圖 6-1. Cucumber的架構

下面就是一個加法例子的需求描述,Cucumber檔案以`.feature`結尾。

  # 加法 adding.feature
  Feature: Adding
    In order to avoid silly mistakes
    As a math idiot
    I want to be told the sum of two numbers

下面就是書的全部markdown檔案,每一章一個檔案。我把它們分成了序、前言、致謝、正文和附錄,蠻像回事吧。有興趣的朋友可以看看作譯者手冊,來了解標準的書是怎麼組成的。

$ find zh
zh
zh/0preface
zh/0preface/00-chapter1-preface.markdown
zh/0preface/00-chapter2-changes.markdown
zh/0preface/00-chapter3-acknowledgement.markdown
zh/1chapters
zh/1chapters/01-chapter1-agile-scrum.markdown
zh/1chapters/01-chapter2-git-gerrit.markdown
zh/1chapters/01-chapter3-ci.markdown
zh/1chapters/01-chapter4-java.markdown
zh/1chapters/01-chapter5-sbe.markdown
zh/1chapters/01-chapter6-cucumber.markdown
zh/1chapters/01-chapter7-workshop.markdown
zh/2appendix
zh/2appendix/02-chapter1-sample.markdown
zh/2appendix/02-chapter2-cc2git.markdown

全書的內容夠可以在github上找到https://github.com/larrycai/sdcamp/tree/master/zh

樣式的產生全部有模板完成,一般不需要改動,這個稍後講。

什麼是markdown

有興趣了,就可以聊聊markdown了,簡單來說,markdown格式的檔案看著像一般的文字檔案,裡面只是加了很少的格式標記,因此看文字檔案也不影響理解,這種格式也有很多工具幫你去轉化,而且很容易自動化解決。並且這些技術大多數是開源或免費的。

## Cucumber 簡介 ##就可以轉換成html的<h2>Cucumber 簡介</h2>或者書中的小節, 空四個就是表示程式碼,是否很簡單。具體可以看圖靈社群的文章 Markdown語法說明(詳解版)

為什麼要用markdown

原因也很簡單,因為簡潔和流行。markdown格式的普及要歸功於Github和StackOverflow。因為它們越來越流行,它們支援markdown格式也越來越流行。這裡要贊一個的是,國內的圖靈社群也支援markdown,用起來超級方便。

我的體會是,它讓你關注內容,格式怎麼顯示不是要你在寫得時候關注的。Word讓我討厭的原因就是老要關注格式。

實際上核心是軟體思想中的分離,就像HTML關注內容,CSS關注格式表現一樣。

背後的魔法

從Markdown原始檔產生電子書一般有兩種方案:一種是產生HTML中間格式再轉換出電子書,另一種是對應地轉換產生出LaTeX檔案格式,再和LaTeX模板合在一起,最後轉換產生PDF,達到標準書籍出版的質量(完整的封面,目錄,頁首等等),這裡主要討論第二種。

Markdown產生的書技術方案

LaTeX(就是Donald E. Knuth(高德納)發明的)是一個出版界(至少是科技界)常用的格式,PDF也能很容易地產生出來,它的好處是內容和形式是很容易分開的,感謝大師的設計。

Markdown可以通過工具自動轉換出LaTeX的標準內容。

\section{Cucumber 簡介} % 

就是上面由## Cucumber 簡介 ##自動生成的LaTeX內容,表示小節。

餘下書的表現形式就有預先調好的LaTeX的模板來處理,像頁首、目錄、字型之類的和內容無關的就全部有LaTeX搞定了。不同的出版社或者圖書系列都會有特定的模板,這和作者的內容無關。

這有點像HTML和CSS的關係。下面這一段是調整小節標題顯示:

\definecolor{colorsection}{RGB}{95,158,160}    % CadetBlue
\setromanfont[Mapping=tex-text,BoldFont="WenQuanYi Micro Hei"]
\titleformat{\section}
    {\color{colorsection}\normalfont\Large\bfseries}
    {\color{colorsection}\thesection}{1em}{}

\bfseries 是讓 LaTeX 使用粗體字排版,這兒選擇了文泉驛的微黑。

下面這一段是調出頁首左上角(LE=Left Head)的:顯示頁碼和內容,顏色設定為鋼鐵藍,

\definecolor{colorheader}{RGB}{70,130,180} % SteelBlue
\fancyhead[LE]{\color{colorheader}\quad\small\textbf\thepage\quad\quad\small\leftmark} %頁首左上角

初看有點複雜,學習曲線蠻陡的。不懂的話,知道里面含有樣式就可以了,反正你可以用現成的模板,這也是出版的專業所在,不用寫書的負責。

工具軟體pandoc能幫著從markdown轉換出LaTeX格式,然後通過TexLive軟體中的xelatex再轉成PDF格式。

強烈建議你到Pandoc的線上實驗環境試一下。

這裡主要討論PDF的格式,實際上epub/mobi格式的用pandoc生成也很方便。

其他常用格式的出版方案

計算機類圖書對格式要求不是很多,圖文、章節、原始碼基本就夠了,就算有些複雜公式,也可用圖來顯示。這也從理論上說明,它不需要複雜的格式。現在對這類技術書出版我的理解主要有幾種:

  1. Microsoft的Word格式,雖然國內出版界如日中天,預設就認它(對技術沒追求,鄙視)。簡單好學,但是不擅長自動化,是開源的死敵。
  2. 直接用LaTeX格式,這是很棒的東西,特別適合學術類的各種複雜的公式等,不過學習曲線很高,國內也只有幾家學術期刊使用。
  3. DocBook格式是最有名的(從SGML演化過來),O'Reilly和Pragmatic出版社預設就用它,它能很方便地轉化出出版要的各種樣式。如Jenkins - the definition guide開源書就是採用docbook。但由於是XML格式,很多人不習慣,而且多人網上協作不是很方便。
  4. 通過蔣鑫的Got Github開源書,我也瞭解reStructureText也是和markdown差不多純文字(plain text)的,也是蠻流行的,結合sphinx也所向無敵。

自己動手產生電子書

講了那麼多,作為碼農,該動手實踐一下,其他讀者可以跳過這一章。

你需要一臺Linux機器(虛擬機器就可以了)和簡單的Linux命令就可以試驗了。有git和ruby的知識那就更方便了。

我用的試驗環境是Ubuntu 12.04 (Precise) 版本。

下載書的原始碼

很簡單,git clone一下就可以了,下載它的原始檔包我覺得還是煩了點。

$ git clone https://github.com/larrycai/sdcamp.git

生成PDF是一個比較複雜的東西,用到了pandocTexLive軟體,用Ubuntu庫裡就可以了。關於Pandoc,可以看圖靈社群翻譯的文章關於通用文件轉換器Pandoc,TexLive就是LaTeX的工具集。

$ sudo apt-get install pandoc 
$ sudo apt-get install texlive-xetex texlive-latex-recommended texlive-latex-extra # 安裝texlive 2011

因為是中文PDF,需要把字型嵌入在檔案中,因此需要安裝字型檔案(如果不是Ubuntu中文版),具體可看我在圖靈社群的文章開源書和開源技術-PDF中蛋疼的中文字型

$ sudo apt-get install ttf-arphic-gbsn00lp ttf-arphic-ukai ttf-wqy-microhei ttf-wqy-zenhei

現在你就可以生成pdf檔案了。

$ ./mkbok    

mkbok 指令碼

pandoc本身也支援模板,但很多情況下,還需要調整,寫個指令碼就方便多了。我用的指令碼mkbok是基於Pro Git裡面的指令碼makeebooksmakepdfs開發的。原書作者Scott原來還用calibre產生epub檔案,我統一用pandoc。並原有的基礎上進行了擴充套件,統一為mkbok指令碼。

$ ./mkbok --build pdf,html,epub --lang zh --template latex/template.tex

這樣就可一次性完成電子書的活,而且還改造了LaTeX模板(加了前言、致謝和頁首等,使它最後的結果更像一份標準的書。主要功能差不多,但是擴充套件應該會更好些,特別是有機會更方便地採用不同的專業模板。

基於Github和Travis-ci的網際網路線上方案

你可以建一套基於上述技術的方便的出版系統。不過也可以利用網際網路的服務,混搭一下。Github和Travis-ci就是我要利用的混搭服務。

Github和Travis CI這裡就不介紹怎麼使用了,具體可以先看曉斌的部落格和蔣鑫的Got Github,強烈建議你先試一下。要不下期碼農吧。

簡單道理就是當你把程式碼推送到Github時,就可以觸發Travis-ci的構建。Travis-ci會啟動一個基於Virtualbox的Ubuntu的虛擬機器(當前是12.04版本),然後根據你的.travis-ci.yml中的配置來構建你的產品,也就是執行上面的步驟來產生PDF檔案。

構建結束後,虛擬機器會被刪除掉,雖然Travis-ci網站本身沒有提供歸檔功能,但是Github的API提供了極好的方法來上傳檔案。所以我們可以用Github API和Travis-ci的保密環境變數的方式來把Travis-ci的結果上傳回Github。

具體請看我的部落格把Travis-ci的結果上傳回Github

李明老師的原始碼開放學ARM也是此方案的忠實使用者,基本上可以全用瀏覽器解決。

結尾

裡面的技術細節還有蠻多的,不知是否你都明白,實際上照著試一遍,你會發現不是那麼複雜。如果有問題,儘管找我 (@larrycaiyu)。

我一直設想中有一天上面提到的各個環節都能打磨得非常流暢,吸引更多的使用者。然後能夠有很多人有興趣用它來寫書,可能是自娛自樂,也可以免費出版。不管怎樣都是促進圖書業。

出版界或者LaTeX的高手可以提供設計些更好的LaTeX模板(可以收費)供大家使用。

圖靈出版社也提供網上的編輯服務(當然是可以收費的),對一些想把書寫得專業點的作者提供額外的幫助,這樣或許是一個很好的增值服務。至少像我這樣的文筆超爛的技術人員很想得到的。

這些本是我2012想做到的事情:設想中的開源書專案,而且域名都買好了,留個遺憾放到明年吧。

技術無極限,只怕沒追求。

相關文章