粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

jupyter notebookをTex,PDFへと変換

jupyterでコードとプリアンブルを書いてTexに移せばいろいろと捗るのではという目論見の元はじめたこの企み,思ったより面倒なことがあります。

結論

下のような感じでjupyterの見た目を保存したようなTex,PDF資料を作れます。
必要箇所を抜き出せば普通に資料にできますね。
f:id:ossyaritoori:20171025200603p:plain


結局何をすればいい?

ここのGistからファイルをダウンロードして,
New template for jupyter · GitHub

以下のようなPathの下に置いて,

C:\Users\<User>\Anaconda3\envs\matlab\Lib\site-packages\nbconvert\templates\latex

(追記)C:\Users\\AppData\Local\conda\conda\envs\matlab\Lib\site-packages\nbconvert\templates\latex
にある場合もありました。


作成手順は,例えば名前がipythonの名前がfooだった場合,
Texをダウンロード

jupyter-nbconvert --to latex foo.ipynb 

コンパイル

extractbb foo_files/*.png
platex foo.tex
dvipdfmx foo.dvi

以上!

大体の人はドコかでエラーがでるので詳細な手順を順に追っていきましょう。

LatexやPDFへの変換

GUIでやる

[File]から[Download as]で好きなフォーマットを選択できます。

コマンドプロンプトから

jupyter nbconvert --to latex <HOGE>.ipynb

と実行することで同様のことができます。

pandocのインストール

そのままだとpandocがありませんという旨のエラーが出ます。

anaconda search -t conda pandoc

の出力を見た感じ,conda-forgeが良さそうですので

anaconda show conda-forge/pandoc

とうってURLを確認します。
2017年10月現在では以下のURLからダウンロードできます。

conda install --channel https://conda.anaconda.org/conda-forge pandoc

これで,Latex形式で落とせます。

Latex変換の結果

Markdownの#は\section{}へ,数式は

\[\begin{align}

\end{align}\]

のように変換されました。

コード部分はVervatimに変換されますが,それに関してとんでもない量のプリアンブルを生成します。

PDFへの変換

PDF変換はLatexコンパイルすることで達成されます。

手順は,例えば名前がipythonの名前がfooだった場合,
Texをダウンロード

jupyter-nbconvert --to latex foo.ipynb 

コンパイル関係

extractbb foo_files/*.png
platex foo.tex
dvipdfmx foo.dvi

XXX.styがない,XXX.defがない

日本語を用いる場合,様々なエラーが出ます。

例えば実行するとucs.styが無いことに気づきます。
ここからダウンロードしましょう。
CTAN: /tex-archive/macros/latex/contrib/ucs
いかのサイトからコピーしたほうが良いです。
https://mirror.hmc.edu/ctan/macros/latex/contrib/ucs/ucs.sty

私はucs.styの他,以下の3つのdefファイルが最終的に必要でした。
ucsencs.def,uni-global.def,utf8x.def


適宜Pathの通ったフォルダにおいておいてください。

Package amsmath Error: Erroneous nesting of equation structures;(amsmath) trying to recover with `aligned'. \end{align}

alignの前に\[がついているせいです。数式の二重宣言をやめさせるべきです。

noboundingbox

dvipdfmxを使うようにTexを書き換えるべきです。

つまり

\usepackage[dvipdfmx]{graphicx}

と変更します。

これは非常に変更点が多い上,面倒ですね…

テンプレートの変更

いままでの問題は使用しているテンプレートに主に問題があるようです。

デフォルトのテンプレート

僕の場合,場所は以下の所にありました。

C:\Users\User\Anaconda3\envs\matlab\Lib\site-packages\nbconvert\templates\latex

デフォルトで使われる設定ファイルはarticle.tplxというファイルで,中身はこんな感じです。

% Default to the notebook output style
((* if not cell_style is defined *))
    ((* set cell_style = 'style_ipython.tplx' *))
((* endif *))

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


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

((* block docclass *))
\documentclass[11pt]{article}
((* endblock docclass *))


この\documentclassの箇所を
\documentclass[10pt,dvipdfmx,fleqn]{jarticle}
と変更します。jarticleにすることでutf8等の面倒なdefを入れずとも日本語をコンパイル出来るはずです。
fleqnは数式左寄せ,dvipdfmxはBoundingBox問題を起こさないようにする配慮です。


参考:
Jupyter nbconvert(ファイル変換)メモ - はしくれエンジニアもどきのメモ
jupyter notebookをLaTeXに変換 - Qiita

プリアンブルや基本関数の変更

構造として,このarticle.tplxがstyle_ipython.tplxを呼び出し,base.tplxを呼び出すという構造になっていました。

プリアンブルや諸関数に関しては,
base.tplxというファイルに全て記述があるのでこれを変更することでより細かな調整ができます。
例えば不要そうなパッケージを排除できます。

  • utf8まわりなど

変更した新しいファイル群をGistにあげておきました。
New template for jupyter · GitHub


テンプレートの見た目変更

こだわりたい人はどうぞ…
人の作ったものを流用するのが最初は良いでしょう。
nbconvert-examples/style_notebook.tplx at master · jupyter/nbconvert-examples · GitHub