部門 > TeX > ソースファイルが更新されたら自動的にコンパイルするスクリプト

Twitterでこんなのを見かけた。

iOSに限らず、TeXを一台にだけセットアップしておけばいいし、便利そうなので自分でも書いてみた。流れとしては、
  1. lsで更新時刻を取得
  2. 時間のオブジェクトに変換
  3. 新しくなってるか判定
  4. コンパイル
という感じ。Time Objectの部分はRubyでやったことがあるので、コンパイルとかもRubyの組み込み関数を使ってみる。つくったスクリプトを、cronで動かす。

  1. #!/usr/bin/ruby
  2.  
  3. dir="/home/oka/Dropbox/TeX/sotuken/"
  4. filename="sotuken"
  5. tex="#{filename}.tex"
  6. dvi="#{filename}.dvi"
  7. pdf="#{filename}.pdf"
  8.  
  9. string = ` ls --full-time #{dir}#{tex}`
  10. p string2 = string.scan(/(....)-(..)-(..) (..):(..):(..)/)
  11. p t = string2[0]
  12.  
  13. p modified=Time.local(t[0],t[1],t[2],t[3],t[4],t[5])
  14.  
  15. p now = Time.now
  16.  
  17. p check = now - 10*60
  18.  
  19. if modified > check #更新されたのが10分以内ならコンパイル
  20. `platex -halt-on-error #{dir}#{tex} `
  21. `dvipdfmx #{dir}#{dvi}`
  22. end

LaTeXは普通エラーが起きると待機状態になってしまうので、-halt-on-errorオプションをつけてエラーが出ると止まるようにした。ただし、これでもinput fileが見つからないと待機状態になってしまうので注意。待機状態になると、cronでどんどん次のプロセスが実行されてしまうからな...

850円分の機能らしいので、1時間以内につくれば時給850円だったけど、もう少しかかった。

追記

lsで時間がどう表示されるかはけっこう環境によってしまう。上のはUbuntuでやった場合で、Macだったらlsのオプションを
ls -lT
に変えて、scanの部分とTimeの部分も変える必要があった。

  1. #!/usr/bin/ruby
  2.  
  3. dir="/Users/oka/Dropbox/TeX/sotuken/"
  4. filename="sotuken"
  5. tex="#{filename}.tex"
  6. dvi="#{filename}.dvi"
  7. pdf="#{filename}.pdf"
  8.  
  9. string = ` ls -lT #{dir}#{tex}`
  10. p string2 = string.scan(/(..) (..) (..):(..):(..) (....)/)
  11. p t = string2[0]
  12. p modified=Time.local(t[5],t[0].to_i,t[1].to_i,t[2],t[3],t[4])
  13.  
  14.  
  15. p now = Time.now
  16.  
  17. p check = now - 10*60
  18.  
  19. if modified > check #更新されたのが10分以内ならコンパイル
  20. `platex -halt-on-error #{dir}#{tex} `
  21. `dvipdfmx #{dir}#{dvi}`
  22. end


参考

タグ:

Ruby TeX
最終更新:2012年09月04日 10:44