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?