Bagaimana cara menambahkan daftar isi ke notebook Jupyter / JupyterLab?


106

Dokumentasi di http://ipython.org/ipython-doc/stable/interactive/notebook.html mengatakan

Anda dapat memberikan struktur konseptual untuk dokumen komputasi Anda secara keseluruhan menggunakan level heading yang berbeda; ada 6 level yang tersedia, dari level 1 (level atas) hingga level 6 (paragraf). Ini dapat digunakan nanti untuk membuat daftar isi, dll.

Namun, saya tidak dapat menemukan petunjuk di mana pun tentang cara menggunakan judul hierarki saya untuk membuat daftar isi seperti itu. Apakah ada cara untuk melakukan ini?

NB: Saya juga tertarik dengan jenis navigasi lain yang menggunakan judul notebook ipython, jika ada. Misalnya, melompat mundur dan maju dari satu judul ke judul lain untuk menemukan awal setiap bagian dengan cepat, atau menyembunyikan (melipat) konten dari seluruh bagian. Ini adalah daftar keinginan saya - tetapi segala jenis navigasi sama sekali akan menarik. Terima kasih!


lihat jawaban @Nikolay di bawah untuk solusi umum yang berfungsi di semua halaman web .. ini adalah jawaban yang bagus.
ihightower

Untuk melengkapi solusi notebook Jupyter yang ada, saya menambahkan instruksi JupyterLab di bawah ini.
joelostblom

Jawaban:


52

Ada ipython nbextension yang membuat daftar isi untuk notebook. Sepertinya hanya menyediakan navigasi, bukan pelipatan bagian.


Terima kasih, saya berasumsi inilah yang dimaksud dokumentasi.
pengguna2428107

2
Bagi yang ingin menginstalnya di jupyter 4, semoga postingan ini membantu.
Syrtis Major

9
Hanya untuk memperbarui ini: sekarang ada ekstensi nbextensions, yang menggabungkan banyak ekstensi menjadi satu dan memungkinkan Anda untuk mengelolanya melalui jupyter itu sendiri. Saya pikir sekarang cara termudah untuk mendapatkan ToC2. Dan itu menyediakan ekstensi relevan lainnya seperti pelipatan bagian. Ada di github.com/ipython-contrib/jupyter_contrib_nbextensions
user2428107

93

Anda dapat menambahkan TOC secara manual dengan Markdown dan HTML. Begini cara saya menambahkan:

Buat TOC di atas Notebook Jupyter:

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

Tambahkan jangkar html di seluruh tubuh:

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

code blocks...

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

code blocks...

Ini mungkin bukan pendekatan terbaik, tetapi berhasil. Semoga ini membantu.


15
Ini tidak berhasil untuk saya lagi, tetapi pendekatan serupa berhasil .
joelostblom

