Bookdown平台分享了哪些书籍,如何使用Bookdown分享书籍

欢迎关注天下博客:http://blog.genesino.com/2016/11/bookdown-usage/
Jump to...

  1. 基本使用
    1. 安装必须软件
    2. Demo示例
    3. 编译成书
  2. Customize our bookdown
    1. 准备Rmd文件
      1. 基本规则
      2. 插入并引用图片(外部图片)
      3. 插入并引用表格(外部表格)
      4. 插入并引用表格(内部表格)
      5. 插入脚注
      6. 插入引文
    2. 准备YML配置文件
      1. _bookdown.yml
      2. _output.yml
    3. 其它定制
  3. 预览生成的WEB文件
  4. References

bookdown是著名R包作者谢益辉开发的,支持采用Rmarkdown (R代码可以运行)或普通markdown编写文档,然后编译成HTML, WORD, PDF, Epub等格式。样式清新,使用简单,值得拥有。

在Bookdown的官网,有很多免费的用bookdown写的R书籍,如Hadley Wickham等撰写的《R for Data Science》,Roger D. Peng撰写的《R Programming for Data Science》, 陈总的《液体活检口袋书》,益辉的《R语言忍者秘笈》,《单细胞数据整体分析流程》https://hemberg-lab.github.io/scRNA.seq.course/index.html (初学单细胞分析可以完全照着这个,在学习过程中改进)。

还有很多基于Bookdown的教程,一时也想不起来,欢迎大家补充。我们前面转录组R培训的教案也是用bookdown写作的,后续再调整下格式,出一批电子书和纸质书,有意向和需求的欢迎联系。

下面分2步讲述,自己如何构建一个Bookdown书籍,第一部分是通过bookdown示例了解其基本功能和使用,第二部分是个人在使用过程中碰到的问题和解决方式。

基本使用

安装必须软件

RstudioPandoc二选一, bookdown必须安装。

  • Install Rstudio (version>1.0.0) (安装和使用见Rstudio)

  • Install Pandoc (version>1.17.0.2)或者参照here。如果系统新,可以直接使用系统自带的yumapt-get;如果没有权限或系统比较老,Pandoc的安装可以使用conda,具体配置见Conda配置,配置好运行conda install -c conda-forge pandoc即可安装。

  • In R install.packages("bookdown")

Demo示例

克隆或下载https://github.com/rstudio/bookdown-demo示例文件,编译成功后,依葫芦画葫芦修改.

编译成书

运行下载的示例中的bash _build.sh_book目录下就是成书.

The content of _build.sh is:

#!/bin/sh
Rscript -e "bookdown::render_book('index.Rmd', 'bookdown::gitbook')"
# 生成pdf需要安装好latex,如果不需要可以注释掉
Rscript -e "bookdown::render_book('index.Rmd', 'bookdown::pdf_book')"

<mark style="box-sizing: border-box;">在前面的内容运转起来后,再看后面的内容。</mark>

Customize our bookdown

准备Rmd文件

基本规则
  • 一个典型的bookdown文档包含多个章节,每个章节在一个R Markdown文件里面 (文件的语法可以是pandoc支持的markdown语法,但后缀必须为Rmd)。

  • 每一个章节都必须以# Chapter title开头。后面可以跟一段概括性语句,概述本章的内容,方便理解,同时也防止二级标题出现在这一页。默认系统会按照文件名的顺序合并Rmd文件。

  • 另外章节的顺序也可在_bookdown.yml文件中通过rmd_files:["file1.Rmd", "file2.Rmd", ..]指定。

  • 如果有index.Rmdindex.Rmd总是出现在第一个位置。通常index.Rmd里面也需要有一章节,如果不需要对这一章节编号的话,可以写作# Preface {-}, 关键是{-}

  • 在第一个出现的Rmd文件中 (通常是index.Rmd),可以定义Pandoc相关的YAML metadata, 比如标题、作者、日期等 (去掉#及其后的内容)。

    title: "My book"
    author: #可以写多行信息,都会被当做Author处理

    如果需要引用参考文献,则添加下面三行内容

    bibliography: [database.bib] #指定存储参考文献的bib文件,endote或zotero都可以导出这种引文格式
    biblio-style: apalike #设定参考文献显示类型
    link-citations: yes

    
    ```{r setup, include=FALSE}
    knitr::opts_chunk$set(echo = FALSE, fig.align="center", out.width="95%", fig.pos='H')
    knitr::opts_chunk$set(cache = FALSE, autodep=TRUE)
    set.seed(0304)
    
    
    
插入并引用图片(外部图片)

插入图片最好使用knitr::include_graphics,可以同时适配HTML和PDF输出。另外当目录下同时存在name1.pngname1.pdf文件时,会自动选择在HTML展示name1.png文件,在PDF输出中引入name1.pdf格式的文件。

图的标签为fig-name(不能有下划线),在引用时需使用如下格式\@ref(fig:fig-name),且fig.cap也要设置内容。

多张图可以同时展示,图的名字以vector形式传给include_graphics,需要设置out.width=1/number-picsfig.show="hold"

Insert a single pic and refer as Figure \@ref(fig:fig-name). `echo=FALSE` will hide the code block and display the output of `r` command only. These options can be set globally as indicated below.

```{r fig-name, fig.cap="Markdown supported string as caption", fig.align="center", echo=FALSE}
knitr::include_graphics("images/1.png")

Suppose we have 3 pictures in images folder with names as Fig1_a, Fig1_b, Fig1_c, we can refer to them using Figure @ref(fig:fig1).

fig1 = list.files("images", pattern="Fig1_.*", full.names=T)
knitr::include_graphics(fig1)

Another way of including two pics.

knitr::include_graphics(c("images/1.png", "images/2.png"))

如果图或表的标题中有Markdown语法,输出为HTML时是可以正确解析的,但是输出为PDF时却不可以。这时可以使用`Text Reference`。当图或表的标题太长时,也可以使用`Text Reference`引用一段话作为图和表的标题。

Here is normal text.

(ref:pic-label) This line can be referred in fig.cap and markdown syntax is supported for both HTML and PDF output.

knitr::include_graphics("images/1.png")

输出PDF时不支持使用在线图片,可以加一个判断。

if (!file.exists(cover_file <- 'cover.jpg')){
  download.file(url,  cover_file,  mode = 'wb')
}
knitr::include_graphics(if (identical(knitr:::pandoc_to(),  'html')) url else cover_file)

##### 插入并引用表格(外部表格)

外部表格的名字中必须包含`tab:`, 然后是表格的实际名字,格式为`(\#tab:table-name)`; 引用时使用`Table \@ref(tab:table-name)`。 表格名字中不能有下划线。

Check Table @ref(tab:seq-sum) for detail.

Table: (#tab:seq-sum) Summary of sequencing reads 测序量总结 (对于双端测序, _1 表示左端reads, _2 表示右端reads)


Sample Total reads Total bases Sequence length (nt) GC content (%) Encoding


T8_1 37,106,941 5,566,036,721 138-150 47 Sanger / Illumina 1.9

T8_2 37,106,941 5,566,034,285 138-150 47 Sanger / Illumina 1.9


##### 插入并引用表格(内部表格)

插入表格推荐使用`knitr::kable`,只要提供数据矩阵,用`r`读取就可以了。

Check Table @ref(tab:table-id) for detail.

a <- as.data.frame(matrix(rnorm(20), nrow=4))
knitr::kable(a, caption="Test table",  booktabs=TRUE)

##### 插入脚注

`text^[footnote]` is used to get the footnote.

where type may be article, book, manual, and so on.^[The type name is case-insensitive, so it does not matter if it is manual, Manual, or MANUAL.]


##### 插入引文

假如我们的`bib`文件中内容如下,如果我们要引用这个文章,只要写 `[@chen_m6a_2015]`就可以了。

@article{chen_m6a_2015,
title = {m6A {RNA} {Methylation} {Is} {Regulated} by {MicroRNAs} and {Promotes} {Reprogramming} to {Pluripotency}},
volume = {16},
issn = {1934-5909, 1875-9777},
url = {http://www.cell.com/cell-stem-cell/abstract/S1934-5909(15)00017-X},
doi = {10.1016/j.stem.2015.01.016},
language = {English},
number = {3},
urldate = {2016-12-08},
journal = {Cell Stem Cell},
author = {Chen, Tong and Hao, Ya-Juan and Zhang, Ying and Li, Miao-Miao and Wang, Meng and Han, Weifang and Wu, Yongsheng and Lv, Ying and Hao, Jie and Wang, Libin and Li, Ang and Yang, Ying and Jin, Kang-Xuan and Zhao, Xu and Li, Yuhuan and Ping, Xiao-Li and Lai, Wei-Yi and Wu, Li-Gang and Jiang, Guibin and Wang, Hai-Lin and Sang, Lisi and Wang, Xiu-Jie and Yang, Yun-Gui and Zhou, Qi},
month = mar,
year = {2015},
pmid = {25683224},
pages = {289--301},
}


#### 准备YML配置文件

##### _bookdown.yml

配置输入和输出文件参数。

book_filename: "输出文件的名字"
output_dir: "输出目录的名字,默认_book"
language:
ui:
chapter_name: ""


##### _output.yml

配置产生输出文件的命令行参数。

bookdown::pdf_book:
template: ehbio.tex #使用自己定制的pandoc latex模板
includes: # or only customize part latex module
in_header: preamble.tex
before_body: latex/before_body.tex
after_body: latex/after_body.tex
latex_engine: xelatex
citation_package: natbib
keep_tex: yes
pandoc_args: --chapters
toc_depth: 3
toc_unnumbered: no
toc_appendix: yes
quote_footer: ["\VA{", "}{}"]
bookdown::epub_book:
stylesheet: css/style.css
bookdown::gitbook:
css: style.css
split_by: section
config:
toc:
collapse: none
before: | #设置toc开头和结尾的链接
<li><a href="http://www.ehbio.com"><img src="ehbio_logo.png" width="100%"></a></li>
after: |
<li><a href="mailto:ct@ehbio.com" target="blank">ct@ehbio.com</a></li>
download: [pdf, epub, mobi]
edit: https://github.com/rstudio/bookdown/edit/master/inst/examples/%s
sharing:
twitter: no
github: no
facebook: no


#### 其它定制

*   不同的文件分别用于`html`和`pdf`输出

    ```
    # in _bookdown.yml 
    rmd_files:
      html: ["index.Rmd", "file2.Rmd"]
      latex: ["index_pdf.Rmd", "file3.Rmd"]

    # Different render way
    #!/bin/sh
    Rscript -e "bookdown::render_book('index.Rmd', 'bookdown::gitbook')"
    Rscript -e "bookdown::render_book('index_pdf.Rmd', 'bookdown::pdf_book')"

    ```

*   配置全局变量自适应`HTML`和`PDF`输出

    ```
    ```{r setup, include=FALSE}
    library(knitr)
    output <- opts_knit$get("rmarkdown.pandoc.to")
    html = FALSE
    latex = FALSE
    opts_chunk$set(echo = FALSE, fig.align="center", fig.show="hold")
    if (output=="html") {
        html = TRUE
    }
    if (output=="latex") {
        opts_chunk$set(out.width="95%", out.height='0.7\\textheight', out.extra='keepaspectratio', fig.pos='H')
        latex = TRUE
    }
    #knitr::opts_chunk$set(cache = FALSE,  autodep=TRUE)
    set.seed(0304)
    ```

    Below text will only appear in HTML output.

    ```{asis, echo=html}

    # EHBIO Gene Technology {-}

    ```

    Below command will only be executed and displayed in HTML output.

    ```{r cover, eval=html, out.width="99%"}
    knitr::include_graphics("ehbio/cover.png")
    ```

    ```

*   保留生成的markdown文件

    ```
    # add below lines to last Rmd file
    ```{r, include=FALSE}
    file.rename(from="bookdown_file_name.md",  to="bookdown_file_name.saved.md")
    ```

    ```

*   包含子文件 (subfile.txt)

    ```
    ```{r child="subfile.txt"}
    ```

    ```

*   cahce external file [ref](https://github.com/yihui/knitr/issues/238)

    ```
    ```{r mtime-func}
    mtime <- function(files){
      lapply(Sys.glob(files), function(x) file.info(x)$mtime)
    }
    ```

    ```{r mtime-usage, cache=T, cache.extra=mtime(c("file1", "file2", file3))}
    file3 <- paste0(dir, '/', name)
    data1 <- read.table("file1")
    data2 <- read.table("file2")
    ```

    ```

### 预览生成的WEB文件

如果没有安装Rstudio,可以在生成的book目录(有`index.html`的目录)下运行`python -m SimpleHTTPServer 11521` (11521为端口号,一般选较大值避免冲突), 然后就可以在浏览器输入网址`http://server-ip:11521`来访问了。

### References

*   [https://bookdown.org/yihui/bookdown/get-started.html](https://bookdown.org/yihui/bookdown/get-started.html)
*   [https://github.com/rstudio/bookdown/tree/master/inst/examples](https://github.com/rstudio/bookdown/tree/master/inst/examples)
*   [http://stackoverflow.com/questions/25236850/how-to-set-different-global-options-in-knitr-and-rstudio-for-word-and-html](http://stackoverflow.com/questions/25236850/how-to-set-different-global-options-in-knitr-and-rstudio-for-word-and-html)
*   Multiple output with different configs [https://github.com/yihui/knitr/issues/1145](https://github.com/yihui/knitr/issues/1145)
*   Multiple output with different configs [https://github.com/yihui/knitr/issues/114://github.com/rstudio/rmarkdown/issues/614](https://github.com/yihui/knitr/issues/114://github.com/rstudio/rmarkdown/issues/614)
*   Citation style [http://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html](http://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html)
*   Save markdown [http://stackoverflow.com/questions/19989325/knit-rmd-file-to-md-and-save-the-md-file-one-level-up-with-a-different-name](http://stackoverflow.com/questions/19989325/knit-rmd-file-to-md-and-save-the-md-file-one-level-up-with-a-different-name)
*   PDF online pic [http://www.pzhao.org/zh/post/bookdown-tips/](http://www.pzhao.org/zh/post/bookdown-tips/)

<footer class="entry-meta" style="box-sizing: border-box; display: block; font-size: 0.75rem; text-transform: uppercase; color: rgba(187, 187, 187, 0.8); margin: 50px 30px 30px; text-align: center; font-family: Lato, Calibri, Arial, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">[BOOKDOWN](http://blog.genesino.com/tags#bookdown "Pages tagged bookdown")CHENTONG 
版权声明:本文为博主原创文章,转载请注明出处。 

![alipay.png](http://upload-images.jianshu.io/upload_images/7071112-57379e41a56e560f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![WeChatPay.png](http://upload-images.jianshu.io/upload_images/7071112-a4f1708f9375dc76.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

</footer>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • 古代杂交事件为慈鲷科鱼类的适应辐射提供动力 Ancient hybridization fuels rapid c...
    智取鸟氨酸阅读 4,618评论 0 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,649评论 18 139
  • 原文地址之前的博客有写到过Markdown轻量级标记语言,也提到过RStudio,还有神奇的Pandoc。今天就介...
    赵禾禾阅读 6,916评论 0 14
  • title: "My Jumble of Computer Vision"category: "Computer ...
    joshua_1988阅读 3,231评论 0 3
  • 人生的奇妙物语--永远不会再重来的这一刻。很像大巴上行驶在法兰克福郊外的高速上面那么奇妙。
    丘鸭Kris阅读 215评论 0 1