Markdown 基础

引言

John Gruber 首创的 Markdown 让你用纯文本的方式来撰写带有简单格式标识的文档(当然这也使得文档更容易阅读)。Markdown 的设计哲学为:

Markdown 格式文档可按其自身样式以纯文本的方式直接发布,而不应看起来有着各式各样标签或格式化指令的标注(marked up)。— John Gruber

Markdown 存在很多种的方言(如 CommonMarkGithub-Flavored Markdown 等),Quarto 主要基于 Pandoc 小幅修改并扩展的 Markdown 语法。以下将简要介绍常用的 Markdown 语法并展示其经过渲染(render)和格式化后的网页呈现结果,更多内容请参见 Pandoc 的官方文档 Markdown

段落

段落是指后面跟着一行或多行空白行作为分隔的文本块。

每一行文本最后的换行符将被视作空格, 所以你可以按你的意愿在段内随意换行1
如果你不想换行符被视为空格,而想要在行末强制换行,则需要在该行文字的最后输入两个及以上的空格(你也可以用在行末换行符的前面输入 \ 进行转义从而得到硬换行符——这里采用的就是这种处理方式,在“如果”前一行的最后有个 \)。

段落是指后面跟着一行或多行空白行作为分隔的文本块。

每一行文本最后的换行符将被视作空格,
所以你可以按你的意愿在段内随意换行^[对中文可能不太合适,这一行中“所以”的前面将出现一个多余的空格)]。\
如果你不想换行符被视为空格,而想要在行末强制换行,则需要在该行文字的最后输入两个及以上的空格(你也可以用在行末换行符的前面输入 `\` 进行转义从而得到硬换行符——这里采用的就是这种处理方式,在“如果”前一行的最后有个 `\`)。

标题

Markdown语法 呈现结果
# 一级标题

一级标题

## 二级标题

二级标题

### 三级标题

三级标题

#### 四级标题

四级标题

##### 五级标题
五级标题
###### 六级标题
六级标题

行内格式化

Markdown语法 呈现结果
*斜体* / **加粗**
斜体 / 加粗
上标^2^ / 下标~2~
上标2 / 下标2
~~删除线~~
删除线
[下划线]{.underline}
下划线
`行内代码 a + b`
行内代码 a + b

链接 & 图像

Markdown语法 呈现结果
<https://quarto.org>
https://quarto.org
[Quarto](https://quarto.org)
Quarto
[段落]
段落
[文档内链接至段落标题](#段落)
文档内链接至段落标题
![Logo](imgs/logo.png)
Logo
[![Logo](imgs/logo.png)](https://quarto.org)
Logo
[![Logo](imgs/logo.png)](https://quarto.org "quarto-logo")
Logo
[![](imgs/logo.png){fig-alt="logo of Q"}](https://quarto.org)
logo of Quarto

列表

无序列表

Markdown语法

* 项目 1
  + 子项目 1
  + 子项目 2
    - 子子项目 1
* 项目 2                
  连续文字 (缩进)

呈现结果

  • 项目 1
    • 子项目 1
    • 子项目 2
      • 子子项目 1
  • 项目 2
    连续文字 (缩进)

有序列表 1

Markdown语法

1. 项目 1

   连续文字 (缩进)

2. 项目 2
   i) 子项目 1
      A.  子子项目 1
   i) 子项目 2

呈现结果

  1. 项目 1

    连续文字 (缩进)

  2. 项目 2

    1. 子项目 1
      1. 子子项目 1
    2. 子项目 2

有序列表 2

Markdown语法

(@) 项目 1

可在其他文字后连续编号的

(@) 项目 2
    i) 子项目 1

呈现结果

  1. 项目 1

可在其他文字后连续编号的

  1. 项目 2
    1. 子项目 1

表格

| 右对齐 | 左对齐 | 默认    |  居中  |
|-------:|:-------|---------|:------:|
|   12   |   12   |    12   |    12  |
|  123   |  123   |   123   |   123  |
|    1   |    1   |     1   |     1  |
右对齐 左对齐 默认 居中
12 12 12 12
123 123 123 123
1 1 1 1

关于更多表格制作的 Markdown 语法可参见 Quarto 的官方文档 Tables

代码块

在 Markdown 文档中使用 ``` 来分隔代码块:

```
1 + 1
```

还可以通过加上语言标识(如 python)来给代码块增加语法高亮(syntax highlight)功能:

```python
1 + 1
```

Pandoc 支持超过 140 种语言的语法高亮。如果你使用的语言未被支持,可设定为 default

```default
1 + 1
```

如果文档的输出格式为 HTML,代码块输出还存在额外的设定选项(如代码折叠、样式主题、增加复制按钮、代码链接、代码工具等),进一步细节可参见 Quarto 官方文档 HTML Code

公式

你可以使用 $$$)分隔符来创建行内的(独显的)数学公式,例如:

Markdown语法 呈现结果
行内数学公式:$E = mc^{2}$
行内数学公式:\(E=mc^{2}\)
独显数学公式:

$$E = mc^{2}$$
独显数学公式:
\[E = mc^{2}\]

如果你想要自定义 TeX 宏,可以用 $$ 分隔符包裹相应的宏定义,并将其设定为 .hidden 代码块,示例如下:

::: {.hidden}
$$
 \def\RR{{\bf R}}
 \def\bold#1{{\bf #1}}
