如何将目录添加到木星/木星实验室笔记本?

http://ipython.org/ipython-doc/stable/interactive/notebook.html的文件显示

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

然而,我在任何地方都找不到关于如何使用分层标题创建这样一个目录的说明。有办法吗?

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

221004 次浏览

有一个 Ipython 扩展,它为笔记本构造一个目录。它似乎只提供导航,而不是区段折叠。

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

正如 Ian 已经指出的,IPython Notebook 有一个 minrk 扩展的目录。我有一些麻烦,使它的工作,使这个 IPython 笔记本半自动生成的文件,为 minrk 的目录扩展在 Windows 中的文件。它不使用“ curl”-命令或链接,而是编写 * 。Js 和 * 。Css 文件直接放入 IPython Notebook-profile-目录。

在笔记本中有一个部分叫做 ‘ What you need to do’-跟着它,有一个漂亮的浮动目录:)

下面是已经显示的 html 版本: Http://htmlpreview.github.io/?https://github.com/ahambi/140824-toc/blob/master/a%20floating%20table%20of%20contents.htm

这是我的方法,笨重的,因为它是和 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 单元格作为标记单元格:

<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 的参数作为新节的字符串标题,然后运行它。在它之后添加一个标记单元格,并将 genTOCMarkdownCell 的输出复制到开始新部分的标记单元格中。然后转到笔记本顶部附近的 genTOCEntry 单元格并运行它。例如,如果向 genTOCMarkdownCell 执行上面所示的参数并运行它,就会得到这个输出 粘贴到新索引部分的第一个标记单元格:

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


###Introduction

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

