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

时间:2014-01-16 00:54:14

标签: ipython-notebook

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

  

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

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

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

11 个答案:

答案 0 :(得分:57)

您可以使用Markdown和HTML手动添加TOC。以下是我添加的方式:

在Jupyter Notebook顶部创建TOC:

## 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...

这可能不是最好的方法,但它有效。希望这会有所帮助。

答案 1 :(得分:35)

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

答案 2 :(得分:25)

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

答案 3 :(得分:13)

如何使用浏览器插件来概述任何html页面。我尝试过以下方法:

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

答案 4 :(得分:8)

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

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

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

  3. 更新:

    jupyter_contrib_nbextensions的最新版本开始,至少使用conda,您无需安装jupyter_nbextensions_configurator,因为它与这些扩展一起安装。

答案 5 :(得分:7)

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

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

enter image description here

答案 6 :(得分:2)

以下是我的方法,笨拙但在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 cell`下面,将TOC单元格作为降价单元格:

<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参数设置为如上所示并运行它,则会得到此输出 粘贴到新索引部分的第一个降价单元格中:

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

###Introduction

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

[Introduction](#Introduction)

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

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

#TOC

[Introduction](#Introduction)

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

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

答案 7 :(得分:1)

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

笔记本中有一个部分名为'你需要做什么' - 关注它并有一个漂亮的浮动目录:)

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

答案 8 :(得分:1)

简介

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

如果使用conda进行安装:

conda install -c conda-forge jupyter_nbextensions_configurator

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

pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user

答案 9 :(得分:1)

JupyterLab ToC指令

这个问题已经有很多好的答案, 但是他们通常需要进行调整才能在JupyterLab中正常使用笔记本电脑。 我写了这个答案来详细说明包括ToC的可能方式 在JupyterLab中进行工作并从JupyterLab导出时在笔记本中显示。

作为侧面板

扩展名jupyterlab-toc将ToC添加为侧面板 可以对标题,折叠部分进行编号,并可以用于导航(有关示例,请参见下面的gif)。使用以下命令安装

jupyter labextension install @jupyterlab/toc

enter image description here


在笔记本电脑中作为单元格

目前, 这可以按照Matt Dancho的回答手动完成, 或通过toc2 jupyter notebook extension自动 在经典笔记本界面中。

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

conda install -c conda-forge jupyter_contrib_nbextensions

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

toc2的默认选项 可以在“ Nbextensions”标签中配置 在经典笔记本启动页面中。 您可以例如选择编号标题 并将ToC固定为侧边栏 (我个人认为它看上去更干净)。

enter image description here


在导出的HTML文件中

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

jupyter nbconvert file.ipynb --to html_toc

请记住,可以将Shell命令添加到笔记本单元中 给他们加上感叹号!, 所以您可以将这行粘贴在笔记本的最后一个单元格中 并始终生成带有ToC的HTML文件 当您点击“运行所有单元格”时 (或您希望从nbconvert获得的任何输出)。 这条路, 您可以在工作时使用jupyterlab-toc浏览笔记本, 仍然在导出的输出中获得ToC 无需诉诸经典笔记本界面 (对于我们中间的纯粹主义者)。

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

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

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


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

答案 10 :(得分:1)

简单的降价方案

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

创建内容表

# Contents
- [Section 1](#Section-1)
- [Section 2](#Section-2)
- [Section 3](#Section-3)

创建标题

# Section 1
## Section 2

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

### Section 3
[top](#Contents)

这类似于 Matt Dancho 的 answer,但我总是觉得 html 锚点很繁琐。