Come posso aggiungere un sommario a un notebook Jupyter / JupyterLab?


106

La documentazione su http://ipython.org/ipython-doc/stable/interactive/notebook.html dice

Puoi fornire una struttura concettuale per il tuo documento computazionale nel suo complesso utilizzando diversi livelli di intestazioni; sono disponibili 6 livelli, dal livello 1 (livello superiore) al livello 6 (paragrafo). Questi possono essere usati in seguito per costruire sommari, ecc.

Tuttavia, non riesco a trovare istruzioni da nessuna parte su come utilizzare le mie intestazioni gerarchiche per creare un tale sommario. C'è un modo per fare questo?

NB: Sarei anche interessato ad altri tipi di navigazione utilizzando intestazioni di notebook ipython, se esistono. Ad esempio, saltare avanti e indietro da un'intestazione all'altra per trovare rapidamente l'inizio di ogni sezione o nascondere (piegare) il contenuto di un'intera sezione. Questa è la mia lista dei desideri, ma qualsiasi tipo di navigazione sarebbe interessante. Grazie!


vedi la risposta di @Nikolay di seguito per una soluzione generale che funziona su tutte le pagine web .. questa è un'ottima risposta.
ihightower

Per completare le soluzioni per notebook Jupyter esistenti, ho aggiunto le istruzioni JupyterLab di seguito.
joelostblom

Risposte:


52

Esiste un'estensione di estensione ipython che costruisce un sommario per un notebook. Sembra fornire solo la navigazione, non il ripiegamento delle sezioni.


Grazie, presumo che questo sia ciò a cui si riferiva la documentazione.
user2428107

2
Per chi vuole installarlo in jupyter 4, questo post può aiutare.
Syrtis Major

9
Solo per aggiornare questo: ora c'è un'estensione nbextensions, che raggruppa un sacco di estensioni insieme e ti consente di gestirle tramite jupyter stesso. Penso che ora sia il modo più semplice per ottenere ToC2. E fornisce altre estensioni rilevanti come la piegatura delle sezioni. È su github.com/ipython-contrib/jupyter_contrib_nbextensions
user2428107

93

Puoi aggiungere un sommario manualmente con Markdown e HTML. Ecco come ho aggiunto:

Crea sommario nella parte superiore di Jupyter Notebook:

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

Aggiungi ancore html in tutto il corpo:

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

code blocks...

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

code blocks...

Potrebbe non essere l'approccio migliore, ma funziona. Spero che questo ti aiuti.


15
Questo non funziona più per me, ma un approccio simile funziona .
joelostblom

