第14章 论文书稿写作

    用嘴说出的话随风而散,用笔写出的话永不磨灭。

— 莫言

    自古皆死,不朽者文。
    

— 宋之问

如果你是个科研工作者,那么多半每天都要跟期刊论文、学位论文打交道;如果你不是科研工作者,有时也需要处理一些文字,例如写日记、写信、做个日历、画个思维导图等;喜欢文艺的朋友可能会写个诗集、小说、散文集,记录个乐谱等等。R 语言提供的 bookdown 和 bookdownplus 等扩展包,为文字工作者和爱好者提供了一个友好的平台,可以将这些各类文字轻松地转化成文档,格式丰富,样式美观。

14.1 魅力不可挡

bookdown (Xie 2016)是 R 语言的一个扩展包,一个用来写书、写文章的平台。bookdown 初版发布于2016年,原本为撰写R语言类书籍而生,非常适合撰写学位论文、学术期刊论文,也可以用来写文学类作品。 使用 bookdown,可以方便地在文章里插入目录、图表、交叉引用、脚注、索引,以及公式、参考文献、R代码,是撰写可重复性报告的不二之选。它可以同时生成漂亮的pdf、Word和网页文件,并免费发布到官方网站上,得到的文档比Word更美观,比传统的\(\LaTeX\)更易用。bookdown 发音为“不可挡”,包如其名,bookdown 的魅力的确不可阻挡。有了它,我再也不愿意用 Word 和\(\LaTeX\) 了。

bookdown 并非完美无瑕。对于 R 初学者来说,如果身边没有人指导,bookdown 上手并不是很容易。酒香巷深,虽然官方手册38提供了完整而详细的资料可以参考,但使用者可能仍然需要花精力应付 \(\LaTeX\),YAML,Pandoc,而很多初学者可能从来没听说过这些,站在 bookdown 的门口往里张望了一下,说不定就被吓跑了,从而错过了门里的精彩世界。所以,我们推荐 bookdownplus 扩展包 (Zhao 2017b),可以让新手对 bookdown 快速上手。bookdownplus 已在 CRAN 正式发布。

bookdownplus 生成的英文、中文学术论文、学位论文、信件、日历、诗集文档.

图 14.1: bookdownplus 生成的英文、中文学术论文、学位论文、信件、日历、诗集文档.

bookdownplus 是对 bookdown 的增强和简化, 是进入 bookdown 世界的捷径。它提供了很多有用的模板,可以很方便地在 bookdown 平台写期刊论文、学位论文、学术海报、化学分子式、信件、日记、日历、诗集、吉他谱等各种常用文档和书籍(图14.1)。这是功能上的增强。bookdownplus 使用时只需指定一个模板,给定作者和书名,就可以一键生成模板文件,用户在模板文件里照猫画虎写自己的文字就可以了,不必再花力气上网找模板、设置 YAML 和 \(\LaTeX\)。这是操作上的简化。正是这“一加一减”,大大降低了 bookdown 的使用门槛,让每个初学者都可以方便的试用。

bookdownplus 各个模板的使用方法详见官方文档 R bookdownplus Textbook39 一书。这本电子书本身就是用 bookdownplus 生成的,尤其是它的 pdf 版本很美观。此书的源码开放,可以作为使用 bookdown 写书的示例(图14.2)。

R bookdownplus Textbook 示例书页.

图 14.2: R bookdownplus Textbook 示例书页.

有了bookdownplus,从此,bookdown 这坛好酒就不必去深巷苦寻,它就放在你手边。

14.2 准备工作

bookdown 环境的准备工作略显繁琐,这是因为它调用了目前最优秀的几个现成软件。首先,需要下载和安装免费软件 \(\LaTeX\)Pandoc。有的安装文件比较庞大,下载和安装时需要一点耐心,但是绝对值得,磨刀不误砍柴工嘛。

其次,bookdown 的背景平台是 R 语言,用户界面首选RStudio,R 和 RStudio的下载安装方法见第1.1节。

