#ruby #erb #pdflatex
#ruby #erb #pdflatex
Вопрос:
У меня есть скрипт Ruby, который создает документ Latex с использованием шаблона erb. После создания файла .tex я хотел бы выполнить системный вызов для компиляции документа с помощью pdflatex
. Вот основные элементы скрипта:
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"
system
Строка переводит меня в интерактивный режим ввода tex, как если бы документ был пуст. Если я удалю вызов, документ будет сгенерирован как обычно. Как я могу гарантировать, что системный вызов не будет выполнен до тех пор, пока документ не будет сгенерирован? В то же время я просто использую скрипт bash, который вызывает скрипт ruby, а затем pdflatex
чтобы обойти проблему.
Ответ №1:
File.new
Откроется новый поток, который не будет закрыт (сохранен на диск) до завершения скрипта или пока вы не закроете его вручную.
Это должно сработать:
...
f = File.new("/path/to/tex/output.tex")
f.puts template.result
f.close
system "pdflatex /path/to/tex/output.tex"
Или более удобный способ:
...
File.open("/path/to/tex/output.tex", 'w') do |f|
f.puts template.result
end
system "pdflatex /path/to/tex/output.tex"
File.open
С блоком откроет поток, сделает поток доступным через переменную block ( f
в этом примере) и автоматически закроет поток после выполнения блока. 'w'
Откроется или будет создан файл (если файл уже существует, содержимое будет удалено => Файл будет усечен)
Комментарии:
1. Для полноты картины другим подходом (менее подходящим) было бы иметь
f.flush
afterf.puts
.