隨著互聯(lián)網(wǎng)的進(jìn)步和技術(shù)積累,國(guó)內(nèi)技術(shù)圈交流的氣氛越來(lái)越濃,微博博客上到處可見(jiàn)有質(zhì)量的技術(shù)貼,但是有時(shí)候想系統(tǒng)閱讀時(shí)卻不是很方便,如果能夠整理成冊(cè)自由分享該有多好。雖然少數(shù)人有幸通過(guò)出版社出書(shū)了,但代價(jià)太大,也不能普及大眾,現(xiàn)在技術(shù)那么發(fā)達(dá),有沒(méi)有辦法自己自助出版呢?
看了圖靈社區(qū)的文章為什么寫(xiě)作自由書(shū)籍?,作為愛(ài)書(shū)之人,我為什么不能想個(gè)辦法來(lái)解決呢?
技術(shù)無(wú)極限,辦法現(xiàn)在有好幾種,在本文中,我就介紹用現(xiàn)在流行的Markdown格式的方式來(lái)產(chǎn)生專業(yè)的書(shū)籍,而且還可以做到利用互聯(lián)網(wǎng),不需要本地機(jī)器參與的完美方案。如果你喜歡微軟的Word,覺(jué)得用它已經(jīng)足夠了,那我們不是同道,不用往下看了。
多說(shuō)無(wú)益,先來(lái)看看效果吧。下面是我去年寫(xiě)的一本小冊(cè)子:跟我學(xué)企業(yè)敏捷開(kāi)發(fā) 在PDF閱讀器中的效果。注意還有完整的目錄和頁(yè)眉。
書(shū)的內(nèi)容就全是用markdown格式寫(xiě)的,上圖相對(duì)應(yīng)的文件內(nèi)容(6.2節(jié))片斷如下。
## Cucumber 簡(jiǎn)介 ##Cucumber(英文:黃瓜)(官方網(wǎng)站是<http://cukes.info/>)是一個(gè)實(shí)例化需求的極佳實(shí)現(xiàn)伴侶。它是基于Ruby的開(kāi)源測(cè)試工具,得益于Ruby便于創(chuàng)建和使用DSL的特性,它可以通過(guò)自然語(yǔ)言(文本文字)來(lái)描述需求(業(yè)務(wù)層),并通過(guò)關(guān)鍵字驅(qū)動(dòng)和正則表達(dá)式匹配告訴去做哪些事情(驅(qū)動(dòng)層),在運(yùn)行自動(dòng)化測(cè)試結(jié)束以后,還會(huì)給出詳細(xì)的報(bào)告。Insert 18333fig0601.png圖 6-1. Cucumber的架構(gòu)下面就是一個(gè)加法例子的需求描述,Cucumber文件以`.feature`結(jié)尾。 # 加法 adding.feature Feature: Adding In order to avoid silly mistakes As a math idiot I want to be told the sum of two numbers
下面就是書(shū)的全部markdown文件,每一章一個(gè)文件。我把它們分成了序、前言、致謝、正文和附錄,蠻像回事吧。有興趣的朋友可以看看作譯者手冊(cè),來(lái)了解標(biāo)準(zhǔn)的書(shū)是怎么組成的。
$ find zhzhzh/0prefacezh/0preface/00-chapter1-preface.markdownzh/0preface/00-chapter2-changes.markdownzh/0preface/00-chapter3-acknowledgement.markdownzh/1chapterszh/1chapters/01-chapter1-agile-scrum.markdownzh/1chapters/01-chapter2-git-gerrit.markdownzh/1chapters/01-chapter3-ci.markdownzh/1chapters/01-chapter4-java.markdownzh/1chapters/01-chapter5-sbe.markdownzh/1chapters/01-chapter6-cucumber.markdownzh/1chapters/01-chapter7-workshop.markdownzh/2appendixzh/2appendix/02-chapter1-sample.markdownzh/2appendix/02-chapter2-cc2git.markdown
全書(shū)的內(nèi)容夠可以在github上找到https://github.com/larrycai/sdcamp/tree/master/zh
樣式的產(chǎn)生全部有模板完成,一般不需要改動(dòng),這個(gè)稍后講。
有興趣了,就可以聊聊markdown了,簡(jiǎn)單來(lái)說(shuō),markdown格式的文件看著像一般的文本文件,里面只是加了很少的格式標(biāo)記,因此看文本文件也不影響理解,這種格式也有很多工具幫你去轉(zhuǎn)化,而且很容易自動(dòng)化解決。并且這些技術(shù)大多數(shù)是開(kāi)源或免費(fèi)的。
如 ## Cucumber 簡(jiǎn)介 ##
就可以轉(zhuǎn)換成html的<h2>Cucumber 簡(jiǎn)介</h2>
或者書(shū)中的小節(jié), 空四個(gè)就是表示代碼,是否很簡(jiǎn)單。具體可以看圖靈社區(qū)的文章 Markdown語(yǔ)法說(shuō)明(詳解版)
原因也很簡(jiǎn)單,因?yàn)楹?jiǎn)潔和流行。markdown格式的普及要?dú)w功于Github和StackOverflow。因?yàn)樗鼈冊(cè)絹?lái)越流行,它們支持markdown格式也越來(lái)越流行。這里要贊一個(gè)的是,國(guó)內(nèi)的圖靈社區(qū)也支持markdown,用起來(lái)超級(jí)方便。
我的體會(huì)是,它讓你關(guān)注內(nèi)容,格式怎么顯示不是要你在寫(xiě)得時(shí)候關(guān)注的。Word讓我討厭的原因就是老要關(guān)注格式。
實(shí)際上核心是軟件思想中的分離,就像HTML關(guān)注內(nèi)容,CSS關(guān)注格式表現(xiàn)一樣。
從Markdown源文件產(chǎn)生電子書(shū)一般有兩種方案:一種是產(chǎn)生HTML中間格式再轉(zhuǎn)換出電子書(shū),另一種是對(duì)應(yīng)地轉(zhuǎn)換產(chǎn)生出LaTeX文件格式,再和LaTeX模板合在一起,最后轉(zhuǎn)換產(chǎn)生PDF,達(dá)到標(biāo)準(zhǔn)書(shū)籍出版的質(zhì)量(完整的封面,目錄,頁(yè)眉等等),這里主要討論第二種。
LaTeX(就是Donald E. Knuth(高德納)發(fā)明的)是一個(gè)出版界(至少是科技界)常用的格式,PDF也能很容易地產(chǎn)生出來(lái),它的好處是內(nèi)容和形式是很容易分開(kāi)的,感謝大師的設(shè)計(jì)。
Markdown可以通過(guò)工具自動(dòng)轉(zhuǎn)換出LaTeX的標(biāo)準(zhǔn)內(nèi)容。
\section{Cucumber 簡(jiǎn)介} %
就是上面由## Cucumber 簡(jiǎn)介 ##
自動(dòng)生成的LaTeX內(nèi)容,表示小節(jié)。
余下書(shū)的表現(xiàn)形式就有預(yù)先調(diào)好的LaTeX的模板來(lái)處理,像頁(yè)眉、目錄、字體之類的和內(nèi)容無(wú)關(guān)的就全部有LaTeX搞定了。不同的出版社或者圖書(shū)系列都會(huì)有特定的模板,這和作者的內(nèi)容無(wú)關(guān)。
這有點(diǎn)像HTML和CSS的關(guān)系。下面這一段是調(diào)整小節(jié)標(biāo)題顯示:
\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 使用粗體字排版,這兒選擇了文泉驛的微黑。
下面這一段是調(diào)出頁(yè)眉左上角(LE=Left Head
)的:顯示頁(yè)碼和內(nèi)容,顏色設(shè)定為鋼鐵藍(lán),
\definecolor{colorheader}{RGB}{70,130,180} % SteelBlue\fancyhead[LE]{\color{colorheader}\quad\small\textbf\thepage\quad\quad\small\leftmark} %頁(yè)眉左上角
初看有點(diǎn)復(fù)雜,學(xué)習(xí)曲線蠻陡的。不懂的話,知道里面含有樣式就可以了,反正你可以用現(xiàn)成的模板,這也是出版的專業(yè)所在,不用寫(xiě)書(shū)的負(fù)責(zé)。
工具軟件pandoc能幫著從markdown轉(zhuǎn)換出LaTeX格式,然后通過(guò)TexLive軟件中的xelatex
再轉(zhuǎn)成PDF格式。
強(qiáng)烈建議你到Pandoc的在線實(shí)驗(yàn)環(huán)境試一下。
這里主要討論P(yáng)DF的格式,實(shí)際上epub/mobi格式的用pandoc
生成也很方便。
計(jì)算機(jī)類圖書(shū)對(duì)格式要求不是很多,圖文、章節(jié)、源代碼基本就夠了,就算有些復(fù)雜公式,也可用圖來(lái)顯示。這也從理論上說(shuō)明,它不需要復(fù)雜的格式?,F(xiàn)在對(duì)這類技術(shù)書(shū)出版我的理解主要有幾種:
講了那么多,作為碼農(nóng),該動(dòng)手實(shí)踐一下,其他讀者可以跳過(guò)這一章。
你需要一臺(tái)Linux機(jī)器(虛擬機(jī)就可以了)和簡(jiǎn)單的Linux命令就可以試驗(yàn)了。有g(shù)it和ruby的知識(shí)那就更方便了。
我用的試驗(yàn)環(huán)境是Ubuntu 12.04 (Precise) 版本。
很簡(jiǎn)單,git clone
一下就可以了,下載它的源文件包我覺(jué)得還是煩了點(diǎn)。
$ git clone https://github.com/larrycai/sdcamp.git
生成PDF是一個(gè)比較復(fù)雜的東西,用到了pandoc和TexLive軟件,用Ubuntu庫(kù)里就可以了。關(guān)于Pandoc,可以看圖靈社區(qū)翻譯的文章關(guān)于通用文檔轉(zhuǎn)換器Pandoc,TexLive就是LaTeX的工具集。
$ sudo apt-get install pandoc $ sudo apt-get install texlive-xetex texlive-latex-recommended texlive-latex-extra # 安裝texlive 2011
因?yàn)槭侵形腜DF,需要把字體嵌入在文件中,因此需要安裝字體文件(如果不是Ubuntu中文版),具體可看我在圖靈社區(qū)的文章開(kāi)源書(shū)和開(kāi)源技術(shù)-PDF中蛋疼的中文字體
$ sudo apt-get install ttf-arphic-gbsn00lp ttf-arphic-ukai ttf-wqy-microhei ttf-wqy-zenhei
現(xiàn)在你就可以生成pdf文件了。
$ ./mkbok
pandoc
本身也支持模板,但很多情況下,還需要調(diào)整,寫(xiě)個(gè)腳本就方便多了。我用的腳本mkbok
是基于Pro Git里面的腳本makeebooks
和makepdfs
開(kāi)發(fā)的。原書(shū)作者Scott原來(lái)還用calibre產(chǎn)生epub文件,我統(tǒng)一用pandoc
。并原有的基礎(chǔ)上進(jìn)行了擴(kuò)展,統(tǒng)一為mkbok
腳本。
$ ./mkbok --build pdf,html,epub --lang zh --template latex/template.tex
這樣就可一次性完成電子書(shū)的活,而且還改造了LaTeX模板(加了前言、致謝和頁(yè)眉等,使它最后的結(jié)果更像一份標(biāo)準(zhǔn)的書(shū)。主要功能差不多,但是擴(kuò)展應(yīng)該會(huì)更好些,特別是有機(jī)會(huì)更方便地采用不同的專業(yè)模板。
你可以建一套基于上述技術(shù)的方便的出版系統(tǒng)。不過(guò)也可以利用互聯(lián)網(wǎng)的服務(wù),混搭一下。Github和Travis-ci就是我要利用的混搭服務(wù)。
Github和Travis CI這里就不介紹怎么使用了,具體可以先看曉斌的博客和蔣鑫的Got Github,強(qiáng)烈建議你先試一下。要不下期碼農(nóng)吧。
簡(jiǎn)單道理就是當(dāng)你把代碼推送到Github時(shí),就可以觸發(fā)Travis-ci的構(gòu)建。Travis-ci會(huì)啟動(dòng)一個(gè)基于Virtualbox的Ubuntu的虛擬機(jī)(當(dāng)前是12.04版本),然后根據(jù)你的.travis-ci.yml
中的配置來(lái)構(gòu)建
你的產(chǎn)品,也就是執(zhí)行上面的步驟來(lái)產(chǎn)生PDF文件。
構(gòu)建結(jié)束后,虛擬機(jī)會(huì)被刪除掉,雖然Travis-ci網(wǎng)站本身沒(méi)有提供歸檔功能,但是Github的API提供了極好的方法來(lái)上傳文件。所以我們可以用Github API和Travis-ci的保密環(huán)境變量的方式來(lái)把Travis-ci的結(jié)果上傳回Github。
具體請(qǐng)看我的博客把Travis-ci的結(jié)果上傳回Github。
李明老師的源碼開(kāi)放學(xué)ARM也是此方案的忠實(shí)用戶,基本上可以全用瀏覽器解決。
里面的技術(shù)細(xì)節(jié)還有蠻多的,不知是否你都明白,實(shí)際上照著試一遍,你會(huì)發(fā)現(xiàn)不是那么復(fù)雜。如果有問(wèn)題,盡管找我 (@larrycaiyu)。
我一直設(shè)想中有一天上面提到的各個(gè)環(huán)節(jié)都能打磨得非常流暢,吸引更多的使用者。然后能夠有很多人有興趣用它來(lái)寫(xiě)書(shū),可能是自?shī)首詷?lè),也可以免費(fèi)出版。不管怎樣都是促進(jìn)圖書(shū)業(yè)。
出版界或者LaTeX的高手可以提供設(shè)計(jì)些更好的LaTeX模板(可以收費(fèi))供大家使用。
圖靈出版社也提供網(wǎng)上的編輯服務(wù)(當(dāng)然是可以收費(fèi)的),對(duì)一些想把書(shū)寫(xiě)得專業(yè)點(diǎn)的作者提供額外的幫助,這樣或許是一個(gè)很好的增值服務(wù)。至少像我這樣的文筆超爛的技術(shù)人員很想得到的。
這些本是我2012想做到的事情:設(shè)想中的開(kāi)源書(shū)項(xiàng)目,而且域名都買好了,留個(gè)遺憾放到明年吧。
技術(shù)無(wú)極限,只怕沒(méi)追求。
聯(lián)系客服