运行 RStudio,在左上面板的代码窗口输入并运行以下代码,来安装和调用 bookdownplus 扩展包(bookdown 扩展包会随带自动安装):

install.packages("bookdownplus")
require(bookdownplus)

好了,需要的工具已经安装完毕。现在,检查你的 R 语言工作目录 (getwd()), 确保这个文件夹是空的。 bookdownplus 将在目录里产生很多临时文件,所以我们建议使用空文件夹作为工作目录。如果懒得更改工作目录,也可以在 RStudio 里创建一个新项目 (File – New Project - New Directory – Empty Project),以后每次总是在这个项目里工作就可以了。

14.3 见证奇迹的时刻

准备工作只需做一次,一劳永逸。一切准备就绪后,接下来就是见证奇迹的时刻。

从版本 V1.2.0 开始, bookdownplus 提供了两种魔法。第一种是用一个循环条指令来自动生成若干格式不同、风格迥异的文档,让初学者迅速体验 bookdown 的工作方式和成果。运行下面的代码,然后去喝个茶:

for (i in template()[1:19])
  bookdownplus(template = i, 
               more_output = more_output()[1:3])

回来以后,你会在工作目录里看到很多文件和文件夹。打开那个叫做 _book/的文件夹,Duang!19个示例文档,每个都以 pdf、Word、网页和电子书格式乖乖地等在那里,等你打开了。其中,电子书 epub 格式可以在手机上阅读,也可以在电脑里用免费的Calibre软件打开阅读。这些示例文档,从学术论文到诗歌乐谱,从中文到英文,展示了 bookdown 能胜任的工作。是不是动心了?

第二个魔法,是使用嵌套循环,来生成其中一个模板 ‘mail’ 不同样式的示例文档。运行下面的代码,然后看两眼窗外的风景,bookdownplus 就把事情做完了:

for (mf in mail_font()) {
  for (ms in mail_style()) {
    for (mt in mail_theme()) {
      outputname <- paste('mail', ms, mf, mt, sep = '_')
      bookdownplus(template = 'mail', 
                   mail_style = ms, 
                   mail_font = mf, 
                   mail_theme = mt, 
                   output_name = outputname)
    }
  }
}

仍然打开那个叫做 _book/的文件夹,Duang! 不同字体、不同主题、不同布局的信件示例文档就全部在那里了。我们在申请国外的学习和工作岗位时经常要求提供 cover letter,这就是’mail’模板的用武之地。

 bookdownplus 的 mail 模板文档示例.

图 14.3: bookdownplus 的 mail 模板文档示例.

下面我们用几个例子,来解释一下 bookdownplus 的基本用法,同时理解一下上面两个魔法是如何实现的。

14.4 撰写学术论文

示范文档

写学术期刊论文是 ‘bookdown’ 的强项,也是 ‘bookdownlus’ 扩展包开发的初衷。事实上,学术论文是 bookdown 里最为动人的精华所在。只有在写学术论文的过程里,遇到输入上下标、脚注、图表、方程、交叉引用、参考文献等任务时,bookdown 的魅力才会充分展示出来。本节介绍的学术论文生成、修改、导出、发布方法同样适用于后续章节介绍的其他模板,不再赘述。

14.1 里已经展示了两份期刊论文的示例文档。下面的代码,可以生成一个双栏的英文期刊论文文档(图14.4左):

bookdownplus(template = 'article')

打开 _book/的文件夹,示范文档article.pdf已经在那里了。随带附送的article.tex 可以直接投稿给学术期刊,一般的国际期刊都接收这个格式的文稿。

bookdownplus 生成的双栏论文(article,左)和讨论论文(discussion,右)示范文件.

图 14.4: bookdownplus 生成的双栏论文(article,左)和讨论论文(discussion,右)示范文件.

下面,我们进一步解释一下上面这条代码的含义和用法。

选择模板

参数template用来指定模板名称。可用的模板名称可以用F1魔法调出bookdownplus()函数的帮助文件来查看。如果你懒得用键盘输入模板名称’article’,那么可以换用下面的代码:

