Wie kann ich einem Jupyter / JupyterLab-Notizbuch ein Inhaltsverzeichnis hinzufügen?

104

In der Dokumentation unter http://ipython.org/ipython-doc/stable/interactive/notebook.html heißt es

Sie können eine konzeptionelle Struktur für Ihr Computerdokument als Ganzes mit verschiedenen Überschriftenebenen bereitstellen. Es stehen 6 Ebenen zur Verfügung, von Ebene 1 (oberste Ebene) bis Ebene 6 (Absatz). Diese können später zum Erstellen von Inhaltsverzeichnissen usw. verwendet werden.

Ich kann jedoch nirgendwo Anweisungen finden, wie ich meine hierarchischen Überschriften verwenden kann, um ein solches Inhaltsverzeichnis zu erstellen. Gibt es eine Möglichkeit, dies zu tun?

NB: Ich würde mich auch für andere Arten der Navigation mit ipython-Notizbuchüberschriften interessieren, falls vorhanden. Zum Beispiel von Überschrift zu Überschrift vor- und zurückspringen, um schnell den Anfang jedes Abschnitts zu finden, oder den Inhalt eines gesamten Abschnitts ausblenden (falten). Dies ist meine Wunschliste - aber jede Art von Navigation wäre von Interesse. Vielen Dank!

user2428107
quelle
In der Antwort von @Nikolay unten finden Sie eine allgemeine Lösung, die auf allen Webseiten funktioniert. Dies ist eine großartige Antwort.
ihightower
Als Ergänzung zu den vorhandenen Jupyter-Notebook-Lösungen habe ich unten die Anweisungen für JupyterLab hinzugefügt .
Joelostblom

Antworten:

52

Es gibt eine ipython nbextension , die ein Inhaltsverzeichnis für ein Notizbuch erstellt. Es scheint nur eine Navigation zu bieten, keine Abschnittsfaltung.

Ian
quelle
Vielen Dank, ich gehe davon aus, dass sich die Dokumentation darauf bezieht.
user2428107
2
Für diejenigen, die es in Jupiter 4 installieren möchten, kann dieser Beitrag hilfreich sein.
Syrtis Major
9
Nur um dies zu aktualisieren: Es gibt jetzt eine nbextensions-Erweiterung, die eine ganze Reihe von Erweiterungen bündelt und es Ihnen ermöglicht, sie über jupyter selbst zu verwalten. Ich denke, es ist jetzt der einfachste Weg, um ToC2 zu bekommen. Und es bietet andere relevante Erweiterungen wie das Falten von Abschnitten. Es ist bei github.com/ipython-contrib/jupyter_contrib_nbextensions
user2428107
93

Sie können ein Inhaltsverzeichnis manuell mit Markdown und HTML hinzufügen. So habe ich hinzugefügt:

Erstellen Sie ein Inhaltsverzeichnis oben auf dem Jupyter-Notizbuch:

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

Fügen Sie HTML-Anker im ganzen Körper hinzu:

## First Bullet Header <a class="anchor" id="first-bullet"></a>

code blocks...

## Second Bullet Header <a class="anchor" id="second-bullet"></a>

code blocks...

Es ist vielleicht nicht der beste Ansatz, aber es funktioniert. Hoffe das hilft.

