ムカデノワラジ

ムカデノワラジ

ガジェット・Webサービス・プログラミング・エンタメについて書く雑記ブログ

MENU

Windows10 jupyter notebookで日本語&LaTeXを含む文書をdownload as PDF でダウンロードできる環境を作る

LaTeXを使う機会があったのだが、LaTeXで文章を書くのはめんどくさい。タグ名長すぎる。普段Ruby on RailsHamlを使っているのでHTMLでさえめんどくさい。

Markdownを使えば表もスッキリかけるし、最悪HTMLタグを使って文字などを装飾できる。

LaTeXMarkdownPythonを混在できて、Jupyter notebookから直接コンパイルしてPDF出力できたら最強じゃないかと思ったので、Jupyterを使って文書作成環境を作ろうとしたら案外詰まったのでこの記事にまとめる。

この記事について

Markdownとうまいこと混在させて書けるエディターがなかったのでJupyter Notebookを使って快適なLatex & Markdown & Pythonの文書作成環境を作った。

Windows 10 Jupyter NotebookでmarkdownLaTeXの混ざった文書作成環境を構築する。

最終的にJupyter NotebookのGUI  [Download as PDF via LaTeX] でPDFをダウンロードできるようにする

英語・日本語を含んだipynbもDownload as PDFでダウンロードできる 

ココが一番手間取った。texファイル=> PDFの記事はネットにそれなりにあるけど、ipynb => PDFの記事はほとんどない。加えてLaTeXはそんなに使ったことないからTeXのエラーがいまいちわからないのでちょっと詰まった。

 最終的にできること
  • Pythonのコード・MarkdownLaTeXをひとつのipyrbファイルで管理
  • 簡単に文章・数式を記述&図を描画
  • Jupyter NotebookのGUI [ Download as PDF ] を日本語に対応させる
  • LaTeX=>PDFに限りなく近い形式でipynb=>PDFにJupyter Notebookから直接変換
  • Input cellsのPythonコードをPDF化するとき完全に隠す
環境

Windows 10 Pro

Python 3.6

anaconda navigator, pandocがインストールされていることが前提

※pandocのバージョンは2.0.0以下推奨だがそれ以上でも問題なく動作した。

 

Jupyter notebookの設定

 

拡張機能の有効化

anaconda promptよりjupyter notebookの拡張機能を利用できるようにする

f:id:xhateblo:20190508204716p:plain

以下の手順を実行すれば上の画像のようなNBextensionsのタブがJupyter NotebookのHomeに追加される。

 

 pip install jupyter-contrib-nbextensions
 pip install jupyter-nbextensions-configurator

拡張機能を有効化する

 jupyter contrib nbextension install --user

 jupyter nbextensions_configurator enable --user

参考:http://pynote.hatenablog.com/entry/jupyter-notebook-nbextensions

以上の操作でGUIからJupyter notebookの拡張機能が設定できる。 

 

文書作成に使える拡張機能

にチェックを付ける。

 

  • table content

table conent(2)のAdd a Table of Contents at the top of the notebookにチェックを入れると一番上のcellに見出しが挿入される。

 table content(2)を使うと、Markdownのヘッダーから自動で見出しが生成される

f:id:xhateblo:20190508205152p:plain

 


Python Markdownを使うと、markdown内に{{}}を使ってpythonの変数を代入できる

e.g. {{ python_code  }}

※ただし、PDF出力時には展開されない 

  • equation auto numbering

equation auto numberingで数式に番号が自動で割り当てられる 

f:id:xhateblo:20190508205348p:plain

・Live Markdown PreviewLaTeX environment for jupyter


これを使うと上の画像の様にMarkdown& Latex environment for jupyter がプレビューされる。

 

Tex環境

PDF出力するためにはTeXがPCにインストールされている必要がある。

今回はMikTeXをPCにインストールする。

texliveでもできるそうだが、6Gb近くあったので軽量なMikTexを利用した。

 

https://miktex.org/ よりMikTexのインストーラーをダウンロードする

インストールする際、installing missing packagesは

ask me からyesに変更する

ask me でもできるが、packagesがないときに逐一確認しないといけないのでめんどくさい。

 

インストール後、MikTex ConsoleからUpdatesを実行したあとPackagesをインストールする

 

  • cjk
  • cjk-fonts 
  • miktex-cjkutils-bin-x64-2.9
  • xecjk
  • japanese-otf
  • xetex
  • miktex-fribidixetex-bin-x64-2.9
  • miktex-xetex
  • miktex-xetex-bin-x64-2.9
  • IPAex
  • IPAex-type1

 