bookdownplus(template = template()[1])

template()[1] 就是 template()里的第一个元素,而这里出现的函数 template()是用来列出所有的可用模板名称的,以便选择:

template()
##  [1] "article"         "article_mdpi"    "article_zh"     
##  [4] "calendar"        "chemistry"       "chemistry_zh"   
##  [7] "discussion"      "guitar"          "journal"        
## [10] "mail"            "nte_zh"          "poem"           
## [13] "thesis_classic"  "thesis_mypku_zh" "thesis_ubt"     
## [16] "thesis_zju_zh"   "yihui_demo"      "yihui_mini"     
## [19] "yihui_zh"        "poster"

如果换成’discussion’模板,就得到图14.4右图的格式。

标题和作者

文章的标题和作者,有两种方式来设定。第一种是利用 bookdownplus()authortitle参数来指定:

bookdownplus(template = 'article',
             author = 'John Smith',
             title = 'My article')

第二种是打开’index.Rmd’文件, 将开头的titleauthor字段改成你文章的信息即可。

正文内容

文章的正文内容在 ‘body.Rmd’ 里修改即可。将 ‘body.Rmd’ 与 pdf 示范文档对照一下,就可以快速掌握 markdown 格式标记的用法。本书的附录给出了格式标记的速查表。如果这些还不够,那么就去读 bookdown 的官方手册40吧,里面介绍得最为齐全详尽。

修改成你自己的文字后,就可以生成自己的文档了。只需双击 ‘bookdownplus.Rproj’用 RStudio 打开这个项目,按快捷键 ’ctrl+shift+b’,Duang!你的书就在 ’_book/’ 里出现了。

你自己的’body.Rmd’文件可以备份到其他文件夹里。每次运行 bookdownplus() 创建新示范文件后,用你的’body.Rmd’文件将模板的同名文件覆盖就可以直接生成新书稿了。

导出与发布

bookdownplus 可以很方便地将你写好的文字导出为多种格式。除了默认的 .pdf 和 .tex 格式外,支持导出的格式有:

more_output()
## [1] "word_document2" "html_document2" "epub_book"     
## [4] "gitbook"

我们在生成示例文档时,可以用 more_output 参数指定导出的格式:

bookdownplus(template = 'article',
             more_output = more_output())

这样,在你完成’body.Rmd’ 的编写后,按 ’ctrl+shift+b’就会生成这些格式的书稿。 Word 是我国广大人民群众喜闻乐见的文档格式。epub格式意味着你可以在手机上阅读论文了。gitbook 文档可以用网页浏览器打开。这些文档都可以免费发布到网上,只需在 bookdown.org 注册并登录后,在RStudio运行命令:

bookdown::publish_book()

就可以把当前项目的作品发布在bookdown的官网上了。浏览器会自动打开你的专属网页。快把地址分享给亲朋好友来围观吧。

更多模板

这里示范的 ‘article’ 和 ‘discussion’ 模板,来自 Copernicus Publications 出版社的 \(\LaTeX\) 模板41,经修改后收进了 ‘bookdownplus’ 的模板库里。事实上,很多国际期刊都提供了各自的 \(\LaTeX\) 模板,按照 R bookdownplus Textbook 里给出的步骤,稍微修改一下就可以纳入这个模板库。比如图14.1中展示的论文模板就是来自 MDPI42。如果你创建了新的 bookdownplus 模板,或者发现了喜欢的 \(\LaTeX\)期刊论文模板,可以提交到 bookdownplus 的项目主页43,以便纳入模板库里,让 bookdownplus 越来越强大。下面介绍的几个模板,就是这样得到的。

14.5 撰写学位论文