Matt Dancho
quelle
15
Das funktioniert bei mir nicht mehr, aber ein ähnlicher Ansatz .
Joelostblom
2
auch der gleiche "ähnliche Ansatz" wie dieser: stackoverflow.com/questions/5319754/… tl; dr: Verwendung <a name="pookie"></a>für Anker- und Take me to [pookie](#pookie)
Linkverwendung
1
Für alle Überschriften in Ihren Abschriften fügt das Notizbuch automatisch Anker hinzu. Sie können auf den Pfeil (¶) rechts neben den Überschriften klicken, die Sie sehen, wenn Sie den Mauszeiger darüber halten, um den Anker in der Adressleiste Ihres Browsers anzuzeigen. Sie können diesen Anker verwenden, anstatt Anker manuell zu Abschnitten Ihres Markdowns hinzuzufügen. Das Beste ist auch, dass es zellübergreifend funktioniert.
Aaruja
Ich habe dieses Skript add_toc.py , das oben eine Markdown-Zelle mit einem Inhaltsverzeichnis hinzufügt. Die Lösung eines armen Mannes, wenn Sie keine Erweiterungen installieren möchten.
user2148414
18

Wie wäre es mit einem Browser-Plugin, das Ihnen einen Überblick über JEDE HTML-Seite gibt. Ich habe folgendes versucht:

Beide funktionieren ziemlich gut für IPython-Notebooks. Ich wollte die vorherigen Lösungen nur ungern verwenden, da sie etwas instabil erscheinen und letztendlich diese Erweiterungen verwenden.

Nikolay
quelle
1
Sehr hilfreich! Aber einige eingebaute Funktionen wären sehr sinnvoll - besonders in Kombination mit Markdown
15.
13

Ich habe kürzlich eine kleine Erweiterung für Jupyter namens jupyter-navbar erstellt . Es sucht nach Überschriften, die in Markdown-Zellen geschrieben sind, und zeigt Links zu diesen in der Seitenleiste hierarchisch an. Die Seitenleiste kann in der Größe geändert und reduziert werden. Siehe Screenshot unten.

Es ist einfach zu installieren und nutzt die benutzerdefinierten JS- und CSS-Codes, die beim Öffnen eines Notebooks ausgeführt werden, sodass Sie es nicht manuell ausführen müssen.

Geben Sie hier die Bildbeschreibung ein

Shovalt
quelle
1
In der Tat ist es einfach zu installieren und der Quellcode ist auch freundlich. Schönes Projekt!
Carson
13

Es gibt jetzt zwei Pakete, mit denen Jupyter-Erweiterungen verarbeitet werden können:

  1. jupyter_contrib_nbextensions , das Erweiterungen einschließlich des Inhaltsverzeichnisses installiert;

  2. jupyter_nbextensions_configurator , der grafische Benutzeroberflächen zum Konfigurieren der aktivierten nbextensions bereitstellt (automatisch für jedes Notebook laden) und Steuerelemente zum Konfigurieren der Optionen der nbextensions bereitstellt.

AKTUALISIEREN:

Ab neueren Versionen von jupyter_contrib_nbextensionsmüssen Sie zumindest bei condanicht installieren, jupyter_nbextensions_configuratorda es zusammen mit diesen Erweiterungen installiert wird.

Sergey Zakharov
quelle
9

JupyterLab ToC Anweisungen

Es gibt bereits viele gute Antworten auf diese Frage, aber sie erfordern häufig Optimierungen, um mit Notebooks in JupyterLab ordnungsgemäß zu funktionieren. Ich habe diese Antwort geschrieben, um detailliert zu beschreiben, wie ein Inhaltsverzeichnis in ein Notizbuch aufgenommen werden kann, während in JupyterLab gearbeitet und aus JupyterLab exportiert wird.

Als Seitenwand

Die Erweiterung jupyterlab-toc fügt den ToC als Seitenbereich hinzu, der Überschriften nummerieren, Abschnitte reduzieren und für die Navigation verwendet werden kann (siehe GIF unten für eine Demo). Installieren Sie mit dem folgenden Befehl

jupyter labextension install @jupyterlab/toc

Geben Sie hier die Bildbeschreibung ein


Im Notizbuch als Zelle

Derzeit kann dies entweder manuell wie in Matt Danchos Antwort oder automatisch über die toc2 jupyter Notebook-Erweiterung in der klassischen Notebook-Oberfläche erfolgen.

Installieren Sie zunächst toc2 als Teil des Bundles jupyter_contrib_nbextensions :

conda install -c conda-forge jupyter_contrib_nbextensions

Starten Sie dann JupyterLab, gehen Sie zu Help --> Launch Classic Notebookund öffnen Sie das Notizbuch, in dem Sie den ToC hinzufügen möchten. Klicken Sie auf das toc2-Symbol in der Symbolleiste, um das schwebende ToC-Fenster aufzurufen (siehe das GIF unten, wenn Sie es nicht finden können), klicken Sie auf das Zahnradsymbol und aktivieren Sie das Kontrollkästchen "Notebook-ToC-Zelle hinzufügen". Speichern Sie das Notizbuch und die ToC-Zelle wird angezeigt, wenn Sie es in JupyterLab öffnen. Die eingefügte Zelle ist eine Markdown-Zelle mit HTML. Sie wird nicht automatisch aktualisiert.

Die Standardoptionen des toc2 können auf der Registerkarte "Nbextensions" auf der klassischen Startseite des Notebooks konfiguriert werden. Sie können z. B. Überschriften nummerieren und den ToC als Seitenleiste verankern (was meiner Meinung nach sauberer aussieht).

Geben Sie hier die Bildbeschreibung ein


In einer exportierten HTML-Datei

nbconvertkann verwendet werden, um Notizbücher nach den folgenden Regeln zum Formatieren des exportierten HTML-Codes in HTML zu exportieren. Die toc2oben erwähnte Erweiterung fügt ein Exportformat mit dem Namen hinzu html_toc, das direkt über nbconvertdie Befehlszeile verwendet werden kann (nachdem die toc2Erweiterung installiert wurde):

jupyter nbconvert file.ipynb --to html_toc
# Append `--ExtractOutputPreprocessor.enabled=False`
# to get a single html file instead of a separate directory for images

Denken Sie daran, dass Shell-Befehle zu Notebook-Zellen hinzugefügt werden können, indem ihnen ein Ausrufezeichen vorangestellt wird. !Sie können diese Zeile also in die letzte Zelle des Notebooks einfügen und immer eine HTML-Datei mit einem ToC generieren lassen, wenn Sie auf "Alle Zellen ausführen" klicken ( oder was auch immer Sie ausgeben möchten nbconvert). Auf diese Weise können Sie jupyterlab-tocwährend der Arbeit im Notebook navigieren und trotzdem ToCs in der exportierten Ausgabe abrufen, ohne auf die klassische Notebook-Oberfläche zurückgreifen zu müssen (für Puristen unter uns).

Beachten Sie, dass das Konfigurieren der Standardoptionen für toc2 wie oben beschrieben das Format von nicht ändert nbconver --to html_toc. Sie müssen das Notizbuch in der klassischen Notizbuchoberfläche öffnen, damit die Metadaten in die IPynb-Datei geschrieben werden (nbconvert liest die Metadaten beim Exportieren). Alternativ können Sie die Metadaten manuell über die Registerkarte Notizbuch-Tools der JupyterLab-Seitenleiste hinzufügen, z mögen:

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

Wenn Sie einen GUI-gesteuerten Ansatz bevorzugen, sollten Sie in der Lage sein, das klassische Notizbuch zu öffnen und auf zu klicken File --> Save as HTML (with ToC) (obwohl zu beachten ist, dass dieser Menüpunkt für mich nicht verfügbar war).


Die obigen Gifs sind aus der jeweiligen Dokumentation der Erweiterungen verlinkt.

joelostblom
quelle
Ich arbeite lieber mit jupyter lab, musste aber einer großen HTML-Ausgabe eines Notizbuchs ein Inhaltsverzeichnis hinzufügen. Das funktioniert einwandfrei! Es gab einige zusätzliche Schritte, um es zum Laufen zu bringen: 1. Aktivieren Sie TOC2, z. B. conda install -c conda-forge jupyter_nbextensions_configuratorgehen Sie zu http://localhost:8888/nbextensions, deaktivieren Sie "Kompatibilität" und aktivieren Sie "Toc2". 2. Starten Sie Classical Notebbok, ändern Sie die TOC-Einstellungen an Ihre Bedürfnisse und Add TOC to Cell(fahren Sie wie beschrieben fort). 3. Öffnen Sie Ihre .ipynbDatei und suchen Sie nach den "toc"json toc-Konfigurationen, kopieren Sie sie und fügen Sie sie mithilfe der Registerkarte "Tools" des Jupyter Lab
Alex
6

Einführung

Wie @Ian und @Sergey erwähnt haben, ist nbextensions eine einfache Lösung. Um ihre Antwort zu erläutern, finden Sie hier einige weitere Informationen.

Was ist nbextensions?

Die nbextensions enthalten eine Sammlung von Erweiterungen, die Ihrem Jupyter-Notebook Funktionen hinzufügen.

Zum Beispiel, um nur einige Erweiterungen zu nennen:

  • Inhaltsverzeichnis

  • Zusammenklappbare Überschriften

Installieren Sie nbextensions

Die Installation kann über Conda oder PIP erfolgen

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

Kopieren Sie JS- und CSS-Dateien

Gehen Sie wie folgt vor, um die Javascript- und CSS-Dateien der nbextensions in das Suchverzeichnis des Jupyter-Servers zu kopieren:

jupyter contrib nbextension install --user

Erweiterungen umschalten

Beachten Sie, dass es besser ist, den nbextensions-Konfigurator zu installieren, wenn Sie mit dem Terminal nicht vertraut sind (siehe nächster Abschnitt).

Sie können die Erweiterungen Ihrer Wahl aktivieren / deaktivieren. Wie in der Dokumentation erwähnt, lautet der generische Befehl:

jupyter nbextension enable <nbextension require path>

Um die ToC-Erweiterung (Inhaltsverzeichnis) zu aktivieren, gehen Sie konkret wie folgt vor:

jupyter nbextension enable toc2/main

Konfigurationsschnittstelle installieren (optional, aber nützlich)

Wie in der Dokumentation angegeben, bietet nbextensions_configurator Konfigurationsschnittstellen für nbextensions.

Es sieht folgendermaßen aus: nbextensions-Konfiguratoren

So installieren Sie es, wenn Sie conda verwenden:

conda install -c conda-forge jupyter_nbextensions_configurator

Wenn Sie Conda nicht haben oder nicht über Conda installieren möchten, führen Sie die folgenden zwei Schritte aus:

pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user
KeyMaker00
quelle
Dies ist eine großartige und detaillierte Antwort. Ich denke, das Aktivieren toc2/mainist dasselbe wie das Überprüfen von "Inhaltsverzeichnis (2)" auf localhost: 8888 / tree # nbextensions_configurator .
flow2k
4

Hier ist mein Ansatz, klobig wie er ist und in Github verfügbar ist :

Geben Sie in die allererste Notizbuchzelle die Importzelle ein:

from IPythonTOC import IPythonTOC

toc = IPythonTOC()

Fügen Sie irgendwo nach der Importzelle die genTOCEntry-Zelle ein, führen Sie sie jedoch noch nicht aus:

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

print toc.genTOCEntry()

Erstellen Sie unterhalb der genTOCEntry-Zelle eine TOC-Zelle als Markdown-Zelle:

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

#TOC

Setzen Sie diese genTOCMarkdownCell während der Entwicklung des Notebooks ein, bevor Sie einen neuen Abschnitt beginnen:

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

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

!cat TOCMarkdownCell.txt

!rm TOCMarkdownCell.txt

Bewegen Sie die genTOCMarkdownCell bis zu dem Punkt in Ihrem Notizbuch, an dem Sie einen neuen Abschnitt beginnen möchten, und führen Sie das Argument für genTOCMarkdownCell als Zeichenfolgentitel für Ihren neuen Abschnitt aus. Führen Sie ihn dann aus. Fügen Sie direkt danach eine Markdown-Zelle hinzu und kopieren Sie die Ausgabe von genTOCMarkdownCell in die Markdown-Zelle, die Ihren neuen Abschnitt startet. Gehen Sie dann zur genTOCEntry-Zelle oben in Ihrem Notebook und führen Sie sie aus. Wenn Sie beispielsweise das Argument für genTOCMarkdownCell wie oben gezeigt ausführen und es ausführen, wird diese Ausgabe in die erste Markdown-Zelle Ihres neu indizierten Abschnitts eingefügt:

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

###Introduction

Wenn Sie dann zum Anfang Ihres Notizbuchs gehen und genTocEntry ausführen, erhalten Sie die folgende Ausgabe:

[Introduction](#Introduction)

Kopieren Sie diese Verknüpfungszeichenfolge und fügen Sie sie wie folgt in die TOC-Markdown-Zelle ein:

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

#TOC

[Introduction](#Introduction)

Nachdem Sie die Inhaltsverzeichniszelle bearbeitet haben, um die Verknüpfungszeichenfolge einzufügen, und dann die Umschalttaste drücken, wird der Link zu Ihrem neuen Abschnitt in Ihrem Notizbuch als Weblink angezeigt. Wenn Sie darauf klicken, wird der Browser in Ihrem neuen Abschnitt positioniert.

Eine Sache, die ich oft vergesse, ist, dass der Browser durch Klicken auf eine Zeile im Inhaltsverzeichnis zu dieser Zelle springt, diese aber nicht auswählt. Welche Zelle auch immer aktiv war, als wir auf den Inhaltsverzeichnis-Link geklickt haben, ist immer noch aktiv. Ein Abwärts- oder Aufwärtspfeil oder eine Umschalttaste bezieht sich also auf die noch aktive Zelle, nicht auf die Zelle, die wir durch Klicken auf den Inhaltsverzeichnis-Link erhalten haben.

upandacross
quelle
2

Wie Ian bereits betont hat, gibt es für das IPython Notebook eine Erweiterung des Inhaltsverzeichnisses von minrk. Ich hatte einige Probleme damit und habe dieses IPython-Notizbuch erstellt, das die Dateien für die Inhaltsverzeichniserweiterung von minrk in Windows halbautomatisch generiert. Es verwendet nicht die 'curl'-Befehle oder -Links, sondern schreibt die Dateien * .js und * .css direkt in Ihr IPython Notebook-Profilverzeichnis.

Es gibt einen Abschnitt im Notizbuch mit dem Titel "Was Sie tun müssen" - folgen Sie ihm und haben Sie ein schönes schwebendes Inhaltsverzeichnis :)

Hier ist eine HTML-Version, die es bereits zeigt: http://htmlpreview.github.io/?https://github.com/ahambi/140824-TOC/blob/master/A%20floating%20table%20of%20contents.htm

Anna Christine
quelle