Jak mogę dodać spis treści do notatnika Jupyter / JupyterLab?


108

Dokumentacja pod adresem http://ipython.org/ipython-doc/stable/interactive/notebook.html mówi

Możesz zapewnić strukturę koncepcyjną dla swojego dokumentu obliczeniowego jako całości, używając różnych poziomów nagłówków; Dostępnych jest 6 poziomów, od poziomu 1 (najwyższy poziom) do poziomu 6 (akapit). Można ich później użyć do tworzenia spisów treści itp.

Jednak nigdzie nie mogę znaleźć instrukcji, jak używać moich nagłówków hierarchicznych do tworzenia takiego spisu treści. Czy jest na to sposób?

NB: Byłbym również zainteresowany innymi rodzajami nawigacji wykorzystującymi nagłówki notatnika ipython, jeśli takie istnieją. Na przykład przeskakiwanie wstecz i do przodu od nagłówka do nagłówka, aby szybko znaleźć początek każdej sekcji lub ukrywanie (składanie) zawartości całej sekcji. To jest moja lista życzeń - ale jakakolwiek nawigacja byłaby interesująca. Dzięki!


zobacz odpowiedź @Nikolay poniżej, aby uzyskać ogólne rozwiązanie, które działa na wszystkich stronach internetowych. to jest świetna odpowiedź.
ihightower

Aby uzupełnić istniejące rozwiązania dla notebooków Jupyter, dodałem poniżej instrukcje JupyterLab .
joelostblom

Odpowiedzi:


52

Istnieje rozszerzenie ipython, które tworzy spis treści dla notatnika. Wydaje się, że zapewnia tylko nawigację, a nie zwijanie sekcji.


Dzięki, zakładam, że właśnie tego dotyczyła dokumentacja.
user2428107

2
Dla tych, którzy chcą zainstalować go w jupyter 4, ten post może pomóc.
Syrtis Major

9
Aby to zaktualizować: dostępne jest teraz rozszerzenie nbextensions, które zawiera wiele rozszerzeń razem i umożliwia zarządzanie nimi za pośrednictwem samego jupyter. Myślę, że teraz jest to najłatwiejszy sposób na zdobycie ToC2. I zapewnia inne odpowiednie rozszerzenia, takie jak składanie sekcji. Jest na github.com/ipython-contrib/jupyter_contrib_nbextensions
user2428107

94

Możesz dodać spis treści ręcznie za pomocą Markdown i HTML. Oto jak dodawałem:

Utwórz spis treści w górnej części Notatnika Jupyter:

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

Dodaj kotwice html w całym ciele:

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

code blocks...

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

code blocks...

Może nie jest to najlepsze podejście, ale działa. Mam nadzieję że to pomoże.


15
To już nie działa, ale podobne podejście działa .
joelostblom

