TeX -> PDF らっぱーすくりぷと

某ドラマの影響でか、pythonを少し触ってみる。
ちょうど、TeXをPDFに変換する作業をラクにしようと思っていたところだったので、良いタイミング。


実は、TeX環境を統合環境にするするいいながら未だにEmacs + YaTeXという。
しかもEmacsのバインドも、TeXコマンドもほとんど覚えてないという。


そして、portsで入れたpTeX等をアップグレードしたら、オプション指定し忘れたせいか、UTF-8だとエラーが出てしまうようになった。
基本はEUC-JPだからか。なのでplatexコマンドを--kanji=utf8で起動する必要がある。


ということで、一度Terminalに戻って、以下のようにする必要がある。

platex --kanji=utf8 filename.tex
dvipdf filename.dvi
open filename.pdf

最後の`open`はMac OS X のコマンドで、関連付けされたアプリケーションで開くコマンド。
生成されたPDFを確認するのに使います。


この3つのコマンドですが、シェルから履歴を辿るのも面倒なのでスクリプトにまとめることにしました。
あんまり凝らずにこんな感じに。

#!/usr/bin/env python

# tex -> pdf translation script for Mac OS X
#
# Usage: tex2pdf.py [-p] filename.tex
#
# if -p flag is set, this script launches previewer with generated pdf. 
#
# Requirement: {platex, dvipdf} command
#             and *.pdf associates with any previewer like Preview.app
#             so that file could open with `open` command.

import os, sys

class ArgumentError(Exception):
	def __init__(self, msg=""):
		self.message = "Argument is wrong: " + msg
	def __str__(self):
		return repr(self.message)

tex = ""
p_flag = False
for e in sys.argv[1:]:
	if e == "-p": p_flag = True
	elif e.endswith(".tex"): tex = e
	else: raise ArgumentError("the argument must be '[-p] filename.tex'")

# run shell command
if len(tex) != 0:
	# tex -> dvi
	os.system("platex --kanji=utf8 %s" % tex)
	
	# dvi -> pdf
	dvi = tex[:-3] + "dvi"
	os.system("dvipdf %s" % dvi)
	
	# open pdf with Previewer if p_flag is set
	if p_flag:
		pdf = tex[:-3] + "pdf"
		os.system("open %s" % pdf)
else: raise ArgumentError("No TeX file is specified.")

コメントは適当www


引っかかった点。
ArgumentErrorがなかったので、必要最小限のを作った。
さすがの、ミニマリズム
ちょっとしたのを書くのにもimportが必要。でも、確かに見やすくなる傾向ある気がする。


シェルコマンドの実行は、よくある ` ` (バッククオート)で囲むのではなく、os.system() を用いる。
あと、endswith()がなにげに便利だ。suffixやprefix一致はあるということだ( prefixには startswith() )。


まー、統合環境だと全自動でやってくれることなんだけどねw


で、やっと気付いたんだけど。
プログラミング言語って結局、何かを実装する手段であって。
まず、“何か作りたい”というのがあって、次に来るもの。
で、俺はサーバーサイドの技術やネットワークの基礎が分かってない。
こういう仕組みを知ることが、実装力そのものになるわけであって。


だから、まずは根本的な仕組みから勉強しよう。


――と、そんなことを思ったある秋の夜。