6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

pythonでDataFrameを.texに埋め込んでpdfで出力する

Last updated at Posted at 2023-07-08

はじめに

この記事では python 3.9.13 を使って、Jupyter Notebook 環境でコーディングしてます。
ファイル名などは適宜読み替えてください。

また、tex のインストールが必要です。

やりたいこと

python で DataFrame 作成

DataFrame を TeX に書き出し

TeX のエディターでコンパイル、pdf 出力

一連の動作を python で全部やってもらいたいです。

必要なモジュール

必要なモジュールを以下に示します。

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 の書式に書き下します。

python
# 埋め込む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 のテンプレートを作成します。

tex_temp.j2
\documentclass[11pt,a4paper]{jsarticle}
%
\usepackage[dvips]{graphicx}

・
・
・

\newcommand{\rot}{\mathrm{rot}\,}  
%
\pagestyle{myheadings}
%

\begin{document}

{{ glaph }}

\end{document}

jinja2 では、{{ }} 内の変数名を指定することで 任意の文字列を埋め込むことができます。

作った jinja2 のファイルを読み込んで、埋め込みます。

python
#テンプレート読み込み
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 ファイルを作成します。

python
# 新しくファイル作ってそこに書き込む関数の作成
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 とは、指定したコマンドをコマンドプロンプトで実行してくれるモジュールです。

python
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で新しいディレクトリにファイルを作成・保存

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?