2
juga "pendekatan serupa" yang sama seperti ini: stackoverflow.com/questions/5319754/… tl; dr: gunakan <a name="pookie"></a>untuk jangkar dan untuk penggunaan tautan:Take me to [pookie](#pookie)
michael

2
Untuk semua judul dalam penurunan harga Anda, buku catatan secara otomatis menambahkan jangkar. Anda dapat mengeklik pilcrow (¶) di sebelah kanan judul yang Anda lihat saat Anda mengarahkan kursor ke atasnya, untuk menampilkan jangkar di bilah alamat browser Anda. Anda dapat menggunakan jangkar ini daripada menambahkan jangkar secara manual ke bagian penurunan harga Anda. Juga yang terbaik adalah ia bekerja lintas sel.
aaruja

1
Saya memiliki skrip add_toc.py yang menambahkan sel penurunan harga di bagian atas dengan daftar konten. Solusi orang miskin jika Anda tidak ingin memasang ekstensi.
pengguna2148414


18

Bagaimana jika menggunakan plugin Browser yang memberi Anda gambaran umum tentang halaman html APA SAJA. Saya telah mencoba yang berikut ini:

Keduanya bekerja dengan cukup baik untuk Notebook IPython. Saya enggan menggunakan solusi sebelumnya karena tampaknya agak tidak stabil dan akhirnya menggunakan ekstensi ini.


1
Sangat membantu! Tetapi beberapa fungsi built-in akan sangat masuk akal - terutama dalam kombinasi dengan penurunan harga
dmeu

13

Saya baru-baru ini membuat ekstensi kecil untuk Jupyter bernama jupyter-navbar . Ini mencari tajuk yang ditulis dalam sel penurunan harga, dan menampilkan tautan ke mereka di bilah sisi secara hierarkis. Bilah sisi dapat diubah ukurannya dan dapat diciutkan. Lihat gambar di bawah.

Ini mudah dipasang, dan memanfaatkan kode JS dan CSS 'khusus' yang dijalankan setiap kali buku catatan dibuka, jadi Anda tidak perlu menjalankannya secara manual.

masukkan deskripsi gambar di sini


1
Memang mudah dipasang, dan source code-nya juga bersahabat. Proyek yang bagus!
Carson

13

Sekarang ada dua paket yang dapat digunakan untuk menangani ekstensi Jupyter:

  1. jupyter_contrib_nbextensions yang menginstal ekstensi, termasuk daftar isi;

  2. jupyter_nbextensions_configurator yang menyediakan antarmuka pengguna grafis untuk mengonfigurasi nbextensions mana yang diaktifkan (memuat secara otomatis untuk setiap notebook) dan menyediakan kontrol untuk mengonfigurasi opsi nbextensions.

MEMPERBARUI:

Mulai dari versi terbaru jupyter_contrib_nbextensions, setidaknya dengan condaAnda tidak perlu menginstal jupyter_nbextensions_configuratorkarena sudah terpasang bersama dengan ekstensi tersebut.


10

Petunjuk ToC JupyterLab

Sudah ada banyak jawaban bagus untuk pertanyaan ini, tetapi sering kali memerlukan penyesuaian agar berfungsi dengan baik dengan notebook di JupyterLab. Saya menulis jawaban ini untuk merinci kemungkinan cara memasukkan ToC di notebook saat bekerja dan mengekspor dari JupyterLab.

Sebagai panel samping

The jupyterlab-toc ekstensi menambahkan TOC sebagai panel samping yang judul jumlah kaleng, bagian runtuh, dan akan digunakan untuk navigasi (lihat gif di bawah ini untuk demo). Instal dengan perintah berikut

jupyter labextension install @jupyterlab/toc

masukkan deskripsi gambar di sini


Di notebook sebagai sel

Saat ini, ini dapat dilakukan secara manual seperti dalam jawaban Matt Dancho, atau secara otomatis melalui ekstensi notebook toc2 jupyter di antarmuka notebook klasik.

Pertama, instal toc2 sebagai bagian dari bundel jupyter_contrib_nbextensions :

conda install -c conda-forge jupyter_contrib_nbextensions

Lalu, luncurkan JupyterLab, buka Help --> Launch Classic Notebook, dan buka notebook tempat Anda ingin menambahkan ToC. Klik simbol toc2 di toolbar untuk menampilkan jendela ToC mengambang (lihat gif di bawah jika Anda tidak dapat menemukannya), klik ikon roda gigi dan centang kotak "Tambahkan sel ToC notebook". Simpan notebook dan sel ToC akan ada di sana saat Anda membukanya di JupyterLab. Sel yang dimasukkan adalah sel penurunan harga dengan html di dalamnya, itu tidak akan diperbarui secara otomatis.

Opsi default toc2 dapat dikonfigurasi di tab "Nbextensions" di halaman peluncuran buku catatan klasik. Misalnya, Anda dapat memilih nomor tajuk dan mengaitkan ToC sebagai bilah samping (yang menurut saya pribadi terlihat lebih bersih).

masukkan deskripsi gambar di sini


Dalam file HTML yang diekspor

nbconvertdapat digunakan untuk mengekspor notebook ke HTML mengikuti aturan tentang cara memformat HTML yang diekspor. The toc2ekstensi yang disebutkan di atas menambahkan format ekspor yang disebut html_toc, yang dapat digunakan langsung dengan nbconvertdari baris perintah (setelah toc2perpanjangan telah terinstal):

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

Ingatlah bahwa perintah shell dapat ditambahkan ke sel notebook dengan diawali dengan tanda seru !, sehingga Anda dapat menempelkan baris ini di sel terakhir notebook dan selalu memiliki file HTML dengan ToC yang dibuat saat Anda menekan "Jalankan semua sel" ( atau hasil apa pun yang Anda inginkan nbconvert). Dengan cara ini, Anda dapat menggunakan jupyterlab-tocuntuk menavigasi notebook saat Anda bekerja, dan masih mendapatkan ToC dalam output yang diekspor tanpa harus menggunakan antarmuka notebook klasik (untuk puritan di antara kita).

Perhatikan bahwa mengonfigurasi opsi toc2 default seperti dijelaskan di atas, tidak akan mengubah format nbconver --to html_toc. Anda perlu membuka notebook di antarmuka notebook klasik agar metadata dapat ditulis ke file .ipynb (nbconvert membaca metadata saat mengekspor) Atau, Anda dapat menambahkan metadata secara manual melalui tab Alat Notebook dari sidebar JupyterLab, misalnya sesuatu Suka:

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

Jika Anda lebih suka pendekatan berbasis GUI, Anda harus dapat membuka buku catatan klasik dan mengklik File --> Save as HTML (with ToC) (meskipun perhatikan bahwa item menu ini tidak tersedia untuk saya).


Gif di atas ditautkan dari dokumentasi masing-masing ekstensi.


Saya lebih suka bekerja dengan jupyter lab, tetapi perlu menambahkan TOC ke output HTML notebook besar. Ini bekerja dengan sempurna! Ada beberapa langkah tambahan untuk membuatnya bekerja: 1. Aktifkan TOC2, misalnya conda install -c conda-forge jupyter_nbextensions_configurator, pergi ke http://localhost:8888/nbextensions, hapus centang "kompatibilitas" dan aktifkan "Toc2" 2. Luncurkan Notebbok Klasik, ubah pengaturan TOC sesuai kebutuhan Anda dan Add TOC to Cell(lanjutkan seperti yang dijelaskan). 3. Buka .ipynbfile Anda dan cari "toc", salin konfigurasi json toc dan tambahkan ke metadata menggunakan tab alat lab Jupyter
Alex

6

pengantar

Seperti yang telah disebutkan @Ian dan @Sergey, nbextensions adalah solusi sederhana. Untuk menguraikan jawaban mereka, berikut adalah beberapa informasi lagi.

Apa itu nbextensions?

Nbextensions berisi kumpulan ekstensi yang menambahkan fungsionalitas ke notebook Jupyter Anda.

Misalnya, hanya untuk mengutip beberapa ekstensi:

  • Daftar Isi

  • Judul yang bisa diciutkan

Pasang nbextensions

Instalasi dapat dilakukan melalui Conda atau PIP

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

Salin file js dan css

Untuk menyalin file javascript dan css nbextensions ke direktori pencarian server jupyter, lakukan hal berikut:

jupyter contrib nbextension install --user

Alihkan ekstensi

Perhatikan bahwa jika Anda tidak terbiasa dengan terminal, akan lebih baik untuk menginstal nbextensions configurator (lihat bagian selanjutnya)

Anda dapat mengaktifkan / menonaktifkan ekstensi pilihan Anda. Seperti yang disebutkan dalam dokumentasi, perintah generiknya adalah:

jupyter nbextension enable <nbextension require path>

Secara konkret, untuk mengaktifkan ekstensi ToC (Daftar Isi), lakukan:

jupyter nbextension enable toc2/main

Instal antarmuka Konfigurasi (opsional tapi berguna)

Seperti yang dikatakan dalam dokumentasinya, nbextensions_configurator menyediakan antarmuka config untuk nbextensions.

Ini terlihat seperti berikut: nbextensions configurators

Untuk menginstalnya jika Anda menggunakan conda:

conda install -c conda-forge jupyter_nbextensions_configurator

Jika Anda tidak memiliki Conda atau tidak ingin menginstal melalui Conda, lakukan 2 langkah berikut:

pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user

Ini adalah jawaban yang bagus dan terperinci. Saya kira mengaktifkannya toc2/mainsama dengan memeriksa "Daftar Isi (2)" di localhost: 8888 / tree # nbextensions_configurator .
flow2k

4

Inilah pendekatan saya, kikuk apa adanya dan tersedia di github :

Letakkan di sel notebook pertama, sel impor:

from IPythonTOC import IPythonTOC

toc = IPythonTOC()

Di suatu tempat setelah sel impor, masukkan sel genTOCEntry tetapi jangan jalankan dulu:

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

print toc.genTOCEntry()

Di bawah sel genTOCEntry`, buat sel TOC sebagai sel penurunan harga:

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

#TOC

Saat notebook dikembangkan, letakkan genTOCMarkdownCell ini sebelum memulai bagian baru:

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

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

!cat TOCMarkdownCell.txt

!rm TOCMarkdownCell.txt

Pindahkan genTOCMarkdownCell ke bawah ke titik di buku catatan Anda di mana Anda ingin memulai bagian baru dan buat argumen ke genTOCMarkdownCell sebagai judul string untuk bagian baru Anda, lalu jalankan. Tambahkan sel penurunan harga tepat setelahnya dan salin keluaran dari genTOCMarkdownCell ke dalam sel penurunan harga yang memulai bagian baru Anda. Lalu pergi ke sel genTOCEntry di dekat bagian atas notebook Anda dan jalankan. Misalnya, jika Anda membuat argumen ke genTOCMarkdownCell seperti yang ditunjukkan di atas dan menjalankannya, Anda mendapatkan output ini untuk ditempelkan ke sel penurunan harga pertama dari bagian yang baru diindeks:

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

###Introduction

Kemudian saat Anda pergi ke bagian atas notebook Anda dan menjalankan genTocEntry, Anda mendapatkan output:

[Introduction](#Introduction)

Salin string tautan ini dan tempelkan ke sel penurunan harga TOC sebagai berikut:

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

#TOC

[Introduction](#Introduction)

Setelah Anda mengedit sel TOC untuk menyisipkan string link lalu Anda menekan shift-enter, link ke bagian baru Anda akan muncul di Daftar Isi buku catatan Anda sebagai link web dan mengkliknya akan menempatkan browser ke bagian baru Anda.

Satu hal yang sering saya lupakan adalah mengklik sebuah baris di TOC membuat browser melompat ke sel itu tetapi tidak memilihnya. Sel apa pun yang aktif ketika kita mengklik tautan TOC masih aktif, jadi panah bawah atau atas atau shift-enter mengacu pada sel yang masih aktif, bukan sel yang kita dapatkan dengan mengklik tautan TOC.


2

Seperti yang telah ditunjukkan Ian, ada ekstensi daftar isi oleh minrk untuk Notebook IPython. Saya mengalami kesulitan untuk membuatnya bekerja dan membuat Notebook IPython ini yang secara semi-otomatis menghasilkan file untuk ekstensi daftar isi minrk di Windows. Itu tidak menggunakan 'curl'-commands atau links, tapi menulis file * .js dan * .css langsung ke direktori IPython Notebook-profile-directory.

Ada bagian di buku catatan yang disebut 'Apa yang perlu Anda lakukan' - ikuti dan buat daftar isi mengambang yang bagus :)

Berikut adalah versi html yang sudah menunjukkannya: http://htmlpreview.github.io/?https://github.com/ahambi/140824-TOC/blob/master/A%20floating%20table%20of%20contents.htm

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.