2
również to samo „podobne podejście” jak to: stackoverflow.com/questions/5319754/… tl; dr: użyj <a name="pookie"></a>do zakotwiczenia i do linków:Take me to [pookie](#pookie)
michael

2
Notatnik automatycznie dodaje kotwice do wszystkich nagłówków w przecenach. Możesz kliknąć pilcrow (¶) po prawej stronie nagłówków, które widzisz po najechaniu na nie kursorem, aby wyświetlić zakotwiczenie w pasku adresu przeglądarki. Możesz użyć tej kotwicy zamiast ręcznie dodawać kotwice do sekcji swojej przeceny. Najlepsze jest również to, że działa w poprzek komórek.
aaruja

1
Mam ten skrypt add_toc.py, który dodaje komórkę przeceny na górze z listą treści. Rozwiązanie dla biednych, jeśli nie chcesz instalować rozszerzeń.
user2148414


18

Co powiesz na użycie wtyczki do przeglądarki, która zapewnia przegląd DOWOLNEJ strony html. Próbowałem następujących rzeczy:

Oba działają całkiem dobrze dla notebooków IPython. Nie chciałem korzystać z poprzednich rozwiązań, ponieważ wydają się one nieco niestabilne i ostatecznie korzystałem z tych rozszerzeń.


1
Bardzo pomocne! Ale niektóre wbudowane funkcje miałyby taki sens - szczególnie w połączeniu z przecenami
dmeu

13

Niedawno stworzyłem małe rozszerzenie do Jupyter o nazwie jupyter-navbar . Wyszukuje nagłówki zapisane w komórkach przecen i wyświetla linki do nich na pasku bocznym w sposób hierarchiczny. Pasek boczny można zmieniać i zwijać. Zobacz zrzut ekranu poniżej.

Jest łatwy w instalacji i korzysta z „niestandardowych” kodów JS i CSS, które są wykonywane przy każdym otwarciu notatnika, więc nie trzeba go uruchamiać ręcznie.

wprowadź opis obrazu tutaj


1
Rzeczywiście jest łatwy w instalacji, a kod źródłowy jest również przyjazny. Niezły projekt!
Carson

13

Istnieją teraz dwa pakiety, których można użyć do obsługi rozszerzeń Jupyter:

  1. jupyter_contrib_nbextensions, które instalują rozszerzenia, w tym spis treści;

  2. jupyter_nbextensions_configurator, który zapewnia graficzne interfejsy użytkownika do konfigurowania, które rozszerzenia nbextensions są włączone (ładuje się automatycznie dla każdego notebooka) i zapewnia elementy sterujące do konfigurowania opcji nbextensions.

AKTUALIZACJA:

Począwszy od najnowszych wersji jupyter_contrib_nbextensions, przynajmniej condanie musisz instalować, jupyter_nbextensions_configuratorponieważ jest instalowany razem z tymi rozszerzeniami.


12

Instrukcje dotyczące ToC JupyterLab

Istnieje już wiele dobrych odpowiedzi na to pytanie, ale często wymagają one poprawek, aby poprawnie współpracować z notebookami w JupyterLab. Napisałem tę odpowiedź, aby szczegółowo opisać możliwe sposoby umieszczania ToC w notatniku podczas pracy i eksportowania z JupyterLab.

Jako panel boczny

Rozszerzenie jupyterlab-toc dodaje ToC jako panel boczny, który może numerować nagłówki, zwijać sekcje i być używany do nawigacji (zobacz poniższy gif dla demonstracji). Zainstaluj za pomocą następującego polecenia

jupyter labextension install @jupyterlab/toc

wprowadź opis obrazu tutaj


W zeszycie jako komórka

W tej chwili można to zrobić ręcznie, jak w odpowiedzi Matta Dancho, lub automatycznie przez rozszerzenie notebooka toc2 jupyter w klasycznym interfejsie notebooka.

Najpierw zainstaluj toc2 jako część pakietu jupyter_contrib_nbextensions :

conda install -c conda-forge jupyter_contrib_nbextensions

Następnie uruchom JupyterLab, przejdź do Help --> Launch Classic Notebooki otwórz notatnik, w którym chcesz dodać ToC. Kliknij symbol toc2 na pasku narzędzi, aby wyświetlić ruchome okno ToC (zobacz poniższy gif, jeśli nie możesz go znaleźć), kliknij ikonę koła zębatego i zaznacz pole „Dodaj komórkę ToC notatnika”. Zapisz notatnik, a komórka ToC będzie tam, gdy otworzysz go w JupyterLab. Wstawiona komórka to komórka przeceny zawierająca kod HTML, nie zaktualizuje się automatycznie.

Domyślne opcje toc2 można skonfigurować na karcie „Nbextensions” na stronie uruchamiania klasycznego notatnika. Możesz np. Wybrać numerowanie nagłówków i zakotwiczenie ToC jako paska bocznego (co osobiście uważam za bardziej przejrzyste).

wprowadź opis obrazu tutaj


W wyeksportowanym pliku HTML

nbconvertmoże być używany do eksportowania notatników do HTML zgodnie z zasadami formatowania eksportowanego HTML. Wspomniane toc2rozszerzenie dodaje format eksportu o nazwie html_toc, który może być używany bezpośrednio z nbconvertlinii poleceń (po zainstalowaniu toc2rozszerzenia):

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

Pamiętaj, że polecenia powłoki można dodawać do komórek notatnika, poprzedzając je wykrzyknikiem !, więc możesz umieścić tę linię w ostatniej komórce notatnika i zawsze mieć plik HTML z ToC wygenerowany po naciśnięciu przycisku „Uruchom wszystkie komórki” ( lub cokolwiek z czego chcesz nbconvert). W ten sposób możesz używać jupyterlab-tocdo nawigacji w notebooku podczas pracy i nadal otrzymywać ToC w wyeksportowanych wynikach bez konieczności uciekania się do korzystania z klasycznego interfejsu notebooka (dla purystów wśród nas).

Zwróć uwagę, że skonfigurowanie domyślnych opcji toc2 zgodnie z powyższym opisem nie zmieni formatu nbconver --to html_toc. Musisz otworzyć notatnik w klasycznym interfejsie notatnika, aby metadane zostały zapisane w pliku .ipynb (nbconvert czyta metadane podczas eksportu). Alternatywnie możesz dodać metadane ręcznie za pomocą zakładki Narzędzia notatnika na pasku bocznym JupyterLab, np. lubić:

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

Jeśli wolisz podejście oparte na GUI, powinieneś być w stanie otworzyć klasyczny notatnik i kliknąć File --> Save as HTML (with ToC) (chociaż zauważ, że ta pozycja menu nie była dla mnie dostępna).


Powyższe gify są powiązane z odpowiednią dokumentacją rozszerzeń.


Wolę pracować jupyter lab, ale potrzebuję dodać spis treści do wyjścia HTML dużego notatnika. To działa bez zarzutu! Było kilka dodatkowych kroków, aby to działało: 1. Włącz TOC2, np. conda install -c conda-forge jupyter_nbextensions_configuratorPrzejdź do http://localhost:8888/nbextensions, odznacz "kompatybilność" i włącz "Toc2" 2. Uruchom Classical Notebbok, zmodyfikuj ustawienia TOC do swoich potrzeb i Add TOC to Cell(postępuj zgodnie z opisem). 3. Otwórz .ipynbplik i wyszukaj "toc", skopiuj konfiguracje json toc i dodaj do metadanych za pomocą karty narzędzi w laboratorium Jupyter
Alex

Nie udało mi się uruchomić rozszerzenia toc2 w klasycznym notebooku, aby dodać komórkę TOC. Jednak eksportowanie notatnika za pomocą nbconvert --to html_toczadziałało. Format jest świetny i dodaje ładny spis treści z boku oraz numery nagłówków.
aimfeld

6

Wprowadzenie

Jak wspomnieli @Ian i @Sergey, nbextensions to proste rozwiązanie. Aby rozwinąć ich odpowiedź, oto kilka dodatkowych informacji.

Co to jest nbextensions?

Nbextensions zawiera kolekcję rozszerzeń, które dodają funkcjonalność do Twojego notesu Jupyter.

Na przykład, żeby zacytować kilka rozszerzeń:

  • Spis treści

  • Zwijane nagłówki

Zainstaluj nbextensions

Instalację można przeprowadzić za pomocą Conda lub PIP

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

Skopiuj pliki js i css

Aby skopiować pliki javascript i css nbextensions do katalogu wyszukiwania serwera jupyter, wykonaj następujące czynności:

jupyter contrib nbextension install --user

Przełącz rozszerzenia

Zauważ, że jeśli nie jesteś zaznajomiony z terminalem, lepiej byłoby zainstalować konfigurator nbextensions (patrz następna sekcja)

Możesz włączyć / wyłączyć wybrane rozszerzenia. Jak wspomniano w dokumentacji, ogólne polecenie to:

jupyter nbextension enable <nbextension require path>

Konkretnie, aby włączyć rozszerzenie ToC (spis treści), wykonaj:

jupyter nbextension enable toc2/main

Zainstaluj interfejs konfiguracyjny (opcjonalny, ale przydatny)

Jak mówi dokumentacja, nbextensions_configurator zapewnia interfejsy konfiguracyjne dla nbextensions.

Wygląda to następująco: konfiguratory nbextensions

Aby go zainstalować, jeśli używasz conda:

conda install -c conda-forge jupyter_nbextensions_configurator

Jeśli nie masz Conda lub nie chcesz instalować przez Conda, wykonaj następujące 2 kroki:

pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user

To świetna i szczegółowa odpowiedź. Domyślam się, że włączenie toc2/mainjest tym samym, co sprawdzenie " Spisu treści (2)" na localhost: 8888 / tree # nbextensions_configurator .
flow2k

4

Oto moje podejście, niezgrabne i dostępne na githubie :

Umieść pierwszą komórkę notebooka, komórkę importu:

from IPythonTOC import IPythonTOC

toc = IPythonTOC()

Gdzieś po komórce importu umieść komórkę genTOCEntry, ale jeszcze jej nie uruchamiaj:

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

print toc.genTOCEntry()

Pod komórką genTOCEntry` utwórz komórkę TOC jako komórkę przeceny:

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

#TOC

W miarę opracowywania notebooka, przed rozpoczęciem nowej sekcji umieść tę genTOCMarkdownCell:

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

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

!cat TOCMarkdownCell.txt

!rm TOCMarkdownCell.txt

Przenieś genTOCMarkdownCell w dół do punktu w swoim notatniku, w którym chcesz rozpocząć nową sekcję i wprowadź argument do genTOCMarkdownCell jako ciąg tytuł dla nowej sekcji, a następnie uruchom go. Dodaj komórkę przeceny zaraz po niej i skopiuj dane wyjściowe z genTOCMarkdownCell do komórki przeceny, która rozpoczyna nową sekcję. Następnie przejdź do komórki genTOCEntry w górnej części notebooka i uruchom ją. Na przykład, jeśli utworzysz argument do genTOCMarkdownCell, jak pokazano powyżej, i uruchomisz go, otrzymasz te dane wyjściowe do wklejenia do pierwszej komórki markdown nowo zindeksowanej sekcji:

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

###Introduction

Następnie, gdy przejdziesz na górę swojego notebooka i uruchomisz genTocEntry, otrzymasz wynik:

[Introduction](#Introduction)

Skopiuj ten ciąg linku i wklej go do komórki markdown TOC w następujący sposób:

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

#TOC

[Introduction](#Introduction)

Po wyedytowaniu komórki spisu treści w celu wstawienia ciągu łącza, a następnie naciśnięciu klawisza shift-enter, łącze do nowej sekcji pojawi się w spisie treści notatnika jako łącze internetowe, a kliknięcie go przestawi przeglądarkę na nową sekcję.

Często zapominam, że kliknięcie wiersza w spisie treści powoduje, że przeglądarka przeskakuje do tej komórki, ale jej nie wybiera. Każda komórka była aktywna po kliknięciu łącza TOC, więc nadal jest aktywna, więc strzałka w dół lub w górę lub shift-enter odnosi się do wciąż aktywnej komórki, a nie komórki, którą otrzymaliśmy po kliknięciu łącza TOC.


2

Jak już zauważył Ian, minrk ma rozszerzenie spisu treści dla Notatnika IPython. Miałem trochę problemów, aby to działało i stworzyłem ten notatnik IPython, który półautomatycznie generuje pliki dla rozszerzenia spisu treści Minrk w systemie Windows. Nie używa poleceń „curl” ani linków, ale zapisuje pliki * .js i * .css bezpośrednio w katalogu IPython Notebook-profile-profile.

W notatniku znajduje się sekcja zatytułowana `` Co musisz zrobić '' - postępuj zgodnie z nią i miej ładny, pływający spis treści:)

Oto wersja html, która już to pokazuje: http://htmlpreview.github.io/?https://github.com/ahambi/140824-TOC/blob/master/A%20floating%20table%20of%20contents.htm

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.