本文翻譯自 Pablo Casas 的博客 How to self publish a book: customizing Bookdown,感謝作者的授權。
原始鏈接:https://blog.datascienceheroes.com/how-to-self-publish-a-book-customizing-bookdown/
This post is translated form Pablo Casas's post — How to self publish a book: customizing Bookdown. Thanks to the author for authorization.
original link: https://blog.datascienceheroes.com/how-to-self-publish-a-book-customizing-bookdown/
如何自出版一本書:定制 bookdown
本文和前一篇文章——《如何自出版一本書:一份資源清單》相關聯。本文圍繞 bookdown 展開,以及我在創作《Data Science Live Book》的過程中發現的非標准定制化技巧。
Github 上的本書:https://github.com/pablo14/data-science-live-book
如果你沒有打算寫一本書、一份手冊或任何其他類型的文件,這似乎不太重要。但是,如果你開始寫作,谷歌可能會帶你到這里來尋找答案。
bookdown 的第一步

這不是一篇介紹性的文章。但是,要了解 bookdown 的話,請從下面的內容開始:
- bookdown 官網教材(由 bookdown 創建);
- What is R markdown?(RStudio);
- A minimum reproducible example,我建議你 clone 下來並運行(這是輸出結果)
亞馬遜 Kindle 格式
亞馬遜圖書的擴展名是 .mobi,而 bookdown 提供的格式是 .epub,你可以從下面的鏈接下載轉換軟件:
https://www.amazon.com/gp/feature.html?ie=UTF8&docId=1000765211
如果 epub 版本的書和程序 kindlegen 處於同一路徑,轉換格式只需輸入下面的命令:./kindlegen my-amazing-book.epub
這將產生新的文件:my-amazing-book.mobi.
我知道 Calibre 也可以將 epub 轉換到 mobi。但保險起見,我建議你用亞馬遜的 kindlegen。Calibre 看電子書很有用,它是免費的。
創建書籍
首先,獲得我用來創建 PDF 和 html 的腳本,在這里。
我用 RStudio 按鈕(在 bookdown::epub_book 選項)創建 epub。

_bookdown.yml
在此文件中,你可以定義要處理的文件,以及顯示頁面的順序。
默認是運行所有頁面。但是,如果這本書很大,那么它會運行很多不必要的代碼。如你所見,我在調試時使用了兩條注釋。

請注意 new_session: yes:要看最新運行的話,這很重要。
注意行寬

雖然我們通常不會考慮行寬,即一行中有多少個字符,但如果有個字符超出你定義的頁面格式的邊距,亞馬遜將不會發布該書。
用 formatR(謝益輝開發的另一個包)來解救你!為什么是用它?因為它能自動格式化 R 代碼。
是的,它總是會重新安排代碼以“適配”行寬要求(備注 1)。Hurray!
在線應用:https://yihui.shinyapps.io/formatR/
備注 1:然而,在某些條件下,它並不是按照我們想要的方式工作(但能預見得到)。它使用了 R base 包中的 deparse 函數。
由於缺少對技術細節的了解,我不得不使用 dirty-while(1) 的 hack 方式修改 formatR,因為 deparse 函數並不能按照我想要的方式處理行寬。
更多技術信息:https://github.com/yihui/formatR/pull/71
我 fork 了 formatR 以實現這個功能。我不保證它在所有情形下都能工作:https://github.com/pablo14/formatR
我花了 30 個小時來修改它,我希望它能幫到你,哪怕 1 分鍾。
重點:檢查下一節中的參數 width.cutoff=56 和 options("width"=56)。
寫在每個 .Rmd 文件的開頭
這是我寫下的:
```{r include = FALSE}
if(!knitr:::is_html_output())
{
options("width"=56)
knitr::opts_chunk$set(
tidy.opts=list(width.cutoff=56, indent = 2),
tidy = TRUE)
knitr::opts_chunk$set(fig.pos = 'H')
}
```
這將在輸出 PDF 的情況下運行。這為文件中的所有塊設置了全局選項,但我們可以覆蓋每個塊的行為。
現在,我不記得對於 width.cutoff=56 來說 options("width"=56) 是否是冗余的,但根據書本的大小,我的最大行寬是 56 個字符。
indent = 2:縮進兩個空格。
tidy=TRUE 讓 formatR 能夠產生漂亮且標准的代碼布局。記住,我使用的是自己 fork 的 formatR。
當寬度修正不起作用的時候,你需要在 Rmd(不是 md!)中手動修改它。這時,你需要為所有手動修正的塊設置 tidy=FALSE:
```{r, tidy=FALSE}
print("bla bla bla * 1000")
```
例如,本書的一個 .Rmd 文件:

