Как я могу добавить оглавление в записную книжку Jupyter / JupyterLab?

Документация по адресу http://ipython.org/ipython-doc/stable/interactive/notebook.html говорит

Вы можете предоставить концептуальную структуру для вашего вычислительного документа в целом, используя разные уровни заголовков; доступно 6 уровней, от уровня 1 (верхний уровень) до уровня 6 (параграф). Их можно использовать позже для построения оглавлений и т. Д.

Однако я нигде не могу найти инструкций о том, как использовать мои иерархические заголовки для создания такого оглавления. Есть ли способ сделать это?

NB: Мне также были бы интересны другие виды навигации с использованием заголовков блокнотов ipython, если таковые существуют. Например, переход назад и вперед от заголовка к заголовку, чтобы быстро найти начало каждого раздела, или скрытие (сворачивание) содержимого всего раздела. Это мой список желаний, но любая навигация была бы интересна. Спасибо!


person user2428107    schedule 16.01.2014    source источник
comment
см. ответ @Nikolay ниже для получения общего решения, которое работает на всех веб-страницах .. это отличный ответ.   -  person ihightower    schedule 21.06.2017
comment
Чтобы дополнить существующие решения для ноутбуков Jupyter, я добавил ниже инструкции JupyterLab.   -  person joelostblom    schedule 11.12.2019


Ответы (11)


Существует ipython nbextension, который создает оглавление для записной книжки. Кажется, он обеспечивает только навигацию, а не сворачивание разделов.

person Ian    schedule 16.01.2014
comment
Спасибо, я полагаю, это то, о чем говорилось в документации. - person user2428107; 18.01.2014
comment
Для тех, кто хочет установить его в jupyter 4, этот пост может помочь. - person Syrtis Major; 10.10.2015
comment
Просто чтобы обновить это: теперь есть расширение nbextensions, которое объединяет множество расширений вместе и позволяет вам управлять ими через сам jupyter. Я думаю, что сейчас это самый простой способ получить ToC2. И он обеспечивает другие соответствующие расширения, такие как складывание секций. Это на github.com/ipython-contrib/jupyter_contrib_nbextensions. - person user2428107; 30.03.2017

Вы можете добавить оглавление вручную с помощью 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...

Возможно, это не лучший подход, но он работает. Надеюсь это поможет.

