Pythonスクリプトでpdf-latexを生成する 質問する

Pythonスクリプトでpdf-latexを生成する 質問する

私は大学生ですが、私の大学では、どんな種類の宿題を提出するにも、標準的な表紙(大学のロゴ、コース名、教授の名前、私の名前など)が必要です。

そこで、標準の表紙 PDF を生成する .tex ドキュメントを用意しました。内容は次のようになります。

...
\begin{document}
%% College logo
\vspace{5cm}
\begin{center}
\textbf{\huge "School and Program Name" \\}
\vspace{1cm}
\textbf{\Large "Homework Title" \\}
\vspace{1cm}
\textbf{\Large "Course Name" \\}
\end{center}
\vspace{2.5cm}
\begin{flushright}
{\large "My name" }
\end{flushright}
...

そこで、宿題のタイトル、コース名、その他の文字列を尋ね、それらを使用して表紙を生成する Python スクリプトを作成する方法があるかどうか疑問に思いました。その後、.tex をコンパイルし、指定された情報を使用して pdf を生成する必要があります。

あらゆる意見、アドバイス、スニペット、ライブラリが受け入れられます。

ベストアンサー1

まず、テンプレート tex ファイルを文字列として定義します。

content = r'''\documentclass{article}
\begin{document}
...
\textbf{\huge %(school)s \\}
\vspace{1cm}
\textbf{\Large %(title)s \\}
...
\end{document}
'''

次に、argparseコース、タイトル、名前、学校の値を受け入れるために使用します。

parser = argparse.ArgumentParser()
parser.add_argument('-c', '--course')
parser.add_argument('-t', '--title')
parser.add_argument('-n', '--name',) 
parser.add_argument('-s', '--school', default='My U')

引数を次のように挿入するには、文字列を少しフォーマットするだけで済みますcontent

args = parser.parse_args()
content%args.__dict__

内容をcover.texというファイルに書き出した後、

with open('cover.tex','w') as f:
    f.write(content%args.__dict__)

subprocessを使用して呼び出すことができますpdflatex cover.tex

proc = subprocess.Popen(['pdflatex', 'cover.tex'])
proc.communicate()

ここでもコマンドを追加して、lprワークフローに印刷を追加できます。

不要なファイルを削除します:

os.unlink('cover.tex')
os.unlink('cover.log')

スクリプトは次のように呼び出すことができます。

make_cover.py -c "Hardest Class Ever" -t "Theoretical Theory" -n Me

すべてを一緒に入れて、

import argparse
import os
import subprocess

content = r'''\documentclass{article}
\begin{document}
... P \& B 
\textbf{\huge %(school)s \\}
\vspace{1cm}
\textbf{\Large %(title)s \\}
...
\end{document}
'''

parser = argparse.ArgumentParser()
parser.add_argument('-c', '--course')
parser.add_argument('-t', '--title')
parser.add_argument('-n', '--name',) 
parser.add_argument('-s', '--school', default='My U')

args = parser.parse_args()

with open('cover.tex','w') as f:
    f.write(content%args.__dict__)

cmd = ['pdflatex', '-interaction', 'nonstopmode', 'cover.tex']
proc = subprocess.Popen(cmd)
proc.communicate()

retcode = proc.returncode
if not retcode == 0:
    os.unlink('cover.pdf')
    raise ValueError('Error {} executing command: {}'.format(retcode, ' '.join(cmd))) 

os.unlink('cover.tex')
os.unlink('cover.log')

おすすめ記事