私は大学生ですが、私の大学では、どんな種類の宿題を提出するにも、標準的な表紙(大学のロゴ、コース名、教授の名前、私の名前など)が必要です。
そこで、標準の表紙 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')