可以看到 tidy=FALSE,並且每行最寬 56 個字符。亞馬遜和我都可以保證這一點。
這是這一段的 web 在線版:https://livebook.datascienceheroes.com/exploratory-data-analysis.html#selecting_best_vars_mic
這是 PDF 版:

bookdown 的功能真是太贊了!
index.Rmd 中的一些參數
links-as-notes: true
如果你想擁有圖書的可打印版本,請使用此選項。它會將所有超鏈接轉換為腳注(因為你無法單擊紙張)。
一個很好的功能:當我們引用書中的章節時,頁碼不會出現在腳注中或參考位置旁邊。有關示例,請參見數據准備章節(54 頁)中的更多內容。
linestretch: 1.15
如果 PDF 中句子間的行距非常小,請使用此參數。它會為你的段落提供一些空間。😉
圖片

圖片位置
knitr::opts_chunk$set(fig.pos = 'H'),記住,這句放在 Rmd 文件的開頭。
參數 fig.pos='H'(加上另一個)強制所有圖片出現在我們畫出它們的地方,否則它們將出現在頁面的底部。
另一個是 out.extra=''(兩個單引號),你必須為每個塊定義。
接着前面的例子:
```{r importance-variable-ranking, fig.width=6, fig.height=4.5,
tidy=FALSE, fig.cap="Correlation using information theory",
out.extra=''}
```
更多關於圖片位置的信息:https://stackoverflow.com/questions/42486617/knitr-ignoring-fig-pos
當你添加圖片時,像這樣做是不必要的:
knitr::include_graphics(
"exploratory_data_analysis/mic_mutual_info.png")
圖片說明與索引
fig.cap:為圖片添加說明,以及一個自增長的數字(例如 1.18):

圖片大小
從上一個例子:fig.width=6 和 fig.height=4.5 以 RStudio 中相同的方式定義圖片大小:如果你減小它,那么數字將變得更大(譯注:可能是筆誤?)
圖片的大小取決於你所畫的圖。
還有其他方式定義圖片大小,例如 out.width 和 out.height,按照屏幕的百分比或像素調整圖片大小。請參考官方文檔:https://bookdown.org/yihui/bookdown/figures.html
長 url 的換行
當引用參考文獻的時候,一條長 url 會超出邊界,要用下面的方式修正:
在 template.tex 添加:\Urlmuskip=0mu plus 1mu\relax
對於目錄中的 url,我不知道怎么換行。我笨拙地 hack 了一下:使用谷歌短 url 服務,例如 https://goo.gl/2TrDgN(現在已經失效了),所以試試選擇其他服務,例如 tinyurl。
書本大小
我開始的時候用 A4 格式的紙,因為這是默認的。當書快完成的時候,我才發現它和一只 7 歲大的喵喵一樣寬:

接受了谷歌的神諭之后,我得知科技類圖書的“標准大小”是 6 x 9 英寸,或 15.24 x 22.86 cm。
再一次,這可以在 tempated.tex 中定義:
\usepackage[paperwidth=6in, paperheight=9in]{geometry}
這樣一來,你必須重新檢查所有行寬。
結語
我真的希望我能鼓勵你在書中寫下你自己的故事。對於你計划發布的某些資料,如果你想得到其他意見,請與我們聯系。
不要害羞,從只有幾個頁面的網站開始,或者在 Rpubs 還有 Github Pages 上發帖子。享受你所做的事,並讓其成長。

感謝閱讀!
