# 列表

列表 (opens new window)是一个或多个相同类型 (opens new window)列表项的序列,列表项可能被一行或多行空行分隔。
相同类型 (opens new window)列表项拥有相同的列表标记 (opens new window),如果两个列表项有使用相同字符(-,+,或*)的无序列表标记或者是使用相同分隔符(「.」或「)」)的有序列表,则它们也是同一种类型。
列表的类型由其第一个列表项的列表标记决定。
一个有序列表 (opens new window)起始序号 (opens new window)由其起始列表项的序号确定,忽略后面的列表项数字。
如果列表任意的组成列表项有空行分隔,或者如果其任意的组成列表项直接包含两个块级元素,并且它们之间有空行,则列表是稀疏 (opens new window)的。否则列表是稠密 (opens new window)的。(HTML 输出的不同之处在于稀疏列表中的段落包含在<p>标记中,而稠密列表中的段落则不包含在内。)
改变无序或者有序列表的分隔符会另起新列表:

示例 281

Markdown HTML 效果
- foo
- bar
+ baz

<ul>
<li>foo</li>
<li>bar</li>
</ul>
<ul>
<li>baz</li>
</ul>

示例 282

Markdown HTML 效果
1. foo
2. bar
3) baz

<ol>
<li>foo</li>
<li>bar</li>
</ol>
<ol start="3">
<li>baz</li>
</ol>

在 CommonMark 中,段落可以中断列表,也就是说,不需要空行来分隔段落与下列列表:

示例 283

Markdown HTML 效果
Foo
- bar
- baz

<p>Foo</p>
<ul>
<li>bar</li>
<li>baz</li>
</ul>

Markdown.pl不允许这么做,因为可能会因为句子中自带的数字触发列表:

The number of windows in my house is
14.  The number of doors is 6.

但奇怪的是,Markdown.pl允许块引用中断段落,即使可能适用相同的考虑因素。
在CommonMark中,我们允许列表中断段落,原因有两个。首先,新建一个没有空行的列表是很自然的并且并不罕见:

I need to buy
- new shoes
- a coat
- a plane ticket

其次,我们发现了

统一性原则 (opens new window): 如果一段文本有其本身的意义,那么它在容器块中将继续含有相同的含义(像在块引用 (opens new window)列表项 (opens new window)中那样)。

(确实,列表项 (opens new window)块引用 (opens new window)的规范也默许了这个原则。) 这个原则意味着如果

  * I need to buy
    - new shoes
    - a coat
    - a plane ticket

是一个列表项,其中包含一个段落后跟一个嵌套的子列表,因为所有 Markdown 实现都是这样解析的(尽管该段落可能没有<p>标签,因为列表「稠密」),然后

I need to buy
- new shoes
- a coat
- a plane ticket

本身应该是一个段落,后跟一个嵌套的子列表。
由于 Markdown 实现允许列表中断列表项内的段落,因此统一性原则 (opens new window)要求我们允许这个外部列表项。 (reStructuredText (opens new window)采用不同的方法,在列表之前甚至在其他列表项中也需要空行。)
为了解决带有嵌套数字的段落中出现意外的列表,我们只允许以 1 开头的列表来中断段落。 从而,

示例 284

Markdown HTML 效果
The number of windows in my house is
14.  The number of doors is 6.

<p>The number of windows in my house is
14.  The number of doors is 6.</p>

我们也可能获得一个未缩进像这样的结果

示例 285

Markdown HTML 效果
The number of windows in my house is
1.  The number of doors is 6.

<p>The number of windows in my house is</p>
<ol>
<li>The number of doors is 6.</li>
</ol>

但是这应该可以防止大多数意外的列表生成。
项之间可以有任意行的空行:

示例 286

Markdown HTML 效果
- foo

- bar


- baz

<ul>
<li>
<p>foo</p>
</li>
<li>
<p>bar</p>
</li>
<li>
<p>baz</p>
</li>
</ul>

示例 287

Markdown HTML 效果
- foo
  - bar
    - baz


      bim

<ul>
<li>foo
<ul>
<li>bar
<ul>
<li>
<p>baz</p>
<p>bim</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>

为了要分隔相同类型的连续列表,或者分隔列表与缩进的代码块,不然的话这些代码块将被解析为最终列表项的子段,可以通过插入空白的 HTML 注释:

示例 288

Markdown HTML 效果
- foo
- bar

<!-- -->

- baz
- bim

<ul>
<li>foo</li>
<li>bar</li>
</ul>
<!-- -->
<ul>
<li>baz</li>
<li>bim</li>
</ul>

示例 289

Markdown HTML 效果
-   foo

    notcode

-   foo

<!-- -->

    code

<ul>
<li>
<p>foo</p>
<p>notcode</p>
</li>
<li>
<p>foo</p>
</li>
</ul>
<!-- -->
<pre><code>code
</code></pre>

