用 kitabu 制作高顏值的電子書

終于搞定了使用 MathJax 渲染 LaTex 數(shù)學公式的問題退子,分享給大家岖妄。

辛辛苦苦用 markdown 寫就了一系列文章,怎么樣導出制作成一本高顏值的電子書呢寂祥?本文介紹一種在 Mac 下使用 kitabu + princexml 導出高顏值電子書的方法荐虐。

本文還介紹了字體定制,排版定制丸凭,代碼高亮福扬,使用 MathJax 渲染 LaTex 數(shù)學公式等方法。

安裝軟件

首先安裝 kitabu

gem install kitabu

這是個開源的 Ruby 包惜犀,主要提供電子書模板和制作過程自動化的功能铛碑。如果你沒使用過 ruby ,可能在使用 gem install kitabu 時報錯 Errno::ECONNRESET: Connection reset by peer虽界,可以試試切換 taobao 的 RubyGems 鏡像

$ gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/
$ gem sources -l
*** CURRENT SOURCES ***

https://ruby.taobao.org

接著安裝 princexml汽烦,可以從官網(wǎng) princexml.com 下載免費的安裝包。princexml 會完成從 html 轉(zhuǎn)為為 pdf 功能莉御。安裝完這兩個工具后撇吞,可以用 kitabu check 命令檢查一下是否安裝成功:

bogon:~ kamidox$ kitabu check

Prince XML: Converts HTML files into PDF files.
Installed.

KindleGen: Converts ePub e-books into .mobi files.
Installed.

html2text: Converts HTML documents into plain text.
Not installed.

我的環(huán)境里多安裝了 KindleGen 俗冻,如果你需要制作 .mobi 格式的電子書,可以使用 brew install kindlegen 來安裝牍颈。不過這一步不是必須的迄薄。

制作電子書

接著在工作目錄執(zhí)行 kitabu new mybook 即可創(chuàng)建 kitabu 電子書的模板:

mybook/
├── Gemfile
├── Guardfile
├── config
│   ├── helper.rb
│   └── kitabu.yml
├── fonts
├── images
│   ├── kitabu-icon.png
│   ├── kitabu-icon.svg
│   ├── kitabu-word.png
│   ├── kitabu-word.svg
│   ├── kitabu.png
│   └── kitabu.svg
├── output
├── templates
│   ├── epub
│   │   ├── cover.erb
│   │   ├── cover.png
│   │   └── page.erb
│   ├── html
│   │   └── layout.erb
│   └── styles
│       ├── epub.scss
│       ├── files
│       │   └── _normalize.scss
│       ├── html.scss
│       ├── pdf.scss
│       └── print.scss
└── text
    ├── 01_Getting_Started.md
    ├── 02_Creating_Chapters.md
    ├── 03_Syntax_Highlighting.erb
    ├── 04_Dynamic_Content.erb
    └── 05_Exporting_Files.md

然后在 mybook 目錄運行 kitabu export 即可在 output 目錄下生成電子書了。默認情況下煮岁,會生成 kitabu 使用說明文檔噪奄。

基礎配置

要制作自己的電子書,需要做些簡單的配置人乓。先把 kitabu 模板的 text 目錄清空,然后把自己的 markdown 文件拷貝到這個目錄下都毒,需要注意的是 kitabu 是使用文件名排序生成電子書色罚,并且會自動把 2-6 級標題自動生成書籍的目錄。如果你的 markdown 文件是以 1 級標題開始账劲,則需要把所有的標題降一個等級戳护。

接著修改 config/kitabu.yml 把書箱的作者,版權聲明瀑焦,出版商的信息補充完整腌且。然后修改 templates 目錄下的 css 文件,讓生成的電子書更漂亮榛瓮。

我自己主要修改兩處铺董。一是修改 templates/styles/pdf.scss,在所有的 font-family 字段里添加 PingFang SC禀晓,以便使用 Mac 的蘋方字體來顯示中文精续,默認字體中文效果比較差。比如:

body {
  font-family: Caslon, serif;
  font-size: 14px;
  line-height: 1.5;
}

改成

body {
  font-family: PingFang SC, Caslon, serif;
  font-size: 14px;
  line-height: 1.5;
}

二是修改圖片的寬度粹懒,以便電子書里的圖片能自動縮放重付,避免大圖片顯示不全的問題。這個主要是修改 templates/styles/files/_normalize.scss

img {
  border: 0;
}

改成:

