mkdocs-jupyter:基于 mkdocs 与 Jupyter 的文档集成项目

Use Jupyter Notebook in mkdocs

分支1Tags42
当前项目代码仓暂无内容

mkdocs-jupyter:在 mkdocs 中使用 Jupyter 笔记本

  • 文档演示站点
  • 直接将 Jupyter 笔记本添加到 mkdocs 导航
  • 支持多种格式:
    • .ipynb.py 文件(使用 jupytext
  • 与常规 Jupyter 笔记本相同的样式
    • 支持 Jupyter 主题
  • 可选择在转换前执行笔记本
  • 支持 ipywidgets
  • 支持 mkdocs 目录(TOC)
  • 可选择包含笔记本源代码

mkdocs-jupyter 默认主题 mkdocs-jupyter 材质主题

安装

pip install mkdocs-jupyter

配置

mkdocs.yml 中,可将 Jupyter 笔记本(.ipynb)或 Python 脚本(.py)用作页面:

nav:
    - Home: index.md
    - Notebook page: notebook.ipynb
    - Python file: python_script.py
plugins:
    - mkdocs-jupyter

标题和目录

Notebook 中的第一个 h1 标题(#)将被用作标题。

# This H1 header will be the the title.

这可以在配置中关闭(这种情况下将使用文件名作为标题):

plugins:
    - mkdocs-jupyter:
          ignore_h1_titles: True

为了能看到目录,你需要在笔记本中保持层级标题结构。你必须使用 h2 标题(##),而不是 h1(#)。

## This H2 title will show in the table of contents

如果您想在 TOC 中嵌套标题,需要在同一个 markdown 单元格的后续位置或新的下方 markdown 单元格中添加额外的标题级别:

## This header will show as top level in the table of contents

<content>

### This one will be displayed inside the above level

包含或忽略文件

您可以通过 glob 模式列表控制要包含或忽略哪些文件:

plugins:
    - mkdocs-jupyter:
          include: ["*.ipynb"] # Default: ["*.py", "*.ipynb"]
          ignore: ["some-irrelevant-files/*.ipynb"]

执行笔记本

您可以告知插件在转换前执行笔记本,默认值为 False

plugins:
    - mkdocs-jupyter:
          execute: true

您可以告知插件忽略某些文件的执行(使用 glob 匹配):

plugins:
    - mkdocs-jupyter:
          execute_ignore:
              - "my-secret-files/*.ipynb"

若要在笔记本执行失败时使构建失败,请将 allow_errors 设置为 false

plugins:
    - mkdocs-jupyter:
          execute: true
          allow_errors: false

内核

默认情况下,插件会使用笔记本中指定的内核来执行它。你可以为所有笔记本指定一个自定义内核名称:

plugins:
    - mkdocs-jupyter:
          kernel_name: python3

忽略代码输入

默认情况下,该插件会显示完整代码和常规的单元格输出详情。你可以对所有笔记本隐藏单元格代码输入:

plugins:
    - mkdocs-jupyter:
          show_input: False

你也可以决定为所有笔记本隐藏 Out[#] 输出标记和其他单元格元数据:

plugins:
    - mkdocs-jupyter:
          no_input: True

您也可以仅隐藏 In[#]Out[#] 提示,但保留输入和输出内容:

plugins:
    - mkdocs-jupyter:
          no_prompt: True

使用标签移除单元格

默认情况下,该插件会显示完整代码和常规单元格输出详情。你可以使用标签为特定单元格隐藏代码输入:

plugins:
    - mkdocs-jupyter:
          remove_tag_config:
              remove_input_tags:
                  - hide_code

有关基于标签删除单元格的更多详细信息,请参见 NbConvert 自定义

Jupyter 主题

您可以配置不同的 Jupyter 主题。例如,如果使用带有 slate 配色方案的 material,您可以使用 Jupyter Lab 的 dark 主题:

plugins:
    - mkdocs-jupyter:
          theme: dark

theme:
    name: material
    palette:
        scheme: slate

额外 CSS 类

此选项会为突出显示代码单元格的 div 容器添加自定义 CSS 类。这有助于为代码单元格添加自定义样式。

plugins:
  - mkdocs-jupyter:
      highlight_extra_classes: "custom-css-classes

RequireJS

默认情况下,RequireJS 未被加载。Plotly 需要此库。 您可以通过以下方式启用它:

plugins:
    - mkdocs-jupyter:
          include_requirejs: true

下载笔记本链接

您可以告知插件包含笔记本源文件,以便在主题中轻松显示下载按钮,默认值为 False

plugins:
    - mkdocs-jupyter:
          include_source: True

此设置还会创建一个 page.nb_url 值,您可以在主题中使用该值在每个页面上创建链接。

例如,在 mkdocs-material 中(请参阅自定义),您可以创建如下 main.html 文件:

{% extends "base.html" %}

{% block content %}
{% if page.nb_url %}
    <a href="{{ page.nb_url }}" title="Download Notebook" class="md-content__button md-icon">
        {% include ".icons/material/download.svg" %}
    </a>
{% endif %}

{{ super() }}
{% endblock content %}

下载笔记本按钮

缓存

默认情况下,插件会缓存笔记本的转换结果,因此未更改的笔记本不会在每次构建时重新转换。缓存键基于笔记本文件内容和所有相关的插件配置选项。

要禁用缓存:

plugins:
    - mkdocs-jupyter:
          cache: false

要更改缓存目录(默认目录为 .cache/mkdocs-jupyter):

plugins:
    - mkdocs-jupyter:
          cache_dir: .cache/custom-dir

之前构建中过时的缓存条目会被自动清理。

样式

此扩展包含 Jupyter Lab nbconvert CSS 样式,并做了一些修改以使其尽可能通用,以便与各种 mkdocs 主题配合使用。但这并非总能实现,我们测试最多的主题是 mkdocs-material

你可能需要进行一些 CSS 更改才能使其达到理想的外观效果,例如对于 material 主题,可参考其 自定义文档

创建一个 main.html 文件,如下所示:

{% extends "base.html" %}

{% block content %}
{{ super() }}

<style>
// Do whatever changes you need here

.jp-RenderedHTMLCommon p {
    color: red
}

</style>
{% endblock content %}

Mkdocs Material 注意事项

任何特定于 Markdown 的功能,例如 提示框, 都无法在 mkdocs-jupyter 中使用,因为这些功能本身不受 Jupyter 支持,而我们是通过 nbconvert 进行转换的。

要使用此类功能,您必须在 Markdown 单元格中直接定义 HTML:

<div class="admonition note">
    <p class="admonition-title">Note</p>
    <p>
        If two distributions are similar, then their entropies are similar,
        implies the KL divergence with respect to two distributions will be
        smaller...
    </p>
</div>