列表项不需要缩进到同一级别。 以下列表项将被视为同一列表级别的项目,因为没有缩进到足以属于上一个列表项:

示例 290

Markdown HTML 效果
- a
 - b
  - c
   - d
  - e
 - f
- g

<ul>
<li>a</li>
<li>b</li>
<li>c</li>
<li>d</li>
<li>e</li>
<li>f</li>
<li>g</li>
</ul>

示例 291

Markdown HTML 效果
1. a

  2. b

   3. c

<ol>
<li>
<p>a</p>
</li>
<li>
<p>b</p>
</li>
<li>
<p>c</p>
</li>
</ol>

但请注意,列表项可能不会缩进三个以上的空格。在这里 - e 被视为段落延续行,因为它缩进了三个以上的空格:

示例 292

Markdown HTML 效果
- a
 - b
  - c
   - d
    - e

<ul>
<li>a</li>
<li>b</li>
<li>c</li>
<li>d
- e</li>
</ul>

这里的 3. c 被视为缩进的代码块,因为它缩进了四个空格且前面有一行空行。

示例 293

Markdown HTML 效果
1. a

  2. b

    3. c

<ol>
<li>
<p>a</p>
</li>
<li>
<p>b</p>
</li>
</ol>
<pre><code>3. c
</code></pre>

这是一个稀疏列表,因为列表项被空行分隔:

示例 294

Markdown HTML 效果
- a
- b

- c

<ul>
<li>
<p>a</p>
</li>
<li>
<p>b</p>
</li>
<li>
<p>c</p>
</li>
</ul>

像这样,有一个空的列表项:

示例 295

Markdown HTML 效果
* a
*

* c

<ul>
<li>
<p>a</p>
</li>
<li></li>
<li>
<p>c</p>
</li>
</ul>

这些是稀疏列表,尽管项中间没有空隔,但是其中一项中含有被空行分隔的两个块级元素:

示例 296

Markdown HTML 效果
- a
- b

  c
- d

<ul>
<li>
<p>a</p>
</li>
<li>
<p>b</p>
<p>c</p>
</li>
<li>
<p>d</p>
</li>
</ul>

示例 297

Markdown HTML 效果
- a
- b

  [ref]: /url
- d

<ul>
<li>
<p>a</p>
</li>
<li>
<p>b</p>
</li>
<li>
<p>d</p>
</li>
</ul>

这是一个稠密列表,因为空行存在于代码块中:

示例 298

Markdown HTML 效果
- a
- ```
  b


  ```
- c

<ul>
<li>a</li>
<li>
<pre><code>b


</code></pre>
</li>
<li>c</li>
</ul>

这个列表是稠密的,因为空行是子列表的两个段落中间的,所以子列表是稀疏的,外部列表是稠密的:

示例 299

Markdown HTML 效果
- a
  - b

    c
- d

<ul>
<li>a
<ul>
<li>
<p>b</p>
<p>c</p>
</li>
</ul>
</li>
<li>d</li>
</ul>

这个列表是稠密的,因为空行包含在块引用中:

示例 300

Markdown HTML 效果
* a
  > b
  >
* c

<ul>
<li>a
<blockquote>
<p>b</p>
</blockquote>
</li>
<li>c</li>
</ul>

这个列表是稠密的,因为连续的块元素没有被空行分割:

示例 301

Markdown HTML 效果
- a
  > b
  ```
  c
  ```
- d

<ul>
<li>a
<blockquote>
<p>b</p>
</blockquote>
<pre><code>c
</code></pre>
</li>
<li>d</li>
</ul>

一个单个段落是稠密的:

示例 302

Markdown HTML 效果
- a

<ul>
<li>a</li>
</ul>

示例 303

Markdown HTML 效果
- a
  - b

<ul>
<li>a
<ul>
<li>b</li>
</ul>
</li>
</ul>

这个列表是稀疏的,因为列表项中含有被空行分隔块元素:

示例 304

Markdown HTML 效果
1. ```
   foo
   ```

   bar

<ol>
<li>
<pre><code>foo
</code></pre>
<p>bar</p>
</li>
</ol>

这里的外部列表是稀疏的,内部列表是稠密的:

示例 305

Markdown HTML 效果
* foo
  * bar

  baz

<ul>
<li>
<p>foo</p>
<ul>
<li>bar</li>
</ul>
<p>baz</p>
</li>
</ul>

示例 306

Markdown HTML 效果
- a
  - b
  - c

- d
  - e
  - f

<ul>
<li>
<p>a</p>
<ul>
<li>b</li>
<li>c</li>
</ul>
</li>
<li>
<p>d</p>
<ul>
<li>e</li>
<li>f</li>
</ul>
</li>
</ul>