person Matt Dancho    schedule 02.10.2016
comment
У меня это больше не работает, но похожий подход делает. - person joelostblom; 24.05.2017
comment
также такой же подход, как этот: stackoverflow.com/questions/5319754/ tl; dr: используйте <a name="pookie"></a> для привязки и для использования ссылки: Take me to [pookie](#pookie) - person michael; 24.05.2017
comment
Блокнот автоматически добавляет привязки ко всем заголовкам в вашей уценке. Вы можете нажать на значок (¶) справа от заголовков, которые вы видите при наведении на них курсора, чтобы открыть якорь в адресной строке браузера. Вы можете использовать эту привязку вместо того, чтобы вручную добавлять привязки к разделам вашей уценки. Также лучше всего то, что он работает по ячейкам. - person aaruja; 11.04.2020
comment
У меня есть этот скрипт add_toc.py, который добавляет ячейка уценки вверху со списком содержимого. Решение для бедняков, если вы не хотите устанавливать расширения. - person user2148414; 01.05.2020

Вот еще один вариант без особых проблем с JS: https://github.com/kmahelona/ipython_notebook_goodies

person Anaderi    schedule 05.03.2014
comment
Это очень полезно для записных книжек, которыми вы делитесь с другими людьми! - person rerx; 19.01.2018
comment
Супер полезно +1 - person Minstein; 05.11.2020
comment
Если вы используете Jupyter Lab (не Notebook) и хотите использовать эту опцию JS, следуйте инструкциям в этом выпуске, чтобы заставить ее работать (информация на странице README не работает для Lab): github.com/kmahelona/ipython_notebook_goodies/issues/ - person Haskan; 19.02.2021

Инструкции JupyterLab ToC

На этот вопрос уже есть много хороших ответов, но они часто требуют настройки для правильной работы с блокнотами в JupyterLab. Я написал этот ответ, чтобы подробно описать возможные способы включения ToC в записную книжку во время работы и экспорта из JupyterLab.

Как боковая панель

Расширение jupyterlab-toc добавляет ToC в качестве боковой панели, которая может нумеровать заголовки, сворачивать разделы и использоваться для навигации (см. гифку ниже для демонстрации). Это расширение включено по умолчанию, начиная с JupyterLab 3.0, в более старой версии вы можете установить его с помощью следующей команды

jupyter labextension install @jupyterlab/toc

 введите описание изображения здесь


В записной книжке как клетка

В настоящее время это можно сделать либо вручную, как в ответе Мэтта Данчо, либо автоматически через toc2 jupyter notebook extension в классическом интерфейсе записной книжки.

Сначала установите toc2 как часть пакета jupyter_contrib_nbextensions:

conda install -c conda-forge jupyter_contrib_nbextensions

Затем запустите JupyterLab, перейдите к Help --> Launch Classic Notebook и откройте записную книжку, в которую вы хотите добавить ToC. Щелкните символ toc2 на панели инструментов, чтобы открыть плавающее окно ToC (см. Рисунок ниже, если вы не можете его найти), щелкните значок шестеренки и установите флажок Добавить ячейку ToC для записной книжки. Сохраните записную книжку, и ячейка ToC будет там, когда вы откроете ее в JupyterLab. Вставленная ячейка является ячейкой уценки с HTML в ней, она не будет обновляться автоматически.

Параметры toc2 по умолчанию можно настроить на вкладке Nbextensions на классической странице запуска записной книжки. Вы можете, например, выберите нумеровать заголовки и привязать 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

Помните, что команды оболочки могут быть добавлены в ячейки записной книжки, поставив перед ними восклицательный знак !, чтобы вы могли вставить эту строку в последнюю ячейку записной книжки и всегда иметь HTML-файл с ToC, сгенерированным при нажатии кнопки «Выполнить все ячейки» (или любой результат, который вы хотите от nbconvert). Таким образом, вы можете использовать jupyterlab-toc для навигации по записной книжке во время работы и по-прежнему получать ToCs в экспортированном выводе, не прибегая к использованию классического интерфейса записной книжки (для пуристов среди нас).

Обратите внимание, что настройка параметров toc2 по умолчанию, как описано выше, не изменяет формат nbconver --to html_toc. Вам нужно открыть записную книжку в классическом интерфейсе записной книжки, чтобы метаданные были записаны в файл .ipynb (nbconvert считывает метаданные при экспорте). Кроме того, вы можете добавить метаданные вручную через вкладку «Инструменты записной книжки» на боковой панели JupyterLab, например что-то вроде:

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

Если вы предпочитаете подход, основанный на графическом интерфейсе пользователя, у вас должна быть возможность открыть классический блокнот и щелкнуть File --> Save as HTML (with ToC) (хотя обратите внимание, что этот пункт меню был недоступен для меня).


На приведенные выше гифки есть ссылки из соответствующей документации расширений.

person joelostblom    schedule 11.12.2019
comment
Я предпочитаю работать с jupyter lab, но мне нужно было добавить оглавление в большой 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 lab - person Alex; 13.03.2020
comment
Я не мог заставить расширение toc2 работать в классическом ноутбуке, чтобы добавить ячейку TOC. Однако экспорт записной книжки с помощью nbconvert --to html_toc работал. Формат отличный и добавляет красивое оглавление сбоку, а также номера заголовков. - person aimfeld; 09.09.2020

Как насчет использования плагина браузера, который дает вам обзор ЛЮБОЙ HTML-страницы. Я пробовал следующее:

Оба они очень хорошо работают с ноутбуками IPython. Я не хотел использовать предыдущие решения, поскольку они казались немного нестабильными, и в конечном итоге использовал эти расширения.

person Nikolay    schedule 03.07.2015
comment
Очень полезно! Но некоторые встроенные функции будут иметь такой смысл, особенно в сочетании с уценкой. - person dmeu; 15.02.2016
comment
мой любимый ответ - person Dr_Hope; 20.10.2020
comment
потрясающе умный! - person Oleg; 08.11.2020

Недавно я создал небольшое расширение для Jupyter под названием jupyter-navbar. Он ищет заголовки, записанные в ячейках уценки, и отображает ссылки на них на боковой панели в иерархическом порядке. Размер боковой панели можно изменять, и она складывается. См. Снимок экрана ниже.

Его легко установить, и он использует «пользовательские» коды JS и CSS, которые запускаются при каждом открытии записной книжки, поэтому вам не нужно запускать его вручную.

введите описание изображения здесь

person Shovalt    schedule 30.01.2018
comment
Действительно, его легко установить, и исходный код тоже дружелюбен. Хороший проект! - person Carson; 16.06.2020
comment
Спасибо! очень хорошая работа, это, безусловно, лучшее решение, от которого я мог дождаться оглавления. Я должен сказать, что nbextensions работали для меня, пока muy notebook не становился все больше и больше, ваше решение, как я уже сказал, идеальное и простое. еще раз спасибо за вашу хорошую работу. - person pabloverd; 26.10.2020
comment
вау, это большое спасибо за твой подарок. Да светит тебе благодать. - person clancy; 10.12.2020
comment
Потрясающие. Было бы здорово, если бы что-то подобное было встроено в Jupyter. - person Bryan P; 16.01.2021
comment
Очень прост в установке и использовании. - person Pedro Alonso; 06.06.2021

Теперь есть два пакета, которые можно использовать для обработки расширений Jupyter:

  1. jupyter_contrib_nbextensions, устанавливающий расширения, включая оглавление;

  2. jupyter_nbextensions_configurator, который предоставляет графический пользовательский интерфейс для настройки того, какие nbextensions включены (загружаются автоматически для каждого ноутбука) и предоставляет элементы управления для настройки параметров nbextensions.

ОБНОВИТЬ:

Начиная с последних версий jupyter_contrib_nbextensions, по крайней мере, с conda вам не нужно устанавливать jupyter_nbextensions_configurator, потому что он устанавливается вместе с этими расширениями.

person Sergey Zakharov    schedule 16.05.2017
comment
А затем, выбирая 1.), убедитесь, что вы разрешили использование расширений без явной совместимости (снимите флажок вверху). Затем выберите «Содержание» (2). См. Подробности в ответе @ KeyMaker00. - person questionto42; 05.11.2020

