第 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 如何参与改进

改进原则

  1. 不要引入新的 LaTeX 宏包,在我看来,上游 ElegantBook 使用的宏包已经足够多了,详见 https://d.cosx.org/d/421349-latex/2
  2. 书籍风格尽可能简洁,本人信奉 simple is better
  3. 不要自定义 Pandoc’s LaTeX 模版,Pandoc 内建的模版已经功能很全面了,下游的 R Markdown 生态已经甩掉了自己造的大量 LaTeX 模版。为保持与下游的完美兼容,也为了更加轻量地输出多种文档格式,也尽可能多地保持多种输出格式的风格一致。
  4. 本书输出格式目标是 HTML/PDF/EPUB,可以推动上游优化 Pandoc 模版或者 ElegantBook 模版

1.2 运行环境

xfun::session_info(c(
  "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">
    MathJax.Hub.Config({
      TeX: {
        Macros: {
          bm: ["{\\boldsymbol #1}",1],
        }
      }
    });
</script>

进一步地,使用常用的 3 个取消符号 \(\bcancel{///}\) 需要在 header.html 添加 JS 库 cancel.js

<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
      TeX: {
        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

要做的还有很多

这是警告

这是提示

这是注意

普通说明