runtex 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data/lib/Code_zum_Pluendern_rtex4newrtex.rb +275 -0
  2. data/lib/catch_output.rb +99 -0
  3. data/lib/runtex.rb +221 -0
  4. data/lib/runtex_bibtex.rb +111 -0
  5. data/lib/runtex_job_chain.rb +371 -0
  6. data/lib/runtex_latex.rb +373 -0
  7. data/lib/runtex_makeindex.rb +114 -0
  8. data/lib/runtex_pathes.yaml +59 -0
  9. data/lib/runtex_rail.rb +116 -0
  10. data/lib/runtex_splitindex.rb +78 -0
  11. data/lib/runtex_tool.rb +128 -0
  12. data/lppl.txt +416 -0
  13. data/readme +73 -0
  14. data/unittest/expected/test_bibliography_babelbib.debug1.txt +31 -0
  15. data/unittest/expected/test_bibliography_babelbib.debug2.txt +16 -0
  16. data/unittest/expected/test_bibliography_babelbib.tex.runtex_summary.txt +19 -0
  17. data/unittest/expected/test_bibliography_babelbib_1.txt +15 -0
  18. data/unittest/expected/test_bibliography_babelbib_2.txt +11 -0
  19. data/unittest/expected/test_bibliography_plain.debug1.txt +45 -0
  20. data/unittest/expected/test_bibliography_plain.debug2.txt +16 -0
  21. data/unittest/expected/test_bibliography_plain.tex.runtex_summary.txt +18 -0
  22. data/unittest/expected/test_bibliography_plain_1.txt +19 -0
  23. data/unittest/expected/test_bibliography_plain_2.txt +11 -0
  24. data/unittest/expected/test_error.debug1.txt +22 -0
  25. data/unittest/expected/test_error.debug2.txt +12 -0
  26. data/unittest/expected/test_error.tex.runtex_summary.txt +15 -0
  27. data/unittest/expected/test_error_1.txt +15 -0
  28. data/unittest/expected/test_error_2.txt +12 -0
  29. data/unittest/expected/test_gloss.debug1.txt +45 -0
  30. data/unittest/expected/test_gloss.debug2.txt +16 -0
  31. data/unittest/expected/test_gloss.tex.runtex_summary.txt +18 -0
  32. data/unittest/expected/test_gloss_1.txt +19 -0
  33. data/unittest/expected/test_gloss_2.txt +11 -0
  34. data/unittest/expected/test_gloss_newgloss.debug1.txt +58 -0
  35. data/unittest/expected/test_gloss_newgloss.debug2.txt +20 -0
  36. data/unittest/expected/test_gloss_newgloss.tex.runtex_summary.txt +24 -0
  37. data/unittest/expected/test_gloss_newgloss_1.txt +23 -0
  38. data/unittest/expected/test_gloss_newgloss_2.txt +13 -0
  39. data/unittest/expected/test_glossaries.debug1.txt +56 -0
  40. data/unittest/expected/test_glossaries.debug2.txt +28 -0
  41. data/unittest/expected/test_glossaries.tex.runtex_summary.txt +30 -0
  42. data/unittest/expected/test_glossaries_1.txt +24 -0
  43. data/unittest/expected/test_glossaries_2.txt +19 -0
  44. data/unittest/expected/test_index.debug1.txt +35 -0
  45. data/unittest/expected/test_index.debug2.txt +18 -0
  46. data/unittest/expected/test_index.tex.runtex_summary.txt +24 -0
  47. data/unittest/expected/test_index2.debug1.txt +58 -0
  48. data/unittest/expected/test_index2.debug2.txt +29 -0
  49. data/unittest/expected/test_index2.tex.runtex_summary.txt +27 -0
  50. data/unittest/expected/test_index2_1.txt +23 -0
  51. data/unittest/expected/test_index2_2.txt +17 -0
  52. data/unittest/expected/test_index_1.txt +21 -0
  53. data/unittest/expected/test_index_2.txt +17 -0
  54. data/unittest/expected/test_makeindex.debug1.txt +35 -0
  55. data/unittest/expected/test_makeindex.debug2.txt +18 -0
  56. data/unittest/expected/test_makeindex.tex.runtex_summary.txt +18 -0
  57. data/unittest/expected/test_makeindex_1.txt +15 -0
  58. data/unittest/expected/test_makeindex_2.txt +11 -0
  59. data/unittest/expected/test_packagedoc_dtx.debug1.txt +54 -0
  60. data/unittest/expected/test_packagedoc_dtx.debug2.txt +27 -0
  61. data/unittest/expected/test_packagedoc_dtx.dtx.runtex_summary.txt +31 -0
  62. data/unittest/expected/test_packagedoc_dtx_1.txt +18 -0
  63. data/unittest/expected/test_packagedoc_dtx_2.txt +13 -0
  64. data/unittest/expected/test_rail.debug1.txt +35 -0
  65. data/unittest/expected/test_rail.debug2.txt +12 -0
  66. data/unittest/expected/test_rail.tex.runtex_summary.txt +12 -0
  67. data/unittest/expected/test_rail_1.txt +13 -0
  68. data/unittest/expected/test_rail_2.txt +9 -0
  69. data/unittest/expected/test_rail_error.debug1.txt +37 -0
  70. data/unittest/expected/test_rail_error.debug2.txt +35 -0
  71. data/unittest/expected/test_rail_error.tex.runtex_summary.txt +18 -0
  72. data/unittest/expected/test_rail_error_1.txt +18 -0
  73. data/unittest/expected/test_rail_error_2.txt +18 -0
  74. data/unittest/expected/test_splitindex.debug1.txt +64 -0
  75. data/unittest/expected/test_splitindex.debug2.txt +32 -0
  76. data/unittest/expected/test_splitindex.tex.runtex_summary.txt +31 -0
  77. data/unittest/expected/test_splitindex_1.txt +21 -0
  78. data/unittest/expected/test_splitindex_2.txt +15 -0
  79. data/unittest/expected/test_test.debug1.txt +32 -0
  80. data/unittest/expected/test_test.debug2.txt +12 -0
  81. data/unittest/expected/test_test.tex.runtex_summary.txt +12 -0
  82. data/unittest/expected/test_test_1.txt +15 -0
  83. data/unittest/expected/test_test_2.txt +9 -0
  84. data/unittest/expected/test_test_bibliography.debug1.txt +31 -0
  85. data/unittest/expected/test_test_gloss.debug1.txt +45 -0
  86. data/unittest/expected/test_test_gloss_newgloss.debug1.txt +58 -0
  87. data/unittest/expected/test_test_glossaries.debug1.txt +48 -0
  88. data/unittest/expected/test_test_index.debug1.txt +35 -0
  89. data/unittest/expected/test_test_index2.debug1.txt +58 -0
  90. data/unittest/expected/test_test_makeindex.debug1.txt +35 -0
  91. data/unittest/expected/test_test_rail.debug1.txt +35 -0
  92. data/unittest/expected/test_test_splitindex.debug1.txt +64 -0
  93. data/unittest/expected/test_test_test.debug1.txt +32 -0
  94. data/unittest/testcases.yaml +427 -0
  95. data/unittest/unittest_catch_output.rb +66 -0
  96. data/unittest/unittest_runtex.rb +282 -0
  97. metadata +149 -0
