如果用bookdown来写诗集

update-2017-07-03:bookdownplus包里附带了诗集模板,可以用bookdown制作下图这样的诗集:

enter image description here


今天,我用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}
\makeatletter
\patchcmd{\chapter}{\if@openright\cleardoublepage\else\clearpage\fi}{}{}{}
\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同步更新,继续深度体验。

如果用bookdown来写诗集》上有6条评论

    1. 大鹏 文章作者

      谢谢推荐。我的体会是,R的markdown和bookdown应该算是R的外围产品,锦上添花的增值服务,不是专门的文本编辑器和排版工具。用来处理抛开R代码的纯文本,可能不如别的专业软件做得好。如果不涉及R代码,那么在界面和快捷键上,我更喜欢用Stackedit。

      我看了一下markeditor,好像客服不够好?那前景就敌不过bookdown了,因为这儿有益辉呀……

      回复
      1. Yihui

        谢谢宣传。我自己生产的狗粮我通常会大口猛吃,所以对书籍写作来说常见的痛点我应该还是比较清楚的。做 Markdown 编辑器的人可能成百上千,因为 Markdwon 语言简单嘛;说支持 HTML/PDF/Word 等输出容易,因为有 Pandoc 嘛,但里面究竟有多少坑需要填,你要是不亲身写一两本书还真很难了解,做出精美的 HTML/PDF/Word 还是有点挑战性的。

        其实我也很想用大白话写一本非纯技术类的书(关于码农与用户的永久心理战),不过目前还有优先级高得多的任务要完成:写 blogdown 的书。

        回复
        1. 大鹏 文章作者

          频发大招呀!太好了,我正在玩blogdown,期待大作早日面世。

          同性交友网站不是号称全球协作嘛,就没有一两个小弟打个下手帮你填填坑的?看看别的包,比如fortunes,那作者列表足有半页长,再看看你的包们,作者孤零零一个xie。太累了不好,想想诸葛亮……我们这些粉丝都盼你仙福永寿,寿与天齐呢,期待看你多出一些好作品。

    1. 大鹏 文章作者

      markdown是布景,LaTeX是后台,bookdown是总导演,RStudio是舞台。这些都不重要,重要的是节目的内容。

      回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax