优雅的 bookdown 书籍模版
第 1 章 欢迎
A Markdown-formatted document should be publishable as-is, as plain text, without looking like it’s been marked up with tags or formatting instructions.
— John Gruber
这是一份 R Markodwn 文档。 Markdown 提供一种简洁的格式语法,用来生成 HTML、PDF 和 MS Word 文档。
当你点击 Knit 按钮时,就会生成一份包含正文和代码执行结果的文档。你可以像这样嵌入 R 代码块:
summary(cars)
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
1.1 如何参与改进
改进原则
- 不要引入新的 LaTeX 宏包,在我看来,上游 ElegantBook 使用的宏包已经足够多了,详见 https://d.cosx.org/d/421349-latex/2
- 书籍风格尽可能简洁,本人信奉 simple is better
- 不要自定义 Pandoc’s LaTeX 模版,Pandoc 内建的模版已经功能很全面了,下游的 R Markdown 生态已经甩掉了自己造的大量 LaTeX 模版。为保持与下游的完美兼容,也为了更加轻量地输出多种文档格式,也尽可能多地保持多种输出格式的风格一致。
- 本书输出格式目标是 HTML/PDF/EPUB,可以推动上游优化 Pandoc 模版或者 ElegantBook 模版
1.2 运行环境
::session_info(c(
xfun"rmarkdown", "bookdown", "knitr"
dependencies = FALSE) ),
## R version 4.2.1 (2022-06-23)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 22.04.1 LTS
##
## Locale:
## LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
## LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
## LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
## LC_PAPER=en_US.UTF-8 LC_NAME=C
## LC_ADDRESS=C LC_TELEPHONE=C
## LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
##
## Package version:
## bookdown_0.31 knitr_1.41 rmarkdown_2.19
##
## Pandoc version: 2.17.1
1.3 Pandoc
Pandoc 自诞生以来已历 15 个春秋,Github 星级 18.5k,而日常使用的 Hive 不过区区 3k。Pandoc 现已被各大 Linux 发行版(如 CentOS/Ubuntu 等)收录。下面给出一个使用 Pandoc 的简单例子
echo "hello, world!" > note.md
pandoc note.md -s -o note.tex # markdown 文本转化为 tex 文本
pandoc note.md -o note.pdf # markdown 文本转化为 pdf 文档
pandoc note.md -o note.html # markdown 文本转化为 html 文档
Pandoc 支持数十种文档输出格式,更多命令参数说明见 https://pandoc.org/MANUAL.html。可不可以不要 R,也不要 R Markdown 呢?当然可以,详见 https://github.com/annProg/PanBook,基于 Pandoc’s Markdown 实现一次写作,多样输出!
1.4 已有 Block
引理 1.1 For any two random variables \(X_1\), \(X_2\), they both have the same probability distribution if and only if \[\varphi _{X_1}(t)=\varphi _{X_2}(t)\]
定理 1.1 If \(X_1\), …, \(X_n\) are independent random variables, and \(a_1\), …, \(a_n\) are some constants, then the characteristic function of the linear combination \(S_n=\sum_{i=1}^na_iX_i\) is \[\varphi _{S_{n}}(t)=\prod_{i=1}^n\varphi _{X_i}(a_{i}t)=\varphi _{X_{1}}(a_{1}t)\cdots \varphi _{X_{n}}(a_{n}t)\]
命题 1.1 The distribution of the sum of independent Poisson random variables \(X_i \sim \mathrm{Pois}(\lambda_i),\: i=1,2,\cdots,n\) is \(\mathrm{Pois}(\sum_{i=1}^n\lambda_i)\).
1.5 数学公式
数学公式加粗可能是最常见的需求之一, elegantbook 宏包提供的文类 elegantbook.cls
已经调用了 bm 宏包 1。有了 bm 宏包,就可以使用 bm 宏包提供的 \bm{}
命令,而不需要调 \boldsymbol{}
加粗希腊字母,如将 \(\alpha\) (正常)加粗为 \(\bm{\alpha}\)(粗体)。为了在 HTML 网页中显示加粗效果,则还不够,默认情况下, MathJax 是不认识 \bm{}
命令的,所以需要在 header.html
自定义 \bm{}
命令:
<script type="text/x-mathjax-config">
.Hub.Config({
MathJaxTeX: {
Macros: {
bm: ["{\\boldsymbol #1}",1],
}
};
})</script>
进一步地,使用常用的 3 个取消符号 \(\bcancel{///}\) 需要在 header.html
添加 JS 库 cancel.js
,
<script type="text/x-mathjax-config">
.Hub.Config({
MathJaxTeX: {
Macros: {
bm: ["{\\boldsymbol #1}",1],
,
}extensions: ["cancel.js"]
};
})</script>
并在 preamble.tex 文件中添加一行代码加载 cancel 宏包
\usepackage[makeroom]{cancel}
1.6 自定义 block
基于 Pandoc 自定义 block 是一件很有意思的事情,目前不想让模版过于复杂,仅给出几个最常用的例子。如何自定义可以去看谢益辉的新书 https://bookdown.org/yihui/rmarkdown-cookbook/custom-blocks.html。
要做的还有很多
这是警告
这是提示
这是注意
普通说明