2
anche lo stesso "approccio simile" di questo: stackoverflow.com/questions/5319754/… tl; dr: use <a name="pookie"></a>for anchor and for link use:Take me to [pookie](#pookie)
michael

2
Per tutti i titoli nei ribassi, il taccuino aggiunge automaticamente gli ancoraggi. Puoi fare clic sul pilcrow (¶) a destra dei titoli che vedi quando ci passi sopra con il mouse, per rivelare l'ancora nella barra degli indirizzi del browser. Puoi usare questo ancoraggio invece di aggiungere manualmente gli ancoraggi alle sezioni del tuo markdown. Inoltre, la cosa migliore è che funziona su tutte le cellule.
aaruja

1
Ho questo script add_toc.py che aggiunge una cella di markdown in alto con un elenco di contenuti. La soluzione di un povero uomo se non vuoi installare estensioni.
user2148414


18

Che ne dici di usare un plugin per browser che ti dà una panoramica di QUALSIASI pagina html. Ho provato quanto segue:

Entrambi funzionano abbastanza bene per i notebook IPython. Ero riluttante a utilizzare le soluzioni precedenti in quanto sembravano un po 'instabili e ho finito per utilizzare queste estensioni.


1
Molto utile! Ma alcune funzioni integrate avrebbero molto senso, specialmente in combinazione con il
markdown

13

Di recente ho creato una piccola estensione per Jupyter denominata jupyter-navbar . Cerca le intestazioni scritte nelle celle di markdown e visualizza i collegamenti ad esse nella barra laterale in modo gerarchico. La barra laterale è ridimensionabile e pieghevole. Vedi screenshot qui sotto.

È facile da installare e sfrutta i codici JS e CSS "personalizzati" che vengono eseguiti ogni volta che viene aperto un notebook, quindi non è necessario eseguirlo manualmente.

inserisci qui la descrizione dell'immagine


1
In effetti è facile da installare e anche il codice sorgente è amichevole. Bel progetto!
Carson,

13

Ora ci sono due pacchetti che possono essere utilizzati per gestire le estensioni Jupyter:

  1. jupyter_contrib_nbextensions che installa le estensioni, incluso il sommario;

  2. jupyter_nbextensions_configurator che fornisce interfacce utente grafiche per configurare quali nbextensions sono abilitate (caricate automaticamente per ogni notebook) e fornisce i controlli per configurare le opzioni di nbextensions.

AGGIORNARE:

A partire dalle versioni recenti di jupyter_contrib_nbextensions, almeno con condanon è necessario installare jupyter_nbextensions_configuratorperché viene installato insieme a quelle estensioni.


10

Istruzioni JupyterLab ToC

Ci sono già molte buone risposte a questa domanda, ma spesso richiedono modifiche per funzionare correttamente con i notebook in JupyterLab. Ho scritto questa risposta per dettagliare i possibili modi di includere un ToC in un notebook mentre lavoravo ed esportava da JupyterLab.

Come pannello laterale

L' estensione jupyterlab-toc aggiunge il ToC come pannello laterale che può numerare le intestazioni, comprimere le sezioni ed essere utilizzato per la navigazione (vedi gif di seguito per una demo). Installa con il seguente comando

jupyter labextension install @jupyterlab/toc

inserisci qui la descrizione dell'immagine


Nel taccuino come cella

Al momento, questo può essere fatto manualmente come nella risposta di Matt Dancho o automaticamente tramite l' estensione per notebook toc2 jupyter nell'interfaccia classica del notebook.

Innanzitutto, installa toc2 come parte del bundle jupyter_contrib_nbextensions :

conda install -c conda-forge jupyter_contrib_nbextensions

Quindi, avvia JupyterLab, vai a Help --> Launch Classic Notebooke apri il blocco note in cui desideri aggiungere il ToC. Fare clic sul simbolo toc2 nella barra degli strumenti per visualizzare la finestra mobile ToC (vedere la gif di seguito se non la si trova), fare clic sull'icona a forma di ingranaggio e selezionare la casella "Aggiungi cella ToC notebook". Salva il taccuino e la cella ToC sarà lì quando lo apri in JupyterLab. La cella inserita è una cella markdown con html in essa, non si aggiornerà automaticamente.

Le opzioni predefinite di toc2 possono essere configurate nella scheda "Nbextensions" nella pagina di avvio del notebook classico. Puoi ad esempio scegliere di numerare le intestazioni e di ancorare il ToC come barra laterale (che personalmente ritengo sia più pulita).

inserisci qui la descrizione dell'immagine


In un file HTML esportato

nbconvertpuò essere utilizzato per esportare i taccuini in HTML seguendo le regole su come formattare l'HTML esportato. L' toc2estensione di cui sopra aggiunge un formato di esportazione chiamato html_toc, che può essere utilizzato direttamente nbconvertdalla riga di comando (dopo che l' toc2estensione è stata installata):

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

Ricorda che i comandi della shell possono essere aggiunti alle celle del taccuino anteponendole a un punto esclamativo !, così puoi inserire questa riga nell'ultima cella del taccuino e avere sempre un file HTML con un ToC generato quando premi "Esegui tutte le celle" ( o qualsiasi output desideri nbconvert). In questo modo potresti usarejupyterlab-toc navigare nel notebook mentre si sta lavorando e ottenere comunque ToC nell'output esportato senza dover ricorrere all'uso della classica interfaccia del notebook (per i puristi tra noi).

Si noti che la configurazione delle opzioni toc2 predefinite come descritto sopra, non cambierà il formato di nbconver --to html_toc. È necessario aprire il taccuino nell'interfaccia classica del taccuino affinché i metadati vengano scritti nel file .ipynb (nbconvert legge i metadati durante l'esportazione) In alternativa, puoi aggiungere manualmente i metadati tramite la scheda Strumenti del taccuino della barra laterale di JupyterLab, ad esempio qualcosa piace:

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

Se preferisci un approccio basato sulla GUI, dovresti essere in grado di aprire il classico notebook e fare clic File --> Save as HTML (with ToC) (anche se tieni presente che questa voce di menu non era disponibile per me).


Le gif sopra sono collegate dalla rispettiva documentazione delle estensioni.


Preferisco lavorare con jupyter lab, ma avevo bisogno di aggiungere un sommario a un grande output HTML del notebook. Funziona perfettamente! C'erano alcuni passaggi aggiuntivi per farlo funzionare: 1. Abilita TOC2, ad esempio conda install -c conda-forge jupyter_nbextensions_configurator, vai su http://localhost:8888/nbextensions, deseleziona "compatibilità" e abilita "Toc2" 2. Avvia Notebbok classico, modifica le impostazioni del sommario in base alle tue esigenze e Add TOC to Cell(procedi come descritto). 3. Apri il tuo .ipynbfile e cerca "toc", copia json toc configs e aggiungi ai metadati utilizzando la scheda strumenti di Jupyter lab
Alex

6

introduzione

Come hanno già detto @Ian e @Sergey, nbextensions è una soluzione semplice. Per elaborare la loro risposta, ecco qualche informazione in più.

Cos'è nbextensions?

Nbextensions contiene una raccolta di estensioni che aggiungono funzionalità al tuo notebook Jupyter.

Ad esempio, solo per citare alcune estensioni:

  • Sommario

  • Intestazioni pieghevoli

Installa nbextensions

L'installazione può essere eseguita tramite Conda o PIP

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

Copia i file js e css

Per copiare i file javascript e css di nbextensions nella directory di ricerca del server jupyter, procedi come segue:

jupyter contrib nbextension install --user

Attiva / disattiva estensioni

Nota che se non hai familiarità con il terminale, sarebbe meglio installare il configuratore di nbextensions (vedi la sezione successiva)

Puoi abilitare / disabilitare le estensioni di tua scelta. Come menzionato nella documentazione, il comando generico è:

jupyter nbextension enable <nbextension require path>

In concreto, per abilitare l'estensione ToC (Table of Contents), fare:

jupyter nbextension enable toc2/main

Installa l'interfaccia di configurazione (opzionale ma utile)

Come dice la sua documentazione, nbextensions_configurator fornisce interfacce di configurazione per nbextensions.

Sembra il seguente: Configuratori di nbextensions

Per installarlo se usi conda:

conda install -c conda-forge jupyter_nbextensions_configurator

Se non si dispone di Conda o non si desidera eseguire l'installazione tramite Conda, eseguire i 2 passaggi seguenti:

pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user

Questa è un'ottima e dettagliata risposta. Immagino che abilitare toc2/mainsia lo stesso che selezionare "Sommario (2)" localhost: 8888 / tree # nbextensions_configurator .
flow2k

4

Ecco il mio approccio, goffo com'è e disponibile in GitHub :

Metti nella primissima cella del taccuino, la cella di importazione:

from IPythonTOC import IPythonTOC

toc = IPythonTOC()

Da qualche parte dopo la cella di importazione, inserisci la cella genTOCEntry ma non eseguirla ancora:

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

print toc.genTOCEntry()

Sotto la cella genTOCEntry`, crea una cella TOC come cella markdown:

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

#TOC

Man mano che il notebook viene sviluppato, inserire questo genTOCMarkdownCell prima di iniziare una nuova sezione:

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

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

!cat TOCMarkdownCell.txt

!rm TOCMarkdownCell.txt

Sposta genTOCMarkdownCell fino al punto del tuo notebook in cui desideri iniziare una nuova sezione e imposta l'argomento di genTOCMarkdownCell come titolo della stringa per la nuova sezione, quindi eseguilo. Aggiungi una cella di markdown subito dopo e copia l'output da genTOCMarkdownCell nella cella di markdown che avvia la nuova sezione. Quindi vai alla cella genTOCEntry vicino alla parte superiore del tuo notebook ed eseguilo. Ad esempio, se crei l'argomento genTOCMarkdownCell come mostrato sopra e lo esegui, ottieni questo output da incollare nella prima cella di markdown della sezione appena indicizzata:

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

###Introduction

Quindi, quando vai all'inizio del tuo notebook ed esegui genTocEntry, ottieni l'output:

[Introduction](#Introduction)

Copia questa stringa di collegamento e incollala nella cella di markdown del sommario come segue:

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

#TOC

[Introduction](#Introduction)

Dopo aver modificato la cella TOC per inserire la stringa di collegamento e quindi aver premuto MAIUSC-INVIO, il collegamento alla nuova sezione verrà visualizzato nel sommario del blocco appunti come collegamento Web e facendo clic su di esso si posizionerà il browser nella nuova sezione.

Una cosa che spesso dimentico è che facendo clic su una riga nel sommario il browser salta a quella cella ma non la seleziona. Qualunque cella fosse attiva quando abbiamo fatto clic sul collegamento TOC è ancora attiva, quindi una freccia giù o su o shift-invio si riferisce alla cella ancora attiva, non alla cella che abbiamo ottenuto facendo clic sul collegamento TOC.


2

Come Ian ha già sottolineato, esiste un'estensione del sommario di minrk per IPython Notebook. Ho avuto qualche problema a farlo funzionare e ho realizzato questo notebook IPython che genera semi-automaticamente i file per l'estensione del sommario di minrk in Windows. Non utilizza i comandi oi collegamenti "curl", ma scrive i file * .js e * .css direttamente nella directory del profilo del notebook IPython.

C'è una sezione nel taccuino chiamata 'Cosa devi fare' - seguila e fai un bel sommario mobile :)

Ecco una versione html che lo mostra già: http://htmlpreview.github.io/?https://github.com/ahambi/140824-TOC/blob/master/A%20floating%20table%20of%20contents.htm

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.