如何自出版一本书:定制 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 的话,请从下面的内容开始:
- 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 中句子间的行距非常小,请使用此参数。它会为你的段落提供一些空间。
如何自出版一本书:定制 bookdown的更多相关文章
- Git Pro Book
目录 2nd Edition (2014) Switch to 1st Edition Download Ebook The entire Pro Git book, written by Scott ...
- self-publishing ebook guide all in one
self-publishing ebook guide all in one 自助出版电子书指南 第1课:让我们自己出版一本书! 与您会想到的很多人相反,自我出版并不容易. 您不仅必须写书,而且还必须 ...
- 大型网站系统与Java中间件实践
大型网站系统与Java中间件实践(贯通分布式高并发高数据高访问量网站架构与实现之权威著作,九大一线互联网公司CTO联合推荐) 曾宪杰 著 ISBN 978-7-121-22761-5 2014年4 ...
- 《Node.js实战(双色)》作者之一——吴中骅访谈录
- Git教程(7)用合并还是变基?
合并或变基前的样子:分支experiment与master两个分支都产生了提交. 图1. 未合并或变基前的样子 合并 原理: 找到两个分支的最末提交和最近的共同祖先,在执行git merge时所处的分 ...
- 以写作为例说下IT人如何培养挣钱DNA
洛克菲勒说:“如果把我剥得一文不名丢在沙漠的中央,只要一行驼队经过——我就可以重建整个王朝.”这话反过来可以这样说,方法不对路,也不肯干的人,哪怕给一笔财富(比如人生小目标一个亿),最好的结果是跑赢C ...
- 13.Git分支-变基(rebase)、rebase VS merge
1.变基的基本操作 在Git中整合来自不同分支的修改主要有两种方法:merge和rebase. 看下面的例子: 开发任务分叉到了两个不同的分支,并且都有了新的提交. 这时候我们可以使用 git mer ...
- git rebase 的使用
rebase 在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase. 在本节中我们将学习什么是“rebase”,怎样使用“rebase”,并将展示该操作的惊艳之处,以及指 ...
- Git rebase的使用
rebase 在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase. 在本节中我们将学习什么是“rebase”,怎样使用“rebase”,并将展示该操作的惊艳之处,以及指 ...
随机推荐
- 【Alpha 冲刺】 6/12
今日任务总结 人员 今日原定任务 完成情况 遇到问题 贡献值 胡武成 建立数据库 未完成 表结构文档已设计好,服务器mysql刚配置完成,但是,SpringMVC框架还没有熟络,不清楚如何使用该框架去 ...
- jquery attr处理checkbox / select 等表单元素时只能使用一次的坑
先上html结构 <body> <form action=""> <input type="checkbox" id=" ...
- 详解--从地址栏输入url到页面展现中间都发生了什么?
这是一个综合性很强的问题,个人理解包含以下七个基本点: 1.在浏览器地址栏输入url并按下回车. 2.浏览器检查当前url是否存在缓存和缓存是否过期. 3.域名解析(DNS解析url对应的ip). 4 ...
- python第四十五课——继承性之多重继承
演示多重继承的结构和使用 子类:Dog 直接父类:Animal 间接父类:Creature #生物类 class Creature: def __init__(self,age): print('我是 ...
- [POI2007]MEG-Megalopolis
传送门:嘟嘟嘟 第一反应是树链剖分,但是太长懒得写,然后就想出了一个很不错的做法. 想一下,如果我们改一条边,那么影响的只有他的子树,只要先搞一个dfs序,为什么搞出这个呢?因为有一个性质:一个节点的 ...
- Spark项目之电商用户行为分析大数据平台之(三)大数据集群的搭建
Zookeeper集群搭建 http://www.cnblogs.com/qingyunzong/p/8619184.html Hadoop集群搭建 http://www.cnblogs.com/qi ...
- JavaScript无阻塞加载具体方式
将脚本放在底部.\还是放在head中,用以保证在js加载前,能加载出正常显示的页面.\<script>标签放在\前 成组脚本:由于每个\<script>标签下载时阻塞页面解析过 ...
- Linux之Vim学习
Linux之Vim学习 一般模式 光标移动 按键 作用 j或down方向键 向下移动一个字符 k或up方向键 向上移动一个字符 h或left方向键 向左移动一个字符 l或right方向键 向右移动一个 ...
- nmap数据流
扫描者:1.1.1.1被扫描者:2.2.2.2 0x00 介绍 在日常工作对目标信息收集时,我们经常用到nmap这款网络探测工具和安全/端口扫描器,虽然我们关注的是结果(如目标开启了哪些危险端口,什么 ...
- android camera 摄像头预览画面变形
问题:最近在处理一下camera的问题,发现在竖屏时预览图像会变形,而横屏时正常.但有的手机则是横竖屏都会变形. 结果:解决了预览变形的问题,同时支持前后摄像头,预览无变形,拍照生成的jpg照片方向正 ...