FileUtilsとtexpdf.rb
pLaTeX→PDF変換をするバッチファイル的なスクリプトをRubyで書いてみました(texpdf.rb)。
require "fileutils" if ARGV.length == 0 puts "Usage: texpdf.rb filename[.tex]" exit end from = ARGV[0].gsub(/\.tex$/, "") tmp = ENV["TMP"] time = Time.now.to_i to = "#{from}_#{time}" to_tex = "#{to}.tex" to_dvi = "#{to}.dvi" to_pdf = "#{to}.pdf" FileUtils.cp("#{from}.tex", "#{tmp}\\#{to_tex}") Dir.chdir(tmp) system("platex #{to_tex}") system("platex #{to_tex}") unless File.exist?(to_dvi) puts "#{to_dvi} is not found." exit end system("dvipdfm #{to_dvi}") unless File.exist?(to_pdf) puts "#{to_pdf} is not found." exit end system("start #{to_pdf}")
使い方は、たとえばこんな感じです。
ruby texpdf.rb sample.tex
やっていることは以下の通り。
- 時間を元に一時的なファイル名を作り、それをコピー。sample.tex → sample_1140348195.tex
- コピー先は環境変数TMPから取る。
- platexを二回かける(table of contentsなどを正しく解決するため)
- dvipdfmでPDF化する。
- start sample_1140348195.pdf でPDFを表示する。(Windows用)
一時的なファイル名を作った理由は、Acrobat ReaderでPDFファイルを開いたままdvipdfmしようとすると、競合してしまい、Output file removed.になってしまうからです。コピーしているのは一個のファイルだけなので、複数ファイルにまたがるLaTeX文書は処理できません。
このスクリプトtexpdf.rbを作って学んだこと。
- ARGV
- ENV["TMP"]
- FileUtils.cp
- Dir.chdir
- system
- File.exist?