如何在ipython笔记本中添加目录?

use*_*107 81 ipython-notebook

http://ipython.org/ipython-doc/stable/interactive/notebook.html上的文档说

您可以使用不同级别的标题为整个计算文档提供概念结构; 有6个级别,从1级(顶级)到6级(段落).这些可以在以后用于构建目录等.

但是,我无法在任何地方找到有关如何使用我的分层标题来创建此类目录的说明.有没有办法做到这一点?

注意:我也对使用ipython笔记本标题的其他导航感兴趣,如果有的话.例如,从标题跳回到标题以快速找到每个部分的开头,或者隐藏(折叠)整个部分的内容.这是我的愿望清单 - 但任何类型的导航都会引起人们的兴趣.谢谢!

Mat*_*cho 70

您可以使用Markdown和HTML手动添加TOC.这是我一直在添加的方式:

在Jupyter Notebook的顶部创建TOC:

## TOC:
* [First Bullet Header](#first-bullet)
* [Second Bullet Header](#second-bullet)
Run Code Online (Sandbox Code Playgroud)

在整个身体中添加html锚点:

## First Bullet Header <a class="anchor" id="first-bullet"></a>

code blocks...

## Second Bullet Header <a class="anchor" id="second-bullet"></a>

code blocks...
Run Code Online (Sandbox Code Playgroud)

它可能不是最好的方法,但它有效.希望这可以帮助.

  • 这对我来说不再适用,但[类似方法](/sf/ask/836377181/#33433098). (11认同)
  • 对于降价中的所有标题,笔记本会自动添加锚点。您可以单击当您将鼠标悬停在标题上时看到的标题右侧的 pilcrow (¶),以显示浏览器地址栏中的锚点。您可以使用此锚点,而不是手动将锚点添加到 Markdown 的部分。最好的一点是它可以跨细胞工作。 (4认同)
  • 也与此相同的“类似方法”:/sf/ask/372382811/#7335259 tl;dr:使用`&lt;a name="pookie"&gt; &lt;/a&gt;` 用于锚点和链接使用:`Take me to [pookie](#pookie)` (3认同)
  • 我有这个脚本 [add_toc.py](https://github.com/gerbaudo/python-scripts/blob/master/various/add_toc.py),它在顶部添加一个带有内容列表的降价单元格。如果您不想安装扩展,那么这是一个穷人的解决方案。 (2认同)

Ian*_*Ian 43

有一个ipython nbextension构建了一个笔记本的目录.它似乎只提供导航,而不是折叠.

  • 只是为了更新这个:现在有一个nbextensions扩展,它将很多扩展捆绑在一起,并允许你通过jupyter本身来管理它们.我认为这是获得ToC2的最简单方法.它还提供其他相关扩展,例如剖面折叠.它在https://github.com/ipython-contrib/jupyter_contrib_nbextensions (8认同)
  • 对于谁想要在jupyter 4中安装它,[这篇文章](http://stackoverflow.com/questions/21188698/what-happend-to-the-toc-extension-for-ipython-notebook/33051798#33051798)可能救命. (2认同)

joe*_*lom 39

JupyterLab ToC 说明

这个问题已经有很多很好的答案,但它们通常需要调整才能在 JupyterLab 中与笔记本一起正常工作。我写这个答案是为了详细说明在 JupyterLab 中工作和从 JupyterLab 导出时在笔记本中包含 ToC 的可能方法。

作为侧板

所述jupyterlab-TOC扩展增加该罐号标题,崩溃的部分,和被用于导航(见下文的gif用于演示)ToC的作为侧板。自 JupyterLab 3.0 起默认包含此扩展,在旧版本中,您可以使用以下命令安装它

jupyter labextension install @jupyterlab/toc
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


在笔记本中作为一个单元格

目前,这可以像 Matt Dancho 的回答那样手动完成,也可以通过 经典笔记本界面中的toc2 jupyter 笔记本扩展自动完成。

首先,将 toc2 作为jupyter_contrib_nbextensions 包的一部分安装:

conda install -c conda-forge jupyter_contrib_nbextensions
Run Code Online (Sandbox Code Playgroud)

然后,启动 JupyterLab,转到Help --> Launch Classic Notebook,然后打开要添加 ToC 的笔记本。单击工具栏中的 toc2 符号以调出浮动 ToC 窗口(如果找不到,请参阅下面的 gif),单击齿轮图标并选中“添加笔记本 ToC 单元格”框。保存笔记本,当您在 JupyterLab 中打开它时,ToC 单元将在那里。插入的单元格是一个带有html的markdown单元格,它不会自动更新。

可以在经典笔记本启动页面的“Nbextensions”选项卡中配置 toc2 的默认选项。例如,您可以选择对标题进行编号并将 ToC 锚定为侧栏(我个人认为这看起来更简洁)。

在此处输入图片说明


在导出的 HTML 文件中

nbconvert可用于按照如何格式化导出的 HTML 的规则将笔记本导出为 HTML。toc2上面提到的扩展添加了一个名为 的导出格式html_toc,可以直接nbconvert从命令行使用(toc2安装扩展后):

jupyter labextension install @jupyterlab/toc
Run Code Online (Sandbox Code Playgroud)

请记住,可以通过在笔记本单元格前面加上感叹号来将 shell 命令添加到笔记本单元格中!,因此您可以将此行粘贴在笔记本的最后一个单元格中,并且在您点击“运行所有单元格”时始终生成一个带有 ToC 的 HTML 文件(或您想要的任何输出nbconvert)。这样,您可以jupyterlab-toc在工作时使用导航笔记本,并且仍然可以在导出的输出中获取 ToC,而不必求助于经典的笔记本界面(对于我们中间的纯粹主义者)。

请注意,如上所述配置默认的 toc2 选项不会更改nbconver --to html_toc. 您需要在经典笔记本界面中打开笔记本才能将元数据写入 .ipynb 文件(nbconvert 在导出时读取元数据)或者,您可以通过 JupyterLab 侧边栏的笔记本工具选项卡手动添加元数据,例如某些东西喜欢:

    "toc": {
        "number_sections": false,
        "sideBar": true
    }
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢 GUI 驱动的方法,您应该能够打开经典笔记本并单击File --> Save as HTML (with ToC) (但请注意,此菜单项对我不可用)。


上面的 gif 链接来自扩展的相应文档。


Ana*_*eri 27

这是一个没有太多JS麻烦的选择:https://github.com/kmahelona/ipython_notebook_goodies


Nik*_*lay 16

如何使用浏览器插件,为您提供任何HTML页面的概述.我尝试过以下方法:

它们都适用于IPython笔记本电脑.我不愿意使用以前的解决方案,因为它们看起来有点不稳定,最终使用这些扩展.

  • 很有帮助!但是一些内置函数会很有意义 - 特别是在与 markdown 结合使用时 (2认同)

D A*_*lls 15

简单的降价解决方案

您可以使用 Markdown 超链接跳转到 Markdown 标头,而无需定义 html 标签。无论#标题中有多少个哈希值,都请使用一个作为超链接。标题中的任何空格都将替换为连字符-

创建内容表

# Contents
- [Section 1](#Section-1)
- [Section 2](#Section-2)
- [Section 3](#Section-3)
Run Code Online (Sandbox Code Playgroud)

创建标题

# Section 1
Run Code Online (Sandbox Code Playgroud)
## Section 2
Run Code Online (Sandbox Code Playgroud)

您还可以添加返回内容的超链接。

### Section 3
[top](#Contents)
Run Code Online (Sandbox Code Playgroud)

这与 Matt Dancho 的答案类似,但我总是发现 html 锚点很繁琐。


Key*_*r00 14

nbextensions ToC 说明

介绍

正如@Ian 和@Sergey 所提到的,nbextensions是一个简单的解决方案。为了详细说明他们的答案,这里有更多信息。

什么是 nbextensions?

nbextensions 包含一组扩展,可以为您的 Jupyter 笔记本添加功能。

例如,仅举几个扩展:

  • 目录

  • 可折叠标题

安装 nbextensions

安装可以通过 Conda 或 PIP 完成

# If conda:
conda install -c conda-forge jupyter_contrib_nbextensions
# or with pip:
pip install jupyter_contrib_nbextensions
Run Code Online (Sandbox Code Playgroud)

您将Nbextensions在 jupyter notebook 菜单中看到新选项卡。取消选中顶部的复选框,disable configuration for nbextensions without explicit compatibility (they may break your notebook environment, but can be useful to show for nbextension development)然后选中Table of Contents(2)。就这些。截屏:

在 Configurable nbextensions 中选择“目录(2)”

复制js和css文件

要将 nbextensions 的 javascript 和 css 文件复制到 jupyter 服务器的搜索目录中,请执行以下操作:

jupyter contrib nbextension install --user
Run Code Online (Sandbox Code Playgroud)

切换扩展

注意,如果你对终端不熟悉,最好安装nbextensions configurator(见下一节)

您可以启用/禁用您选择的扩展。正如文档中提到的,通用命令是:

jupyter nbextension enable <nbextension require path>
Run Code Online (Sandbox Code Playgroud)

具体来说,要启用 ToC(目录)扩展,请执行以下操作:

jupyter nbextension enable toc2/main
Run Code Online (Sandbox Code Playgroud)

安装配置界面(可选但有用)

正如其文档所说,nbextensions_configuratornbextensions提供了配置接口。

它看起来像下面这样: nbextensions 配置器

如果您使用 conda,要安装它:

conda install -c conda-forge jupyter_nbextensions_configurator
Run Code Online (Sandbox Code Playgroud)

如果您没有 Conda 或不想通过 Conda 安装,请执行以下 2 个步骤:

pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很棒且详细的答案。我猜启用 `toc2/main` 与在 http://localhost:8888/tree#nbextensions_configurator 上检查“目录 (2)”相同。 (2认同)

Ser*_*rov 11

现在有两个可用于处理Jupyter扩展的包:

  1. 安装扩展的jupyter_contrib_nbextensions,包括目录;

  2. jupyter_nbextensions_configurator,提供图形用户界面,用于配置启用哪些nbextensions(为每个笔记本自动加载),并提供控制以配置nbextensions的选项.


Sho*_*alt 10

我最近为Jupyter创建了一个名为jupyter-navbar的小扩展.它搜索以降价单元格编写的标题,并以分层方式显示侧栏中的链接.侧边栏可调整大小并可折叠.见下面的截图.

它易于安装,并且可以利用每当打开笔记本时执行的"自定义"JS和CSS代码,因此您无需手动运行它.

在此输入图像描述

  • 事实上它很容易安装,而且源代码也很友好。好项目! (2认同)

小智 5

这是我的方法,尽管很笨拙,但可以在github中找到:

放入第一个笔记本单元,即导入单元:

from IPythonTOC import IPythonTOC

toc = IPythonTOC()
Run Code Online (Sandbox Code Playgroud)

在导入单元格之后的某个位置,放入 genTOCEntry 单元格,但不要运行它:

''' if you called toc.genTOCMarkdownCell before running this cell, 
the title has been set in the class '''

print toc.genTOCEntry()
Run Code Online (Sandbox Code Playgroud)

在 genTOCEntry 单元下方,创建一个 TOC 单元作为 Markdown 单元:

<a id='TOC'></a>

#TOC
Run Code Online (Sandbox Code Playgroud)

随着笔记本的开发,将此 genTOCMarkdownCell 放在开始新部分之前:

with open('TOCMarkdownCell.txt', 'w') as outfile:

    outfile.write(toc.genTOCMarkdownCell('Introduction'))

!cat TOCMarkdownCell.txt

!rm TOCMarkdownCell.txt
Run Code Online (Sandbox Code Playgroud)

将 genTOCMarkdownCell 向下移动到笔记本中要开始新部分的位置,并将 genTOCMarkdownCell 的参数设置为新部分的字符串标题,然后运行它。在其后面添加一个 Markdown 单元格,并将 genTOCMarkdownCell 的输出复制到开始新部分的 Markdown 单元格中。然后转到笔记本顶部附近的 genTOCEntry 单元并运行它。例如,如果您将参数设置为如上所示的 genTOCMarkdownCell 并运行它,您将获得以下输出并将其粘贴到新索引部分的第一个 Markdown 单元格中:

<a id='Introduction'></a>

###Introduction
Run Code Online (Sandbox Code Playgroud)

然后,当您转到笔记本顶部并运行 genTocEntry 时,您会得到输出:

[Introduction](#Introduction)
Run Code Online (Sandbox Code Playgroud)

复制此链接字符串并将其粘贴到 TOC markdown 单元格中,如下所示:

<a id='TOC'></a>

#TOC

[Introduction](#Introduction)
Run Code Online (Sandbox Code Playgroud)

编辑 TOC 单元格以插入链接字符串,然后按 Shift-Enter 后,新部分的链接将作为 Web 链接显示在笔记本的目录中,单击它会将浏览器定位到新部分。

我经常忘记的一件事是,单击目录中的一行会使浏览器跳转到该单元格,但不会选择它。当我们单击 TOC 链接时,任何处于活动状态的单元格仍然处于活动状态,因此向下或向上箭头或 Shift-Enter 指的是仍然活动的单元格,而不是我们通过单击 TOC 链接获得的单元格。