Jupyter/Jupyter Lab 노트북에 목차를 추가하려면 어떻게 해야 합니까?
문서에는 다음과 같이 나와 있습니다
여러 수준의 표제를 사용하여 컴퓨터 문서 전체에 대한 개념 구조를 제공할 수 있습니다. 사용 가능한 수준은 수준 1(최상위 수준)에서 수준 6(문단)까지 6개입니다. 이것들은 나중에 목차 등을 구성하는 데 사용될 수 있다.
그러나 계층 제목을 사용하여 목차를 만드는 방법에 대한 지침을 찾을 수 없습니다. 이걸 할 방법이 있나요?
주의: ipython 노트북 제목을 사용하는 다른 종류의 네비게이션도 관심이 있습니다. 예를 들어, 각 섹션의 시작을 빠르게 찾기 위해 머리글에서 머리글로 앞뒤로 점프하거나 전체 섹션의 내용을 숨깁니다(접습니다). 이것은 나의 위시리스트이다 - 그러나 어떤 종류의 내비게이션도 흥미로울 것이다. 감사합니다!
노트북의 목차를 구성하는 것이 있다. 섹션 폴딩이 아닌 내비게이션만 제공하는 것 같습니다.
JS의 번거로움 없이 한 가지 옵션이 더 있습니다:
Ian이 이미 지적했듯이, IPython Notebook의 목차 확장이 minr 단위로 있습니다. 나는 그것을 작동시키기 위해 약간의 어려움을 겪었고 윈도우에서 minrk의 목차 확장을 위한 파일을 반자동으로 생성하는 이것을 만들었다. 'curl' 명령이나 링크를 사용하지 않고 *.js 및 *.css 파일을 IPython Notebook-profile-directory에 직접 씁니다.
공책에 - 따라가서 멋진 부동 목차를 가져라 :)라는 섹션이 있다
다음은 이미 표시된 html 버전입니다:
임의의 HTML 페이지에 대한 개요를 제공하는 브라우저 플러그인을 사용해 보는 것은 어떨까요. 나는 다음을 시도했다:
- 크롬용
- 파이어폭스용
둘 다 IPython 노트북에서 꽤 잘 작동합니다. 나는 이전 솔루션들이 약간 불안정해 보여서 사용하기가 꺼려졌고 결국 이러한 확장을 사용하게 되었다.
다음은 투박하고 사용 가능한 내 접근법이다:
첫 번째 노트북 셀인 가져오기 셀에 넣습니다:
from IPythonTOC import IPythonTOC
toc = IPythonTOC()
수입 셀 다음 어딘가에, 제네를 넣는다TOCEntry 셀이지만 아직 실행하지 않음:
''' if you called toc.genTOCMarkdownCell before running this cell,
the title has been set in the class '''
print toc.genTOCEntry()
세대 아래TOC Entry cell ", TOC cell을 마크다운 셀로 만듭니다:
<a id='TOC'></a>
#TOC
노트북이 개발되면서 이 세대를새 섹션을 시작하기 전에 TOC 마크다운 셀:
with open('TOCMarkdownCell.txt', 'w') as outfile:
outfile.write(toc.genTOCMarkdownCell('Introduction'))
!cat TOCMarkdownCell.txt
!rm TOCMarkdownCell.txt
세대를 이동TOC Markdown 새로운 섹션을 시작하고 gen에 대한 주장을 할 수 있는 노트북의 지점까지 셀을 표시합니다TOC Markdown 새 섹션의 문자열 제목을 셀링한 다음 실행합니다. 바로 뒤에 마크다운 셀을 추가하고 gen에서 출력을 복사합니다TOC 마크다운 셀을 새 섹션을 시작하는 마크다운 셀로 이동합니다. 그럼 장군에게 가봐노트북 맨 위에 있는 TOC 입력 셀을 실행합니다. 예를 들어, 만약 당신이 gen에게 인수를 한다면위에 표시된 것처럼 TOC MarkdownCell을 실행하면 다음 출력을 새로 인덱싱된 섹션의 첫 번째 마크다운 셀에 붙여넣을 수 있습니다:
<a id='Introduction'></a>
###Introduction
그런 다음 노트북 맨 위로 이동하여 genTocEntry를 실행하면 다음과 같은 출력이 표시됩니다:
[Introduction](#Introduction)
다음과 같이 이 링크 문자열을 복사하여 TOC 마크다운 셀에 붙여넣습니다:
<a id='TOC'></a>
#TOC
[Introduction](#Introduction)
TOC 셀을 편집하여 연결 문자열을 삽입한 다음 shift-enter를 누르면 새 섹션에 대한 링크가 노트북 목차에 웹 링크로 표시되고 이 링크를 클릭하면 브라우저가 새 섹션으로 이동합니다.
TOC에서 줄을 클릭하면 브라우저가 해당 셀로 이동하지만 셀을 선택하지 않는다는 점을 자주 기억합니다. TOC 링크를 클릭했을 때 활성화된 셀은 여전히 활성화되어 있으므로 아래쪽 화살표 또는 위쪽 화살표 또는 Shift-Enter는 TOC 링크를 클릭하여 얻은 셀이 아니라 활성화된 셀을 나타냅니다.
Markdown과 HTML을 사용하여 TOC를 수동으로 추가할 수 있습니다. 다음은 제가 추가하는 방법입니다:
Jupyter 노트북 맨 위에 TOC 만들기:
## 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...
최선의 방법은 아닐 수도 있지만, 효과가 있습니다.
이제 주피터 확장을 처리하는 데 사용할 수 있는 두 가지 패키지가 있습니다:
목차를 포함한 확장명을 설치합니다;
nbextension이 활성화된 그래픽 사용자 인터페이스(모든 노트북에 대해 자동으로 로드됨)를 제공하고 nbextension의 옵션을 구성하는 제어 기능을 제공합니다.
업데이트:
의 최신 버전부터는 해당 확장과 함께 설치되므로 설치할 필요가 없습니다.
나는 최근에 목성의 작은 확장을 만들었다. 이것은 마크다운 셀에 기록된 헤더를 검색하고 사이드바에 계층적 방식으로 헤더에 대한 링크를 표시합니다. 사이드바는 크기를 조정하고 접을 수 있습니다. 아래 스크린샷을 참조하십시오.
설치가 쉽고 노트북을 열 때마다 실행되는 '커스텀' JS와 CSS 코드를 활용하기 때문에 수동으로 실행할 필요가 없다.
nb 확장ToC 명령어
서론
@Ian과 @Sergey가 언급했듯이, 간단한 해결책이다. 그들의 대답을 자세히 설명하기 위해, 여기 몇 가지 더 많은 정보가 있다.
nb 확장이란 무엇인가?
그런 다음 확장 기능은 Jupyter 노트북에 기능을 추가하는 확장 기능 모음을 포함합니다.
예를 들어, 몇 가지 확장을 예로 들어보자:
목차.
접을 수 있는 제목
nb 확장 설치
설치는 Conda 또는 PIP를 통해 수행할 수 있습니다
# If conda:
conda install -c conda-forge jupyter_contrib_nbextensions
# or with pip:
pip install jupyter_contrib_nbextensions
주피터 노트북 메뉴에 새 탭이 표시됩니다. 맨 위에 있는 확인란을 선택 취소한 다음 선택합니다. 그게 다야. 스크린샷:
js 및 css 파일 복사
nbextensions의 javascript 및 css 파일을 주피터 서버의 검색 디렉터리에 복사하려면 다음을 수행하십시오:
jupyter contrib nbextension install --user
확장 전환
터미널을 잘 모르는 경우 nb 확장 구성기를 설치하는 것이 좋습니다(다음 섹션 참조)
선택한 확장 기능을 사용하거나 사용하지 않도록 설정할 수 있습니다. 설명서에서 언급한 바와 같이 일반적인 명령은 다음과 같습니다:
jupyter nbextension enable <nbextension require path>
구체적으로 ToC(목차) 확장을 사용하려면 다음을 수행합니다:
jupyter nbextension enable toc2/main
구성 인터페이스 설치(선택 사항이지만 유용)
설명서에 나와 있듯이, 에서는 nb 확장에 대한 구성 인터페이스를 제공합니다.
다음과 같습니다:
콘다를 사용하는 경우 설치하기:
conda install -c conda-forge jupyter_nbextensions_configurator
Conda가 없거나 Conda를 통해 설치하지 않으려면 다음 두 단계를 수행하십시오:
pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user
Jupyter Lab ToC 지침
이 질문에 대한 좋은 답변은 이미 많지만 JupyterLab의 노트북에서 제대로 작동하려면 수정이 필요한 경우가 많습니다. 저는 Jupyter Lab에서 작업하고 수출하는 동안 노트북에 ToC를 포함하는 가능한 방법을 자세히 설명하기 위해 이 답변을 작성했습니다.
사이드 패널로
확장은 머리글에 번호를 매기고 섹션을 접으며 탐색에 사용할 수 있는 측면 패널로 ToC를 추가합니다(데모는 아래 gif 참조). 이 확장은 JupyterLab 3.0 이후 기본적으로 포함되어 있으며 이전 버전에서는 다음 명령을 사용하여 설치할 수 있습니다
jupyter labextension install @jupyterlab/toc
노트북에서 셀로 사용합니다
현재는 Matt Dancho의 답변처럼 수동으로 수행하거나 기존 노트북 인터페이스를 통해 자동으로 수행할 수 있습니다.
먼저 tc2를 의 일부로 설치합니다:
conda install -c conda-forge jupyter_contrib_nbextensions
그런 다음 JupterLab을 시작하고 으로 이동한 다음 ToC를 추가할 노트북을 엽니다. 도구 모음에서 toc2 기호를 클릭하여 부동 ToC 창을 표시하고(찾을 수 없는 경우 아래의 gif를 참조하십시오) 기어 아이콘을 클릭한 다음 "노트북을 C 셀에 추가" 상자를 선택합니다. 노트북을 저장하면 Jupyter Lab에서 열 때 ToC 셀이 나타납니다. 삽입된 셀은 HTML이 포함된 마크다운 셀이므로 자동으로 업데이트되지 않습니다.
The default options of the toc2 can be configured in the "Nbextensions" tab in the classic notebook launch page. You can e.g. choose to number headings and to anchor the ToC as a side bar (which I personally think looks cleaner).
In an exported HTML file
nbconvert
can be used to export notebooks to HTML following rules of how to format the exported HTML. The toc2
extension mentioned above adds an export format called html_toc
, which can be used directly with nbconvert
from the command line (after the toc2
extension has been installed):
jupyter nbconvert file.ipynb --to html_toc
# Append `--ExtractOutputPreprocessor.enabled=False`
# to get a single html file instead of a separate directory for images
Remember that shell commands can be added to notebook cells by prefacing them with an exclamation mark !
, so you can stick this line in the last cell of the notebook and always have an HTML file with a ToC generated when you hit "Run all cells" (or whatever output you desire from nbconvert
). This way, you could use jupyterlab-toc
to navigate the notebook while you are working, and still get ToCs in the exported output without having to resort to using the classic notebook interface (for the purists among us).
Note that configuring the default toc2 options as described above, will not change the format of nbconver --to html_toc
. You need to open the notebook in the classic notebook interface for the metadata to be written to the .ipynb file (nbconvert reads the metadata when exporting) Alternatively, you can add the metadata manually via the Notebook tools tab of the JupyterLab sidebar, e.g. something like:
"toc": {
"number_sections": false,
"sideBar": true
}
If you prefer a GUI-driven approach, you should be able to open the classic notebook and click File --> Save as HTML (with ToC)
(although note that this menu item was not available for me).
The gifs above are linked from the respective documentation of the extensions.
Simple markdown solution
You can use markdown hyperlinks to jump to markdown headers without defining html tags. No matter how many hashes #
you have in your title, use one for the hyperlink. Any spaces in you title are replaced with hyphens -
.
Create the contents table
# Contents
- [Section 1](#Section-1)
- [Section 2](#Section-2)
- [Section 3](#Section-3)
Create headers
# Section 1
## Section 2
You can also add a hyperlink back to the contents.
### Section 3
[top](#Contents)
This is similar to Matt Dancho's answer but I always find html anchors to be fiddly.
The question has already been answered, but here is a function for others like me who would like a lightweight solution they can paste in a code cell, run and get the table of contents to copy and paste in a markdown cell:
import urllib, json
def generate_toc(notebook_path, indent_char=" "):
is_markdown = lambda it: "markdown" == it["cell_type"]
is_title = lambda it: it.strip().startswith("#") and it.strip().lstrip("#").lstrip()
with open(notebook_path, 'r') as in_f:
nb_json = json.load(in_f)
for cell in filter(is_markdown, nb_json["cells"]):
for line in filter(is_title, cell["source"]):
line = line.strip()
indent = indent_char * (line.index(" ") - 1)
title = line.lstrip("#").lstrip()
url = urllib.parse.quote(title.replace(" ", "-"))
out_line = f"{indent}[{title}](#{url})<br>\n"
print(out_line, end="")
'개발하자' 카테고리의 다른 글
펄럭임/안드로이드: [...] 활동이 있지만 'android:exported' 속성이 없는 APK를 업로드했습니다. exported="true"가 작동하지 않음 (0) | 2023.03.20 |
---|---|
플러터에 있는 연산자 == 방법은 무엇입니까? (0) | 2023.03.20 |
개발 모드에서 Svelte-kit에서 프록시하는 방법 (0) | 2023.03.19 |
응답이 Fast의 POST 응답을 표시하지 않음API 백엔드 애플리케이션 (0) | 2023.03.18 |
주피터 SQL 셀의 Python 변수 (0) | 2023.03.17 |