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


108

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

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

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

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


см. ответ @Nikolay ниже, чтобы узнать об общем решении, которое работает на всех веб-страницах .. это отличный ответ.
— ihightower

Чтобы дополнить существующие решения для ноутбуков Jupyter, я добавил ниже инструкции JupyterLab .
— joelostblom

Ответы:


52

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


Спасибо, я полагаю, это то, о чем говорилось в документации.
— user2428107

2
Этот пост может помочь тем, кто хочет установить его в jupyter 4 .
— Syrtis Major

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: use <a name="pookie"></a>for anchor and for link use:Take me to [pookie](#pookie)
— michael

2
Блокнот автоматически добавляет привязки ко всем заголовкам в вашей уценке. Вы можете нажать на значок (¶) справа от заголовков, которые вы видите при наведении на них курсора, чтобы открыть якорь в адресной строке браузера. Вы можете использовать эту привязку вместо того, чтобы вручную добавлять привязки к разделам вашей уценки. Также лучше всего то, что он работает по ячейкам.
— aaruja

1
У меня есть сценарий add_toc.py, который добавляет вверху ячейку уценки со списком содержимого. Решение для бедняков, если вы не хотите устанавливать расширения.
— user2148414


18

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

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


1
Очень полезно! Но некоторые встроенные функции будут иметь такой смысл - особенно в сочетании с
— уценкой

13

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

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

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


1
Действительно, его легко установить, и исходный код тоже дружелюбен. Хороший проект!
— Carson

13

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

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

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

ОБНОВИТЬ:

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


12

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

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

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

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

jupyter labextension install @jupyterlab/toc

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


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

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

Сначала установите 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) (хотя обратите внимание, что этот пункт меню был недоступен для меня).


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


Я предпочитаю работать 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
— Алекс,

Я не мог заставить расширение toc2 работать в классическом ноутбуке, чтобы добавить ячейку TOC. Однако экспорт записной книжки с помощью nbconvert --to html_tocработал. Формат отличный и добавляет красивое оглавление сбоку, а также номера заголовков.
— aimfeld

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

Чтобы скопировать файлы 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.

Выглядит это примерно так: конфигураторы nbextensions

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

conda install -c conda-forge jupyter_nbextensions_configurator

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

pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user

Это отличный и подробный ответ. Я предполагаю, что включение toc2/mainаналогично проверке «Таблицы содержания (2)» на локальном хосте: 8888 / tree # nbextensions_configurator .
— 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 как ячейку уценки:

<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 относится к все еще активной ячейке, а не к ячейке, которую мы получили, щелкнув ссылку оглавления.


2

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.