@@ -0,0 +1,275 @@
1
+ puts <<xx
2
+ Kopiervorlage aus alter Version
3
+ Sollte am Ende der Umsetzung leer sein.
4
+ ------------------------------
5
+ xx
6
+
7
+ require 'yaml'
8
+ File.open('runtex_pathes.yaml'){|f| $conf = YAML.load(f)}
9
+
10
+ #~ puts $conf.inspect
11
+ basename = 'basename'
12
+
13
+ exit
14
+ #
15
+ #Things to get better:
16
+ #- class Configuration is platform depending and only defined for Win2K
17
+ # - path and program for each tool
18
+ # - stdout/stderr/Log->Files
19
+ #- Error and Warning-Analyses must be enforced
20
+ #- support multibib.sty (bibtex)
21
+ #- support multind.sty
22
+ #- Option -c to remove all auxiliary files.
23
+ #- Check in which source-file an error/warning occurs (input-list)
24
+ #- Check on which output page an error/warning occurs (input-list)
25
+
26
+ #
27
+ #This class allows some precompile on the given TeX-File(s)
28
+ #Actual a method for listings.sty is implemented.
29
+ class Precompile
30
+ #This method overwrites the given file with the replacements for listings
31
+ def Precompile.mix_references!( filename )
32
+
33
+ Logger.add(2, '', "Precompile #{filename} for cross-references")
34
+ pre = new( filename)
35
+ pre.listings_mix_references()
36
+
37
+ new = File.new(filename, 'w')
38
+ new.puts pre.text() #write the converted text
39
+ new.close
40
+ end #mix_references( template )
41
+ #Read the contents of the file
42
+ def initialize( filename)
43
+ @text = ''
44
+ File.open( filename ){ |f|
45
+ @text = f.readlines.to_s
46
+ }
47
+ end
48
+ attr_reader :text
49
+ #This function supports the handling of the package listings.
50
+ #Listings.sty allows you the insertion of external lsitings with the command
51
+ # \lstinputlisting[firstline=<first>,lastline=<last>]{Programm}
52
+ #There is one Problem: Whats the value of <first> and <last>?
53
+ #Once a programm is finished, it is no problem. But when the program is still in develpment,
54
+ #you have to adapt the line numbering.
55
+ #It would be much nicer, if you could use something like
56
+ # \lstinputlisting[fromlabel=<first>,tolabel=<last>]{Programm}
57
+ #Well, I understand why it is dificult to make it in listings.sty.
58
+ #This method makes this work. It scans the listing file for the label and replaces it in the source.
59
+ def listings_mix_references( template = @text )
60
+ #This method scan a program file for the string TeXlabel{<label>} or LABEL{<label>} and stores the linenumber.
61
+ #The string can be redefined by a regular expression, $1 must be the label.
62
+ def scan_source( source, r = /[(TeXlabel)|(LABEL)]\{(.*?)?\}/ )
63
+ Logger.add(4, self.class, "Read File #{source} for cross-references")
64
+ labels = Hash.new( 0 )
65
+ if !File.exist?( source )
66
+ Logger.add(3, self.class, "Sourcecode #{source} nicht gefunden" )
67
+ return labels
68
+ end
69
+ #extend this Hash with a method get_label
70
+ File.open(source){ |f|
71
+ linenumber = 0
72
+ f.each{|l|
73
+ linenumber += 1
74
+ while l =~ r #Perhaps there are mor then one label on a line
75
+ labels[$1] = linenumber
76
+ l.sub!( r ,'') #delete label for next Regex-check
77
+ end
78
+ #Idee f�r ABAP: FORM/Endform automatisch mit Labels versehen?
79
+ }
80
+ }
81
+ Logger.add(5, self.class, "Found labels in #{source}: #{labels.inspect}")
82
+ return labels
83
+ end
84
+ def get_label( hash, key, source )
85
+ pos = hash.fetch(key, 0)
86
+ Logger.add(3, self.class, "Label #{key} not found in #{source}") if pos == 0
87
+ return pos
88
+ end
89
+ #If this script is running more the once, the inputlistings would increase.
90
+ #So we clear it here to a "virgin" state.
91
+ @text.gsub!(
92
+ /%(lstinputlisting\[.*?\]\{(.*?)\})\n.lstinputlisting\[.*?\]\{.*?\}/m,
93
+ '\\\\\1'
94
+ )
95
+ #\ABAPinput is a macro used in a privat package of the author ;-)
96
+ @text.gsub!(
97
+ /%(ABAPinput\[.*?\]\{(.*?)\})\n.ABAPinpu\[.*?\]\{.*?\}/m,
98
+ '\\\\\1'
99
+ )
100
+
101
+ sources = Hash.new() #all Sources
102
+ #Replace all from/tolabe-listings with the new first/lastline version.
103
+ #Remember the original labels in a TeX-comment (needed next time, the programm could change.
104
+ r = Regexp.new('\\\\(lstinputlisting|ABAPinput)\[.*(?:fromlabel=(.*?))(,.*)*(?:tolabel=(.*?))(,.*)*\]{(.*)}')
105
+ while m = r.match(@text)
106
+ old = m[0]
107
+ source = m[6]
108
+ Logger.add(5, self.class, "Found lstinputlisting #{source}")
109
+ if ! sources.has_key?(source)
110
+ sources[source] = scan_source( source )
111
+ end
112
+ pos1 = get_label(sources[source], m[2], source ) + 1
113
+ pos2 = get_label(sources[source], m[4], source ) - 1
114
+ new = '\\' + m[1] + '[' + 'firstline=' + pos1.to_s + m[3] +
115
+ 'lastline=' + pos2.to_s + m[5].to_s + "]{" + source + '}'
116
+ Logger.add(5, self.class, "Command old:\t#{old}\nCommand new\t#{new}" )
117
+ @text = m.pre_match + "%#{old[1..-1]}\n" + new + m.post_match
118
+ end
119
+ return @text
120
+ end #mix_references
121
+ end #Precompile
122
+
123
+
124
+ class DVIPS< Tool
125
+ def initialize( filename )
126
+ super()
127
+ @filename = filename
128
+ @logInclude = false #Add log-Files
129
+ @stdoutInclude = false #Add the stdout-Files
130
+ @stderrInclude = true #Add the stderr-Files same as ilg-file
131
+ @first = true
132
+ end
133
+ def rerun?( log = nil )
134
+ return @first #Postprocessor runs only once
135
+ end
136
+ def execute()
137
+ @first = false
138
+ Logger.add( 5, self.class, "Execute #{Configuration.dvips}")
139
+ @dataChanged = false #clear flag
140
+ stderrOff()
141
+ result = system( Configuration.dvips(@filename) )
142
+ stderrOn()
143
+ @log = get_stderr()
144
+ put_analyse( analyse( @log ) )
145
+ if !result
146
+ Logger.add(1, self.class, "Error executing #{self.class}")
147
+ end
148
+ add_stdout( self.class ) if @stdoutInclude
149
+ add_stderr( self.class ) if @stderrInclude
150
+ return result
151
+ end
152
+ def analyse( log=@log )
153
+ result = { 'Error' => 0,
154
+ 'Warning' => 0,
155
+ 'Informationlist' => [],
156
+ 'Errorlist' => [],
157
+ 'Warninglist' => [],
158
+ }
159
+ log.each{ |l|
160
+ if /This is (.*) Copyright/ =~ l
161
+ result['Informationlist'] << "Called #{$1}"
162
+ # check analyses
163
+ elsif /[Ee]rror/ =~ l
164
+ result['Error'] += 1
165
+ result[:error] << "#{l}"
166
+ elsif /[Ww]arning/ =~ l
167
+ result['Warning'] += 1
168
+ result[:warning] << "#{l}"
169
+ end
170
+ }
171
+ return result
172
+ end
173
+ end #DVIPS
174
+
175
+ class PS2PDF< Tool
176
+ def initialize( filename )
177
+ super()
178
+ @filename = filename
179
+ @logInclude = false #Add log-Files
180
+ @stdoutInclude = true #Add the stdout-Files
181
+ @stderrInclude = false #Add the stderr-Files
182
+ @first = true
183
+ end
184
+ def rerun?( log = nil )
185
+ return @first #Postprocessor runs only once
186
+ end
187
+ def execute()
188
+ @first = false
189
+ Logger.add( 5, self.class, "Execute #{self.class} (#{Configuration.ps2pdf})")
190
+ @dataChanged = false #clear flag
191
+ stdoutOff()
192
+ result = system( Configuration.ps2pdf( @filename ) )
193
+ stdoutOn()
194
+ @log = get_stdout()
195
+ put_analyse( analyse( @log ) )
196
+ if !result
197
+ Logger.add(1, self.class, "Error executing #{self.class}")
198
+ end
199
+ add_stdout( self.class ) if @stdoutInclude
200
+ add_stderr( self.class ) if @stderrInclude
201
+ return result
202
+ end
203
+ def analyse( log=@log )
204
+ result = { 'Error' => 0,
205
+ 'Warning' => 0,
206
+ 'Informationlist' => [],
207
+ 'Errorlist' => [],
208
+ 'Warninglist' => [],
209
+ }
210
+ log.each{ |l|
211
+ if /Unable to open the initial device, quitting./ =~ l
212
+ result['Error'] += 1
213
+ result[:error] << "Unable to open the initial device (PDF opened in Acrobat?)"
214
+ elsif /[Ee]rror/ =~ l
215
+ result['Error'] += 1
216
+ result[:error] << "#{l}"
217
+ elsif /[Ww]arning/ =~ l
218
+ result['Warning'] += 1
219
+ result[:warning] << "#{l}"
220
+ end
221
+ }
222
+ return result
223
+ end
224
+ end #PS2PDF
225
+
226
+ class DVIPDFM< Tool
227
+ def initialize( filename )
228
+ super()
229
+ @filename = filename
230
+ @logInclude = false #Add log-Files
231
+ @stdoutInclude = true #Add the stdout-Files
232
+ @stderrInclude = false #Add the stderr-Files
233
+ @first = true
234
+ end
235
+ def rerun?( log = nil )
236
+ return @first #Postprocessor runs only once
237
+ end
238
+ def execute()
239
+ @first = false
240
+ Logger.add( 5, self.class, "Execute #{self.class} (#{Configuration.ps2pdf})")
241
+ @dataChanged = false #clear flag
242
+ stdoutOff()
243
+ result = system( Configuration.dvipdfm( @filename ) )
244
+ stdoutOn()
245
+ @log = get_stdout()
246
+ put_analyse( analyse() )
247
+ if !result
248
+ Logger.add(1, self.class, "Error executing #{self.class}")
249
+ end
250
+ add_stdout( self.class ) if @stdoutInclude
251
+ add_stderr( self.class ) if @stderrInclude
252
+ return result
253
+ end
254
+ def analyse( log=@log )
255
+ result = { 'Error' => 0,
256
+ 'Errorlist' => [],
257
+ 'Warninglist' => [],
258
+ }
259
+ log.each{ |l|
260
+ if /Unable to open the initial device, quitting./ =~ l
261
+ result['Error'] += 1
262
+ result[:error] << "Unable to open the initial device (PDF opened in Acrobat?)"
263
+ elsif /[Ee]rror/ =~ l
264
+ result['Error'] += 1
265
+ result[:error] << "#{l}"
266
+ elsif /[Ww]arning/ =~ l
267
+ result['Warning'] += 1
268
+ result[:warning] << "#{l}"
269
+ end
270
+ }
271
+ return result
272
+ end
273
+ end #DVIPDFM
274
+
275
+
@@ -0,0 +1,99 @@
1
+ #
2
+ #Catch screen output.
3
+ #Can be used to avoid messages from programms called by system
4
+ #
5
+ #
6
+
7
+
8
+ #Class Tempfile for temporary redirection of stdout and stderr
9
+ require "tempfile"
10
+
11
+ #Catch screen output.
12
+ #Can be used to avoid messages from programms called by system
13
+ module Catch_output
14
+ STDOUT_ORIG = STDOUT.clone()
15
+ STDERR_ORIG = STDERR.clone()
16
+
17
+
18
+ #Catch stdout for the given block, but print stderr.
19
+ def catch_stdout( &block )
20
+ #~ raise 'no block' unless block_given?
21
+ raise 'no block' unless block.is_a?(Proc)
22
+ stdout, stderr = catch_screen_output( true, false, &block )
23
+ return stdout
24
+ end #catch_stdout()
25
+
26
+ #Catch stderr for the given block, but print stdout.
27
+ def catch_stderr( &block )
28
+ #~ raise 'no block' unless block_given?
29
+ raise 'no block' unless block.is_a?(Proc)
30
+ stdout, stderr = catch_screen_output( false, true, &block )
31
+ return stderr
32
+ end #catch_stderr()
33
+
34
+ #Catch the screen output (stdout and stderr) for the given block.
35
+ #You can set, which output you want to catch.
36
+ #
37
+ #Returnvalue is an array with the result of stdout and stderr.
38
+ #If any output wasn't catched, the return value in the array is nil.
39
+ def catch_screen_output(
40
+ catch_stdout = true,
41
+ catch_stderr = true,
42
+ stdout_orig = STDOUT.clone(),
43
+ stderr_orig = STDERR.clone()
44
+ )
45
+
46
+ raise 'no block' unless block_given?
47
+
48
+ if catch_stdout
49
+ #Create temporary file for stdout
50
+ tmpstdout = Tempfile.new( 'stdout')
51
+ #redirect stdout
52
+ STDOUT.reopen( tmpstdout )
53
+ end
54
+ if catch_stderr
55
+ #Create temporary file for stdout
56
+ tmpstderr = Tempfile.new( 'stderr')
57
+ #redirect stdout
58
+ STDERR.reopen( tmpstderr )
59
+ end
60
+
61
+
62
+ yield #Execute the block
63
+
64
+ if catch_stdout
65
+ #stdout is coming again to the screen.
66
+ tmpstdout.close()
67
+ STDOUT.reopen( stdout_orig)
68
+
69
+ # Get the result of stdout
70
+ tmpstdout.open()
71
+ stdout = tmpstdout.readlines().join
72
+ tmpstdout.close()
73
+ end
74
+
75
+
76
+ if catch_stderr
77
+ #stderr is coming again to the screen.
78
+ tmpstderr.close()
79
+ STDERR.reopen( stderr_orig)
80
+
81
+ # Get the result of stderr
82
+ tmpstderr.open()
83
+ stderr = tmpstderr.readlines().join
84
+ tmpstderr.close()
85
+ end
86
+ return [ stdout, stderr ]
87
+ end
88
+ end
89
+
90
+
91
+ #Frame to use module Catch_output
92
+ #
93
+ #Example:
94
+ # Frame_catch_output.catch_stdout{ puts 11 }
95
+ class Frame_catch_output
96
+ class << self
97
+ include Catch_output
98
+ end
99
+ end
@@ -0,0 +1,221 @@
1
+ #
2
+ #This program translates a (La)TeX-File as often as necessary and
3
+ #gives a log-overview.
4
+ #
5
+ #
6
+ #Some programs with a similar functionalty
7
+ #- texify (miktex)
8
+
9
+ #- texexec (ConTeXt)
10
+ #- rubber (Python) http://ebeffara.free.fr/stuff/rubber/
11
+ #- texi2pdf (or texi2dvi)
12
+ #- mk Perl script http://www.servalys.nl/tex/mk.html
13
+ #
14
+ #Sometimes 'make' is recommended for this task,
15
+ #but make makes problems with the multiple calls
16
+ #of LaTeX.
17
+ #
18
+ #This script consider:
19
+ #- index (normal makeindex and multiple indices with indes.sty or splitindex)
20
+ #- glossaries.sty
21
+ #- bibliography
22
+ #- rails and rails.sty
23
+ #- ...
24
+ #
25
+ # %%%%%%%%%%%%%%%%%%%%
26
+ # % License
27
+ # %%%%%%%%%%%%%%%%%%%%
28
+ # %% Copyright 2009 Knut Lickert
29
+ # %
30
+ # % This work may be distributed and/or modified under the
31
+ # % conditions of the LaTeX Project Public License, either version 1.3
32
+ # % of this license or (at your option) any later version.
33
+ # % The latest version of this license is in
34
+ # % http://www.latex-project.org/lppl.txt
35
+ # % and version 1.3 or later is part of all distributions of LaTeX
36
+ # % version 2005/12/01 or later.
37
+ # %
38
+ # % This work has the LPPL maintenance status `maintained'.
39
+ # %
40
+ # % The Current Maintainer of this work is Knut Lickert.
41
+ # %
42
+ #
43
+
44
+ require 'log4r'
45
+ require 'zip/zip' #The log files are stored in a zip.
46
+ require 'optparse'
47
+ require 'yaml'
48
+
49
+ #Some Tools have screen output.
50
+ #runtex should run silent in background, so we have to redirect the output.
51
+ require 'catch_output'
52
+
53
+ module RunTeX
54
+ CONFIGURATION = File.dirname(__FILE__) + '/runtex_pathes.yaml'
55
+
56
+ require 'runtex_job_chain'
57
+ require 'runtex_tool'
58
+ require 'runtex_latex'
59
+ require 'runtex_makeindex'
60
+ require 'runtex_splitindex'
61
+ require 'runtex_rail'
62
+ require 'runtex_bibtex'
63
+ end #module runtex
64
+
65
+ #Analyse from ARGV when called from Desktop
66
+ def start_from_desktop( )
67
+
68
+ options = {
69
+ :format => 'pdflualatex',
70
+ :overfull => 100, #report overfull boxes > this value
71
+ :underfull => 9000, #report underfull boxes > this badness
72
+ }
73
+
74
+ optparser = OptionParser.new{ |opts|
75
+ opts.banner = <<BANNER
76
+ runtex.rb: Translate a TeX-File.
77
+ This tool checks, how often the file must be translated to
78
+ create a document with correct references.
79
+ Usage:
80
+ runtex.rb [switches] source[.tex]
81
+
82
+ Known Problems:
83
+ - Not tested on different systems (PS2PDF will work only on windows)
84
+ - The errors statistic count some errors twice
85
+ (or do you want to loose errors)
86
+ - index.sty is not supported. Use index2.sty instead
87
+ Detailed informations: http://ruby.lickert.net/runtex
88
+
89
+ Switches:
90
+ -h <switch> for details of option <switch>
91
+ BANNER
92
+
93
+ #~ opts.on('-h', '--help' ){ |selection|
94
+ #~ puts opts.banner()
95
+ #~ STDIN.getc if @@wait
96
+ #~ exit
97
+ #~ }
98
+ #~ opts.on('-H', '--HELP' ){ |selection|
99
+ #~ puts opt.help( '--HELP' )
100
+ #~ STDIN.getc if @@wait
101
+ #~ exit
102
+ #~ }
103
+ #~ puts "Option #{option}#{selection} not known\nUse -h for help"
104
+
105
+ opts.on('-a', "--action ACTION", '--chain ACTION', %Q|Define the action chain
106
+ A chain defines the steps from source to the target.
107
+ - pdfLaTeX
108
+ - pdfLuaLaTeX [default]
109
+ - XeLaTeX
110
+ - LaTeX
111
+ - LaTeXPS Call LaTeX and then create a
112
+ Postscript file (dvips)
113
+ - LaTeXPSPDF Call LaTeX and then create a PDF
114
+ via dvips and ghostscript
115
+ -LaTeXPDF Call LaTeX and then create a PDF with dvipdfm
116
+ remark: Each tool may define a "subchain"
117
+ (pdf)LaTeX calls bibtex, makeindex, rail if necessary|.gsub(/^\t/, '')
118
+ ){ |selection|
119
+ selection = '?' if ! selection.respond_to?( :downcase )
120
+ case selection.downcase
121
+ when 'latex', 'pdflatex', 'pdflualatex', 'xelatex'
122
+ options[:format] = selection.to_sym
123
+ when 'latexps', 'latexpdf', 'latexpspdf'
124
+ puts "Sorry, not supported yet"
125
+ else
126
+ puts "Action chain #{selection} not valid"
127
+ STDIN.getc if $stdin.tty?
128
+ exit
129
+ end #case selection
130
+ }
131
+
132
+ opts.on('-o', "--overfull OVERFULL",
133
+ "Set the limit, from which overfull boxes are reported"
134
+ ){ |selection|
135
+ options[:overfull] = selection.to_i
136
+ }
137
+
138
+ opts.on('-u', "--underfull UNDERFULL", "Set the limit, from which underfull boxes are reported"){ |selection|
139
+ options[:underfull] = selection.to_i
140
+ }
141
+
142
+ #~ opts.on('-p', "--precompile PRE", %q|The given file(s) are precompiled.
143
+ #~ Conversions of the precompiler:
144
+ #~ - listings.sty:
145
+ #~ \lstinputlisting[fromlabel=<label>,tolabel=<label>]{file} to
146
+ #~ \lstinputlisting[firstline=<num>,lastline=<num>] {file}
147
+ #~ file must contain tags like "TeXlabel{label}"
148
+ #~ |.gsub(/^\t/, '')){ |selection|
149
+ #~ selection.each{|f|
150
+ #~ Precompile.mix_references!( f )
151
+ #~ }
152
+ #~ }
153
+ }
154
+
155
+ begin
156
+ optparser.parse!
157
+ #~ rescue OptionParser::MissingArgument => err
158
+ #~ rescue OptionParser::InvalidOption => err
159
+ rescue OptionParser::MissingArgument, OptionParser::InvalidOption => err
160
+ puts "Error:\t#{err}"
161
+ #Ausgabe der Schnittstelle
162
+ puts optparser.banner
163
+ end
164
+
165
+
166
+ if ARGV.size == 0
167
+ #Message if called by exe created with rubyscript2exe
168
+ puts "Add file to translate or -h for help" if /app.rb/ =~ $0
169
+ end
170
+ ARGV.each{|arg|
171
+ if arg =~ /\.(tex|dtx)$/
172
+ job = RunTeX::Job_chain.new(arg, options)
173
+ else
174
+ job = RunTeX::Job_chain.new("#{arg}.tex", options)
175
+ end
176
+ job.log.level = Log4r::WARN
177
+ job.start(options[:format])
178
+ }
179
+
180
+ if ARGV.empty?
181
+ puts "No TeX-File given"
182
+ exit
183
+ end
184
+
185
+ puts "Thanks for using #{File.basename($0)}."
186
+ STDIN.getc if $stdin.tty?
187
+
188
+ end #start_from_desktop( )
189
+
190
+ start_from_desktop( ) if __FILE__ == $0
191
+
192
+ __END__
193
+ lox: fixme.sty
194
+ out: hyperref.ste
195
+ tex: TeX-Source-file
196
+ aux: Auxiliary file, created by LaTeX
197
+ toc: table of contents (LaTeX)
198
+ bib: Bibliography, define bib-entries for BibTeX
199
+ bbl: Result of BibTeX
200
+ blg: Logfile from BibTeX
201
+ idx: Index, input for makeindex (LaTeX)
202
+ ind: Index, output from makeindex
203
+ ilg: Logfile by makeindex
204
+ glo: Glossary, definitions for glossaries.sty
205
+ gls: Glossary, corresponds to ind (glossaries.sty)
206
+ glg: Logfile from glossaries.sty, corresponds to ilg
207
+ ist: Style file for makeindex
208
+ rai: Rail-input file (rail)
209
+ rao: Rail-output file (rail)
210
+ log: logfile (TeX)
211
+ dvi: Result of (La)TeX.
212
+ pdf: Portable document format, result of the tex-run
213
+ sty: Style-file (LaTeX)
214
+ cls: document class definition (LaTeX)
215
+ dtx: source for cls/sty-files. (LaTeX)
216
+ ins: Install-file to create cls/sty from dtx. (LaTeX)
217
+ nav: Help-File Navigation (hyperref?) (LaTeX)
218
+ ps: Post-Script
219
+ eps: encapsulated Post-Script
220
+ lof: List of figures (LaTeX)
221
+ lot: List of tables (LaTeX)