reStructuredText 语法指南
###########################
简介
*******
理解 RST
+++++++++
reStructuredText(可简写为RST、ReST或reST)是一种用于文本数据的文件格式,主要用于 Python 编程语言社区的技术文档。
它是Python Doc-SIG(Documentation Special Interest Group)的 Docutils 项目的一部分,旨在为 Python 创建一组类似于 Java 的 Javadoc 或 Perl 的 Plain Old Documentation(pod)的工具。Docutils 可以从 Python 程序中提取注释和信息,并将它们格式化为各种形式的程序文档。
reStructuredText 是一种轻量级标记语言,其设计目的是(a)文档处理软件(如Docutils)可以处理它,(b)读和写 Python 源代码的程序员很容易读它。而本教程介绍的 Sphinx,则是从 reStructuredText 文档生成 HTML/PDF 的工具。
学习本章 reStructuredText 语法,首先要理解两种标记元素:指令(Directives)和角色(Role)。区别在于指令是块级元素,像段落一样使用。角色是行内元素,可以写在普通文本之中。
插件安装
+++++++++
在第一小节 Sphinx开发环境配置中,已经介绍了如何在 Visual Studio Code 中安装 reStructuredText 拓展。开始学习本节 reStructuredText 前,同学们可以再前往 extensions 安装 RST Preview 插件。
.. image:: images/rst-extension-preview.jpg
安装插件后,同学们可以一边练习,一边随时预览文件渲染效果,检查自己书写是否正确。比如新建一个 rst-test.rst 文件,分别输入斜体文本、加粗文本,点击如下标志,可以看到已经有了相应效果:
.. image:: images/rst-welcome-preview.jpg
.. image:: images/rst-preview-result.jpg
标题
********
reStructuredText中,没有特定的字符指定给标题级别,这是因为结构是根据继承的标题来确定的。同学们可以自行选用自己习惯的符号, # * = - ^ ",或是 = - ` : . ' " ~ ^ _ * + #,都是可以参考的标记顺序。
本篇指南使用 # * + = : - 标记一、二、三、四、五、六级标题,语法格式如下: ::
我展示的是一级标题
##################
我展示的是二级标题
******************
我展示的是三级标题
++++++++++++++++++
我展示的是四级标题
==================
我展示的是五级标题
::::::::::::::::::
我展示的是六级标题
------------------
渲染效果如下:
.. image:: images/rst-heading-preview.jpg
..
注意:
1. 标题下方标记长度需要大于等于标题文字长度;
2. 标题级别递进是按顺序的,这一点与 Markdowm 语法不同,否则会渲染失败;
3. 全文标题标记符号要保持一致。
格式
********
本节介绍 reStructuredText 中的段落和字体格式。
段落
++++++
段落是reST 文档的基本模块,是由一个或多个空白行分离形成的文本块。
语法格式如下::
普通的文本段落或块级元素之间,必须使用空行加以区分,可按两下回车继续书写。
类似Python,同一段落的所有行必须左对齐而且同一级缩进。
每级缩进建议用 4 个空格,或设置 Tab 自动转为 4 个空格。
渲染效果如下:
普通的文本段落或块级元素之间,必须使用空行加以区分,可按两下回车继续书写。
类似Python,同一段落的所有行必须左对齐而且同一级缩进。
每级缩进建议用 4 个空格,或设置 Tab 自动转为 4 个空格。
字体
++++++
reStructuredText 可以使用以下几种文字格式::
*斜体文本*
**加粗文本**
渲染效果如下:
*斜体文本*
**加粗文本**
注意:
1. 格式标记不可相互嵌套;
2. 星号及反引号在文本中容易与内联标记符号混淆,可使用反斜杠符号转义;如果内容需要特殊字符分隔,可使用反斜杠转义,如: ``thisis\ *one*\ word.``
3. 文本与格式标记符号之间不要留空格, ``* text*`` 不能实现渲染效果。
分隔符
+++++++
与 Markdown 类似,分隔符用4个或以上 - 组成,需要添加换行。格式为: ::
上面部分
------------
下面部分
渲染效果如下:
上面部分
------------
下面部分
脚注
+++++
在文档中添加脚注,文内使用 ``[#name]_`` 标注脚注,文末使用 ``.. rubric:: Footnotes`` 添加脚注的内容。
比如: ::
Let's learn reStructuredText [#f1]_ ! You'll see a footnote [#f2]_.
.. rubric:: Footnotes
.. [#f1] reStructuredText 是一种轻量级标记语言。
.. [#f2] 这是第二条脚注.
渲染效果如下:
.. image:: images/rst-footnote-preview.jpg
此外,也可以用数字标注脚注,或者不指定 name,使用自动数字标记脚注 ``[#]_``。 # 有自动数字标记的功能,同学们接下来学习列表时也会注意到这一点。
列表
********
官方文档介绍了多种列表形式,同学们学习时可以优先掌握前两种,其余形式可以在应用时对照书写。
无序列表
++++++++
无序列表使用星号(*)、加号(+)或是减号(-)作为列表标记。语法格式如下: ::
* 第一项
* 第二项
* 第三项
+ 第一项
+ 第二项
+ 第三项
- 第一项
- 第二项
- 第三项
渲染效果如下:
* 第一项
* 第二项
* 第三项
+ 第一项
+ 第二项
+ 第三项
- 第一项
- 第二项
- 第三项
有序列表
++++++++
有序列表使用数字并加上 . 号来表示。语法格式如下: ::
1. 第一项
2. 第二项
3. 第三项
渲染效果如下:
1. 第一项
2. 第二项
3. 第三项
如果项很多,可以通过使用标志 # 自动编号有序列表,也可以和数字混用。 ::
#. 第一项
#. 第二项
#. 第三项
#. 第一项
#. 第二项
#. 第三项
定义列表
+++++++++
定义列表第一行写 term,类似于列表的一项名称。中间换行即可,不需要空行,缩进一级书写内容。比如: ::
what
第一项
how
第二项
渲染效果如下:
.. image:: images/rst-define-list.jpg
字段列表
++++++++
使用 ``:term:`` 和 ``:term:``,在行内紧接着写项的内容,比如: ::
:what: 第一项
:how: 第二项
渲染效果如下:
.. image:: images/rst-field-list.jpg
选项列表
+++++++++
使用 ``-term``, 后面与具体内容间留出两个或以上空格。比如: ::
-a 选项一
-b 选项二
渲染效果如下:
.. image:: images/rst-option-list.jpg
定义列表、字段列表、选项列表三种形式都可以灵活用自己 term,保证 term 只有一个文本行即可。比如: ::
-CAT 描述二
-TC 描述一
渲染效果如下:
.. image:: images/rst-define-term.jpg
列表嵌套
+++++++++
与 Markdown 语法类似,RST 中也可以实现列表嵌套。注意父列表与子列表要以空行分隔: ::
1. 父列表第一项
2. 父列表第二项
* 子列表第一项
* 子列表第二项
3. 父列表第三项
渲染效果如下:
1. 父列表第一项
2. 父列表第二项
* 子列表第一项
* 子列表第二项
3. 父列表第三项
代码
********
单行代码
++++++++
通过反引号实现: \``text``
渲染效果即为:``text``
代码区块
++++++++
在段落后使用两个连续英文引号标记 ``::`` 引出原始文本块。
代码块段落缩进,多行代码中间不需要空行,与其他文本前后空行分隔,最后有空行,缩进退回到 ``::`` 的位置,就表示退出原始文本块。比如: ::
第一段文本 ::
代码区块演示
展示源代码,不会***渲染***。
第二段文本
渲染效果如下:
第一段文本 ::
代码区块演示
展示源代码,不会***渲染***。
第二段文本
提示:在 reStructuredText 中, ``::`` 是很神奇的标记:
1. 如果 ``::`` 标记作为独立段落存在,则整段都不会出现在文档里.
2. 如果 ``::`` 标记前面有空白,标记将被删除。
3. 如果 ``::`` 标记前面非空白,标记会被单个冒号取代。
块级代码与代码高亮
++++++++++++++++++
原始文本块不会转换内部的字符,如果有时候写源代码,希望能高亮显示,就需要使用块级代码。
rst 标记格式为: ``.. code:: 语言名`` ,如:
.. code:: php
可以进一步查看 `代码高亮支持列表 `_,`详细用法 `_ 。
引用
*******
在reStructuredText中,引用有两种方式,但无论哪一种,引用中都不能使用标题。
引用纯文本
++++++++++
引用一段不需要渲染的纯文本,可以直接使用 ``::`` ,标记方式类似上一小节代码: ::
::
引用文本
渲染效果如下:
::
引用文本
引用带格式文本
++++++++++++++
如果想在引用里也使用 reStructuredText 的语法标记,缩进就可以实现了,引用会自动换行: ::
(Tab)引用文本,可以 *包含渲染*
渲染效果如下:
引用文本,可以 *包含渲染*
链接
******
外部链接
+++++++++
使用外部链接最简便的方式是直接粘贴网址,两端用空格和文本隔开,reStructuredText 会自动把网址转成超链接。如:``http://www.ss.pku.edu.cn``
渲染效果如下:
北京大学软件与微电子学院: http://www.ss.pku.edu.cn
更推荐的形式,是用锚文本来显示一个链接,尖括号包裹网址放在文本后面,注意空格。用一对反引号包裹它们,结尾跟一个下划线。基本标记格式为: ```链接文本 <网址>`_`` 。
比如: ::
可参考资料:`Sphinx官网 `_
`reStructuredText 详细说明 `_
渲染效果如下:
可参考资料:`Sphinx官网 `_
`reStructuredText 详细说明 `_
内部链接
++++++++++
内部链接是通过 Sphinx 提供的 reST role 来实现的。每一级标题都会变成一个锚,标题名加下划线即可创建跳转到此位置的连接。比如回到外部链接所所在位置学习: ``外部链接_``
渲染效果如下:
外部链接_
如果标题当中含有空格,则需要使用反引号将标题括起来。比如回到“代码“一节学习,语法格式为:```代码`_``。
渲染效果如下:
`代码`_
提示:虽然内部链接一般不需要,但同学们写链接时可以统一使用反引号包裹,记忆负担较小。
图片
*******
插入图片
++++++++
图片是块级元素,要单独成段,一般不能嵌入行内。建议优先使用源文件的相对路径,图像指令应为: ::
.. image:: 路径/文件名
比如在将 sphinx 图片存入与这篇指南同一文件夹 images 下,插入图片的语法格式为: ::
.. image:: images/rst-insert-sphinx.jpg
插入图片如下:
.. image:: images/rst-insert-sphinx.jpg
如果是绝对路径,则以文件的源目录为根目录. 此外,添加图片的形式也可以以网址链接形式添加。
图片格式
+++++++++
图片后还可以加入一些额外选项,比如大小选项宽度(width)和高度(height)。如果没有单位或单位为像素, 给定的尺寸信息仅在输出通道支持像素时才有用,如输出 LaTeX 没用;其他单位(如 pt)在输出 HTML、LaTeX 时被用到.添加选项的格式如: ::
.. image:: picture.jpeg
:height: 100px
:width: 200 px
:scale: 50 %
:alt: alternate text
:align: right
如果把上一个例子插入的图片缩小一些,那么语法格式可以为: ::
.. image:: images/rst-insert-sphinx.jpg
:height: 50px
:width: 218 px
插入图片如下:
.. image:: images/rst-insert-sphinx.jpg
:height: 50px
:width: 218 px
图片输出形式
+++++++++++++
Sphinx会自动将图像文件拷贝到输出目录中(例如 HTML格式输出,会拷贝到 _static 目录中。)
Sphinx 延伸了标准的文档化行为,只需在后面加星号: ::
.. image:: 图片名.*
这样写 Sphinx 就会搜索所有名字匹配的图像,而不管图像类型. 每个生成器则会选择最合适的图像. 源文件目录里同一文件名可能含有 pdf 和 png 两个文件, LaTeX 生成器会选择前者,而 HTML 生成器会匹配后者.
表格
********
reStructuredText 主要有两种表格形式,简单表格和网格表格。
简单表格
++++++++
简单表格书写简单, 基础形式好上手。要求有多行,且第一列元素不能分行显示。
构成简单表格的标记主要是"=":用于绘制表格上方、下方框线,以及分隔标题,比如: ::
===== ===== =======
A B A and B
===== ===== =======
False False False
True False False
False True False
True True True
===== ===== =======
渲染效果如下:
===== ===== =======
A B A and B
===== ===== =======
False False False
True False False
False True False
True True True
===== ===== =======
在此基础上,每格内容如图所示可以相应使用"-"分隔表头,但不支持合并单元格: ::
===== ===== ======
Inputs Output
------------ ------
A B A or B
===== ===== ======
False False False
True False True
False True True
True True True
===== ===== ======
渲染效果如下:
===== ===== ======
Inputs Output
------------ ------
A B A or B
===== ===== ======
False False False
True False True
False True True
True True True
===== ===== ======
如果一些单元格没有内容,需要用转义符或者".."表示,否则会被视为上一行的延续: ::
===== =====
col 1 col 2
===== =====
1 Second column of row 1.
2 Second column of row 2.
Second line of paragraph.
3 - Second column of row 3.
- Second item in bullet
list (row 3, column 2).
\ Row 4; column 1 will be empty.
===== =====
渲染效果如下:
===== =====
col 1 col 2
===== =====
1 Second column of row 1.
2 Second column of row 2.
Second line of paragraph.
3 - Second column of row 3.
- Second item in bullet
list (row 3, column 2).
\ Row 4; column 1 will be empty.
===== =====
网格表格
++++++++
网格表格可以自定义表格的边框,更灵活,但绘制相对复杂。构成网格表格的标记有以下几种:
* "-"用于绘制横线,分隔各行;
* "="用于分隔标题与表格主体,但标题可有可无,视情况而定;
* "|"用于绘制竖线,分隔各列;
* "+"用在行与列的交界处。
网格表格支持合并单元格,内部也可以嵌套列表。官方示例囊括了这些细节: ::
+------------------------+------------+----------+----------+
| Header row, column 1 | Header 2 | Header 3 | Header 4 |
+========================+============+==========+==========+
| body row 1, column 1 | column 2 | column 3 | column 4 |
+------------------------+------------+----------+----------+
| body row 2 | Cells may span columns. |
+------------------------+------------+---------------------+
| body row 3 | Cells may | - Table cells |
+------------------------+ span rows. | - contain |
| body row 4 | | - body elements. |
+------------------------+------------+---------------------+
渲染效果如下:
+------------------------+------------+----------+----------+
| Header row, column 1 | Header 2 | Header 3 | Header 4 |
+========================+============+==========+==========+
| body row 1, column 1 | column 2 | column 3 | column 4 |
+------------------------+------------+----------+----------+
| body row 2 | Cells may span columns. |
+------------------------+------------+---------------------+
| body row 3 | Cells may | - Table cells |
+------------------------+ span rows. | - contain |
| body row 4 | | - body elements. |
+------------------------+------------+---------------------+
提示:纯手打表格比较麻烦,书写中文内容标记难以对齐。如果精力允许,同学们也可以尝试 Emacs 编辑器绘制网格表格。
列表表格
+++++++++
此外,还有一种特殊的列表表格,通过创建一组嵌套的列表来渲染成表。
父级列表是行,每一行的子列表是列,每行的列数必须一致,不支持合并单元格),缺少的格用空出占位。比如: ::
.. list-table::
* - 单行代码
- 代码区块
- 代码高亮
* - 简单表格
- 网格表格
- 列表表格
* - 外部链接
- 内部链接
-
显示效果如下:
.. list-table::
* - 单行代码
- 代码区块
- 代码高亮
* - 简单表格
- 网格表格
- 列表表格
* - 外部链接
- 内部链接
-
更多详细说明,请参考 `reStructuredText官方文档 `_ 。