2012-03-07 21 views
1

私は、ユーザの投稿に基づいて、ユーザ入力に基づいて何らかの.texファイルを生成し、pdfにコンパイルしてpdfを配布するRailsアプリケーションを用意しました。排除のプロセスを通じて、私は1つの行を除いてすべてが機能していることをかなり肯定しています。 pdflatexが呼び出される場所。私のRailsコントローラ内でシステムコマンド(pdflatex)を実行する

ここに重要なコードスニペットがあります: (問題があれば、フォームの後に呼び出されるgenerateアクションの質問コントローラ内にありますが、これは最良の方法ではありませんが、 )そのないエラーの原因はかなり特定のmは

texHeader = 'app\assets\tex\QuestionsFront.txt' 
texOut = 'app\assets\tex\Questions.tex' 

#copy latex header to new file 
FileUtils.cp(texHeader, texOut) 

File.open(texOut, 'a+') do |fout| 
     fout.write("\n") 
     # a loop writes some more code to fout (its quite lengthy) 
     fout.write("\\end{enumerate}\n") 
     fout.write("\\end{document}") 
     #The problem line: 
     puts `pdflatex app/assets/tex/Questions.tex --output-directory=app/assets/tex` 
    end 

    filename = 'Questions.pdf' 
    filelocation = "app\\assets\\tex\\" + filename 

    File.open(filelocation, 'r') do |file| 
     send_file file, :filename => filename, :type => "application/pdf", :disposition => "attachment" 
    end 
end 

は、ここに私の推論です:それは正しく.texファイルを生成し、事前に作成したQuestions.pdf与えられ、それを提出、それがうまく送信されます。 putsのコマンドがターミナルにコピーされると、ヒットせずに実行されます(ファイルは\ nonstopmodeで始まり、小さなエラーの心配はありません)。しかし、何らかの理由で上記のスクリプトを実行すると、エラーが発生してもログファイルが作成されません。

私は何を見落としていますか?何か案は? puts行がどのような出力を生成しているかを見る方法はありますか?

ありがとうございます!

答えて

1

私自身の問題を解明しました。エラーはかなり面白いです。あなたは、私はコンパイルするラテックスを取得しようとしている、基本的に

File.open(texOut, 'a+') do |fout| 

ところわずか数行前

texOut = 'app\assets\tex\Questions.tex' 
ブロック内

puts `pdflatex app/assets/tex/Questions.tex --output-directory=app/assets/tex` 

を呼んでいる表示されますファイルがまだ開かれている間にの文書 File.openブロックに入っている限り、ファイルは開いていて、ブロックの最後に自動的に閉じられます。 コードの行をブロックの最後より下にカットアンドペーストすると、私が望んだように機能しました。しかし、わかりやすくするために、また別の人がこの問題を抱えているまれなケースとして、実際には別のシステムシェルを開くほうがラテックス文書があるディレクトリに移動してそこでコンパイルしてください。

次のようにそのバッチファイルがある
fout.write("\\end{document}") 
end 

system 'runlatex.bat' 

:だから、私の更新されたコードがどのように見える

cd app/assets/tex 
pdflatex Questions.tex 

テックスディレクトリ内のすべての追加のファイルが検出されたそのように、ログファイルがそこに作成された、など

なぜログファイルがないのですか? pdflatexは決して実行されませんでした。OSは実行前にパーミッションエラーで停止しました。

希望すると便利です。

0

バッククォート(および%x{})は、二重引用符付きの文字列と同じ構文解析コンテキストを提供します。つまり、通常のバックスラッシュエスケープシーケンスはバッククォート内で解釈されます。特に、\tはタブですので、この:

puts `pdflatex app\assets\tex\Questions.tex --output-directory=app\assets\tex` 

は、2つのタブで終わるだろうとそれはすべてを壊します。あなたは、また

puts `pdflatex app/assets/tex/Questions.tex --output-directory=app/assets/tex` 

でき

:あなたはあなたのバックスラッシュをエスケープ開始(私はあなたがシェルまでのものを得るために2つのまたは3バックスラッシュが必要と思う)または(Windowsが通常の経路で受け付け)通常のスラッシュに切り替えることができますエスケープや引用の問題を避けるために open3に切り替えて、エラー処理機能を向上させてください。

+0

フィードバックいただきありがとうございます。私はいつもスラッシュを混ぜる。私はコードの行を変更しましたが、私はまだ何も得ていません。ログファイルはなく、出力もありません。私はそれに応じて私の質問を更新した。 –

+0

@ngmiceli: 'pdflatex'は標準出力に有用なものを出力しますか、それを' --output-directory'にすべて書きますか? –

+0

これは大量のものを標準出力に出力しますが、通常は同じ_exact_コンテンツが通常はログファイルにも出力されます。私は、ログアウトファイルを作成せずに標準出力に印刷する予定の状況があるかどうかをよく知るスクリプトを知らない。コマンドをターミナルにコピーして夢のように動作させると、そのような状況がどうして起こるのか分かりません。 –

関連する問題