bookdownplus 的模板库里有几个专门用来写学位论文的模板。从这些模板出发,可以非常方便地撰写学位论文。由于数据计算过程的R代码可以嵌入到文档中,一旦发现错误,只需在文档中修改即可。我在写科研论文时曾遇到一件事:论文有个计算公式,其中一个数值不小心敲错了。后续计算都是建立在这个计算的基础上,所以后续计算全错。虽然不影响结论,但严格来讲,论文里所有的数据都得改。这种灾难往往让人郁闷和沮丧,幸亏我用了 bookdown:由于正文里的数据和图表大多数是调用 R 代码计算得到的,走的是“可重复性研究”的思路,只要把 R 代码里那个敲错的数据改过来,重新编译论文文档,后续计算就全部自动更新,导出的 pdf 或 Word 文档也相应自动更新,节省了大量时间,还极大减少了敲数字或拷贝粘贴出错的可能。

运行下面的代码,可以生成一个英文的博士论文示例文档:

bookdownplus(template = 'thesis_ubt')

这个模板来自德国拜罗伊特大学博士论文。模板名称里的ubt是拜罗伊特大学(University of Bayreuth)的缩写。‘thesis_ubt’ 模板适合使用英语或德语撰写的学位论文。此外,bookdownplus 为中文用户提供了支持中文的学位论文模板。运行下面的代码:

bookdownplus(template = 'thesis_mypku')

将得到一个简单的支持中文环境的示范论文文档。

另一个支持中文的学位论文模板是 ‘thesis_zju’,来自浙江大学(Zhejiang University)的 \(\LaTeX\) 模板。网上也有其他大学的 \(\LaTeX\) 论文模板,例如北京大学44 和清华大学45 ,如果你能把任何一个改成 bookdownplus 模板,那么可以提交到 bookdownplus 的模板库里。

14.6 生成思维导图

由于 bookdown 生成的文档基于 markdown 语法,采取的是标记语言,那么就很容易从文档中提取指定标记的字段,来进行进一步加工。比如说,将 bookdown 或 markdown 文稿自动生成思维导图。

思维导图又称为脑图、头脑风暴图、心智导图,是时下流行的一种记忆知识、交流想法的工具。一般情况下,我们在 bookdown 文档里用#标识来标记章节标题,# 的数量表示标题的级别。因此,只需把文稿里 # 后面的内容提取出来,就可以自动生成文稿的大纲;格式稍作转换,就可以自动生成思维导图了。

《学R》一书的思维导图, 由mindr 扩展包制作.

图 14.5: 《学R》一书的思维导图, 由mindr 扩展包制作.

14.5 是由本书的原始书稿自动生成的思维导图,用的是 mindr (Zhao 2017c) 扩展包 。这里简要介绍一下用法。

mindr 包已在 CRAN 正式发布,安装和载入方法跟别的扩展包一样:

install.packages('mindr')
library('mindr')

在 R 的工作目录(getwd())创建名叫 mm/ 的文件夹,丢进去一个或多个 markdown 文件 (.md, .Rmd),比如可以把 bookdownplus 生成的 body.Rmd 示例文件拷贝进去,然后运行:

md2mm()

就会在工作目录下得到一个名为 mm.mm 的思维导图文件。这个文件可以用大多数主流的思维导图软件打开。这里我们推荐 FreeMind46,因为.mm格式是 FreeMind 可以直接打开的默认格式。FreeMind 的界面比较简陋,所以我们另外推荐 Xmind,安装运行后在菜单栏选择导入 freemind 导图即可。漂亮的思维导图就自动出现了。

mindr包还有另外的两个函数:如果你并不想从 bookdown 或 markdown 文件里生成思维导图,而只想获取文档的大纲,那么可以用outline()函数;如果你是思维导图的老用户,想从你现有的思维导图作为出发点,进一步展开写文档,那么可以用 mm2md() 函数,会将 .mm 格式的思维导图转换成 markdown,然后就可以用 bookdown 进一步生成各种需要的文档了。

Example 14.1 利用 bookdownplus的’article’模板,写一篇学术论文,并利用mindr生成该论文的思维导图。

Example 14.2 利用 bookdownplus的’mail’模板,写一封发给某国外大学的留学申请信(cover letter)。

14.7 撰写散文和日记

