用Markdown來寫自由書籍-開源技術的方案
{{ page.title }}
背景
隨著網際網路的進步和技術積累,國內技術圈交流的氣氛越來越濃,微博部落格上到處可見有質量的技術貼,但是有時候想系統閱讀時卻不是很方便,如果能夠整理成冊自由分享該有多好。雖然少數人有幸通過出版社出書了,但代價太大,也不能普及大眾,現在技術那麼發達,有沒有辦法自己自助出版呢?
看了圖靈社群的文章為什麼寫作自由書籍?,作為愛書之人,我為什麼不能想個辦法來解決呢?
技術無極限,辦法現在有好幾種,在本文中,我就介紹用現在流行的Markdown格式的方式來產生專業的書籍,而且還可以做到利用網際網路,不需要本地機器參與的完美方案。如果你喜歡微軟的Word,覺得用它已經足夠了,那我們不是同道,不用往下看了。
markdown能做出什麼效果呢?
多說無益,先來看看效果吧。下面是我去年寫的一本小冊子:跟我學企業敏捷開發 在PDF閱讀器中的效果。注意還有完整的目錄和頁首。
書的內容就全是用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,達到標準書籍出版的質量(完整的封面,目錄,頁首等等),這裡主要討論第二種。
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
生成也很方便。
其他常用格式的出版方案
計算機類圖書對格式要求不是很多,圖文、章節、原始碼基本就夠了,就算有些複雜公式,也可用圖來顯示。這也從理論上說明,它不需要複雜的格式。現在對這類技術書出版我的理解主要有幾種:
- Microsoft的Word格式,雖然國內出版界如日中天,預設就認它(對技術沒追求,鄙視)。簡單好學,但是不擅長自動化,是開源的死敵。
- 直接用LaTeX格式,這是很棒的東西,特別適合學術類的各種複雜的公式等,不過學習曲線很高,國內也只有幾家學術期刊使用。
- DocBook格式是最有名的(從SGML演化過來),O'Reilly和Pragmatic出版社預設就用它,它能很方便地轉化出出版要的各種樣式。如Jenkins - the definition guide開源書就是採用docbook。但由於是XML格式,很多人不習慣,而且多人網上協作不是很方便。
- 通過蔣鑫的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是一個比較複雜的東西,用到了pandoc和TexLive軟體,用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裡面的指令碼makeebooks
和makepdfs
開發的。原書作者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想做到的事情:設想中的開源書專案,而且域名都買好了,留個遺憾放到明年吧。
技術無極限,只怕沒追求。
相關文章
- 「ReStory」在 Markdown 中自由書寫 React 元件 (Beta)RESTReact元件
- 說說技術書籍
- 受益技術類書籍
- 必讀技術書籍
- 關於技術書籍,我是這麼來選書和看書的
- 技術類書籍中的形容詞
- 讀書打卡 | 參與沸點#讀書打卡#活動來拿技術書籍?
- 如何閱讀技術類書籍
- 技術管理—管理書籍推薦
- 技術人必看的各類工具書籍
- 6 個用於寫書的開源工具開源工具
- 「Fluent Python」今年最佳技術書籍Python
- 技術書籍超級閱讀法
- 技術進階的書籍清單之一
- 2017年讀的非技術書籍
- 我讀過的⼀些優秀技術書籍
- 技術方案(開源方案)選型的考量和方法論
- Markdown 書寫規範
- Markdown書寫規範
- 讀一本跟技術無關的書籍
- 對引進IT技術書籍的一點建議
- 開源書和開源技術-PDF中蛋疼的中文字型
- 《Node.js 除錯指南》開源書籍Node.js除錯
- 看技術書籍堅持不下來的,看這裡,記錄增量學習法
- 適合初學者學java技術的書籍推薦!Java
- 我的2014圖靈技術書籍排行圖靈
- 使用 github, gitbook, markdown 寫部落格/寫書Github
- 技術書籍推薦-v1.0版本
- 便宜出Java核心技術等計算機書籍Java計算機
- 程式設計師翻譯技術類書籍的總結程式設計師
- 求JAVA多執行緒技術的電子版書籍Java執行緒
- 未來世界商城系統開發技術方案
- [直播預告]如何寫好技術文章?開源技術寫作入門與實踐
- Elastic宣戰亞馬遜,開源從來不自由AST亞馬遜
- 使用 Markdown 寫技術部落格,我踩過的 6個坑
- 來了!閒魚技術團隊開源Flutter應用框架Fish ReduxFlutter框架Redux
- 來了!閒魚技術團隊開源 Flutter 應用框架 Fish ReduxFlutter框架Redux
- 11月書訊:重磅技術書來襲!