[Introduction](#Introduction)

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

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


#TOC


[Introduction](#Introduction)

编辑 TOC 单元格插入链接字符串,然后按 shift-enter,指向新部分的链接将以 Web 链接的形式出现在笔记本目录中,单击它将使浏览器指向新部分。

我经常忘记的一件事是,单击 TOC 中的一行会使浏览器跳转到该单元格,但不会选择该单元格。不管我们点击 TOC 链接时哪个单元格是活动的,它仍然是活动的,所以向下或向上箭头或移位输入表示仍然活动的单元格,而不是我们点击 TOC 链接得到的单元格。

你可以使用 Markdown 和 HTML 手动添加 TOC:

在木星笔记本的顶端创建 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. 安装扩展(包括目录)的 jupyter _ Contrib _ nbextended ;

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

更新:

从最新版本的 jupyter_contrib_nbextensions开始,至少在 conda中你不需要安装 jupyter_nbextensions_configurator,因为它是和那些扩展一起安装的。

我最近创建了一个名为 Jupyter-Navbar的小型木星扩展。它搜索以标记单元格写入的标题,并以分层方式在侧栏中显示指向这些标题的链接。侧边栏是可调整大小和可折叠的。见下面的截图。

它很容易安装,并利用了“自定义”的 JS 和 CSS 代码,每当笔记本电脑被打开时都会执行这些代码,所以您不需要手动运行它。

enter image description here

扩展到指令

简介

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

什么是扩展?

Nbextended 包含一个扩展集合 为你的木星笔记本增加功能。

举几个例子:

  • 目录

  • 可折叠的标题

安装扩展

安装可以通过 Conda 或 PIP 完成

# If conda:
conda install -c conda-forge jupyter_contrib_nbextensions
# or with pip:
pip install jupyter_contrib_nbextensions

您将在木星笔记本菜单中看到新的标签 Nbextensions。取消选中 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)。仅此而已。截图:

choice of "Table of Contents(2)" in Configurable nbextensions

复制 js 和 css 文件

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

jupyter contrib nbextension install --user

切换扩展

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

您可以启用/禁用您选择的扩展:

jupyter nbextension enable <nbextension require path>

具体来说,为了启用目录(目录)扩展,应该:

jupyter nbextension enable toc2/main

安装 Configuration 接口(可选但有用)

正如其文档所说,Nbextensions _ configator为 nbextended 提供了配置接口。

看起来是这样的: nbextensions configurators

如果使用 conda 安装:

conda install -c conda-forge jupyter_nbextensions_configurator

如果你没有 Conda 或者不想通过 Conda 安装,那么做以下两个步骤:

pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user

木星实验室指令

这个问题已经有很多好的答案, 但是他们经常需要调整才能正常使用木星实验室的笔记本电脑。 我写这个答案是为了详细说明包含 ToC 的可能方法 在朱庇特实验室工作和出口的时候,记在笔记本上。

作为侧板

Jupyterlab-toc扩展添加了 ToC 作为侧面板 可以对标题、折叠部分进行编号,并用于导航(参见下面的 gif 演示)。默认情况下,这个扩展包含在 Jupiter 实验室3.0中,在旧版本中,您可以使用以下命令安装它

jupyter labextension install @jupyterlab/toc

enter image description here


作为一个细胞在笔记本上

目前, 这可以手动完成,就像 Matt Dancho 的回答一样, 或自动通过 木星笔记本扩展 经典的笔记本界面。

首先, 将 toc2安装为 Jupyter _ Contrib _ nbextensionsbundle的一部分:

conda install -c conda-forge jupyter_contrib_nbextensions

然后, 发射木星实验室, 转到 Help --> Launch Classic Notebook, 然后打开要在其中添加目录的笔记本。 单击工具栏中的 toc2符号 打开漂浮的目标指令窗口 (如果找不到,请参阅下面的 gif) , 单击齿轮图标并选中 “添加笔记本 ToC 单元格”。 保存笔记本,ToC 单元格将在那里 当你在木星实验室打开它的时候。 插入的单元格是带有 html 的标记单元格, 它不会自动更新。

Toc2的默认选项 可以在“ Nbextensions”选项卡中配置 在经典的笔记本发布页面。 你可以选择给标题编号 并将作战指挥中心作为边栏 (我个人认为看起来更干净)。

enter image description here


在导出的 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

请记住,可以将 shell 命令添加到笔记本单元格中 用叹号字母 abc 0开头, 这样你就可以把这条线粘在笔记本的最后一个单元格里 总是有一个 HTML 文件与一个 ToC 生成 当你点击“运行所有单元格” (或者任何你想从 nbconvert获得的输出)。 这边, 你可以在工作的时候用 jupyterlab-toc导航笔记本, 在出口产品中仍然得到 TOC 而不必使用经典的笔记本界面 (我们中的纯粹主义者)。

注意,配置默认的 toc2选项 如上所述, 没有将改变 nbconver --to html_toc的格式。 你需要在经典的笔记本界面中打开笔记本 用于将元数据写入. ipynb 文件 (导出时 nbConvert 读取元数据) 或者, 您可以手动添加元数据 通过 Jupiter 实验室侧边栏的“笔记本工具”选项卡, 例如:

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

如果您更喜欢 GUI 驱动的方法, 你应该能够打开经典的笔记本 然后按 File --> Save as HTML (with ToC) (不过请注意,这个菜单项不适合我)。


上面的 gif 是从扩展的相应文档链接而来的。

简单的降价解决方案

您可以使用标记超链接跳转到标记标头,而不需要定义 html 标记。不管你的标题中有多少个哈希值,用一个作为超链接。标题中的任何空格都会被连字符 -替换。

创建目录表

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

创建头文件

# Section 1
## Section 2

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

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

这类似于 Matt Dancho 的 回答,但是我总是发现 html 锚点非常复杂。

这个问题已经得到了回答,但是对于像我这样的人来说,这里有一个函数,他们想要一个轻量级的解决方案,可以粘贴到代码单元格中,运行并获取目录,然后复制粘贴到标记单元格中:

import urllib, json
def generate_toc(notebook_path, indent_char="&emsp;"):
is_markdown = lambda it: "markdown" == it["cell_type"]
is_title = lambda it: it.strip().startswith("#") and it.strip().lstrip("#").lstrip()
with open(notebook_path, 'r') as in_f:
nb_json = json.load(in_f)
for cell in filter(is_markdown, nb_json["cells"]):
for line in filter(is_title, cell["source"]):
line = line.strip()
indent = indent_char * (line.index(" ") - 1)
title = line.lstrip("#").lstrip()
url = urllib.parse.quote(title.replace(" ", "-"))
out_line = f"{indent}[{title}](#{url})<br>\n"
print(out_line, end="")