$$
:::

HTML 数学公式采用默认的 MathJax 引擎 ,此时你可以用 \def\newcommand\renewcommand\newenvironment\renewenvironment\let 等命令来创建宏和环境。

图示

Quarto 内生支持 MermaidGraphviz 图示(diagram),这使得你很容易使用类似 markdown 的纯文本语法创建流程图、序贯图、状态图、甘特图等。例如,这里我们插入一份由 Mermaid 创建的流程图:

```{mermaid}
flowchart LR
  A[方角矩形] --> B(圆角矩形)
  B --> C{决策}
  C --> D[分支 1]
  C --> E[分支 2]
```
flowchart LR
  A[方角矩形] --> B(圆角矩形)
  B --> C{决策}
  C --> D[分支 1]
  C --> E[分支 2]

你可通过 Quarto 官方文档 Diagrams 了解更多关于图示的信息。

分页符

pagebreak 短代码让你在文档中插入原生的分页符(LaTeX 为 \newpage,MS Word为分页符,而 HTML 为 page-break-after: always CSS 指令):

第1页

{{< pagebreak >}}

第2页

块级 / 行内元素

块级元素

块级元素以至少三个连续的冒号 : 的围栏行作为开始(可通过 {} 加上额外的属性)并以至少三个连续的冒号 : 行作为结束。块级元素允许套嵌,但前后必须有空行作为分隔。额外的属性包括由 # 指定的唯一标识、. 指定的类以及其它由 key="val" 指定的属性。示例如下:

::::: {#special style="text-align:center"}
一些内容。

::: {.warning .border}
这里为应用 border 和 warning 类样式的文本。
:::

更多内容。
:::::

行内元素

[] 包围的文本在正常情况下用来定义 链接,但如果还附加有额外的属性,那么这些文本将被视作行内元素,例如:

[这是具有指定类 class 和属性取值 key="val" 的 **行内** 文本]{.class key="val"}

当然在自定义块级元素和行内元素之后,我们通常需要进一步使用 HTML 的 CSS(层叠样式表)和/或 过滤器 来给渲染后的块级元素和行内元素增加相应的样式和/或行为。

关于块级元素和行内元素的更多信息可参见 Pandoc 官方文档 Divs and Spans

标注块

标注块有助于吸引读者关注特定内容或者清楚标明某些内容仅适用于某些特定情形。Quarto 基于 块级元素 Markdown 语法内置支持五种类型的标注:

Markdown语法

::: {.callout-note appearance="simple"}
Quarto 内置五种类型的标注,包括:`note``tip``warning``caution``important`
:::

呈现结果

Quarto 内置五种类型的标注,包括:notetipwarningcautionimportant

你可通过 Quarto 官方文档 Callout Blocks 了解更多关于标注块的信息。

脚注

在本文 段落 一节中你们已经看到脚注的出现。Quarto 支持两种方式的脚注(可自由混合使用):

普通脚注

脚注标识和脚注内容分开列示,支持多段落的脚注文本内容(需空格缩进)。示例如下:

正文内容有点复杂,所以这里需要有个脚注2。希望借助长脚注我能把这个问题解释明白3

正文内容有点复杂,所以这里需要有个脚注[^1]。希望借助长脚注我能把这个问题解释明白[^more]。

[^1]: 嗯\~\~ 要解释的东西确实有点复杂,在脚注内也一时半会儿说不清楚啦。

[^more]: 恐怕得加上必要的公式和代码才说得明白:

    $$E = mc^{2}$$
    
    这是用 R 代码实现的计算过程:

    ```r
    E <- m * c^2
    ```

行内脚注

直接将脚注文本内容放在脚注 Markdown 语法标记 ^[][] 内,不支持多段落的脚注文本内容。示例如下:

正文内容有点复杂,所以这里需要有个行内注释4。我说明白了吗?

正文内容有点复杂,所以这里需要有个行内注释^[嗯\~\~ 要解释的东西确实有点复杂,用行内脚注肯定说不清楚啦。]。我说明白了吗?

其它

引用和线文本块

Markdown语法 输出
> 引用 \
> 子在川上曰 \
> 逝者如斯夫

引用
子在川上曰
逝者如斯夫

| 线文本块
|   保留文本中的起始空格和
|     换行符

线文本块
  保留文本中的起始空格和
    换行符

原始 HTML 和 TeX

Markdown 语法允许你在文档中绝大多数的地方插入原始的 HTML(如插入 <br> 来强制换行、<a href="https://bing.com">Bing</a> 等)和 TeX 的内容,并在输出文档中得到渲染支持(或忽略)。

特殊字符

Markdown语法 输出
连接号 (en-dash):--
连接号 (en-dash):–
破折号 (em-dash):---
破折号 (em-dash):—

脚注

  1. 对中文可能不太合适,这一行中“所以”的前面出现一个多余的空格。↩︎

  2. 嗯~~ 要解释的东西确实有点复杂,在脚注内也一时半会儿说不清楚啦。↩︎

  3. 恐怕得加上必要的公式和代码才说得明白:

    \[E = mc^{2}\]

    这是用 R 代码实现的计算过程:

    E <- m * c^2
    ↩︎
  4. 嗯~~ 要解释的东西确实有点复杂,用行内脚注肯定说不清楚啦。↩︎