用 bookdown 来写散文、日记、小说和诗集等文学作品,是一种特别的享受。文学作品跟学术论文的结构在逻辑上是不同的,常常不需要标题分级编号,常常不需要强制每章第一页出现在奇数页,有时候需要特殊字体来点缀。bookdownplus 里的几个模板,把这些问题都考虑进去了,用户不再需要为此烦心。

中文的散文和小说,可以用 ‘nte_zh’ 模板:

bookdownplus(template = `nte_zh`)

这个模板特别为中文订制,自动生成双栏的目录,并选择了适合中文的字体。如果你喜欢记录一些生活里的小故事,小想法,不妨用这个模板发布到 bookdown.org上。我就是这样把博客里的育儿帖子整理成了一本书(图14.6),发布在网上跟亲朋好友分享47

 bookdownplus 的散文小说模板

图 14.6: bookdownplus 的散文小说模板

‘nte_zh’ 模板当然也可以用来写日记。不过,bookdownplus 另外提供了 ‘journal’ 模板:

bookdownplus(template = 'journal')

‘journal’ 模板适合外语日记。该模板最初是设计用来做实验室日志记录的。由于 bookdown 允许很方便地在文档里插入 R 代码来生成可重复性的数据图表,因此 ‘journal’ 模板先天具有写科研日记的优势。而且,该模板为生成的 pdf 文档留有较宽的左右页边距,方便将来打印装订后添加一些注释或说明。

不要小看这个页边距。四百年前,法国数学家费马在阅读丢番图《算术》一书时,突然有了小灵感,但一时找不到本子做记录,于是就在书的页边写道:

将一个立方数分成两个立方数之和,或一个四次幂分成两个四次幂之和,或者一般地将一个高于二次的幂分成两个同次幂之和,这是不可能的。关于此,我确信我发现了一种美妙的证法,可惜这里的空白处太小,写不下。

此后,全人类花了三个世纪的努力,才把费马猜想证明为费马定理。要是丢番图的书用了 bookdownplus 的 ‘journal’ 模板,为费马留出足够的页边距空白,那么会省下人类多少宝贵的时间啊!

14.8 记录吉他谱

bookdown 不仅可以用于学习、工作和生活记录,还可以用来记录音乐,例如吉他谱。

我国的民谣吉他伴奏谱常见的一般是六线和弦全谱,然而录入太麻烦,经常需要专业软件。为了省事儿,经常只保留和弦名称和歌词,简化为文字谱:

   C     Em      F      G      C     Em
让我掉下眼泪的不只昨夜的酒,让我依依不舍的不……

文字谱的好处是用不着任何专业软件,录入方便。但是,这比较坑吉他初学者。想不起来Em和弦的指法该怎么办?Em还好办,看见个G#7sus4,我崩溃了,自认水平不行,乖乖翻和弦字典去。

能不能像录入文字谱那样简单地录入和弦谱呢?

这不是异想天开。在 RStudio 里输入以下代码,就会生成一本吉他和弦示例书:

bookdownplus(template = 'guitar')

这是怎么实现的呢?

打开 ‘body.Rmd’ 文件,输入:

让\CM 我掉下\Em 眼泪的 不\F 只昨夜的\GM 酒 让\CM 我依依\Em 不……

得到的pdf文档里呈现的就是图14.7

bookdownplus 的 'guitar' 模板生成的和弦谱

图 14.7: bookdownplus 的 ‘guitar’ 模板生成的和弦谱

这里,‘CM’ 和 ‘GM’ 两个符号分别表示 C 和弦和 G 和弦,跟习惯稍有不同。这两个符号当然是可以更改的,只需在tex/template_guitar.tex定义即可。例如 C 和弦,定义方式是:

\newcommand{\CM}{\upchord{\chord{t}{n,p3,p2,n,p1,n}{C}}}

这样,在正文里,bookdown看到\CM,就会转换成C和弦指法图。限于篇幅,关于上面这条指令的具体含义我们就不详细解释了,请参阅 \(\LaTeX\) 的 gchords扩展包48

