rake4latex 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,88 @@
1
+ #
2
+ #Checks for a given idx-file if splitindx is used.
3
+ #
4
+ class Splitindex
5
+ def initialize( idx_basename, logger )
6
+ @basename = idx_basename
7
+ @logger = logger
8
+
9
+
10
+ if ! File.exist?( @basename )
11
+ @logger.error("Error: No idx-file for splitindex (#{@basename})")
12
+ @indices = ['idx']
13
+ return
14
+ end
15
+
16
+ @targets = {}
17
+ #Example:
18
+ #~ \indexentry[Fields]{MANDT!MARA|hyperpage}{4}
19
+ #~ \indexentry[DataElement]{MANDT!MARA-MANDT|hyperpage}{4}
20
+ File.readlines(@basename).each{|idx_line|
21
+ case idx_line
22
+ when /\indexentry\[(.+?)\]\{(.+?)\}\{(.+?)\}/
23
+ @targets[$1] ||= [] << "\\indexentry{#{$2}}{#{$3}}"
24
+ when /\indexentry\{(.+?)\}\{(.+?)\}/
25
+ @targets['idx'] ||= [] << "\\indexentry{#{$1}}{#{$2}}"
26
+ end
27
+ } #File.readlines(@basename)
28
+
29
+ @indices = ( @targets.keys << 'idx' ).uniq!
30
+ end
31
+ #
32
+ #Flag if it is no splitindex, but a "normal" index for makeindex.
33
+ def makeindex?()
34
+ @indices.size == 1 #idx always added
35
+ end
36
+ #Actions:
37
+ #* Build the splitted idx-files
38
+ #* add the help files to CLEAN
39
+ #* call makeindex for each file
40
+ def execute()
41
+ @logger.error("Splitindex#execute for normal index") if makeindex? and @logger.info?
42
+ @logger.info("Build splitindex-files for #{@targets.keys.inspect}") if @logger.info?
43
+ @targets.each{|target, content|
44
+ idxname = @basename.sub(/\.idx$/, "-#{target}.idx")
45
+ @logger.debug("Build Split-index #{target} (#{idxname})")
46
+ File.open(idxname, 'w'){| idx |
47
+ idx << content.join("\n")
48
+ }
49
+ CLEAN << idxname
50
+ CLEAN << idxname.ext('ind')
51
+ CLEAN << idxname.ext('ilg')
52
+ call_makeindex( idxname )
53
+ }
54
+ end
55
+ #
56
+ #Call makeindex for the given idx-file
57
+ def call_makeindex( idxname )
58
+ stdout, stderr = catch_screen_output{
59
+ puts `makeindex #{idxname}`
60
+ }
61
+ if $? != 0
62
+ @logger.fatal("There where Makeindex errors. for #{idxname}\n#{stderr}")
63
+ end
64
+ end #call_makeindex()
65
+ #~ #Loop on index names.
66
+ #~ def each_idxname()
67
+ #~ idxnames = []
68
+ #~ @indices.each{|index| #\jobname-index.idx
69
+ #~ idxnames << @basename.sub(/\.idx$/, "-#{index}.idx")
70
+ #~ yield index if block_given?
71
+ #~ }
72
+ #~ idxnames
73
+ #~ end
74
+ end #Splitindex
75
+
76
+ __END__
77
+ #Get existing index-data first
78
+
79
+
80
+ #Call makeindex for each element
81
+ #~ @job << Makeindex.new( @job,
82
+ #~ :name => "Sub-Index #{target}",
83
+ #~ :file_in => "#{@job.basename}-#{target}.idx",
84
+ #~ :file_out => "#{@job.basename}-#{target}.ind",
85
+ #~ :file_log => "#{@job.basename}-#{target}.ilg"
86
+ #~ :format => glossaries_format
87
+ #~ )
88
+ #~ }
@@ -0,0 +1,509 @@
1
+ =begin rdoc
2
+ Build a quick overview on the logs for TeX-runs
3
+ =end
4
+
5
+
6
+ require 'knut_yaml' #fixme
7
+
8
+ class TeX_Statistic
9
+ #Define the main file for the log-analyse.
10
+ def initialize( filename )
11
+ @stat = {}
12
+
13
+ @texfile = filename.ext('tex')
14
+ if ! File.exist?(@texfile)
15
+ @stat['_'] ||= {}
16
+ @stat['_'][:tex] = "No TeX File #{@texfile} found"
17
+ end
18
+
19
+ #Analyse TeX-log
20
+ if File.exist?(@texfile.ext('log'))
21
+ @stat[@texfile.ext('log')] = log_analyse( File.read(@texfile.ext('log')))
22
+ else
23
+ @stat['_'] ||= {}
24
+ @stat['_'][:log] = "No log-file #{File.read(@texfile.ext('log'))} found"
25
+ end #File.exist?(@texfile.ext('log'))
26
+
27
+ #Analyse BibTeX-log
28
+ if File.exist?(@texfile.ext('blg'))
29
+ @stat[@texfile.ext('blg')] = blg_analyse(@texfile.ext('blg'))
30
+ end #File.exist?(@texfile.ext('log'))
31
+
32
+ #Analyse index-logs (multiple possible with splitindex)
33
+ #Example for dirpattern: testdokument{-*,}.ilg
34
+ Dir["#{@texfile.ext}{-*,}".ext('ilg')].each{|ilg_filename|
35
+ @stat[ilg_filename] = ilg_analyse(ilg_filename)
36
+ }
37
+
38
+ end
39
+ #
40
+ attr_reader :stat
41
+ #Analyse the TeX-log file.
42
+ #
43
+ #The log-text is splitted into files and pages and analysed separatly.
44
+ #
45
+ # ----TESTVERSION----
46
+ def log_analyse_by_file_page(logfilename)
47
+ log = File.read(logfilename)
48
+ stat = {}
49
+
50
+ #Analyse log for page and source file
51
+ page = nil #store the actual page
52
+ file = nil #store the actual file
53
+ filestack = [] #
54
+ filecount = Hash.new(0) #numbers of open ( in file, needed to detect end of file
55
+ filecontent = {nil => ''}#content of a file. The content of sub-includes are not part of this content.
56
+
57
+ #New pages looks like "[1.1\n" or [9.9]
58
+ page_pattern = /^\[(\d+\.\d+)[\]\s]/
59
+ # inputs looks like "(./filename_en.toc \n" or "(./filename.lot)"
60
+ file_pattern = /\(((?:\.|c:)\/.*?)[\)\n]/
61
+
62
+ #Splitt at the file- and page-patterns and at ( and )
63
+ #If the ( ) are balanced, then we can detect a file end with )
64
+ #
65
+ log.split(/(#{file_pattern}|\(|\)|#{page_pattern})/ ).each{|x|
66
+ case x #x[0]
67
+ when file_pattern
68
+ if x[-1,1] == ')'
69
+ #~ puts "open and close #{file} on page #{page} #{filestack.inspect}" if file =~ /^\./
70
+ else
71
+ file = x.strip.sub(/\(/,'')
72
+ filestack << file
73
+ filecount[file] += 1
74
+ filecontent[file] = ''
75
+ #~ puts "open #{file} on page #{page} #{filestack.inspect}" if file =~ /^\./
76
+ end
77
+ when page_pattern
78
+ page = $1
79
+ when '('
80
+ filecount[file] += 1
81
+ filecontent[file] << x
82
+ when ')'
83
+ filecount[file] = filecount[file] - 1
84
+ if filecount[file] == 0
85
+ filestack.pop
86
+ #~ puts "close #{file} on page #{page} #{filestack.inspect}" if file =~ /^\./
87
+ stat = log_analyse_content(filecontent[file], file, page)
88
+ if ! stat.empty?
89
+ #hier stats sammeln (je vor/hinter input gab es meldungen)
90
+ puts '============'
91
+ puts file
92
+ puts stat.to_yaml
93
+ end
94
+ #~ filecontent.delete(file)
95
+ filecontent[file] = ''
96
+ file = filestack.last
97
+ else
98
+ filecontent[file] << x
99
+ end
100
+ else
101
+ filecontent[file] << x
102
+ end
103
+ #~ puts "%6s : %s" % [page, file ]
104
+ }
105
+ puts filestack.inspect
106
+ end
107
+
108
+ #Analyse the content of an extract of the TeX-log file.
109
+ #
110
+ def log_analyse_content(log, file, page)
111
+ stat = {}
112
+ filepage = [" (",
113
+ file ? "in #{file}" : '',
114
+ page ? " on page #{page}" : '',
115
+ ")"].join
116
+
117
+ log.each{|logline|
118
+ logline.strip!
119
+ case logline
120
+ when /Package (.*) Error: (.*)/
121
+ stat[:package_error] ||= {}
122
+ stat[:package_error][$1] ||= [] << $2
123
+ stat[:package_error][$1].last << filepage
124
+ when /LaTeX Error:\s*(.*)/
125
+ ( stat[:latex_error] ||= [] ) << $1
126
+ stat[:latex_error].last << filepage
127
+ when /Error:/
128
+ (stat[:error] ||= [] ) << logline
129
+ stat[:error].last << filepage
130
+ #~ puts "!#{logline}"
131
+ when /Package (.*) Warning: (.*)/
132
+ stat[:package_warning] ||= {}
133
+ stat[:package_warning][$1] ||= [] << $2
134
+ stat[:package_warning][$1].last << filepage
135
+ when /LaTeX Warning:\s*(.*)/
136
+ (stat[:latex_warning] ||= [] ) << $1
137
+ stat[:latex_warning].last << filepage
138
+ when /Warning/
139
+ #~ puts "!#{logline}"
140
+ (stat[:warnings] ||= [] ) << logline
141
+ stat[:warnings].last << filepage
142
+ #~ when /Package (.*) Info: (.*)/ #A lot of messages
143
+ #~ stat[:package_info] ||= {}
144
+ #~ stat[:package_info][$1] ||= [] << $2
145
+ when /Output written on (.*) \((\d*) pages, (\d*) bytes\)/
146
+ raise "Double output in #{logfilename}" if stat[:output]
147
+ stat[:output] = {
148
+ :name => $1, :pages => $2, :bytes => $3,
149
+ :kbytes => ($3.to_i / 1024 )
150
+ }
151
+ when /Overfull \\hbox \((.*) too wide\) in paragraph at lines (.*)/
152
+ ( stat[:overfull] ||= [] ) << "#{$1} at lines #{$2}"
153
+ stat[:overfull].last << filepage
154
+ #~ next if $1.to_i() < @options[:overfull]
155
+ #~ stat[:overfull] ||= [] << last_message = "#{$1} at lines #{$2}"
156
+ #~ get_next_lines = 1 #?test
157
+ when /Underfull (.*box) \(badness (.*)\) (detected|in paragraph) at lines? (.*)/
158
+ #~ next if $1.to_i() < @options[:underfull]
159
+ ( stat[:underfull] ||= [] )<< last_message = "badness #{$2} at lines #{$4}"
160
+ stat[:underfull].last << filepage
161
+ #~ get_next_lines = 1 #?test
162
+ else
163
+ #~ puts " #{logline}"
164
+ end
165
+ }
166
+ stat
167
+ end #log_analyse
168
+
169
+
170
+ #Analyse the content of a TeX-log file.
171
+ #
172
+ def log_analyse(log)
173
+ stat = {}
174
+
175
+ log.each{|logline|
176
+ logline.strip!
177
+ case logline
178
+ when /Package (.*) Error: (.*)/
179
+ stat[:package_error] ||= {}
180
+ stat[:package_error][$1] ||= [] << $2
181
+ when /LaTeX Error:\s*(.*)/
182
+ ( stat[:latex_error] ||= [] ) << $1
183
+ when /Error:/
184
+ (stat[:error] ||= [] ) << logline
185
+ #~ puts "!#{logline}"
186
+ when /Package (.*) Warning: (.*)/
187
+ stat[:package_warning] ||= {}
188
+ stat[:package_warning][$1] ||= [] << $2
189
+ when /LaTeX Warning:\s*(.*)/
190
+ (stat[:latex_warning] ||= [] ) << $1
191
+ when /Warning/
192
+ #~ puts "!#{logline}"
193
+ (stat[:warnings] ||= [] ) << logline
194
+ #~ when /Package (.*) Info: (.*)/ #A lot of messages
195
+ #~ stat[:package_info] ||= {}
196
+ #~ stat[:package_info][$1] ||= [] << $2
197
+ when /Output written on (.*) \((\d*) pages, (\d*) bytes\)/
198
+ raise "Double output in #{logfilename}" if stat[:output]
199
+ stat[:output] = {
200
+ :name => $1, :pages => $2, :bytes => $3,
201
+ :kbytes => ($3.to_i / 1024 )
202
+ }
203
+ when /Overfull \\hbox \((.*) too wide\) in paragraph at lines (.*)/
204
+ ( stat[:overfull] ||= [] ) << "#{$1} at lines #{$2}"
205
+ #~ next if $1.to_i() < @options[:overfull]
206
+ #~ stat[:overfull] ||= [] << last_message = "#{$1} at lines #{$2}"
207
+ #~ get_next_lines = 1 #?test
208
+ when /Underfull (.*box) \(badness (.*)\) (detected|in paragraph) at lines? (.*)/
209
+ #~ next if $1.to_i() < @options[:underfull]
210
+ ( stat[:underfull] ||= [] )<< last_message = "badness #{$2} at lines #{$4}"
211
+ #~ get_next_lines = 1 #?test
212
+ else
213
+ #~ puts " #{logline}"
214
+ end
215
+ }
216
+ stat
217
+ end #log_analyse
218
+ #Analyse the BibTeX-Logfile
219
+ def blg_analyse(logfilename)
220
+ stat = {}
221
+ File.readlines(logfilename).each{ |logline|
222
+ case logline
223
+ when /Database file #(.*): (.*)/
224
+ stat[:info] ||= [] << "Database file #{$2} used"
225
+ when /Warning--I didn't find a database entry for "(.*)"/
226
+ stat[:warn] ||= [] << "Databaseentry #{$1} missing"
227
+ when /Warning--Empty definition in (.*)/
228
+ stat[:warn] ||= [] << "Empty definition #{$1}"
229
+ when /Warning--(.*)/
230
+ stat[:warn] ||= [] << "#{$1}"
231
+ when /I couldn't open (.*) file (.*)/
232
+ stat[:error] ||= [] << "#{$1} #{$2} not found"
233
+ when /I found no (.*) commands---while reading file(.*)/
234
+ stat[:warn] ||= [] << "found no #{$1} in #{$2}"
235
+ when /(.*)---line (.*) of file(.*)/
236
+ #line-number ist unsinnig
237
+ stat[:error] ||= [] << "#{$1} in #{$3}"
238
+ end
239
+ }
240
+ stat
241
+ end #log_analyse
242
+ #Analyse the makeindex-log
243
+ def ilg_analyse(logfilename)
244
+ stat = {}
245
+ error = nil
246
+ File.readlines(logfilename).each{ |logline|
247
+ if error #Index error announced in previous line
248
+ stat[:error] ||= [] << "#{logline.chomp.sub(/.*--/, "")} #{error}"
249
+ error = nil
250
+ else
251
+ case logline
252
+ when /Scanning input file (.*)\...done \((.*) entries accepted, (.*) rejected\)./
253
+ #~ stat[:info] ||= [] << "input file #{$1} (#{$2} entries accepted, #{$3} rejected)"
254
+ stat[:output] ||= []
255
+ stat[:output] << "Input file: #{$1}"
256
+ stat[:output] << "Entries accepted: #{$2}"
257
+ stat[:output] << "Entries rejected: #{$3}"
258
+ #~ when /done \((.*) entries accepted, (.*) rejected\)./
259
+ #~ result[:rejected] += $2.to_i() if $2.to_i() > 0
260
+ when /!! Input index error \(file = (.*), line = (.*)\):/
261
+ #Error-message on next line
262
+ error = "(file #{$1} line #{$2}: #{logline})"
263
+ end
264
+ end #if error
265
+ }
266
+ stat
267
+ end #log_analyse
268
+
269
+ def to_s()
270
+ <<stat
271
+ #{@texfile}:
272
+ #{@stat.to_yaml}
273
+ stat
274
+ end
275
+ end #TeX_Statistic
276
+
277
+ if $0 == __FILE__
278
+ require 'rake'
279
+ #~ puts TeX_Statistic.new('../testdocument.tex')
280
+ #~ puts TeX_Statistic.new('C:/usr/Festo/_Projects/PriceCatalog/PriceCatalogTool_en.pdf')
281
+ s = TeX_Statistic.new('logtest_pcat/PriceCatalogTool_en.pdf')
282
+ #~ puts s.stat['logtest_pcat/PriceCatalogTool_en.log'].to_yaml
283
+
284
+ #Test
285
+ #~ s.log_analyse_file_page('logtest_pcat/PriceCatalogTool_en.log')
286
+ s.log_analyse_by_file_page('logtest_pcat/PriceCatalogTool_en.log')
287
+ end
288
+
289
+ __END__
290
+
291
+ TeX:
292
+ logfile.each{|logline|
293
+ #The previous message is continued, get the rest here
294
+ if get_next_lines > 0
295
+ get_next_lines -= 1
296
+ case logline
297
+ #Get the line number
298
+ when /l\.([0-9]*) (.*)/
299
+ last_message << " #{$2} (line #{$1})".strip
300
+ #fixme: get also next line (pdflualatex/invalid utf?)
301
+ else
302
+ last_message << " (#{logline.chomp()})"
303
+ end
304
+ last_message = nil
305
+ next #continue with the next warning/error
306
+ end #last_message
307
+
308
+ #In case of errors, get the line number where it happens
309
+ if jump_to_numberline
310
+ case logline
311
+ #skip text
312
+ when /Type H <return> for immediate help./,
313
+ /^[\.\s]*$/ #empty line
314
+ #Get the line number
315
+ when /l\.([0-9]*) (.*)/
316
+ last_message << " #{$2} (line #{$1})".strip
317
+ jump_to_numberline = false #numberline reached, continue with log-analyses
318
+ #fixme: collect text in between?
319
+ when /See the (.*) package documentation for explanation./
320
+ last_message << " (package #{$1})"
321
+ else
322
+ last_message << " #{logline.strip} ||"
323
+ end
324
+ next #continue with the next warning/error
325
+ end #jump_to_numberline = true; last_message = result[:error].last
326
+
327
+ last_message = nil
328
+ $logline = logline #Only for test surposes
329
+ case logline
330
+ when /^! (.*)/
331
+ case $1
332
+ #Error messages with line code
333
+ when /LaTeX Error:\s*(.*)/,
334
+ /(Undefined control sequence.)/,
335
+ /(Missing [\$|\{|\}|\\cr] inserted.)/,
336
+ /(Dimension too large.)/,
337
+ /(Text line contains an invalid utf-8 sequence.)/, #pdflualatex
338
+ /(Argument of .* has an extra \})./,
339
+ /(Paragraph ended before .* was complete.)/,
340
+ /(Misplaced .+)/,
341
+ /(Extra \}, or forgotten [\$|\\\\endgroup])/,
342
+ /You can't use `\\\\end' in internal vertical mode/
343
+ #~ /(! Emergency stop.)/,
344
+ #~ /(! Huge page cannot be shipped out.)/
345
+ :last_entry_to_avoid_comma_error
346
+ result[:error] << last_message = $1
347
+ jump_to_numberline = true;
348
+ #LaTeX-Errors without line.
349
+ when /(Emergency stop|Huge page cannot be.*)/,
350
+ /(File ended while scanning use of .*)/,
351
+ /(==> Fatal error occurred, no output PDF file produced!)/
352
+ result[:error] << last_message = $1
353
+ when /Package (.*) Error: (.*)/
354
+ result[:error] << last_message = "#{$1}.sty:\t#{$2}"
355
+ jump_to_numberline = true
356
+ when /Extra alignment tab has been changed to \\cr./
357
+ result[:error] << last_message = "tabular: wrong alignment"
358
+ when /pdfTeX warning .*?: (.*)/
359
+ result[:warning] << last_message = "pdftex: #{$1}"
360
+ else
361
+ result[:error] << last_message = "New error to runtex: #{logline.strip}"
362
+ #~ jump_to_numberline = true; last_message = result[:error].last = result[:error].last
363
+ @job.log.warn( "#{__FILE__} Uncatched error? <#{$1.inspect}>") if @job.log.warn?
364
+ end
365
+ when /(job aborted, no legal \\end found)/,
366
+ /(==> Fatal error occurred, no output PDF file produced!)/
367
+ result[:error] << last_message = $1
368
+ when /Package gloss Info: Writing gloss file (.*).aux/ #Check for gloss.sty
369
+ @job << BibTeX.new( @job, :source => "#{$1}.aux", :target => "#{$1}.bbl", :log => "#{$1}.blg" )
370
+ when /Package hyperref Warning: old toc file detected, not used; run LaTeX again/
371
+ @job.please_rerun("(old toc)")
372
+ when /LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right./
373
+ @job.please_rerun("Labels/Toc changed")
374
+ when /Package longtable Warning: Table widths have changed. Rerun LaTeX./
375
+ @job.please_rerun("Longtable requires additional calculation)")
376
+ when /LaTeX Warning: Label (.*)/
377
+ result[:label]<< last_message = $1
378
+ when /LaTeX Warning: (Reference .*)/
379
+ result[:label]<< last_message = $1
380
+ when /LaTeX Warning: Citation (.*)/
381
+ result[:citation]<< last_message = $1
382
+ when /LaTeX Warning: (.*)/
383
+ result[:warning] << last_message = $1
384
+ when /Package hyperref Warning: (.*)/
385
+ result[:warning_hyper]<< last_message = "#{$1}"
386
+ when /Package rail Warning: Railroad diagram \{(\d*)\} doesn't match on input line (\d*)./
387
+ @job.log.debug( "#{@step} Rerun necessary (Rail diagram #{$1} on line #{$2})") if @job.log.debug?
388
+ if @job.stop_rerun?(:rail)
389
+ @job.log.warn( "#{@step} Rail-Rerun blocked by previous error") if @job.log.warn?
390
+ else
391
+ @job.please_rerun( "Rail diagram #{$1} on line #{$2} changed")
392
+ @job << Rail.new( @job, :source => "#{@job.basename}.rai", :target => "#{@job.basename}.rao" )
393
+ end
394
+ when /Package rail Warning: Railroad diagram\(s\) may have changed./
395
+ @job.log.debug( "#{@step} Rerun necessary (Rail diagram changed)") if @job.log.debug?
396
+ if @job.stop_rerun?(:rail)
397
+ @job.log.warn( "#{@step} Rail-Rerun blocked by previous error") if @job.log.warn?
398
+ else
399
+ @job.please_rerun( "Rail diagram changed")
400
+ @job << Rail.new( @job, :source => "#{@job.basename}.rai", :target => "#{@job.basename}.rao" )
401
+ end
402
+ #~ when /Package: rail / #Package: rail 1998/05/19
403
+ #~ @job.log.debug( "#{@step} Package rail detected") if @job.log.debug?
404
+ #~ @job << Rail.new( @job ) ??
405
+ when /Package (.*) Warning: (.*)/
406
+ result[:warning] << last_message = "#{$1}:\t#{$2}"
407
+ when /Using splitted index at (.*)/ ##Find Splittindex
408
+ @job.log.debug( "#{@step} Found splitindex for #{$1}") if @job.log.debug?
409
+ @job << Splitindex.new(@job, :source => $1 )
410
+ #This message is posted, if index2 is used.
411
+ #I hope the responsible person for index.sty will take my changes.
412
+ #If the name is very long, there is a break in the Filename.
413
+ when /Package index2 Info: (.*) (.*)/
414
+ @job.log.debug( "#{@step} Index #{$1} detected (->#{$2})") if @job.log.debug?
415
+ @job.log.warn( "#{@step} Warning: Name #{$2} perhaps cutted") if @job.log.warn? and $1.size != $2.size
416
+ @job << Makeindex.new( @job,
417
+ :name => "Index2-#{$1}",
418
+ :file_in => $1, #"#{@job.basename}.idx",
419
+ :file_out => $2, #"#{@job.basename}.ind",
420
+ :file_log => "#{$1}.ilg"
421
+ #~ :format => glossaries_format
422
+ )
423
+ #If you use index.sty:
424
+ #Unfortenalty there are some missing information to complete the task.
425
+ #Please use index2.sty
426
+ when /Writing index file (\S*)/
427
+ @job.log.debug( "#{@step} Index #{$1} detected") if @job.log.debug?
428
+
429
+ if $1 == @job.basename + '.idx' #'normal' standard index
430
+ name = 'Index'
431
+ format = nil
432
+ if @job.filename =~ /\.dtx$/
433
+ name << '/dtx'
434
+ format = 'gind.ist'
435
+ end
436
+ @job << Makeindex.new( @job,
437
+ :name => name,
438
+ :file_in => "#{@job.basename}.idx",
439
+ :file_out => "#{@job.basename}.ind",
440
+ :file_log => "#{@job.basename}.ilg",
441
+ :format => format
442
+ )
443
+ else
444
+ @job.log.warn( "#{@step} Warning: index.sty is not supported, please use index2 (#{$1})") if @job.log.warn?
445
+ @job.helpfiles << $1
446
+ end
447
+ #This message is created by
448
+ #- glossaries (-> already catched by aux-analyses)
449
+ #- ltxdoc.cls (for dtx.files)
450
+ when /Writing glossary file (\S*)/
451
+ glossfile = $1
452
+ @job.log.debug( "#{@step} Glossary #{glossfile} detected") if @job.log.debug?
453
+
454
+ if @job.filename =~ /\.dtx$/ and glossfile =~ /.glo$/ #ltxdoc.cls
455
+ @job << Makeindex.new( @job,
456
+ :name => 'Glossary/dtx',
457
+ :file_in => glossfile,
458
+ :file_out => "#{@job.basename}.gls",
459
+ :file_log => "#{@job.basename}.glg",
460
+ :format => 'gglo.ist'
461
+ )
462
+ else
463
+ #Possible with usage of glossaries.sty -> catched by aux-analyses
464
+ @job.log.debug( "#{@step} Glossary in non-dtx found #{glossfile}") if @job.log.debug?
465
+ end
466
+ #Add minitocs to helpfiles
467
+ when /\(minitoc\)\s*Writing (.*\.mtc\d*)/
468
+ @job.log.debug( "#{@step} Found minitoc-helpfile") if @job.log.debug?
469
+ @job.helpfiles << $1
470
+ when /Output written on (.*) \((.*) pages?, (.*) bytes\)/
471
+ result[:file] = $1
472
+ result[:pages] = $2.to_i
473
+ result[:size] = "#{$3.to_i / 1024}KB"
474
+
475
+ filedata = []
476
+ filedata << "#{result[:file]}"
477
+ filedata << "#{result[:pages]} Page#{'s' if result[:pages] > 1}" if result[:pages]
478
+ filedata << result[:size] if result[:size]
479
+ filedata << "#{result[:error].size} Error#{'s' if result[:error].size > 1}" unless result[:error].empty?
480
+ filedata << "#{result[:overfull].size} Overfull box#{'es' if result[:overfull].size > 1} (> #{@options[:overfull]})" unless result[:overfull].empty?
481
+ filedata << "#{result[:underfull].size} Underfull box#{'es' if result[:underfull].size > 1} (> #{@options[:underfull]})" unless result[:underfull].empty?
482
+ #~ result[:fileinfo] = "#{result[:file]} (#{filedata.join(', ')})" unless filedata.empty?
483
+ result[:fileinfo] = filedata
484
+ last_message = nil
485
+ end #case logline
486
+ } #each.loglines
487
+ return result
488
+ end #analyse_logfile
489
+
490
+
491
+ Rail:
492
+ stderr.each{ |errline|
493
+ case errline
494
+ when /(.*), line (.*): (.*)/
495
+ #$1: Filename (e.g. 'stdin')
496
+ @result[:error] << "Line #{$2}: #{$3}"
497
+ @job.stop_rerun( :rail, "Rail: #{$3} on line #{$2}") #block rerun for rail
498
+ end
499
+ }
500
+
501
+ stdout.each{ |stdout_line|
502
+ case stdout_line
503
+ when /This is Rail, Version (.*)\s/
504
+ @result[:info] << "Rail version #{$1} was called"
505
+ when /(Der Prozess kann nicht auf die Datei zugreifen, .*)/
506
+ @result[:error] << "#{$1}"
507
+ end
508
+ }
509
+