Julia + Jupyter + VSCode + Windows10 でNotebook to PDF

以前導入したJuliaJupyter環境をリセットして、再度セットアップしようとしたら死ぬほど詰まったのでメモ。

はじめに

グラフ描画と言えばPython+matplotlibが文献も豊富で重宝するが、科学計算という点ではJuliaの方が優れている。 例えば、三角関数をプロットするだけを考えてもPythonではnumpyをインポートした上で、

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
plt.plot(x, y)

と書かなければならないが、Juliaであれば、

using Plots
x = collect(0:0.01:2π)
y = sin.(x)
plot(x, y)

で書けるので、ちょっとしたグラフのレポートや計算のレポートを作成する際に最適である。

物理学科所属の私にとってunicodeをそのままコードに書けること程ありがたいものはない。

理系学生はJuliaの導入を検討すべきだと思うし、普及させたいと考えているのでその一助となれば。

環境

  • Windows10
  • Julia-1.6.1
  • Jupyter Notebook(IJuliaからminicondaを通してインストール)
  • VSCode-1.58.0-insider
  • MikTeX-21.6
  • Inkscape-1.1

Juliaのインストール

julialang.org (accessd on 2021/6/15)

環境変数PATHを通しておくと、どこからでも起動できるので便利。

Juliaのパッケージ

コンソールからJuliaREPLを起動する。

$ julia
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.6.1 (2021-04-23)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |
julia>

]キーを入力してパッケージモードへ切り替えると、(@1.6) pkg>になる。 使い方はGoogle検索しても良いし、helpで確認しても良い。

データ分析の基本的なパッケージを入れる。

(@1.6) pkg>add IJulia  # Jupyter用のカーネル
(@1.6) pkg>add Plots  # グラフ描画ライブラリ
(@1.6) pkg>add DataFrames # pandasのようなもの

それぞれの入門的なものは本題ではないのでここでは無し。 インターネット上のドキュメントは充実している。

Jupyter Notebookのインストール

既にインストールされている場合は必要ないかもしれないが、今回の本題であるNotebook to PDF という点では若干環境が異なるので注意。

パッケージモードからbackspaceキーで戻って、

julia> using IJulia
julia> notebook()

conda経由でインストールするか聞かれるのでyesと。 ~\.julia\condaPythonipython等の必要なライブラリがインストールされてJupyter Notebookが起動する。

因みに~\はホームディレクトリのことでWindowsだとC:\Users\username\

Jupyter NotebookVSCodeから使用するため今は閉じて良し。

VSCodeのインストールと拡張機能

VSCode InsidersのNotebookのGUIが好みだったんだけど、最近VSCodeの仕様と統一されたっぽい? setting.json

{
    "jupyter.experiments.optOutFrom": ["NativeNotebookEditor"]
}

となってただけでした。。。

code.visualstudio.com (accessd on 2021/6/15)

拡張機能JupyterJuliaだけで良い。

github.com

github.com (accessd on 2021/6/15)

Notebookの作成とグラフの描画

# julia-sin.ipynb #
using Plots
x = collect(0:0.01:2π)
y = sin.(x)
plot(x, y)

カーネルJuliaを選択してノートブックを実行するとグラフが描画される。

Notebook to PDF

さて、作成したノートブックをPDFのレポートとして提出したいわけだが、ここが難所なのである。

VSCodeJupyter拡張にはExport asというオプションがあるが、準備なしにはそれは上手くいかない。環境ごとに問題が発生するせいでインターネットにもピンポイントな回答は少ない。

今回はWindows10という環境に絞ってこの問題を解決したいと思う。

Jupyter Interpreterの選択

Jupyter拡張機能を起動する用のPythonインタープリターを選択する。Pythonを複数インストールしている場合は正しく選択されていない可能性があるので要確認。

VSCodeで「ctrl+shift+P」でコマンドパレットを開いて、「Jupyter: Select interpreter to start Jupyter Server」から先ほどcondaでインストールしたPython~\.julia\conda\3\python.exe)を指定する。

MiKTeXのインストール

PDFに変換する際nbconvertというPythonのライブラリを通して一旦texに変換するわけだが、その際に必要なパッケージを管理するのにWindowsではMiKTeXというソフトを使う。 miktex.org (accessd on 2021/6/15)

念のためC:\Program Files\MiKTeX\miktex\bin\x64\へPATHが通っている確認する。

Inkscapeのインストール

グラフをPDF出力するのにnbconvertInkscapeを必要とする。

inkscape.org (accessd on 2021/6/15)

さて、ここが詰まりポイントである。通常インストーラーでインストールするとC:\Program Files\へインストールされるのだが、Program Filesのスペースのせいでnbconvertsvg2pdf.pyが機能しない。InkscapeをCドライブ直下などに配置しなおすことで対処可能。このとき、C:\Inkscape\binにPATHを通すのを忘れないようにする。

PDFの日本語出力

レポートを書いていてすぐに気が付くのが、日本語が出力されないことである。日本の大学で教授も日本人(たとえいくら国際学会で活躍していたとしても)となると名前ぐらいは漢字で書くのが普通だと思うので厄介な問題となる。

結論から言うと、~\.julia\conda\3\share\jupyter\nbconvert\templates\latex\index.tex.j2を次のように書き換える。

((=- Default to the notebook output style -=))
((*- if not cell_style is defined -*))
    ((* set cell_style = 'style_jupyter.tex.j2' *))
((*- endif -*))

((=- Inherit from the specified cell style. -=))
((* extends cell_style *))


%===============================================================================
% Latex Article
%===============================================================================

((*- block docclass -*))
\documentclass[xelatex,ja=standard]{bxjsarticle}
((*- endblock docclass -*))

((*- block packages -*))
((( super() )))
% For greek in a code block
\usepackage[Greek]{ucharclasses}
\newfontfamily{\mygreek}{DejaVuSansMono} 
\setTransitionsForGreek{\mygreek}{}
((*- endblock packages -*))

もしファイルが見つからなければ、

$ cd ~\.julia\conda\3\Scripts
$ ./jupyter --path

で出力されたdataディレクトリを調べる。

Dockerでゴリ押し (2022/01/13)

現在のタスクが一段落したらイメージを作成してDockerHubに挙げたいと考えている。
イメージを作った。

github.com

hub.docker.com

最後に

どれも間接的にエラーとして出力はされてはいるんだけど、解決法は示してくれなくて相当手間取った。 例えば、「nbconvert is not installed」って出るけどpipで確認するとインストールされているから意味がわからないし、MiKTeXがインストールされていてパスも通っているのに「latex is not installed」って出るからイライラが募った。

特にInkscape周りはそもそもエラーが文字化けしてて何が問題なのかさっぱりだった。ディレクトリ名にスペース入れるのやめてもらえませんか?