Memo‎ > ‎

LaTeX の数式を eps で出力する方法

論文書きに必要になったので LaTeX の数式を eps で吐く ruby スクリプトを書いてみました。

動作条件:
  • pLaTeX がインストールされており、パスが通っている
  • dvipsk がインストールされており、パスが通っている
  • ruby スクリプトが実行でき、 open3 ライブラリも使える
使用方法:
  • (スクリプト名) -o 出力ファイル名(拡張子なし) 数式
  • (スクリプト名) -o 出力ファイル名(拡張子なし) -i 入力ファイル名
  • (スクリプト名) -O 連番出力ファイル名 数式1 数式2 ...
数式が複数ある場合は、
(スクリプト名) -o ファイル1 数式1  -o ファイル2 数式2 ...
とする変な仕様です。入力ファイルが複数の時も同様です。
出力ファイルが指定されていないときは "a0.eps", "a1.eps"... と出力していきます。

注意:
 出力ファイル名で dvi aux eps log tex ファイルをつくります。上書きされないように注意して下さい。
 エラー処理は一切していません。ファイル名が不正だったりすると落ちます。不正なオプションはファイル名や数式と見なします。
 オプションの処理が適当です。(-o を連続させるとエラーにならずに、最後の指定が有効になる等。)
 platex や dvipsk の出力は握りつぶしています。 適当に stderr 変数を使って下さい。
 windows では open3 が使えなかったと思うので、2ヵ所ある "Open3.popen3 からブレース閉じまでの部分" を "popen3 の引数をダブルクォートの代わりにバッククォートで囲んだもの" で置き換えて下さい。
      
ちゃんと作り込んでいないので、暇になったらちゃんと作るかも知れません。 #しない可能性が高いですが。

ruby の スクリプト

require "open3"
require "set"

$count = 0
$outdefname = "a"
$outname = nil
$options = {"-o"=>:outset,"-O"=>:outdefset,"-i"=>:execfile,"-h"=>:help}
$options_with_arg = Set.new [:outset, :outdefset, :execfile]
$optreserv = nil
$latexpath = "platex"
$dvipspath = "dvipsk"
$bgnstr = "\\documentclass{article}\\pagestyle{empty}\\begin{document}\\begin{displaymath}"
$endstr = "\\end{displaymath}\\end{document}"
$helpstr = "Usage: commandname [options] -i inputfile | expressions\n -o output file name \n -i input file name\n"

def exectex arg

  if $outname
    outname = $outname
  else
    outname = $outdefname + $count.to_s
    $count += 1
  end
    
  f = open(outname + ".tex","w")
  f.puts $bgnstr
  f.puts arg
  f.puts $endstr
  f.close

  Open3.popen3("#{$latexpath} #{outname}.tex"){
|stdin,stdout,stderr|
stdin.close
stdout.read
stderr.read
}

 Open3.popen3("#{$dvipspath} -E -Ppdf #{outname}.dvi -o #{outname}.eps"){
|stdin,stdout,stderr|
stdin.close
stdout.read
stderr.read
}
  $outname = nil
end


def help
    STDERR.puts $helpstr
end

def execfile arg
    f=File.open(arg,"r")
    str = f.read
    f.close
    exectex str
end

def outset arg
  $outname = arg
end

def outdefset arg
  $outdefname = arg
  $count = 0
end

if ARGV.empty?
  help
end

ARGV.each{|arg|
o=$options[arg]
if o
  if $options_with_arg.include? o
    $optreserv = o
  else
    __send__(o)
  end
elsif $optreserv
  __send__($optreserv,arg)
  $optreserv =nil
else
  exectex(arg)
end
}


Comments