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.
- data/lib/call_rake4latex.rb +156 -0
 - data/lib/rake4latex.rb +377 -0
 - data/lib/rake4latex/latexdependencies.rb +103 -0
 - data/lib/rake4latex/latexrunner.rb +268 -0
 - data/lib/rake4latex/rules.rb +134 -0
 - data/lib/rake4latex/splitindex.rb +88 -0
 - data/lib/rake4latex/tex_statistic.rb +509 -0
 - data/readme.html +236 -0
 - data/readme.txt +186 -0
 - data/test/bibtex/rakefile.rb +59 -0
 - data/test/bibtex/testdocument.bib +26 -0
 - data/test/bibtex/testdocument.tex +16 -0
 - data/test/includes/rakefile.rb +36 -0
 - data/test/includes/testdocument.tex +24 -0
 - data/test/includes/testincludes/testinclude1.tex +7 -0
 - data/test/includes/testincludes/testinclude2.tex +2 -0
 - data/test/index/rakefile.rb +36 -0
 - data/test/index/testdocument.tex +18 -0
 - data/test/longtable/rakefile.rb +43 -0
 - data/test/longtable/testdocument.tex +28 -0
 - data/test/minitoc/rakefile.rb +31 -0
 - data/test/minitoc/testdocument.tex +30 -0
 - data/test/rail/rakefile.rb +51 -0
 - data/test/rail/testrail.tex +32 -0
 - data/test/splitindex/rakefile.rb +36 -0
 - data/test/splitindex/testdocument.tex +29 -0
 - data/test/supertabular/rakefile.rb +48 -0
 - data/test/supertabular/testdocument.tex +23 -0
 - data/test/testdocument.tex +16 -0
 - data/test/unittest_rake4latex.rb +116 -0
 - data/test/z_complex/rakefile.rb +59 -0
 - data/test/z_complex/testdocument.bib +26 -0
 - data/test/z_complex/testdocument.tex +58 -0
 - metadata +101 -0
 
| 
         @@ -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 
     | 
    
         
            +
             
     |