Инструкции ToC nbextensions

Вступление

Как отметили @Ian и @Sergey, nbextensions - это простое решение. Чтобы уточнить свой ответ, вот еще несколько сведений.

Что такое nbextensions?

Nbextensions содержит набор расширений, которые добавляют функциональность вашей записной книжке Jupyter.

Например, просто чтобы процитировать несколько расширений:

  • # P5 #
  • # P6 #

Установить nbextensions

Установка может производиться через Conda или PIP.

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

Вы увидите новую вкладку Nbextensions в меню блокнота jupyter. Снимите флажок вверху 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). Это все. Скриншот:

выбор содержания (2) в настраиваемых расширениях

Скопируйте файлы js и css

Чтобы скопировать файлы javascript и css nbextensions в каталог поиска сервера jupyter, выполните следующие действия:

jupyter contrib nbextension install --user

Переключить расширения

Обратите внимание: если вы не знакомы с терминалом, лучше установить конфигуратор nbextensions (см. следующий раздел)

Вы можете включить / отключить расширения по вашему выбору. Как упоминается в документации, общая команда:

jupyter nbextension enable <nbextension require path>

Конкретно, чтобы включить расширение ToC (Table of Contents), выполните:

jupyter nbextension enable toc2/main

Установите интерфейс конфигурации (необязательно, но полезно)

Как указано в документации, nbextensions_configurator предоставляет интерфейсы конфигурации для расширений.

Это выглядит так:  конфигураторы nbextensions

Чтобы установить его, если вы используете conda:

conda install -c conda-forge jupyter_nbextensions_configurator

Если у вас нет Conda или вы не хотите устанавливать через Conda, выполните следующие 2 шага:

pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user
person KeyMaker00    schedule 15.06.2019
comment
Это отличный и подробный ответ. Я предполагаю, что включение toc2/main аналогично проверке Оглавления (2) на localhost: 8888 / tree # nbextensions_configurator. - person flow2k; 20.08.2019

Вот мой неуклюжий подход, доступный в 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)

После того, как вы отредактируете ячейку оглавления, чтобы вставить строку ссылки, а затем нажмете shift-enter, ссылка на ваш новый раздел появится в вашем оглавлении записной книжки в виде веб-ссылки, и щелчок по ней переместит браузер в ваш новый раздел.

Одна вещь, которую я часто забываю, это то, что щелчок по строке в оглавлении заставляет браузер переходить к этой ячейке, но не выбирает ее. Какая бы ячейка ни была активна, когда мы щелкнули ссылку оглавления, она все еще активна, поэтому стрелка вниз или вверх или Shift-Enter относится к все еще активной ячейке, а не к ячейке, которую мы получили, щелкнув ссылку оглавления.

person upandacross    schedule 15.08.2015

Как уже отмечал Ян, существует расширение оглавления от minrk для IPython Notebook. У меня возникли проблемы с его работой, и я сделал этот IPython Notebook, который полуавтоматически генерирует файлы для расширения оглавления minrk в Windows. Он не использует команды или ссылки 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

person Anna Christine    schedule 24.08.2014

Простое решение для уценки

Вы можете использовать гиперссылки уценки для перехода к заголовкам уценки без определения тегов HTML. Независимо от того, сколько хэшей # у вас в заголовке, используйте один для гиперссылки. Любые пробелы в названии заменяются дефисами -.

Создать таблицу содержимого

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

Создать заголовки

# Section 1
## Section 2

Вы также можете добавить гиперссылку обратно к содержимому.

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

Это похоже на ответ Мэтта Данчо, но я всегда считаю привязки html неудобными.

person D A Wells    schedule 26.05.2021