2011-11-10 20 views
25

私は大学生で、私の大学では、どのような宿題も提示するために、標準のカバーページ(大学のロゴ、コース名、教授の名前、私の名前そしてbla bla bla)。pythonスクリプトを使ったpdf-latexの生成

私は標準のカバーページpdfsを生成する.texドキュメントを持っています。宿題、コース名のタイトルと文字列の残りのために私に尋ねPythonスクリプトを作成し、生成するためにそれらを使用する方法があるのであれば

... 
\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} 
... 

、私が思っていた:それはのようなものが行きますカバーページ。その後、.texをコンパイルし、与えられた情報でpdfを生成する必要があります。

意見、アドバイス、スニペット、図書館は受け入れられます。

+1

テキストエディタは、より高速なIMHOです。カバーページを印刷するたびに、タイトル、コース名などを入力する必要があります。私はそのPDFを単語テンプレートに変換します。試してみてください。http://www.pdftoword.com/ –

+1

スニペット・マネージャー/テンプレート・システムをテキスト・エディターで使用できます。 –

+2

それは良いアイデアです!しかし、私はもっと自分自身/オタクを探していました。 – juliomalegria

答えて

53

あなたは文字列としてテンプレートTeXファイルを定義することによって開始することができます

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') 

ビット文字列の書式設定は、argをスティックするために必要なものです。content

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

ファイルに内容を書き込んだ後、cover.tex、

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

あなたがpdflatex cover.texを呼び出すためにsubprocessを使用することができます。

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') 
+5

かなり良いソリューション、そして簡単!今私は自動カバージェネレータを持っています:) – juliomalegria

+0

pdfが正常に生成されたかどうかをチェックする方法はありますか?テキストに '&'または '%'があると、pdfが破られています。 – Johan

+0

@Johan:このスクリプトは 'pdlatex'の呼び出しの出力を表示します。 LaTeXを処理する際にエラーが発生した場合、これらのエラーメッセージは、pdfが正常に生成されなかったことを示します。 '&'はPythonでは特殊文字ではありませんがTeXにありますので、リテラルのアンパサンド「\と」が必要な場合はバックスラッシュする必要があります。 '%'はPythonとTeXの両方の特殊文字です。 '% 'がどこにあるかによって、' \% 'や' %% 'のいずれかに変更する必要があります。 – unutbu

5

Jinjaのようなテンプレートシステムはもちろんありますが、あなたが求めているものはおそらく残念です。 RSTを使用してページをフォーマットし、LaTeXを生成するためにそれを使用することもできますが、やはりこれはおそらく過剰です。ヘックは、あなたが定義しなければならないフィールドの数が多すぎると、ページを自動生成することはおそらく残念ですが、いつ過ぎると私たちを止めてしまったのですか? :)

私はPythonの文字列の書式設定と同様のことをしました。上にあなたのLaTeX文書を持ち、文書に%(placeholder_name1)sトークンを置くことによってファイルを "トークン化"してください。あなたがそれらを検索したい場合は

template = file('template.tex', 'r').read() 
page = template % {'course_name' : 'Computer Science 500', 
        'homework_title' : 'NP-Complete'} 
file('result.tex', 'w').write(page) 

:たとえば、あなたが自分のクラス名が行きたい場所やPythonから、あなたはそのテンプレートで読み込むことができますし、としてそれをフォーマットし、その後%(course_name)s

\textbf{\Large "%(homework_title)s" \\} 
\vspace{1cm} 
\textbf{\Large "%(course_name)s" \\} 

を使用トークンは自動的に、次のことがかなりよく実行する必要があります。

import sys 
import re 
import subprocess 

template = file('template.tex', 'r').read() 
pattern = re.compile('%\(([^}]+)\)[bcdeEfFgGnosxX%]') 
tokens = pattern.findall(template) 

token_values = dict() 
for token in tokens: 
    sys.stdout.write('Enter value for ' + token + ': ') 
    token_values[token] = sys.stdin.readline().strip() 

page = template % token_values 
file('result.tex', 'w').write(page) 

subprocess.call('pdflatex result.tex') 

コードは、トークン間で反復処理し、各トークンの入力をお願いコンソールにプロンプ​​トを表示します。

Enter value for homework_title: NP-Complete 
Enter value for course_name: Computer Science 500 

最後の行が作成されたファイルにpdflatexを呼び出し、そこからPDFを生成します。上記の例では、(たとえば、答えと)2つのプロンプトを取得します。さらに進めたい場合は、ユーザーに出力ファイル名を問い合わせるか、コマンドラインオプションとして入力することもできます。 、

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

次もちろん、タイトル、名前、学校の値を受け入れるために​​を使用します:

+0

サブプロセスコールに 'shell = True'を追加する必要がありました。 – TimP

+0

私たちは余計に好きなので、私はJinjaの答えを見たいと思っています! – sleblanc

3

もありますTemplateクラス(以降2.4)%(thi)sの代わりに$thatトークンを使用できます。

+0

Jinja2も同様に使用できます:http://flask.pocoo.org/snippets/55/ – alexpirine

関連する問題