===================== Sphinx ===================== Why sphinx ========== 之前一直纠结了很久的文档生成器。包括 核心的文档语言包括 + markdown + rst + mdx + org + tex 很显然如果想要简单,选用markdown即可。但是markdown的功能收到限制,因此需要进一步扩展起能力,就得往下。 而mdx虽然很好,交互丰富,但是想来还是使用python更多,因此,最后还是选择了rst. 不过还有包括 [MyST]_ 这种有趣的md扩展。 Install 常用的sphinx扩展 ================================ 常用的设置 .. dropdown:: 我的吐槽 最烦的就是默认功能不开启,需要额外安装,等你想用的时候,查文档才能知道是安装的时候某个功能没有启用。 而且有些功能居然需要你重新编译,这种设置还不如不开启。。。 这里需要注意的就是,你使用的myst-parser,需要开启的插件功能需要安装 linkify-it-py 。 .. code-block:: bash myst_enable_extensions = [ "amsmath", "attrs_inline", "colon_fence", "deflist", "dollarmath", "fieldlist", "html_admonition", "html_image", "linkify", "replacements", "smartquotes", "strikethrough", "substitution", "tasklist", ] .. code-block:: bash uv pip install myst-parser[linkify] \ sphinxcontrib-mermaid \ sphinx_design \ sphinx-copybutton \ sphinxcontrib-bibtex\ sphinx-comments \ sphinxemoji .. code-block:: python extensions=[ "myst_parser", "sphinx_design", "sphinx_copybutton", "sphinxcontrib.bibtex", "sphinx_comments", "sphinxcontrib.mermaid", "sphinxemoji.sphinxemoji", ] html_css_files = [ "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css" ] bibtex_bibfiles = ['refs.bib'] MyST-Parser ----------- 为了支持直接写markdown, 可以引入这个包. 更多的信息查看这个文档. \ `myst-parser `_ sphinxcontrib-mermaid --------------------- 由于在 `MyST-Parser`_ 介绍了关于这个 \ `mermaid `_, 感觉非常好用。 更多的文档,请查看 \ `https://mermaid.js.org/intro/ `_ 例如,生成一个简单的pie图 .. code-block:: markdown .. mermaid:: pie title Pets adopted by volunteers "Dogs" : 386 "Cats" : 85 "Rats" : 15 .. mermaid:: pie title Pets adopted by volunteers "Dogs" : 386 "Cats" : 85 "Rats" : 15 而且这个sphinx的扩展包也支持主题配置,有点6的,具体使用就是在原始的文档中的代码前面加上 \ :code:`.. mermaid::`\的directive就可以了 例如,代码如下: .. code-block:: bash %%{ init: { 'theme': 'base', 'themeVariables': { 'primaryColor': '#BB2528', 'primaryTextColor': '#fff', 'primaryBorderColor': '#7C0000', 'lineColor': '#F8B229', 'secondaryColor': '#006100', 'tertiaryColor': '#fff' } } }%% graph TD A[Christmas] -->|Get money| B(Go shopping) B --> C{Let me think} B --> G[/Another/] C ==>|One| D[Laptop] C -->|Two| E[iPhone] C -->|Three| F[fa:fa-car Car] subgraph section C D E F G end .. mermaid:: %%{ init: { 'theme': 'base', 'themeVariables': { 'primaryColor': '#BB2528', 'primaryTextColor': '#fff', 'primaryBorderColor': '#7C0000', 'lineColor': '#F8B229', 'secondaryColor': '#006100', 'tertiaryColor': '#fff' } } }%% graph TD A[Christmas] -->|Get money| B(Go shopping) B --> C{Let me think} B --> G[/Another/] C ==>|One| D[Laptop] C -->|Two| E[iPhone] C -->|Three| F[fa:fa-car Car] subgraph section C D E F G end sphinx_design ------------- sphinx_design 包括grid,card, dropdown, tab, badegs。 Tabs using sphinx_design ^^^^^^^^^^^^^^^^^^^^^^^^ `Sphinx Design Tabs `_ .. code-block:: bash .. tab-set:: .. tab-item:: MacOS :sync: key1 MacOS .. tab-item:: linux :sync: key2 linux .. tab-item:: windows :sync: key3 windows .. tab-set:: .. tab-item:: Macos :sync: key1 macos .. tab-item:: linux :sync: key2 linux .. tab-item:: windows :sync: key3 windows Tabs using sphinx_tabs (Abandon) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Sphinx Tab 文档 `_ .. note:: 由于sphinx_desin可以实现tab,因此这个extension的可用性比较低,就可以不用了。 .. code-block:: bash .. tabs:: .. tab:: MacOS MacOS .. tab:: Linux Linux .. tab:: Windows Windows Drop using sphinx_design ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Sphinx Design Drop `_ .. code-block:: bash .. dropdown:: Dropdown title Dropdown content .. dropdown:: Dropdown title Dropdown content Card using sphinx_design ^^^^^^^^^^^^^^^^^^^^^^^^ `Sphinx Design Card `_ .. code-block:: bash .. card:: Card Title Header ^^^ Card content +++ Footer .. card:: Card Title Header ^^^ Card content +++ Footer Grid using sphinx design ^^^^^^^^^^^^^^^^^^^^^^^^ `Sphinx Design Grid `_ .. code-block:: bash .. grid:: 2 :gutter: 2 2 2 2 .. grid-item-card:: A .. grid-item-card:: B .. grid:: 2 :gutter: 2 2 2 2 .. grid-item-card:: A .. grid-item-card:: B Badges, Button, Icons using sphinx_design ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Sphinx Design BBI `_ Inline icon roles are available for the `GitHub octicon `_, `Google Material Design Icons `_, or `FontAwesome `_ libraries. + octicon: :octicon:`logo-github;1em;sd-text-info` :code:`:octicon:\`logo-github;1em;sd-text-info\`` + Google Material Design: :material-outlined:`g_translate` :code:`:material-outlined:\`g_translate\`` + FontAwesome: :fab:`fa-brands fa-github-alt` :code:`:fab:\`fa-brands fa-github-alt\`` :bdg:`plain badge` :bdg-primary:`primary`, :bdg-primary-line:`primary-line` :bdg-secondary:`secondary`, :bdg-secondary-line:`secondary-line` :bdg-success:`success`, :bdg-success-line:`success-line` :bdg-info:`info`, :bdg-info-line:`info-line` :bdg-warning:`warning`, :bdg-warning-line:`warning-line` :bdg-danger:`danger`, :bdg-danger-line:`danger-line` :bdg-light:`light`, :bdg-light-line:`light-line` :bdg-dark:`dark`, :bdg-dark-line:`dark-line` .. button-link:: https://hotchilipowder.github.io .. button-link:: https://hotchilipowder.github.io Button text .. button-link:: https://hotchilipowder.github.io :color: primary :shadow: .. button-link:: https://hotchilipowder.github.io :color: primary :outline: .. button-link:: https://hotchilipowder.github.io :color: secondary :expand: sphinx_copybutton ----------------- `Sphinx CopyButton `_ 将会让代码可以被copy sphinx_emoji ------------ `Sphinx Emoji `_ .. Just use |:+1:|, :code:`|:+1:|`. 当然,我也如同 \ `vim-snippets `_\ ,实现了一个类似的版本,可以查询当前的emoji. sphinx comments --------------- `sphinx-comments `_ 因为这个代码是挂载在 \ :code:`sections = document.querySelectorAll("div.section");`\. 因此在需要评论的下方,加一个 .. code-block:: bash .. raw::html
就可以启用这个插件了。 Sphinx with Latex ================= 首先,由于文档很多时候是包括中文的,因此选用 \ :code:`xelatex`\ 而不是 \ :code:`pdflatex`\。然后倒入 \ :code:`ctex`\ . 最简单的设置如下: .. code-block:: bash latex_engine = 'xelatex' latex_elements = { 'preamble': r''' \addto\captionsenglish{\renewcommand{\chaptername}{}} \usepackage[UTF8, scheme = plain]{ctex} ''', } 然后使用 \ :code:`make latexpdf`\ 修改为单个页面的pdf ------------------- 关于定制化单个页面,如何实现latex的有效编译,需要查看手册: \ `Latex customization `_ 例如: .. code-block:: python latex_engine = 'xelatex' latex_elements = { 'passoptionstopackages': r''' \PassOptionsToPackage{svgnames}{xcolor} ''', 'pointsize': '12pt', 'fontpkg': r''' \setmainfont{Georgia} ''', 'maketitle': r''' \date{Fall 2024} \maketitle ''', 'tableofcontents': "", 'preamble': r''' \usepackage{xeCJK} \usepackage{hyperref} \usepackage{url} \raggedbottom % 避免章节之间产生多余的空白页 \setlength{\parskip}{5pt} % 段落之间空格 ''', 'sphinxsetup': r''' TitleColor=DarkGoldenrod ''', 'printindex': r'\footnotesize\raggedright\printindex', } latex_show_urls = 'footnote' latex_documents = [ ('project1/index', 'project1.tex', 'Title 1', 'Author 1', 'howto'), ] latex_additional_files = ["iclr2024_conference.sty"] 特别需要指出的,如果改成了 \ :code:`howto`\ 那么对应的是 article类。 如果是默认的会是 \ :code:`Manual`\。 多个配置文件对于不同的页面 -------------------------- 例如,我们的某个教学项目,包括教程、练习题和代码手册等。 但是上述的单个页面的 \ :code:`conf.py`\ 比较难满足这种需求,因为tex的预加载可能存在差异。 这个时候最好的方式便是分不同的 \ :code:`conf.py`\ , 然后进行处理。 例如,我们可以创建一个 \ :code:`confs/projects/conf.py`\ 然后使用 \ :code:`make latexpdf`\ 的时候指定配置文件 .. code-block:: bash make latexpdf SPHINXOPTS="-c ./confs/projects" Interesting links for sphinx extensions ======================================= Groups for sphinx ----------------- [excutable-book]_ [sphinx-contrib]_ [sympy]_ : 这个是当时找 math + dollar 发现的 github, References ========== .. [MyST] https://github.com/executablebooks/MyST-Parser .. [sphinx-contrib] https://github.com/sphinx-contrib .. [excutable-book] https://github.com/executablebooks .. [sympy] https://github.com/sympy .. raw:: html