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
17 require 'roman_numerals'
20 puts "#{$0} <nome cartella>"
21 puts "\tcrea un numero per la rivista Le Matematiche, usando le informazioni contenute nella cartella"
25 $stderr.puts "ERRORE: %s" % msg
30 $stderr.puts "AVVISO: %s" % msg
34 SIMPLE_GROUP = /#{NOT_BRACE}+?|\{#{NOT_BRACE}*?\}/
35 NESTED_GROUP = /#{SIMPLE_GROUP}+?|\{#{SIMPLE_GROUP}*?\}/
36 TITLE_RX = /\\title\{(#{NESTED_GROUP})\}/m
37 AUTHOR_RX = /\\author\{(#{NESTED_GROUP})\}/m
39 def titolo_e_autore(name, file)
41 content = File.open(file).read
43 titoli = content.scan(TITLE_RX)
46 errore "Impossibile determinare il titolo di %s" % name
48 res[:titolo] = titoli.first.first.gsub("\\\\", "\n").gsub(/\n|\r/, " ").gsub(/\s+/, " ")
50 avviso "%s sembra avere più d'un titolo." % name
51 res[:titolo] = titoli.first.first.gsub("\\\\", "\n").gsub(/\n|\r/, " ").gsub(/\s+/, " ")
54 autori = content.scan(AUTHOR_RX)
57 avviso "Impossibile determinare l'autore di %s" % name
60 res[:autori] = autori.map { |ar|
70 puts "Prossimo articolo: %s a pagina %d" % [name, $pg]
73 if File.exists?(tex_file)
75 art_info = titolo_e_autore(name, tex_file)
76 puts "\tTitolo:\n\t\t"+art_info[:titolo]
77 puts "\tAutori:\n\t\t"+art_info[:autori].join("\n\t\t")
79 errore "Impossibile trovare titolo o autore per l'articolo \"%s\" (\"%s\")" % [name, tex_file]
83 if !art_info[:autori].empty?
84 $sommario << "\\articolo{#{art_info[:autori].join(' - ')} --\\ \\textit{#{art_info[:titolo]}}}{#{$pg}}\n"
86 $sommario << "\\articolo{#{art_info[:titolo]}}{#{$pg}}\n"
89 errore "Impossibile aggiornare il sommario con le informazioni sull'articolo \"%s\" (\"%s\")" % [name, tex_file]
92 errore "Impossibile trovare l'articolo \"%s\" (\"%s\")" % [name, tex_file]
99 pub = File.new(pub_file, 'w')
101 pub.puts "\\gdef\\LM@FirstPg{#{$pg}}%"
104 errore "Impossibile impostare le informazioni sull'articolo \"%s\" (\"%s\")" % [name, pub_file]
108 compile = system 'pdflatex', "-interaction=batchmode", tex_file
111 errore "Errore durante la compilazione dell'articolo \"%s\" (\"%s\")" % [name, tex_file]
121 if File.exists?(bib_file)
122 system 'bibtex', name
125 compile = system 'pdflatex', "-interaction=batchmode", tex_file
129 compile = system 'pdflatex', "-interaction=batchmode", tex_file
134 log = File.new(log_file).read
135 if log.match(/Output written on .+ \((\d+) pages?, (\d+) bytes\).\s*\r?\n?/)
137 puts "Ok! %d pagine" % pagine
139 errore "Impossibile determinare il numero di pagine per l'articolo \"%s\" (\"%s\")" % [name, tex_file]
142 errore "Errore durante la compilazione dell'articolo \"%s\" (\"%s\"). Consultare il file di log \"%s\" per maggiori informazioni" % [name, tex_file, log_file]
149 if !cartella or cartella.empty?
157 errore "Impossibile accedere alla cartella \"#{cartella}\""
162 if not File.exists?(indice)
163 errore "La cartella \"%s\" non contiene il file di indice!" % cartella
167 info = YAML.load(File.read(indice))
169 errore "Impossibile leggere il file di indice in \"%s\"" % cartella
172 if info.has_key?(:anno)
173 anno = info[:anno].to_i
175 errore "Il file di indice in \"%s\" non specifica l'anno!" % cartella
177 if info.has_key?(:volume)
178 vol = info[:volume].to_i
179 vol_rm = vol.to_s_roman
181 errore "Il file di indice in \"%s\" non specifica il volume!" % cartella
183 if info.has_key?(:fasc)
184 num = info[:fasc].to_i
185 num_rm = num.to_s_roman
187 errore "Il file di indice in \"%s\" non specifica il fascicolo!" % cartella
189 if info.has_key?(:articoli)
190 articoli = info[:articoli]
192 errore "Il file di indice in \"%s\" non specifica alcun articolo!" % cartella
195 puts "Preparazione: Le Matematiche, volume #{vol_rm}, fascicolo #{num_rm}, anno #{anno}"
198 \\gdef\\LM@Year{#{anno}}%
199 \\gdef\\LM@Vol{#{vol_rm}}%
200 \\gdef\\LM@Num{#{num_rm}}%
203 tex_sommario = 'sommario.tex'
208 \\documentclass{lematema}
209 \\usepackage[latin1]{inputenc}
210 \\let\\maketitle\\relax
211 \\newif\\ifpag\\pagtrue
213 \\setbox\\@tempboxa\\hbox{pag}
214 \\newlength\\paglength
215 \\paglength\\wd\\@tempboxa
217 \\newlength\\pnumlength
219 \\def\\articolo#1#2{%
220 \\hangindent0.8cm\\hangafter1\\noindent
222 \\parbox[b]{\\paglength}{\\ifpag pag.\\global\\pagfalse\\else\\hfil"\\hfil\\fi}
228 \\renewcommand{\\@oddfoot}{%
229 \\parbox[t]{\\textwidth}{%
230 \\hrule\\medskip\\baselineskip11pt
231 \\centerline{Pubblicazione realizzata con il contributo finanziario}
232 \\centerline{dell'Universt\\`a degli Studi di Catania}
235 \\centerline{\\Large S O M M A R I O}
237 \\pnumlength\\textwidth
238 \\advance\\pnumlength-11cm\\relax
239 \\advance\\pnumlength-\\paglength\\relax
240 #{info[:small] ? "\\small" : ""}
241 \\begin{tabular*}{\\textwidth}{p{11cm}p{\\paglength}p{\\pnumlength}}
249 tex_fasc = "le_matematiche_#{vol_rm}_#{num_rm}.tex"
252 \\documentclass{lematema}
253 \\usepackage[final]{pdfpages}
254 \\let\\maketitle\\relax
265 $sommario = File.open(tex_sommario, 'w')
266 $sommario << $somm_begin
268 errore "Impossibile creare il sommario in \"%s\"" % cartella
272 $fasc = File.open(tex_fasc, 'w')
275 errore "Impossibile creare il fascicolo in \"%s\"" % cartella
278 articoli.each { |art|
284 $fasc << "\\includepdf[fitpaper=true,pages=-]{#{art}}\n"
287 $fasc << "\\null\\cleardoublepage\n"
295 puts "Compilo il fascicolo . . ."
299 compile = system 'pdflatex', "-interaction=batchmode", tex_fasc
302 errore "Errore durante la compilazione del fascicolo (\"%s\")" % tex_fasc
305 puts "Compilo il sommario . . ."
307 log_sommario = 'sommario.log'
309 $sommario << $somm_end
311 compile = system 'pdflatex', "-interaction=batchmode", tex_sommario
314 errore "Errore durante la compilazione del sommario (\"%s\")" % tex_sommario