完全用 Markdown 书写笔记本

在 Markdown 中存储 Jupyter 笔记本是可能的。这允许你完全使用 MyST Markdown 定义一个笔记本结构。关于 MyST Markdown 的更多信息,请参见 MyST Markdown 概述

使用 Markdown 的笔记本可以在 Jupyter Book 中读取、执行和缓存(参见 执行并缓存页面 来获取关于如何缓存页面的信息)。 这允许你以文本格式存储你所有的笔记本内容,这对于版本控制软件来说是更好的,同时仍然拥有一个 Jupyter 笔记本的所有功能。

注解

MyST 笔记本使用 [MyST-NB to convert between ipynb and text files][myst-nb:index]。 有关更多信息,请参阅文档。

要查看 MyST 笔记本的示例,您可以查看本文档的许多页面。 例如,查看 ../interactive/hiding.md../content/layout.md

用 Jupytext 创建一个 MyST 笔记本

创建 MyST 笔记本最简单的方法是使用 Jupytext,这是一个允许双向转换 .ipynb 和各种文本文件的工具。

你可以用下面的命令将 .ipynb 文件转换为 MyST 笔记本:

jupytext mynotebook.ipynb --to myst

mynotebook.md 文件的结果将被创建。 这可以作为你书中的一页。

重要

为了与 myst-parser 完全兼容,必须使用 jupytext>=1.6.0

Jupytext 也可以与您的 Markdown 自动同步 .ipynb 文件。 要做到这一点,请使用 Jupyter 接口,如 Jupyter Lab 或经典的笔记本接口,并遵循配对笔记本的 Jupytext 说明

将 Markdown 文件转换为 MyST Markdown

Jupyter Book 有一个小的 CLI,为操作和创建与 Jupytext 同步的 MyST Markdown 文件提供通用功能。将 Jupytext 语法添加到 Markdown 文件中(这将告诉 Jupytext 它是一个 MyST Markdown 文件),运行以下命令:

jupyter-book myst init mymarkdownfile.md --kernel kernelname

如果您没有指定 --kernel,那么如果只有一个可用的默认的内核 将被使用。如果有多个可用内核,则必须手动指定一个。

MyST 笔记本的结构

让我们看一下 Jupytext 创建的结构,您也可以使用它从头创建 MyST 笔记本。首先,让我们看看一个简单的 MyST 笔记本:

---
jupytext:
  formats: md:myst
  text_representation:
    extension: .md
    format_name: myst
kernelspec:
  display_name: Python 3
  language: python
  name: python3
---

# My simple notebook

Some **intro Markdown**!

```{code-cell} ipython3
:tags: [mytag]

print("A python cell")
```

## A section

And some more Markdown...

这里有三个主要部分需要注意:

Frontmatter YAML

MyST 笔记本需要特殊的前端格式的 YAML 来告诉 Jupytext 他们可以被转换成 .ipynb 文件。frontmatter YAML 块:

---
jupytext:
  formats: md:myst
  text_representation:
    extension: .md
    format_name: myst
kernelspec:
  display_name: Python 3
  language: python
  name: python3
---

告诉 Jupytext 此文件是 myst 格式的,并且它的代码应该在 Python 3 内核下运行。

代码单元格

MyST 笔记本中的代码块是用下面的 MyST 指令定义的:

```{code-cell}
your-code
```

您可以选择向代码单元添加额外的元数据,这些元数据将转换在 .ipynb 文件中。例如,你可以像这样在代码单元格中添加标签:

```{code-cell}
:tags: [tag1, tag2, tag3]
your-code
```

您也可以显式地在 {code-cell} 之后传递内核名称,以明确您正在运行的内核。例如:

```{code-cell} python3
your-code
```

但是,请记住,每个页面只允许一个内核。

Markdown 内容

代码单元之间的所有内容都使用MyST Markdown 解析器 解析为 Markdown 内容。查阅 MyST Markdown 概述 获取 MyST Markdown 的更多信息。

要明确地将 Markdown 内容拆分为两个 Markdown 单元格,请使用以下模式:

Content in one Markdown cell

+++

Content in another Markdown cell

您也可以通过在 +++ 后面添加 Python 字典来将元数据附加到单元格。 例如,要向上面的第二个单元格添加标记:

Content in one Markdown cell

+++ {"tags": ["tag1", "tag2", "tag3"]}

Content in another Markdown cell

警告

请注意,在 MyST 文件中通过 +++ 语法指定的单元格中断和元数据只会传播到它们的 .ipynb。在生成书的 HTML 时,Markdown单元格 信息将被丢弃,以避免文档结构中的层次结构冲突。换句话说,只有 code cell 标签对生成的 HTML 有影响。