5 # Crea un numero per la rivista Le Matematiche, usando le informazioni contenute in una specifica cartella
7 # Author: Giuseppe Bilotta <bilotta@dmi.unict.it>
11 # Last Modified: 20070317
13 # Copyright: (C) 2007 Giuseppe Bilotta
16 SCRIPT_DIR = File.expand_path File.dirname(__FILE__)
21 require 'roman_numerals'
24 puts "#{$0} <nome cartella>"
25 puts "\tcrea un numero per la rivista Le Matematiche, usando le informazioni contenute nella cartella"
29 $stderr.puts "ERRORE: %s" % msg
34 $stderr.puts "AVVISO: %s" % msg
38 SIMPLE_GROUP = /#{NOT_BRACE}+?|\{#{NOT_BRACE}*?\}/
39 NESTED_GROUP = /#{SIMPLE_GROUP}+?|\{#{SIMPLE_GROUP}*?\}/
40 TITLE_RX = /\\title\{(#{NESTED_GROUP})\}/m
41 AUTHOR_RX = /\\author\{(#{NESTED_GROUP})\}/m
43 def titolo_e_autore(name, file)
45 content = File.open(file).read
47 titoli = content.scan(TITLE_RX)
50 errore "Impossibile determinare il titolo di %s" % name
52 res[:titolo] = titoli.first.first.gsub("\\\\", "\n").gsub(/\n|\r/, " ").gsub(/\s+/, " ")
54 avviso "%s sembra avere più d'un titolo." % name
55 res[:titolo] = titoli.first.first.gsub("\\\\", "\n").gsub(/\n|\r/, " ").gsub(/\s+/, " ")
58 autori = content.scan(AUTHOR_RX)
61 avviso "Impossibile determinare l'autore di %s" % name
64 res[:autori] = autori.map { |ar|
74 puts "Prossimo articolo: %s a pagina %d" % [name, $pg]
77 if File.exists?(tex_file)
79 art_info = titolo_e_autore(name, tex_file)
80 puts "\tTitolo:\n\t\t"+art_info[:titolo]
81 puts "\tAutori:\n\t\t"+art_info[:autori].join("\n\t\t")
83 errore "Impossibile trovare titolo o autore per l'articolo \"%s\" (\"%s\")" % [name, tex_file]
87 if !art_info[:autori].empty?
88 $sommario << "\\articolo{#{art_info[:autori].join(' - ')} --\\ \\textit{#{art_info[:titolo]}}}{#{$pg}}\n"
90 $sommario << "\\articolo{#{art_info[:titolo]}}{#{$pg}}\n"
93 errore "Impossibile aggiornare il sommario con le informazioni sull'articolo \"%s\" (\"%s\")" % [name, tex_file]
96 errore "Impossibile trovare l'articolo \"%s\" (\"%s\")" % [name, tex_file]
103 pub = File.new(pub_file, 'w')
105 pub.puts "\\gdef\\LM@FirstPg{#{$pg}}%"
108 errore "Impossibile impostare le informazioni sull'articolo \"%s\" (\"%s\")" % [name, pub_file]
112 compile = system 'pdflatex', "-interaction=batchmode", tex_file
115 errore "Errore durante la compilazione dell'articolo \"%s\" (\"%s\")" % [name, tex_file]
125 if File.exists?(aux_file)
126 File.open(aux_file) do |io|
128 if l[1,7] == 'bibdata'
129 system 'bibtex', name
136 compile = system 'pdflatex', "-interaction=batchmode", tex_file
140 compile = system 'pdflatex', "-interaction=batchmode", tex_file
144 log = File.new(log_file).read
145 if log.match(/Output written on .+ \((\d+) pages?, (\d+) bytes\).\s*\r?\n?/)
147 puts "Ok! %d pagine" % pagine
149 errore "Impossibile determinare il numero di pagine per l'articolo \"%s\" (\"%s\")" % [name, tex_file]
152 errore "Errore durante la compilazione dell'articolo \"%s\" (\"%s\"). Consultare il file di log \"%s\" per maggiori informazioni" % [name, tex_file, log_file]
159 if !cartella or cartella.empty?
167 errore "Impossibile accedere alla cartella \"#{cartella}\""
172 if not File.exists?(indice)
173 errore "La cartella \"%s\" non contiene il file di indice!" % cartella
177 info = YAML.load(File.read(indice))
179 errore "Impossibile leggere il file di indice in \"%s\"" % cartella
182 if info.has_key?(:anno)
183 anno = info[:anno].to_i
185 errore "Il file di indice in \"%s\" non specifica l'anno!" % cartella
187 if info.has_key?(:volume)
188 vol = info[:volume].to_i
189 vol_rm = vol.to_s_roman
191 errore "Il file di indice in \"%s\" non specifica il volume!" % cartella
193 if info.has_key?(:fasc)
194 num = info[:fasc].to_i
195 num_rm = num.to_s_roman
197 errore "Il file di indice in \"%s\" non specifica il fascicolo!" % cartella
199 if info.has_key?(:articoli)
200 articoli = info[:articoli]
202 errore "Il file di indice in \"%s\" non specifica alcun articolo!" % cartella
205 puts "Preparazione: Le Matematiche, volume #{vol_rm}, fascicolo #{num_rm}, anno #{anno}"
208 \\gdef\\LM@Year{#{anno}}%
209 \\gdef\\LM@Vol{#{vol_rm}}%
210 \\gdef\\LM@Num{#{num_rm}}%
213 tex_sommario = 'sommario.tex'
218 \\documentclass{lematema}
219 \\usepackage[latin1]{inputenc}
220 \\let\\maketitle\\relax
221 \\newif\\ifpag\\pagtrue
223 \\setbox\\@tempboxa\\hbox{pag}
224 \\newlength\\paglength
225 \\paglength\\wd\\@tempboxa
227 \\newlength\\pnumlength
229 \\def\\articolo#1#2{%
230 \\hangindent0.8cm\\hangafter1\\noindent
232 \\parbox[b]{\\paglength}{\\ifpag pag.\\global\\pagfalse\\else\\hfil"\\hfil\\fi}
238 \\renewcommand{\\@oddfoot}{%
239 \\parbox[t]{\\textwidth}{%
240 \\hrule\\medskip\\baselineskip11pt
241 \\centerline{Pubblicazione realizzata con il contributo finanziario}
242 \\centerline{dell'Universt\\`a degli Studi di Catania}
245 \\centerline{\\Large S O M M A R I O}
247 \\pnumlength\\textwidth
248 \\advance\\pnumlength-11cm\\relax
249 \\advance\\pnumlength-\\paglength\\relax
250 #{info[:small] ? "\\small" : ""}
251 \\begin{tabular*}{\\textwidth}{p{11cm}p{\\paglength}p{\\pnumlength}}
259 tex_fasc = "le_matematiche_#{vol_rm}_#{num_rm}.tex"
262 \\documentclass{lematema}
263 \\usepackage[final]{pdfpages}
264 \\let\\maketitle\\relax
275 $sommario = File.open(tex_sommario, 'w')
276 $sommario << $somm_begin
278 errore "Impossibile creare il sommario in \"%s\"" % cartella
282 $fasc = File.open(tex_fasc, 'w')
285 errore "Impossibile creare il fascicolo in \"%s\"" % cartella
288 articoli.each { |art|
294 $fasc << "\\includepdf[fitpaper=true,pages=-]{#{art}}\n"
297 $fasc << "\\null\\cleardoublepage\n"
305 puts "Compilo il fascicolo . . ."
309 compile = system 'pdflatex', "-interaction=batchmode", tex_fasc
312 errore "Errore durante la compilazione del fascicolo (\"%s\")" % tex_fasc
315 puts "Compilo il sommario . . ."
317 log_sommario = 'sommario.log'
319 $sommario << $somm_end
321 compile = system 'pdflatex', "-interaction=batchmode", tex_sommario
324 errore "Errore durante la compilazione del sommario (\"%s\")" % tex_sommario