img {
  border: 0;
  width: 100%;
}

這樣生成的電子書顏值就很高了凫乖。如果你是前端工程師确垫,折騰一下 css 可以做出更精美的電子書。

在電子書中插入圖片

另外帽芽,我自己寫作過程中删掀,直接把圖片放在本地目錄,然后使用相對路徑在 markdown 里生成圖片嚣镜,比如:

![](images/ch02.01.png)

否則就得找圖床爬迟,生成電子書時還會從圖床下載圖片。所以直接放在本地菊匿,用相對路徑引用是個相對經(jīng)濟的方案付呕。默認情況下计福,kitabu 是不認本地相對路徑的圖片的。這時需要 hack 一下 kitabu徽职,因為默認情況下象颖,kitabu 啟用了安全鏈接的功能,我們可以把這個功能關閉掉姆钉。

首先找到 kitabu 包的安裝目錄说订,可以使用 gem help install 命令,然后在輸出中找 --install-dir 字段潮瓶,比如我的機器上有這樣的輸出:

$ gem help install
  ... ...
  Defaults:
    --both --version '>= 0' --document --no-force
    --install-dir /usr/local/lib/ruby/gems/2.3.0 --lock

然后進入 /usr/local/lib/ruby/gems/2.3.0/gems/kitabu-2.0.4/ 目錄陶冷,打開 lib/kitabu/markdown.rb 文件,把

renderer = Renderer.new(hard_wrap: true, safe_links_only: true)

修改為

renderer = Renderer.new(hard_wrap: true, safe_links_only: false)

支持 LaTex 公式

MathJax 是一個 JavaScript 庫毯辅,用來渲染 LaTex 格式的數(shù)學公式埂伦。如果你想了解怎么樣在 Markdown 里書寫數(shù)學公式,可以參考我之前的一篇博客 《使用 Markdown + MathJax 在博客里插入數(shù)學公式》思恐。

默認情況下沾谜,kitabu 無法在渲染使用 MathJax 在 markdown 里書寫的數(shù)學公式。其原因是 princexml 不支持 Window 等對象胀莹,所以 MathJax 的 JavaScript 腳本無法執(zhí)行基跑。

解決這個問題的思路是,使用 Phantomjs 來渲染包含 LaTex 數(shù)學公式的 html 頁面描焰,由于 Phantomjs 可以正確地執(zhí)行 MathJax 的 JavaScript 腳本媳否,所以能正確地渲染出數(shù)學公式。接著再使用 princexml 來生成 PDF 格式的電子書就可以正確地渲染出數(shù)學公式了栈顷。思路很簡單逆日,操作起來還是有點麻煩。

首先萄凤,安裝 Phantomjs 工具室抽,可以在官網(wǎng)下載安裝適合你的操作系統(tǒng)的版本。在 macOS 上靡努,下載下來的是一個綠色安裝包坪圾,我把它放在硬盤的合適位置后,把 /bin/phantomjs 加入到 PATH 變量里惑朦,以便在命令行中能直接執(zhí)行這個命令兽泄。

$ tree ~/tools/phantomjs/
~/tools/phantomjs/
├── ChangeLog
├── LICENSE.BSD
├── README.md
├── bin
│   └── phantomjs
├── examples

接著,安裝 MathJax 漾月,方法是把 MathJax 下載到電子書的目錄病梢。比如,你使用 kitabu new mybook 時,則把 MathJax 下載后解壓到 mybook 目錄下蜓陌,我使用的是 MathJax 2.7.0 版本觅彰。

接著,再把 MathJaxRender.jsMathJaxConfig.js 也下載到 mybook 目錄下钮热。這兩個分別是 phantomjs 渲染腳本和 MathJax 配置文件填抬。需要特別注意,MathJaxConfig.js 不要修改文件名隧期,如果修改了文件名飒责,很多引用的地方也要跟著同步修改。

接著仆潮,還要 hack 一下 kitabu宏蛉,其目的是配置 Redcarpet (這是把 markdown 轉(zhuǎn)成 html 的 ruby 庫),關閉智能腳本渲染性置,即把 superscript 改為 false 檐晕,否則會和 MathJax 沖突。

方法是進入 /usr/local/lib/ruby/gems/2.3.0/gems/kitabu-2.0.4/ 目錄蚌讼,打開 lib/kitabu/markdown.rb 文件,把

    self.processor = Redcarpet::Markdown.new(renderer, {
      tables: true,
      footnotes: true,
      space_after_headers: true,
      superscript: true,
      highlight: true,
      strikethrough: true,
      autolink: true,
      fenced_code_blocks: true,
      no_intra_emphasis: true
    })

