update-2017-07-03:bookdownplus包里附带了诗集模板,可以用bookdown制作下图这样的诗集:
今天,我用R的bookdown做出了第一本电子书:<爸爸三定律>。内容是从我博客上选的育儿相关帖。
益辉在bookdown的官方文档里讲到:
This book is primarily about the R package bookdown, so you need to at least install R and the bookdown package. However, your book does not have to be related to the R language at all. It can use other computing languages (C++, SQL, Python, and so on; see Appendix B), and it can even be totally irrelevant to computing (e.g., you can write a novel, or a collection of poems)
“你可以用bookdown来写小说和诗集。”这属于高射炮打苍蝇,杀鸡用牛刀。我大致看了一下bookdown.org上发布的书籍清单,好像目前仍然局限在R语言、数据科学领域,——当然,也许是我疏忽了没看见。如果你发现有诗集藏着里边,请告诉我,——那么,我这本自制的bookdown育儿书,也许是开了个先河,探索一下将来用bookdown写小说和诗集的体验。
码字的体验
如果是写跟R代码无关的文本,那么目前的 RStudio+bookdown 组合不是最佳的选择。
写本帖时我放弃了RStudio,而是选择了stackedit。markdown的编辑器早年我用过几款,最后锁定在stackedit一直没有换。stackedit是免安装的,打开浏览器就能用,可以用快捷键输入格式标记,支持扩展语法,可以输入脚注、目录、$\LaTeX$公式,实时显示字数和拼写检查,界面美观优雅,左右并排实时预览的效果很舒服,还能直接发布到GitHub、Blogger、Wordpress上,付费版还有更多功能。可惜,stackedit不能调用knitr生成可重复研究报告,也不能交叉引用和处理参考文献,遇见这个问题的话还是得投奔bookdown。
而RStudio+bookdown,由于RStudio的界面本质上是个代码编辑器,如果用作markdown文本编辑器的话,在我看来有以下不足:
代码的显示需要用等宽字体;RStudio在字体选项上,需要兼顾代码和其他文本同时美观呈现,例如允许对代码部分和其他部分选择各自的字体和大小,甚至允许对中文和英文字符选择不同的字体;
编写代码需要很多快捷键,这项需求RStudio 满足得很好,但这恰恰导致没剩下几个快捷键给markdown。据说需要装插件才能重新设置;
编写代码时需要知道光标位置的行列数,这在RStudio的界面能够实时显示,但是在md或Rmd文本编辑状态下,行列数没必要显示,更需要的是显示当前字数,以及实时提示拼写错误,这两点目前在RStudio尚未实现(拼写检查需要按F7才逐个检查)。
说到字数统计,虽然Word和stackedit可以在编辑界面右下角实时显示总字数,但我觉得还不够。我希望字数能像RStudio里的代码每行左栏都显示行号一样,最好每隔5行10行就有个里程显示。甚至可以让用户任意指定文档里的几个起始点,从起始点来计算字数。
回头一看,这些问题其实跟bookdown无关,全怪RStudio界面对markdown文本照顾不周。但是,如果RStudio往markdown编辑器方向走的话,我担心RStudio是不是就走偏了?R处理数据时产生了写报告写书的需求,于是从RStudio诞生了rmarkdown、knitr和bookdown,这就好比为微信在社交过程中产生了支付需求而诞生了微信支付,但如果只是为了支付,目前还是支付宝更专业更好用一些。
不过,微信支付是有可能超越支付宝的,而支付宝永远赶不上微信的社交。所以,我对bookdown的未来发展很看好。
编译的体验
我的博客帖子原本就是md格式,所以直接合并就行,只需统一标题的级别,这实在是方便极了。而且,bookdown一下就把word、pdf、html三种格式的文档打包送给我,简直太豪华。
由于这算是一本散文集,跟R语言的书籍排版逻辑上是不同的,用不着标题分级编号,所以我给所有标题统统加上{.unnumbered}。这就导致生成的pdf里目录是空的。这个问题我还不知道怎么解决(update:现在知道了,修改_output-yml文件里的 toc_unnumbered: yes
,但又导致每页页眉都是“目录”两个字,待解决),因为我对css、html、tex都只知道个皮毛。
此外,为标题设置级别也是个难题。如果所有文章标题都设置为一级,那么导致每篇文章的第一页都会默认出现在奇数页,pdf文件里就有很多空白页;如果所有标题都设置为二级,倒是没有空白页了,但每篇文章末尾就紧跟着下一篇的标题,不分页,而html文件也会很长。好在我研究了一下,才闹明白这都是因为益辉提供的tex模板就是这么设置的。解决办法是:
在index.Rmd文件头的yaml部分添加:classoption: openany
,全部文章标题都设置为1级标题,这样就取消文章标题非要出现在奇数页的设置了。
顺便查了一下两章之间不分页的解决办法:使用LaTeX的etoolbox扩展包,即在益辉提供的bookdown中文模板的preamble.tex里添加:
\usepackage{etoolbox}<br />
\makeatletter<br />
\patchcmd{\chapter}{\if@openright\cleardoublepage\else\clearpage\fi}{}{}{}<br />
\makeatother
bookdown可能需要外配一些tex模板才能满足各种需求:论文模板,海报模板,简历模板,信件模板,诗歌模板,散文模板,乐谱模板……
本地编译 pdf 时出现了两个问题:一是超级链接的插图,可能是链接太长或图片的文件名太长而导致的,我就把插图基本全部删掉或者改名;二是 Shaded 环境出错,说是未定义,我就把中文示例文档 preamble.tex 的 shaded 删掉。反正,LaTeX的心,海底针,不懂的时候要么回答“是”,要么就删。
我怎么又开始折腾LaTeX了,快打住……
发布的体验
在bookdown.org用google账号登录,准备发布。这时,出现了yaml.load()函数错误(但在本地编译成html时并没有出错),是因为index.Rmd文件头的yaml里标题和描述都是中文,我就改成了英文。奇怪的是yaml里作者名字可以是中文。
现在终于可以发布了。运行命令: bookdown::publish_book(render = "local")
出错,说我有多个账号,让我选择一个。大概是我同时登录了多个google账号吧,于是就用publish_book()函数里的account参数来指定了一个。终于发布啦!而且,从发布的电子书可以直接下载pdf文档,而这个文档里是有目录的,只是标题是有编号的(我不需要编号呀——update:我肯定是某次编译后留了这么个文件在_book文件夹里。稳妥起见,把_book文件夹删掉后编译为妥)。
发布之后,觉得总体上还算满意,但由于注册时我用了个马甲的名字,现在想改成真实名字,却找来找去找不到修改的地方……
总结
就像bookdown截取各个工具的精华一样,我也想把bookdown、stackedit连同vim协同使用。这其实好办,我用googledrive将本地文件与云端同步,同一个文本文件,想用哪个打开就用哪个打开便是了。
我对css、html、tex、pandoc都是只知道个皮毛,遇到的很多问题可能是我自己的无知导致的。但是如果bookdown真的想让诗人和作家拿来写诗集和小说的话,恐怕还真得把每个用户当成我这样无知的人来考虑才行。
总地来讲,bookdown让我能绕开LaTeX而得到LaTeX效果的pdf文档,这对用过LaTeX的我来说,是让人热泪盈眶的。以后我会把育儿话题的帖子在我的博客和bookdown同步更新,继续深度体验。