をインストールした。

 

/Anaconda3/Lib/site-packages/nbconvert/templates/latex/base.tplx

を編集する

※隠しフォルダだと見当たらないのでエクスプローラーの表示から隠しフォルダにチェックを入れる

base.tplxのblock packagesの内容を編集する

次のようにusepackage{xeCJK}以下を追加する

 

( ( *  block header *))
( ( *  block docclass *))

( ( * endblock docclass *))

( (  * block packages *))
\usepackage[T1]{fontenc}
\usepackage{xeCJK}
\setCJKmainfont[BoldFont=IPAexGothic]{IPAexMincho}
\setCJKsansfont{IPAexGothic}
\setCJKmonofont{IPAGothic}

 

保存したらJupyter Notebookを再起動すればOK 

Markdown、英語、日本語、LatexPythonが混在したファイルでもPDF出力できる。はず。

f:id:xhateblo:20190508210049p:plain

 上のipynbをDownload as PDF via Latex すると下のPDFになる。

inputを消すにはanaconda promptからjupyter nbconvert --to pdf Filename.ipynbにオプションを指定してPDFに変換する。見ての通りembedded pythonは式展開されない。

f:id:xhateblo:20190508210216p:plain

 

このままでもいいが、タイトルがファイル名、auther名なしになってしまうので文書としては少し使い勝手が悪い。

以下の手順でEdit => Edit Notebook Metadataに設定したTitle, authorなどをtexのtitle, authorにできる。

 

jupyter notebook のedit notebook metadataのJSON

"latex_metadata": {
"title": "Amazing Article",
"author": "Hoge Taro"
},

を追加する。

また /Anaconda3/Lib/site-packages/nbconvert/templates/latex/base.tplx

のmakeblockの ( ( *  block maketitle *))\maketitle( ( * endblock maketitle *))の部分を次のように編集する。

latex_metadataがある場合はlatex_metadataの情報を使い、ない場合はtitle= file name, author = default になる。

( ( *  block maketitle *))

( ( * - if nb.metadata["latex_metadata"]: -*))
( ( * - if nb.metadata["latex_metadata"]["author"]: -*))
\author{((( nb.metadata["latex_metadata"]["author"] )))}
( ( * - endif *))
( ( * - else -*))
\author{Default}
( ( *- endif *))

 

( ( * - if nb.metadata["latex_metadata"]: -*))
( ( * - if nb.metadata["latex_metadata"]["title"]: -*))
\title{((( nb.metadata["latex_metadata"]["title"] )))}
( ( * - endif *))
( ( * - else -*))
\title{((( resources.metadata.name )))}
( ( * - endif *))

\date{\today}
\maketitle
( ( *  endblock maketitle *))

 出力例

f:id:xhateblo:20190508225831p:plain

 日本語も可

f:id:xhateblo:20190508230054p:plain


  参考:http://blog.juliusschulz.de/blog/ultimate-ipython-notebook

 

inputを完全に隠す(Hide input cells after converting to PDF)

nbconvertするファイルがあるディレクトリにhidecode.tplxを作る。

hidecode.tplxの中身は次のようにする。

( ( *- extends 'article.tplx' -*))

( ( * block input_group *))
( ( *- if cell.metadata.get('nbconvert', {}).get('show_code', False) -*))
((( super() )))
( ( * - endif -*))
( ( *  endblock input_group *))

 

anaconda promptから

 

jupyter nbconvert --to pdf --template hidecode Filename.ipynb

 

を実行して変換すれば出力するPDFからin[n] のcodeの表示を隠せる

 参考:https://stackoverflow.com/questions/34818723/export-notebook-to-pdf-without-code

 

文書作成、図の描画、MarkdownLaTeX、コーディングとデバッグを一つの画面で完結させられるJupyter Notebook便利すぎです。

www.slideshare.net

こんな記事があったけど、今回やった方法でPDF化すればもっと簡単に印刷物まで作れるかもしれない。

 

 

 

参考サイト

https://qiita.com/masa-ita/items/8d5ebe8afe0d580af184#%E5%8F%82%E8%80%83

 https://cartman0.hatenablog.com/entry/2016/03/29/131903#sec-warningLatex-japanese

 

基本的なlatexの数式の参考サイト

https://qiita.com/namoshika/items/63db972bfd1030f8264a