2012-03-07 78 views
1

因此,我有一個Rails應用程序,用戶提交時應根據用戶輸入生成某種.tex文件,將其編譯爲pdf並提供pdf。通過消除的過程,我相當積極地認爲除了一條線以外,一切正在發揮作用;調用pdflatex的那個。在我的Rails控制器中運行系統命令(pdflatex)

這裏是代碼的重要部分: (如果它很重要,它位於生成操作下的問題控制器中,在表單發送相關信息之後調用它)雖然這可能不是最好的方法,敢一定它不是錯誤的原因)

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開頭,所以不用擔心小錯誤)。但出於某種原因,當我運行上述腳本時,甚至沒有創建一個包含錯誤的日誌文件。

我在忽略什麼?有任何想法嗎?任何方式看看投入線正在創建什麼輸出?

感謝這麼多提前!

回答

1

找出我自己的問題。這個錯誤很有趣。你會看到我打電話

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

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

內,其中只有幾行之前

texOut = 'app\assets\tex\Questions.tex' 

基本上,我試圖讓乳膠編譯一個文件而文件仍然打開只要我在File.open塊中,文件就會打開,並在塊結束時自動關閉。 在塊的結尾下方切割並粘貼代碼行使它像我想要的那樣工作。但是,爲了清楚起見以及在其他人遇到此問題的罕見情況下,實際上最好打開一個單獨的系統shell,導航到latex文檔所在的目錄並在那裏編譯。所以,我更新的代碼看起來像:

fout.write("\\end{document}") 
end 

system 'runlatex.bat' 

其中該批處理文件如下:

cd app/assets/tex 
pdflatex Questions.tex 

這樣的TEX目錄中的任何其他文件被發現,日誌文件被創建在那裏,等。

爲什麼我從來沒有得到日誌文件的原因? pdflatex從未執行 - 操作系統在運行之前用權限錯誤將其停止。

希望這會有所幫助!

0

反引號(和%x{})提供與雙引號字符串相同的解析上下文。這意味着通常的反斜槓序列在反引號內部被解釋;特別是,\t是一個選項卡,以便本:

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

將結束在兩個選項卡,並打破了一切。你就可以開始你的逃避反斜槓(我想你會需要兩個或三個反斜槓得到一個下到shell)或切換到普通斜線(其通常的Windows路徑中接受):

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

或者,你可以切換到open3以避免轉義和引用問題,並獲得更好的錯誤處理能力。

+0

感謝您的反饋意見。我總是混淆我的斜線。我改變了代碼行,但我仍然沒有得到任何東西。沒有日誌文件,沒有輸出。我相應地更新了我的問題。 – 2012-03-07 04:26:14

+0

@ngmiceli:'pdflatex'打印標準輸出中的任何有用內容,還是將它全部寫入'--output-directory'? – 2012-03-07 04:30:29

+0

它將大量東西打印到標準輸出,但通常相同的_exact_內容通常也會打印到日誌文件中。我承認,我不知道是否有計劃的情況下可以打印標準輸出但不創建日誌文件的腳本。我只是不明白當將命令複製到終端時如何發生這種情況可能會像夢一樣發生。 – 2012-03-07 04:33:11

相關問題