吉他和弦谱有很多,我们没必要自己费力气逐个创建对应的指令,只需去互联网找现成的就行了,有来自开源社区贡献的常见指法设置代码,我们只需拷贝粘贴到这里即可。

利用 bookdownplus 的 ‘guitar’ 模板,我把喜欢的歌制作成了一本电子书放在网上作为示例49,并且把用到的和弦指法表汇总在了书里。

Guitar bookdown 一书汇总的吉他和弦指法图

图 14.8: Guitar bookdown 一书汇总的吉他和弦指法图

开一下脑洞,我们可以利用 bookdown 把吉他和弦谱插入到文学作品中。我们甚至可以在某本书里同时呈现 R 代码、R 图表、诗词散文和吉他谱,开创出一种全新的文体。

14.9 课外活动:创建新模板

在本章中,我们鼓励大家创建自己喜欢的 bookdownplus 模板,那么,一个 bookdownplus 模板是如何创建的呢?

截至本书成稿时,bookdown 1.2.0 的模板库包含大约 20 个用于生成 pdf 文档的 模板。创建 bookdownplus 模板库并不需要太多的 \(\LaTeX\) 知识,只需了解 \(\LaTeX\) 工作的逻辑和基本流程即可。仔细研究一下现有的模板,认真研读 bookdown 官方文档50的第四章,那么你就知道如何创建自己的模板了。下面是基本流程和我的一些体会。

  1. 首先,找到一个新模板。有很多网站提供免费的 \(\LaTeX\) 模板。下载一个你最喜欢的,尤其推荐那些有详细的说明文档和示例文档的。

  2. 在本地电脑上对模板的示例文档用 \(\LaTeX\) 进行编译,确保顺利生成一个你想要的pdf文档。关于编译工具,我们推荐免费好用的 TeXStudio51。如果编译成功,并且你懒得进行下一步操作的话,你可以把相关的文档通过邮件打包提交到 bookdownplus 的项目主页52,并说明这个模板有何优点和特色。然而,靠人不如靠自己,我们建议你勇敢地进行下一步。

  3. 将你的\(\LaTeX\)模板拆成两个文件:‘template_yours.tex’ 和 ‘index.Rmd’。拆分原则如下:

  • \(\LaTeX\) 模板的文章主题部分,也就是位于 \begin{document}\end{document}之间的部分,用符号 $body$替代,保存为’template_yours.tex’ 。$body$所在的部分将会用 ‘body.Rmd’ 里的内容来填充。

  • 创建一个新的’index.Rmd’。可以使用’bookdownplus’ 生成的任何一个 ‘index.Rmd’,将其中的模板字段换成 ‘template_yours.tex’。

  1. 如果你的\(\LaTeX\) 模板足够简单,那么现在就可以试着用 bookdown 来编译了。运气好的话你会得到想要的 pdf 文档。祝贺!

  2. 但是,多数情况下并不能编译成功。一个漂亮的 \(\LaTeX\) 模板经常比较复杂,尤其是中文模板。你可能需要修改导言区,挑出一部分来另存为其他文件,然后在 ‘index.Rmd’ 里标明。详见’bookdown’官方手册53

  3. 努力不懈,坚持到底,相信你最终必然会得到你想要的pdf文档。

你的新模板,包括 ‘index.Rmd’, ‘body.Rmd’, ‘template_yours.tex’ 和其他相关文件和说明,可以提交到 bookdownplus 项目的模板库。

让我们联合起来,一起建立全人类第一个 bookdown 模板库吧!

References

Xie, Yihui. 2016. Bookdown: Authoring Books and Technical Documents with R Markdown. Boca Raton, Florida: Chapman; Hall/CRC. https://github.com/rstudio/bookdown.

Zhao, Peng. 2017b. Bookdownplus: Generate Varied Types of Books and Documents with R ’Bookdown’ Package. https://CRAN.R-project.org/package=bookdownplus.

Zhao, Peng. 2017c. Mindr: Convert Files Between Markdown or Rmarkdown Files and Mindmaps. https://CRAN.R-project.org/package=mindr.