开发者

Ruby System Call Executing Before Script Finishes

I have a Ruby script that produces a Latex document using an erb template. After the .tex file has been generated, I'd like to make a system call to compile the document with pdflatex. Here are the bones of the script:

class Book
  # initialize the class, query a database to get attributes, create the book, etc.
end

my_book = Book.new
tex_file = File.open("/path/to/raw/tex/template")
template = ERB.new(tex_file.read)
f = File.new("/path/to/tex/output.tex")
f.puts template.result
system "pdflatex /path/to/tex/output.tex"

The system line puts me in interactive tex input mode, as if the document were empty. If I remove the call, the document is generated as normal. How can I ensure that the system call isn't made until after the document is generat开发者_如何学Pythoned? In the meantime I'm just using a bash script that calls the ruby script and then pdflatex to get around the issue.


The File.new will open a new stream that won't be closed (saved to disk) until the script ends of until you manually close it.

This should work:

...
f = File.new("/path/to/tex/output.tex")
f.puts template.result
f.close
system "pdflatex /path/to/tex/output.tex"

Or a more friendly way:

...
File.open("/path/to/tex/output.tex", 'w') do |f|
  f.puts template.result
end

system "pdflatex /path/to/tex/output.tex"

The File.open with a block will open the stream, make the stream accessible via the block variable (f in this example) and auto-close the stream after the block execution. The 'w' will open or create the file (if the file already exists the content will be erased => The file will be truncated)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