如何自出版一本書:定制 bookdown


本文翻譯自 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 的話,請從下面的內容開始:

亞馬遜 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=56options("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=6fig.height=4.5 以 RStudio 中相同的方式定義圖片大小:如果你減小它,那么數字將變得更大(譯注:可能是筆誤?)

圖片的大小取決於你所畫的圖。

還有其他方式定義圖片大小,例如 out.widthout.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 上發帖子。享受你所做的事,並讓其成長。

感謝閱讀!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM