はじめに
この記事では python 3.9.13 を使って、Jupyter Notebook 環境でコーディングしてます。
ファイル名などは適宜読み替えてください。
また、tex のインストールが必要です。
やりたいこと
python で DataFrame 作成
↓
DataFrame を TeX に書き出し
↓
TeX のエディターでコンパイル、pdf 出力
一連の動作を python で全部やってもらいたいです。
必要なモジュール
必要なモジュールを以下に示します。
# モジュールのインポート
import numpy as np
import pandas as pd
import os
import subprocess
!pip install Jinja2
from jinja2 import Template, Environment, FileSystemLoader
numpy、pandas はテスト用の DataFrame 作成に、
os、subprocess は tex ファイルのコンパイルに使用します。
jinja2 は今回は tex のテンプレートを作成するのに使用しました。
DataFrame を tex の書式に変更
まず、テスト用に適当な DataFrame を作成します。
作った DataFrame に対して、 pandas のメソッドである .to_latex を呼び、tex の書式に書き下します。
# 埋め込むdf作成
df = pd.DataFrame(np.arange(32).reshape(8,4), columns=list("abcd"))
# dfをtexの書式に変更
print(df.to_latex())
# 出力
print(df.to_latex())
実行結果は以下の通りです。
\begin{tabular}{lrrrr}
\toprule
{} & a & b & c & d \
\midrule
0 & 0 & 1 & 2 & 3 \
1 & 4 & 5 & 6 & 7 \
2 & 8 & 9 & 10 & 11 \
3 & 12 & 13 & 14 & 15 \
4 & 16 & 17 & 18 & 19 \
5 & 20 & 21 & 22 & 23 \
6 & 24 & 25 & 26 & 27 \
7 & 28 & 29 & 30 & 31 \
\bottomrule
\end{tabular}
.to_latex() は色々なオプションがあるので、詳しくは参考サイトをご覧ください↓
【python】pandasのDataFrameをLaTeX出力
jinja2 によるテンプレートへの埋め込み
次に、jinja2 で tex のテンプレートを作成します。
\documentclass[11pt,a4paper]{jsarticle}
%
\usepackage[dvips]{graphicx}
・
・
・
\newcommand{\rot}{\mathrm{rot}\,}
%
\pagestyle{myheadings}
%
\begin{document}
{{ glaph }}
\end{document}
jinja2 では、{{ }} 内の変数名を指定することで 任意の文字列を埋め込むことができます。
作った jinja2 のファイルを読み込んで、埋め込みます。
#テンプレート読み込み
env = Environment(loader=FileSystemLoader('./', encoding='UTF-8'))
tmpl = env.get_template('tex_temp.j2')
# 挿入するやつの指定
ren_s = tmpl.render(glaph=df.to_latex())
テンプレートに埋め込んだものを tex ファイルに変換
モジュール:os と、open() を使って、任意のディレクトリ内に .tex ファイルを作成します。
# 新しくファイル作ってそこに書き込む関数の作成
def save_file_at_dir(dir_path, filename, file_content, mode='w'):
os.makedirs(dir_path, exist_ok=True)
with open(os.path.join(dir_path, filename), mode) as f:
f.write(file_content)
# 実行
save_file_at_dir('F:\study', 'test_2.tex', ren_s)
コンパイルして pdf ファイルの作成
最後に、モジュール:subprocess を使って、.tex ファイルをコンパイルします。
subprocess とは、指定したコマンドをコマンドプロンプトで実行してくれるモジュールです。
subprocess.run(['platex', r'F:\study\test_2.tex'])
subprocess.run(['dvipdfmx', r'F:\study\test_2'])
python の実行結果に returncode=0 が表示されていればコンパイル成功です。
.tex ファイルと同じディレクトリに内に新しく .pdf ファイルが生成されます。
おわりに
私は、 jinja2 でテンプレートを作成するときに文字コードの変換でこけたので、文字コードの変換ができるテキストエディタ(terapadとか)をダウンロードしておくといいかもしれません。
参考サイト
・テンプレートエンジンの使い方(jinja2)
・【python】pandasのDataFrameをLaTeX出力
・Pythonで新しいディレクトリにファイルを作成・保存