如何将目录添加到Jupyter / JupyterLab笔记本?


105

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

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

但是,在任何地方都找不到关于如何使用层次结构标题创建此类目录的说明。有没有办法做到这一点?

注意:如果使用ipython笔记本标题,我也会对其他种类的导航感兴趣。例如,从标题到标题来回跳转以快速找到每个节的开始,或隐藏(折叠)整个节的内容。这是我的愿望清单-但是所有导航方式都将很有趣。谢谢!


有关适用于所有网页的一般解决方案,请参见下面的@Nikolay答案。这是一个很好的答案。
ihightower

为了补充现有的Jupyter笔记本解决方案,我在下面添加了JupyterLab说明
joelostblom

Answers:


52

有一个ipython nbextension可以为笔记本构造一个目录。它似乎仅提供导航,而不提供节折叠。


谢谢,我认为这就是文档所指的内容。
user2428107 2014年

2
对于想在jupyter 4中安装它的人,这篇文章可能会有所帮助。
Syrtis Major 2015年

9
只是为了更新此内容:现在有一个nbextensions扩展,它将很多扩展捆绑在一起,并允许您通过jupyter本身进行管理。我认为这是现在获取ToC2的最简单方法。并提供其他相关扩展,例如节折叠。在github.com/ipython-contrib/jupyter_contrib_nbextensions
user2428107

93

您可以使用Markdown和HTML手动添加目录。这是我一直添加的方式:

在Jupyter Notebook顶部创建目录:

## TOC:
* [First Bullet Header](#first-bullet)
* [Second Bullet Header](#second-bullet)

在整个正文中添加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...

它可能不是最好的方法,但它可以工作。希望这可以帮助。


15
这对我不再有用,但是类似的方法可以
joelostblom

2
也与此相同的“类似方法”:stackoverflow.com/questions/5319754/…tl ; dr:<a name="pookie"></a>用于锚点和链接使用:Take me to [pookie](#pookie)
迈克尔

2
对于减价中的所有标题,笔记本会自动添加锚点。当您将鼠标悬停在标题上时,可以单击标题右侧的pilcrow(¶),以在浏览器地址栏中显示锚点。您可以使用此锚,而不是手动将锚添加到降价部分。最好的是,它可以跨单元工作。
aaruja

1
我有这个脚本add_toc.py,它在顶部添加了一个markdown单元格并带有内容列表。如果您不想安装扩展程序,那么穷人的解决方案。
user2148414


18

如何使用可为您提供任何html页面概述的浏览器插件。我尝试了以下方法:

它们对于IPython Notebook都工作得很好。我不愿意使用以前的解决方案,因为它们似乎有点不稳定,最终使用了这些扩展。


1
很有帮助!但是某些内置功能非常有意义-尤其是与markdown结合使用时
-dmeu

13

我最近为Jupyter创建了一个名为jupyter-navbar的小型扩展。它搜索写在markdown单元中的标题,并在侧栏中以分层方式显示指向它们的链接。边栏可调整大小且可折叠。请参见下面的屏幕截图。

它很容易安装,并利用了每当打开笔记本时都会执行的“自定义” JS和CSS代码,因此您无需手动运行它。

在此处输入图片说明


1
确实,它易于安装,并且源代码也很友好。不错的项目!
卡森

13

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

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

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

更新:

从的最新版本开始jupyter_contrib_nbextensions,至少conda不需要安装,jupyter_nbextensions_configurator因为它与这些扩展名一起安装。


9

JupyterLab ToC说明

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

作为侧板

所述jupyterlab-TOC扩展增加该罐号标题,崩溃的部分,和被用于导航(见下文的gif用于演示)ToC的作为侧板。使用以下命令安装

jupyter labextension install @jupyterlab/toc

在此处输入图片说明


在笔记本中作为单元

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

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

conda install -c conda-forge jupyter_contrib_nbextensions

然后,启动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 nbconvert file.ipynb --to html_toc
# Append `--ExtractOutputPreprocessor.enabled=False`
# to get a single html file instead of a separate directory for images

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

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

    "toc": {
        "number_sections": false,
        "sideBar": true
    }

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


上面的gif从扩展的相应文档中链接。


我更喜欢使用jupyter lab,但是需要将TOC添加到大型笔记本HTML输出中。这完美无瑕!还有一些其他步骤来使其正常运行:1.启用TOC2,例如conda install -c conda-forge jupyter_nbextensions_configurator,转到http://localhost:8888/nbextensions,取消选中“兼容性”并启用“ Toc2” 。2.启动Classical Notebbok,根据需要修改TOC设置,并Add TOC to Cell(按说明进行)。3.打开.ipynb文件,搜索"toc",复制json toc配置并使用Jupyter实验室的
Alex

6

介绍

正如@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

复制js和CSS文件

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

jupyter contrib nbextension install --user

切换扩展

请注意,如果您不熟悉终端,最好安装nbextensions配置器(请参阅下一节)

您可以启用/禁用您选择的扩展名。如文档所述,通用命令为:

jupyter nbextension enable <nbextension require path>

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

jupyter nbextension enable toc2/main

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

如其文档所述,nbextensions_configurator提供了nbextensions的配置接口。

看起来如下: nbextensions配置器

如果使用conda进行安装:

conda install -c conda-forge jupyter_nbextensions_configurator

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

pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user

这是一个很好的详细答案。我想启用toc2/main与在localhost:8888 / tree#nbextensions_configurator上检查“目录(2)” 相同
flow2k

4

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

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

from IPythonTOC import IPythonTOC

toc = IPythonTOC()

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

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

print toc.genTOCEntry()

在genTOCEntry单元下方,将TOC单元作为markdown单元:

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

#TOC

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

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

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

!cat TOCMarkdownCell.txt

!rm TOCMarkdownCell.txt

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

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

###Introduction

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

[Introduction](#Introduction)

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

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

#TOC

[Introduction](#Introduction)

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

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


2

正如Ian已经指出的那样,minrk为IPython Notebook提供了一个目录扩展。我在使其工作时遇到了一些麻烦,并制作了这个IPython Notebook,它可以在Windows中半自动生成minrk目录扩展的文件。它不使用'curl'命令或链接,而是将* .js和* .css文件直接写入您的IPython Notebook-profile-目录。

笔记本中有一个名为“您需要做什么”的部分 -遵循它,并有一个漂亮的浮动目录:)

这是已经显示它的html版本:http : //htmlpreview.github.io/?https : //github.com/ahambi/140824-TOC/blob/master/A%20floating%20table%20of%20contents.htm

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.