.. include:: ../disclaimer-zh_CN.rst :Original: Documentation/doc-guide/sphinx.rst :译者: å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> .. _sphinxdoc_zh: 简介 ==== Linuxå†…æ ¸ä½¿ç”¨ `Sphinx <http://www.sphinx-doc.org/>`_ æ¥æŠŠ ``Documentation`` 下的 `reStructuredText <http://docutils.sourceforge.net/rst.html>`_ 文件转 æ¢æˆæ¼‚亮的文档。使用 ``make htmldocs`` 或 ``make pdfdocs`` 命令å³å¯æž„建HTML 或PDFæ ¼å¼çš„文档。生æˆçš„文档放在 ``Documentation/output`` 文件夹ä¸ã€‚ reStructuredText文件å¯èƒ½åŒ…å«åŒ…å«æ¥è‡ªæºæ–‡ä»¶çš„结构化文档注释或kernel-doc注释。 通常它们用于æ述代ç 的功能ã€ç±»åž‹å’Œè®¾è®¡ã€‚kernel-doc注释有一些特殊的结构和 æ ¼å¼ï¼Œä½†é™¤æ¤ä¹‹å¤–,它们还被作为reStructuredText处ç†ã€‚ 最åŽï¼Œæœ‰æˆåƒä¸Šä¸‡çš„纯文本文档文件散布在 ``Documentation`` 里。éšç€æ—¶é—´æŽ¨ç§»ï¼Œ å…¶ä¸ä¸€äº›å¯èƒ½ä¼šè½¬æ¢ä¸ºreStructuredText,但其ä¸å¤§éƒ¨åˆ†ä»ä¿æŒçº¯æ–‡æœ¬ã€‚ .. _sphinx_install_zh: 安装Sphinx ========== Documentation/ 下的ReST文件现在使用sphinx1.7或更高版本构建。 这有一个脚本å¯ä»¥æ£€æŸ¥Sphinxçš„ä¾èµ–项。更多详细信æ¯è§ :ref:`sphinx-pre-install_zh` 。 大多数å‘行版都附带了Sphinx,但是它的工具链比较脆弱,而且在您的机器上å‡çº§å®ƒ 或其他一些Python包导致文档构建ä¸æ–的情况并ä¸å°‘è§ã€‚ é¿å…æ¤æƒ…况的一ç§æ–¹æ³•æ˜¯ä½¿ç”¨ä¸Žå‘行版附带的ä¸åŒçš„ç‰ˆæœ¬ã€‚å› æ¤ï¼Œå»ºè®®ä½¿ç”¨ ``virtualenv-3`` 或 ``virtualenv`` 在虚拟环境ä¸å®‰è£…Sphinx,具体å–决于å‘行版 如何打包Python3。 .. note:: #) html输出建议使用RTDä¸»é¢˜ã€‚æ ¹æ®Sphinx版本的ä¸åŒï¼Œå®ƒåº”该用 ``pip install sphinx_rtd_theme`` å•ç‹¬å®‰è£…。 #) 一些ReST页é¢åŒ…å«æ•°å¦è¡¨è¾¾å¼ã€‚由于Sphinx的工作方å¼ï¼Œè¿™äº›è¡¨è¾¾å¼æ˜¯ä½¿ç”¨ LaTeX 编写的。它需è¦å®‰è£…amsfontså’Œamsmathå®åŒ…,以便显示。 总之,如您è¦å®‰è£…Sphinx 2.4.4版本,应执行:: $ virtualenv sphinx_2.4.4 $ . sphinx_2.4.4/bin/activate (sphinx_2.4.4) $ pip install -r Documentation/sphinx/requirements.txt 在è¿è¡Œ ``. sphinx_2.4.4/bin/activate`` 之åŽï¼Œæ示符将å˜åŒ–,以指示您æ£åœ¨ä½¿ç”¨æ–° 环境。如果您打开了一个新的shell,那么在构建文档之å‰ï¼Œæ‚¨éœ€è¦é‡æ–°è¿è¡Œæ¤å‘½ä»¤ä»¥å† 次进入虚拟环境ä¸ã€‚ 图片输出 -------- å†…æ ¸æ–‡æ¡£æž„å»ºç³»ç»ŸåŒ…å«ä¸€ä¸ªæ‰©å±•ï¼Œå¯ä»¥å¤„ç†GraphVizå’ŒSVGæ ¼å¼çš„图åƒï¼ˆå‚è§ :ref:`sphinx_kfigure_zh` )。 为了让它工作,您需è¦åŒæ—¶å®‰è£…GraphVizå’ŒImageMagick包。如果没有安装这些软件包, 构建系统ä»å°†æž„建文档,但ä¸ä¼šåœ¨è¾“出ä¸åŒ…å«ä»»ä½•å›¾åƒã€‚ PDFå’ŒLaTeX构建 -------------- ç›®å‰åªæœ‰Sphinx 2.4åŠæ›´é«˜ç‰ˆæœ¬æ‰æ”¯æŒè¿™ç§æž„建。 对于PDFå’ŒLaTeXè¾“å‡ºï¼Œè¿˜éœ€è¦ ``XeLaTeX`` 3.14159265版本。(译注:æ¤ç‰ˆæœ¬å·çœŸå®ž å˜åœ¨ï¼‰ æ ¹æ®å‘行版的ä¸åŒï¼Œæ‚¨å¯èƒ½è¿˜éœ€è¦å®‰è£…一系列 ``texlive`` 软件包,这些软件包æ供了 ``XeLaTeX`` 工作所需的最å°åŠŸèƒ½é›†ã€‚ .. _sphinx-pre-install_zh: 检查Sphinxä¾èµ–项 ---------------- 这有一个脚本å¯ä»¥è‡ªåŠ¨æ£€æŸ¥Sphinxä¾èµ–项。如果它认得您的å‘行版,还会æ示您所用å‘è¡Œ 版的安装命令:: $ ./scripts/sphinx-pre-install Checking if the needed tools for Fedora release 26 (Twenty Six) are available Warning: better to also install "texlive-luatex85". You should run: sudo dnf install -y texlive-luatex85 /usr/bin/virtualenv sphinx_2.4.4 . sphinx_2.4.4/bin/activate pip install -r Documentation/sphinx/requirements.txt Can't build as 1 mandatory dependency is missing at ./scripts/sphinx-pre-install line 468. 默认情况下,它会检查htmlå’ŒPDF的所有ä¾èµ–项,包括图åƒã€æ•°å¦è¡¨è¾¾å¼å’ŒLaTeX构建的 需求,并å‡è®¾å°†ä½¿ç”¨è™šæ‹ŸPython环境。html构建所需的ä¾èµ–é¡¹è¢«è®¤ä¸ºæ˜¯å¿…éœ€çš„ï¼Œå…¶ä»–ä¾ èµ–é¡¹åˆ™æ˜¯å¯é€‰çš„。 它支æŒä¸¤ä¸ªå¯é€‰å‚数: ``--no-pdf`` ç¦ç”¨PDF检查; ``--no-virtualenv`` 使用Sphinx的系统打包,而ä¸æ˜¯Python虚拟环境。 Sphinx构建 ========== 生æˆæ–‡æ¡£çš„常用方法是è¿è¡Œ ``make htmldocs`` 或 ``make pdfdocs`` 。还有其它å¯ç”¨ çš„æ ¼å¼ï¼šè¯·å‚阅 ``make help`` 的文档部分。生æˆçš„文档放在 ``Documentation/output`` ä¸‹ç›¸åº”æ ¼å¼çš„å目录ä¸ã€‚ è¦ç”Ÿæˆæ–‡æ¡£ï¼Œæ˜¾ç„¶å¿…须安装Sphinx( ``sphinx-build`` )。è¦è®©HTML输出更漂亮,å¯ä»¥ 使用Read the Docs Sphinx主题( ``sphinx_rtd_theme`` )。对于PDFè¾“å‡ºï¼Œæ‚¨è¿˜éœ€è¦ ``XeLaTeX`` å’Œæ¥è‡ªImageMagick(https://www.imagemagick.org)的 ``convert(1)`` 。 所有这些软件在大多å‘行版ä¸éƒ½å¯ç”¨æˆ–已打包。 è¦ä¼ 递é¢å¤–的选项给Sphinx,å¯ä»¥ä½¿ç”¨makeå˜é‡ ``SPHINXOPTS`` 。例如,使用 ``make SPHINXOPTS=-v htmldocs`` 获得更详细的输出。 è¦åˆ 除生æˆçš„文档,请è¿è¡Œ ``make cleandocs`` 。 编写文档 ======== æ·»åŠ æ–°æ–‡æ¡£å¾ˆå®¹æ˜“ï¼Œåªéœ€ï¼š 1. 在 ``Documentation`` 下æŸå¤„æ·»åŠ ä¸€ä¸ªæ–°çš„ ``.rst`` 文件。 2. 从 ``Documentation/index.rst`` ä¸çš„Sphinx `ä¸»ç›®å½•æ ‘`_ 链接到它。 .. _ä¸»ç›®å½•æ ‘: http://www.sphinx-doc.org/en/stable/markup/toctree.html 对于简å•çš„文档(比如您现在æ£åœ¨é˜…读的文档),这通常已ç»è¶³å¤Ÿå¥½äº†ï¼Œä½†æ˜¯å¯¹äºŽè¾ƒå¤§ 的文档,最好创建一个å目录(或者使用现有的å目录)。例如,图形å系统文档ä½äºŽ ``Documentation/gpu`` 下,拆分为多个 ``.rst`` 文件,并具有从主目录链接æ¥çš„å• ç‹¬ç´¢å¼• ``index.rst`` ï¼ˆæœ‰è‡ªå·±çš„ç›®å½•æ ‘ ``toctree`` )。 请å‚阅 `Sphinx <http://www.sphinx-doc.org/>`_ å’Œ `reStructuredText <http://docutils.sourceforge.net/rst.html>`_ 的文档,以了解如何使用它们。 特别是Sphinx `reStructuredText 基础`_ 这是开始å¦ä¹ 使用reStructuredTextçš„ 好地方。还有一些 `Sphinx ç‰¹æ®Šæ ‡è®°ç»“æž„`_ 。 .. _reStructuredText 基础: http://www.sphinx-doc.org/en/stable/rest.html .. _Sphinx ç‰¹æ®Šæ ‡è®°ç»“æž„: http://www.sphinx-doc.org/en/stable/markup/index.html å†…æ ¸æ–‡æ¡£çš„å…·ä½“æŒ‡å— ------------------ è¿™æ˜¯ä¸€äº›å†…æ ¸æ–‡æ¡£çš„å…·ä½“æŒ‡å—: * 请ä¸è¦è¿‡äºŽç—´è¿·è½¬æ¢æ ¼å¼åˆ°reStructuredText。ä¿æŒç®€å•ã€‚在大多数情况下,文档 åº”è¯¥æ˜¯çº¯æ–‡æœ¬ï¼Œæ ¼å¼åº”足够一致,以便å¯ä»¥è½¬æ¢ä¸ºå…¶ä»–æ ¼å¼ã€‚ * 将现有文档转æ¢ä¸ºreStructuredText时,请尽é‡å‡å°‘æ ¼å¼æ›´æ”¹ã€‚ * 在转æ¢æ–‡æ¡£æ—¶ï¼Œè¿˜è¦æ›´æ–°å†…容,而ä¸ä»…ä»…æ˜¯æ ¼å¼ã€‚ * 请éµå¾ªæ ‡é¢˜ä¿®é¥°ç¬¦çš„顺åºï¼š 1. ``=`` æ–‡æ¡£æ ‡é¢˜ï¼Œè¦æœ‰ä¸Šçº¿:: ======== æ–‡æ¡£æ ‡é¢˜ ======== 2. ``=`` ç« :: ç« æ ‡é¢˜ ====== 3. ``-`` 节:: èŠ‚æ ‡é¢˜ ------ 4. ``~`` å°èŠ‚:: å°èŠ‚æ ‡é¢˜ ~~~~~~~~ 尽管RST没有规定具体的顺åºï¼ˆâ€œæ²¡æœ‰å¼ºåŠ 一个固定数é‡å’Œé¡ºåºçš„èŠ‚æ ‡é¢˜è£…é¥°é£Žæ ¼ï¼Œæœ€ç»ˆ 按照的顺åºå°†æ˜¯å®žé™…é‡åˆ°çš„顺åºã€‚â€ï¼‰ï¼Œä½†æ˜¯æ‹¥æœ‰ä¸€ä¸ªé€šç”¨çº§åˆ«çš„文档更容易éµå¾ªã€‚ * 对于æ’入固定宽度的文本å—(用于代ç æ ·ä¾‹ã€ç”¨ä¾‹ç‰ï¼‰ï¼š ``::`` 用于è¯æ³•é«˜äº®æ„ä¹‰ä¸ å¤§çš„å†…å®¹ï¼Œå°¤å…¶æ˜¯çŸä»£ç 段; ``.. code-block:: <language>`` 用于需è¦è¯æ³•é«˜äº®çš„ 较长代ç å—。对于嵌入到文本ä¸çš„简çŸä»£ç 片段,请使用 \`\` 。 C域 --- **Sphinx C域(Domain)** (name c)适用于C API文档。例如,函数原型: .. code-block:: rst .. c:function:: int ioctl( int fd, int request ) å†…æ ¸æ–‡æ¡£çš„CåŸŸæœ‰ä¸€äº›é™„åŠ ç‰¹æ€§ã€‚ä¾‹å¦‚ï¼Œæ‚¨å¯ä»¥ä½¿ç”¨è¯¸å¦‚ ``open`` 或 ``ioctl`` è¿™æ ·çš„ 通用å称é‡å‘½å函数的引用å称: .. code-block:: rst .. c:function:: int ioctl( int fd, int request ) :name: VIDIOC_LOG_STATUS 函数å称(例如ioctl)ä»ä¿ç•™åœ¨è¾“出ä¸ï¼Œä½†å¼•ç”¨å称从 ``ioctl`` å˜ä¸º ``VIDIOC_LOG_STATUS`` 。æ¤å‡½æ•°çš„索引项也å˜ä¸º ``VIDIOC_LOG_STATUS`` 。 请注æ„,ä¸éœ€è¦ä½¿ç”¨ ``c:func:`` 生æˆå‡½æ•°æ–‡æ¡£çš„交å‰å¼•ç”¨ã€‚由于一些Sphinx扩展的 神奇力é‡ï¼Œå¦‚果给定函数å的索引项å˜åœ¨ï¼Œæ–‡æ¡£æž„建系统会自动将对 ``function()`` 的引用转æ¢ä¸ºäº¤å‰å¼•ç”¨ã€‚å¦‚æžœåœ¨å†…æ ¸æ–‡æ¡£ä¸çœ‹åˆ° ``c:func:`` çš„ç”¨æ³•ï¼Œè¯·åˆ é™¤å®ƒã€‚ 列表 ---- 我们建议使用 *列å¼è¡¨* æ ¼å¼ã€‚ *列å¼è¡¨* æ ¼å¼æ˜¯äºŒçº§åˆ—表。与ASCII艺术相比,它们对 文本文件的读者æ¥è¯´å¯èƒ½æ²¡æœ‰é‚£ä¹ˆèˆ’适。但其优点是易于创建或修改,而且修改的差异 (diff)更有æ„ä¹‰ï¼Œå› ä¸ºå·®å¼‚ä»…é™äºŽä¿®æ”¹çš„内容。 *平铺表* 也是一个二级列表,类似于 *列å¼è¡¨* ,但具有一些é¢å¤–特性: * 列范围:使用 ``cspan`` 修饰,å¯ä»¥é€šè¿‡å…¶ä»–列扩展å•å…ƒæ ¼ * 行范围:使用 ``rspan`` 修饰,å¯ä»¥é€šè¿‡å…¶ä»–行扩展å•å…ƒæ ¼ * è‡ªåŠ¨å°†è¡¨æ ¼è¡Œæœ€å³è¾¹çš„å•å…ƒæ ¼æ‰©å±•åˆ°è¯¥è¡Œå³ä¾§ç©ºç¼ºçš„å•å…ƒæ ¼ä¸Šã€‚若使用 ``:fill-cells:`` 选项,æ¤è¡Œä¸ºå¯ä»¥ä»Ž *自动åˆå¹¶* 更改为 *自动æ’å…¥* ,自动 æ’入(空)å•å…ƒæ ¼ï¼Œè€Œä¸æ˜¯æ‰©å±•åˆå¹¶åˆ°æœ€åŽä¸€ä¸ªå•å…ƒæ ¼ã€‚ 选项: * ``:header-rows:`` [int] æ ‡é¢˜è¡Œè®¡æ•° * ``:stub-columns:`` [int] æ ‡é¢˜åˆ—è®¡æ•° * ``:widths:`` [[int] [int] ... ] 列宽 * ``:fill-cells:`` æ’入缺少的å•å…ƒæ ¼ï¼Œè€Œä¸æ˜¯è‡ªåŠ¨åˆå¹¶ç¼ºå°‘çš„å•å…ƒæ ¼ 修饰: * ``:cspan:`` [int] 扩展列 * ``:rspan:`` [int] 扩展行 下é¢çš„例åæ¼”ç¤ºäº†å¦‚ä½•ä½¿ç”¨è¿™äº›æ ‡è®°ã€‚åˆ†çº§åˆ—è¡¨çš„ç¬¬ä¸€çº§æ˜¯ *è¡¨æ ¼è¡Œ* 。 *è¡¨æ ¼è¡Œ* ä¸ åªå…è®¸ä¸€ä¸ªæ ‡è®°ï¼Œå³è¯¥ *è¡¨æ ¼è¡Œ* ä¸çš„å•å…ƒæ ¼åˆ—表。 *comments* ( ``..`` )和 *targets* 例外(例如引用 ``:ref:`最åŽä¸€è¡Œ <last row_zh>``` / :ref:`最åŽä¸€è¡Œ <last row_zh>` )。 .. code-block:: rst .. flat-table:: è¡¨æ ¼æ ‡é¢˜ :widths: 2 1 1 3 * - 表头 列1 - 表头 列2 - 表头 列3 - 表头 列4 * - è¡Œ1 - å—段1.1 - å—段1.2(自动扩展) * - è¡Œ2 - å—段2.1 - :rspan:`1` :cspan:`1` å—段2.2~3.3 * .. _`last row_zh`: - è¡Œ3 渲染效果: .. flat-table:: è¡¨æ ¼æ ‡é¢˜ :widths: 2 1 1 3 * - 表头 列1 - 表头 列2 - 表头 列3 - 表头 列4 * - è¡Œ1 - å—段1.1 - å—段1.2(自动扩展) * - è¡Œ2 - å—段2.1 - :rspan:`1` :cspan:`1` å—段2.2~3.3 * .. _`last row_zh`: - è¡Œ3 交å‰å¼•ç”¨ -------- 从一页文档到å¦ä¸€é¡µæ–‡æ¡£çš„交å‰å¼•ç”¨å¯ä»¥é€šè¿‡ç®€å•åœ°å†™å‡ºæ–‡ä»¶è·¯å¾„æ¥å®Œæˆï¼Œæ— ç‰¹æ®Šæ ¼å¼ è¦æ±‚。路径å¯ä»¥æ˜¯ç»å¯¹è·¯å¾„或相对路径。ç»å¯¹è·¯å¾„从“Documentation/â€å¼€å§‹ã€‚ä¾‹å¦‚ï¼Œè¦ äº¤å‰å¼•ç”¨æ¤é¡µï¼Œä»¥ä¸‹å†™æ³•çš†å¯ï¼Œå–å†³äºŽå…·ä½“çš„æ–‡æ¡£ç›®å½•ï¼ˆæ³¨æ„ ``.rst`` 扩展å是å¯é€‰ 的):: å‚è§ Documentation/doc-guide/sphinx.rst 。æ¤æ³•å§‹ç»ˆå¯ç”¨ã€‚ 请查看 sphinx.rst ,仅在åŒçº§ç›®å½•ä¸æœ‰æ•ˆã€‚ 请阅读 ../sphinx.rst ,上级目录ä¸çš„文件。 如果è¦ä½¿ç”¨ç›¸å¯¹è·¯å¾„,则需è¦ä½¿ç”¨Sphinxçš„ ``doc`` 修饰。例如,从åŒä¸€ç›®å½•å¼•ç”¨æ¤é¡µ çš„æ“作如下:: å‚è§ :doc:`sphinx文档的自定义链接文本 <sphinx>`. 对于大多数用例,å‰è€…æ˜¯é¦–é€‰ï¼Œå› ä¸ºå®ƒæ›´å¹²å‡€ï¼Œæ›´é€‚åˆé˜…读æºæ–‡ä»¶çš„人。如果您é‡åˆ°ä¸€ 个没有任何特殊作用的 ``:doc:`` 用法,请将其转æ¢ä¸ºæ–‡æ¡£è·¯å¾„。 有关交å‰å¼•ç”¨kernel-doc函数或类型的信æ¯ï¼Œè¯·å‚阅 Documentation/doc-guide/kernel-doc.rst 。 .. _sphinx_kfigure_zh: 图形图片 ======== 如果è¦æ·»åŠ 图片,应该使用 ``kernel-figure`` å’Œ ``kernel-image`` 指令。例如, è¦æ’入具有å¯ç¼©æ”¾å›¾åƒæ ¼å¼çš„图形,请使用SVG(:ref:`svg_image_example_zh` ):: .. kernel-figure:: ../../../doc-guide/svg_image.svg :alt: 简易 SVG 图片 SVG 图片示例 .. _svg_image_example_zh: .. kernel-figure:: ../../../doc-guide/svg_image.svg :alt: 简易 SVG 图片 SVG 图片示例 å†…æ ¸figure(和imageï¼‰æŒ‡ä»¤æ”¯æŒ DOT æ ¼å¼æ–‡ä»¶ï¼Œè¯·å‚阅 * DOT:http://graphviz.org/pdf/dotguide.pdf * Graphviz:http://www.graphviz.org/content/dot-language 一个简å•çš„例å(:ref:`hello_dot_file_zh` ):: .. kernel-figure:: ../../../doc-guide/hello.dot :alt: ä½ å¥½ï¼Œä¸–ç•Œ DOT 示例 .. _hello_dot_file_zh: .. kernel-figure:: ../../../doc-guide/hello.dot :alt: ä½ å¥½ï¼Œä¸–ç•Œ DOT 示例 åµŒå…¥çš„æ¸²æŸ“æ ‡è®°ï¼ˆæˆ–è¯è¨€ï¼‰ï¼Œå¦‚Graphvizçš„ **DOT** ç”± ``kernel-render`` 指令æä¾›:: .. kernel-render:: DOT :alt: 有å‘图 :caption: åµŒå…¥å¼ **DOT** (Graphviz) 代ç digraph foo { "五棵æ¾" -> "国贸"; } 如何渲染å–决于安装的工具。如果安装了Graphviz,您将看到一个矢é‡å›¾åƒã€‚å¦åˆ™ï¼ŒåŽŸå§‹ æ ‡è®°å°†ä½œä¸º *æ–‡å—å—* æ’入(:ref:`hello_dot_render_zh` )。 .. _hello_dot_render_zh: .. kernel-render:: DOT :alt: 有å‘图 :caption: åµŒå…¥å¼ **DOT** (Graphviz) 代ç digraph foo { "五棵æ¾" -> "国贸"; } *render* æŒ‡ä»¤åŒ…å« *figure* 指令ä¸å·²çŸ¥çš„所有选项,以åŠé€‰é¡¹ ``caption`` 。如果 ``caption`` 有值,则æ’入一个 *figure* èŠ‚ç‚¹ï¼Œè‹¥æ— ï¼Œåˆ™æ’入一个 *image* 节点。 如果您想引用它,还需è¦ä¸€ä¸ª ``caption`` (:ref:`hello_svg_render_zh` )。 åµŒå…¥å¼ **SVG**:: .. kernel-render:: SVG :caption: åµŒå…¥å¼ **SVG** æ ‡è®° :alt: å³ä¸Šç®å¤´ <?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" ...> ... </svg> .. _hello_svg_render_zh: .. kernel-render:: SVG :caption: åµŒå…¥å¼ **SVG** æ ‡è®° :alt: å³ä¸Šç®å¤´ <?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" baseProfile="full" width="70px" height="40px" viewBox="0 0 700 400"> <line x1="180" y1="370" x2="500" y2="50" stroke="black" stroke-width="15px"/> <polygon points="585 0 525 25 585 50" transform="rotate(135 525 25)"/> </svg>