修改為

    self.processor = Redcarpet::Markdown.new(renderer, {
      tables: true,
      footnotes: true,
      space_after_headers: true,
      superscript: false,
      highlight: true,
      strikethrough: true,
      autolink: true,
      fenced_code_blocks: true,
      no_intra_emphasis: true
    })

最后个榕,修改 mybook/templates/html/layout.erb 文件篡石,以便在模板里引入 MathJax 及其配置文件,方法是在其 head 標簽下插入如下內(nèi)容西采,

    <!-- add LaTeX support by MathJax -->
    <script type="text/javascript" src="../MathJax/MathJax.js"></script>
    <script type="text/javascript" src="../MathJaxConfig.js"></script>

即凰萨,把

  <head>
    <title><%= title %></title>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <link name="stylesheet" rel="stylesheet" type="text/css" href="styles/html.css" />
    <meta name="author" content="<%= authors.join(', ') %>" />
    <meta name="subject" content="<%= subject %>" />
    <meta name="keywords" content="<%= keywords %>" />
    <meta name="date" content="<%= published_at %>" />

    <%= highlight_theme %>
  </head>

改成

  <head>
    <title><%= title %></title>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <link name="stylesheet" rel="stylesheet" type="text/css" href="styles/html.css" />
    <meta name="author" content="<%= authors.join(', ') %>" />
    <meta name="subject" content="<%= subject %>" />
    <meta name="keywords" content="<%= keywords %>" />
    <meta name="date" content="<%= published_at %>" />
    <!-- add LaTeX support by MathJax -->
    <script type="text/javascript" src="../MathJax/MathJax.js"></script>
    <script type="text/javascript" src="../MathJaxConfig.js"></script>

    <%= highlight_theme %>
  </head>

完成這些步驟后,我的電子書目錄看起來像這樣:

mybook/
├── Gemfile
├── Guardfile
├── MathJax
│   └── MathJax.js
├── MathJaxConfig.js
├── MathJaxRender.js
├── build-ebook.sh
├── config
├── fonts
├── images
├── output
├── templates
└── text

build-ebook.sh 的內(nèi)容是這樣的:

kitabu export --only=pdf
cd output
phantomjs ../MathJaxRender.js kitabu-ebook.pdf.html | prince --javascript -o ml-scikit-learn.pdf -
cd ..

其中調(diào)用 phantomjs 的那行命令就是用來生成帶數(shù)學公式的電子書的械馆。不要忘記了這個命令最后還有一個 - 字符胖眷,意思是從 stdin 里讀取輸入來轉(zhuǎn)換為 PDF。

參考文檔: Using MathJax with PrinceXML

結語

差不多就這些霹崎。奮力寫作吧珊搀,只為自己成為自己的出版商。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尾菇,一起剝皮案震驚了整個濱河市境析,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌派诬,老刑警劉巖劳淆,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異默赂,居然都是意外死亡沛鸵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門缆八,熙熙樓的掌柜王于貴愁眉苦臉地迎上來曲掰,“玉大人疾捍,你說我怎么就攤上這事◎阽停” “怎么了拾氓?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長底哥。 經(jīng)常有香客問我咙鞍,道長,這世上最難降的妖魔是什么趾徽? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任续滋,我火速辦了婚禮,結果婚禮上孵奶,老公的妹妹穿的比我還像新娘疲酌。我一直安慰自己,他們只是感情好了袁,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布朗恳。 她就那樣靜靜地躺著,像睡著了一般载绿。 火紅的嫁衣襯著肌膚如雪粥诫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天崭庸,我揣著相機與錄音怀浆,去河邊找鬼。 笑死怕享,一個胖子當著我的面吹牛执赡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播函筋,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼沙合,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了跌帐?” 一聲冷哼從身側響起灌诅,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎含末,沒想到半個月后猜拾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡佣盒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年挎袜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡盯仪,死狀恐怖紊搪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情全景,我是刑警寧澤耀石,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站爸黄,受9級特大地震影響滞伟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜炕贵,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一梆奈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧称开,春花似錦亩钟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蕴侣,卻和暖如春总处,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背睛蛛。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胧谈,地道東北人忆肾。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像菱肖,于是被迫代替她去往敵國和親客冈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容