texzip 0.1.3

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/History.txt ADDED
@@ -0,0 +1,13 @@
1
+ == 0.1.3 / 2011-04-12
2
+ * Rename texpack to texzip
3
+
4
+ == 0.1.2 / 2011-04-12
5
+ * Fix highline usage for jruby
6
+
7
+ == 0.1.1 / 2011-04-12
8
+ * Use highline for console interaction
9
+
10
+ == 0.1.0 / 2011-04-12
11
+
12
+ * 1 major enhancement
13
+ * Birthday!
data/README.md ADDED
@@ -0,0 +1,63 @@
1
+ texzip
2
+ ======
3
+
4
+ A small tool to collect images and BibTeX references from tex-files
5
+ and repack them in a new directory with a new clean BibTeX file.
6
+
7
+ Features
8
+ --------
9
+
10
+ * collects images included with \includegraphics
11
+ * collects BibTeX files included with \bibliography
12
+ * handles special images generated by xfig .pspdftex
13
+ * creates compressed archives containing the repacked project
14
+
15
+ Examples
16
+ --------
17
+
18
+ texpack -o result -i Images -a mytex.tgz mainfile.tex
19
+
20
+ Requirements
21
+ ------------
22
+
23
+ * trollop ~> 1.16
24
+ * bibtex-ruby >= 1.2.1, < 2.0
25
+ * ffi-libarchive < 2.0
26
+ * ffi-inliner < 2.0 (through ffi-libarchive)
27
+ * highline ~> 1.0
28
+
29
+ Install
30
+ -------
31
+
32
+ * gem install texpack
33
+
34
+ Author
35
+ ------
36
+
37
+ Original author: Frank Fischer
38
+
39
+ License
40
+ -------
41
+
42
+ (The MIT License)
43
+
44
+ Copyright (c) 2011 Frank Fischer
45
+
46
+ Permission is hereby granted, free of charge, to any person obtaining
47
+ a copy of this software and associated documentation files (the
48
+ 'Software'), to deal in the Software without restriction, including
49
+ without limitation the rights to use, copy, modify, merge, publish,
50
+ distribute, sublicense, and/or sell copies of the Software, and to
51
+ permit persons to whom the Software is furnished to do so, subject to
52
+ the following conditions:
53
+
54
+ The above copyright notice and this permission notice shall be
55
+ included in all copies or substantial portions of the Software.
56
+
57
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
58
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
59
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
60
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
61
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
62
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
63
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,27 @@
1
+
2
+ begin
3
+ require 'bones'
4
+ rescue LoadError
5
+ abort '### Please install the "bones" gem ###'
6
+ end
7
+
8
+ #task :default => 'test:run'
9
+ #task 'gem:release' => 'test:run'
10
+
11
+ files = `darcs show files`.split("\n").
12
+ select{|f| File.file?(f)}.
13
+ map{|f| f.gsub(/^\.\//, '')} - %w(.boring .bnsignore)
14
+
15
+ Bones {
16
+ name 'texzip'
17
+ authors 'Frank Fischer'
18
+ email 'frank.fischer@mathematik.tu-chemnitz.de'
19
+ url 'http://darcsden.com/lyro/texzip'
20
+ depend_on 'bibtex-ruby', ['>= 1.2.1', '< 2.0']
21
+ depend_on 'trollop', '~> 1.16'
22
+ depend_on 'ffi-libarchive', '>= 0.1.2', '< 2.0'
23
+ depend_on 'ffi-inliner', '>= 0.2.4', '< 2.0'
24
+ depend_on 'highline', '~> 1.0'
25
+ gem.files files
26
+ }
27
+
data/bin/texzip ADDED
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.expand_path(File.join(File.dirname(__FILE__),
4
+ %w[.. lib texzip]))
5
+
6
+ # Put your code here
7
+
8
+ require 'trollop'
9
+
10
+ opts = Trollop::options do
11
+ banner <<-EOS
12
+ TeXzip bundles your TeX project in a single archive or directory with all
13
+ included tex-, sty-, cls-files, pictures and (used) BibTeX-references.
14
+
15
+ Usage:
16
+
17
+ #{File.basename(__FILE__)} [options] <master-tex-file>
18
+
19
+ where [options] are:
20
+ EOS
21
+ opt :bib, "Output BibTeX file", :default => "bibliography.bib"
22
+ opt :output, "Output directory where the modified files should saved", :type => String
23
+ opt :images, "Subdirectory where the images should be stored", :default => "img"
24
+ opt :archive, "Archive to be created", :type => String
25
+ opt :force, "Force overwriting of files", :default => false
26
+ version "#{File.basename(__FILE__)} #{TeXzip::VERSION} (c) 2011 Frank Fischer"
27
+ end
28
+
29
+ if ARGV.empty?
30
+ STDERR.puts "Error: No master TeX-file given."
31
+ STDERR.puts "Try --help for help."
32
+ exit -1
33
+ end
34
+
35
+ unless opts[:archive] or opts[:output]
36
+ STDERR.puts "Error: --output or --archive must be given."
37
+ STDERR.puts "Try --help for help."
38
+ exit -1
39
+ end
40
+
41
+ begin
42
+ texproject = TeXzip::Project.new ARGV.shift
43
+ texproject.modify_files(opts[:output] || Dir.getwd, opts[:images], opts[:bib])
44
+
45
+ texproject.overwrite_all = opts[:force]
46
+
47
+ if opts[:output]
48
+ texproject.write_files
49
+ end
50
+
51
+ if opts[:archive]
52
+ texproject.write_archive opts[:archive]
53
+ end
54
+ rescue TeXzip::Error => e
55
+ STDERR.puts "Error: #{e}"
56
+ exit -1
57
+ rescue TeXzip::Project::Quit
58
+ puts "Aborted."
59
+ end
60
+
61
+
62
+
@@ -0,0 +1,478 @@
1
+ require 'pathname'
2
+ require 'set'
3
+ require 'fileutils'
4
+ require 'bibtex'
5
+ require 'ffi-libarchive'
6
+ require 'highline'
7
+
8
+ class TeXzip::Error < Exception; end
9
+
10
+ class TeXzip::Project < HighLine
11
+
12
+ PACKAGE_EXTENSIONS = %w(.sty .cls)
13
+ IMAGE_EXTENSIONS = %w(.jpg .pdf .eps .pstex)
14
+ TEXIMAGE_EXTENSIONS = %w(.pspdftex .pdf_t .pstex_t)
15
+
16
+ class Quit < Exception; end
17
+
18
+ attr_accessor :overwrite_all
19
+
20
+ class FilePath
21
+ def initialize(root_dir, file)
22
+ @root_dir = Pathname.new(root_dir).expand_path
23
+ @file = Pathname.new(file)
24
+ @file = @root_dir.join(file).expand_path.relative_path_from(@root_dir)
25
+ end
26
+
27
+ def set_output_directory dir
28
+ @out_dir = Pathname.new(dir).expand_path
29
+ end
30
+
31
+ def file
32
+ @file
33
+ end
34
+
35
+ def output_path
36
+ @out_dir.join(@file).expand_path
37
+ end
38
+
39
+ def path
40
+ @root_dir.join(@file).expand_path
41
+ end
42
+
43
+ def extname
44
+ @file.extname
45
+ end
46
+
47
+ def hash
48
+ path.to_s.hash
49
+ end
50
+
51
+ def eql?(file_path)
52
+ path.to_s.eql? file_path.path.to_s
53
+ end
54
+ end
55
+
56
+ def initialize( master_file )
57
+ super()
58
+ @tex_master_file = Pathname.new(master_file).expand_path
59
+
60
+ # All possible include-paths for TeX
61
+ @tex_dirs = [@tex_master_file.dirname]
62
+ @tex_dirs.concat((ENV["TEXINPUTS"] || "").split(':').map{|d| Pathname.new(d)})
63
+ @tex_dirs.map! &:expand_path
64
+ @tex_dirs.uniq!
65
+
66
+ @overwrite_all = false
67
+
68
+ parse_files
69
+ end
70
+
71
+ def parse_files
72
+ # The hash of all files, including the whole text.
73
+ @tex_files = {}
74
+ @image_files = Set.new
75
+ @bib_files = Set.new
76
+ @cites = Set.new
77
+
78
+ # Read all files recursively
79
+ unparsed_files = [@tex_master_file]
80
+ until unparsed_files.empty?
81
+ fname = unparsed_files.pop
82
+ file = find_file( fname )
83
+ if file.nil? then
84
+ if PACKAGE_EXTENSIONS.include? File.extname(fname)
85
+ next
86
+ else
87
+ raise TeXzip::Error, "Can't find file: #{fname}"
88
+ end
89
+ end
90
+
91
+ unless @tex_files.has_key? file
92
+ included_files = parse_file file
93
+ unparsed_files.concat included_files
94
+ end
95
+ end
96
+
97
+ unless @bib_files.empty?
98
+ @bib = BibTeX::Bibliography.new
99
+ @bib_files.each do |bib_file|
100
+ bib = BibTeX.open(bib_file.path)
101
+ bib.replace_strings
102
+ @bib.add(bib.to_a)
103
+ end
104
+ else
105
+ @bib = nil
106
+ end
107
+ end
108
+
109
+ # Returns the master-file's path.
110
+ def master_file
111
+ @tex_master_file
112
+ end
113
+
114
+ # Returns a list of included tex and sty files.
115
+ # @return [Array<Pathname>] Included tex files.
116
+ def tex_files
117
+ @tex_files.keys
118
+ end
119
+
120
+ # Returns a list of included image-files.
121
+ # @return [Array<Pathname>] Included image files.
122
+ def image_files
123
+ @image_files.to_a
124
+ end
125
+
126
+ # Returns a list of included BibTeX-files.
127
+ # @return [Array<Pathname>] Included BibTeX files.
128
+ def bib_files
129
+ @bib_files.to_a
130
+ end
131
+
132
+ # Returns a list of citations.
133
+ # @return [Array<String>] Citations.
134
+ def cites
135
+ @cites.to_a
136
+ end
137
+
138
+ # Returns the full path for a certain file.
139
+ #
140
+ # The file is searched in the current directory as well as all
141
+ # directories given by the environment variable +TEXINPUTS+
142
+ #
143
+ # @param [String] file The (relative) path of the file.
144
+ # @param [Array<String>] extensions The (possible) file extensions.
145
+ # @return [Pathname,nil] The path to the file if exist.
146
+ def find_file( file, extensions = [] )
147
+ extensions.unshift "" # the empty extension
148
+ extensions.uniq!
149
+
150
+ @tex_dirs.each do |d|
151
+ extensions.each do |ext|
152
+ file_path = d.join(file + ext).expand_path
153
+ if File.file? file_path
154
+ return FilePath.new(d, file + ext)
155
+ end
156
+ end
157
+ end
158
+ return nil
159
+ end
160
+
161
+ # Returns the full paths for all variants of a certain file.
162
+ #
163
+ # The files are searched in the current directory as well as all
164
+ # directories given by the environment variable +TEXINPUTS+
165
+ #
166
+ # @param [String] file The base file-name.
167
+ # @param [Array<String>] extensions The possible file-extensions.
168
+ # @return [Array<Pathname>] All found files.
169
+ def find_files( file, extensions )
170
+ extensions.uniq!
171
+
172
+ files = []
173
+
174
+ extensions.each do |ext|
175
+ @tex_dirs.each do |d|
176
+ file_path = d.join(file + ext).expand_path
177
+ if file_path.file?
178
+ files << FilePath.new(d, file + ext)
179
+ break
180
+ end
181
+ end
182
+ end
183
+
184
+ files
185
+ end
186
+
187
+ # Load and parse a single tex-file.
188
+ #
189
+ # The file is parsed for commands including images, BibTeX-files
190
+ # and citations. The command along with the command's argument is
191
+ # passed to the block. The block is assumed to return a list of
192
+ # further tex-files to be parsed.
193
+ #
194
+ # @param [Pathname,String] file_name The name of the TeX-file to parse
195
+ # @return [Array<String>] A list of included TeX-files.
196
+ def parse_file file_name, &block
197
+ text = nil
198
+ File.open(file_name.path, "rb") do |f|
199
+ text = f.read
200
+ end
201
+ @tex_files[file_name] = text
202
+
203
+ block = method(:handle_command) unless block
204
+
205
+ included_files = []
206
+ text.each_line do |line|
207
+ comment_match = line.match /(?:\\)*%/
208
+ if comment_match and (comment_match.end(0) - comment_match.begin(0)).odd?
209
+ line = line[0...comment_match.end(0)]
210
+ end
211
+ line.scan(/\\(documentclass|usepackage|include|input|includegraphics|bibliography|cite)(?:\[[^\]]+\])?\{([^}]+)\}/) do |cmd, arg|
212
+ new_files = block.call cmd, arg
213
+ included_files.concat new_files if new_files
214
+ end
215
+ end
216
+ included_files
217
+ end
218
+
219
+ # Handles parsed commands.
220
+ def handle_command command, argument
221
+ case command
222
+ when "includegraphics"
223
+ add_image argument
224
+ when "bibliography"
225
+ argument.split(',').uniq.each{|f| add_bib f.strip}
226
+ when "usepackage"
227
+ return [argument + ".sty"]
228
+ when "documentclass"
229
+ return [argument + ".cls"]
230
+ when "cite"
231
+ @cites.merge argument.split(',').map(&:strip)
232
+ else
233
+ ext = File.extname(argument)
234
+ if TEXIMAGE_EXTENSIONS.include?(ext)
235
+ file = find_file(argument)
236
+ unless file
237
+ puts "WARNING: Can't find tex-image file #{argument}"
238
+ return nil
239
+ end
240
+ dir = File.dirname(argument)
241
+ parse_file file do |command, arg|
242
+ if command == "includegraphics"
243
+ add_image File.join(dir, arg)
244
+ else
245
+ raise TeXzip::Error, "Unexpected command '\\#{command}' in tex-image file: \\#{argument}"
246
+ end
247
+ nil
248
+ end
249
+ elsif ext != ".tex"
250
+ argument += ".tex"
251
+ end
252
+ return [argument]
253
+ end
254
+ return nil
255
+ end
256
+
257
+ # Adds an image to the list of included images.
258
+ # @param [String] image_file_name The path of the image-file
259
+ def add_image image_file_name
260
+ ext = File.extname(image_file_name)
261
+ if ext == ""
262
+ image_files = find_files( image_file_name, IMAGE_EXTENSIONS )
263
+ else
264
+ image_files = [find_file( image_file_name )].compact
265
+ end
266
+
267
+ if image_files.empty?
268
+ puts "WARNING: Can't find included image #{image_file_name}"
269
+ else
270
+ @image_files.merge image_files
271
+ end
272
+ end
273
+
274
+ # Adds a BibTeX-file to the list of included BibTeX-files.
275
+ # @param [String] image_file_name The path of the BibTeX-file.
276
+ def add_bib bib_file_name
277
+ bib_file = find_file( bib_file_name, [".bib"] )
278
+
279
+ if bib_file.nil?
280
+ puts "WARNING: Can't find included BibTeX file #{bib_file_name}"
281
+ else
282
+ @bib_files.add bib_file
283
+ end
284
+ end
285
+
286
+ def modify_files outdir, image_dir, bibtex_file
287
+ @output_directory = Pathname.new(outdir).expand_path
288
+ @output_image_directory = @output_directory.join(Pathname.new(image_dir)).expand_path
289
+ @output_bibtex = @output_directory.join(Pathname.new(bibtex_file)).expand_path
290
+ @modified_files = {}
291
+
292
+ @tex_files.each_key do |file|
293
+ if TEXIMAGE_EXTENSIONS.include? file.extname
294
+ file.set_output_directory @output_image_directory
295
+ else
296
+ file.set_output_directory @output_directory
297
+ end
298
+ end
299
+ @tex_files.each_pair do |file, text|
300
+ @modified_files[file] = update_file file, text
301
+ end
302
+
303
+ @image_files.each do |file|
304
+ file.set_output_directory @output_image_directory
305
+ end
306
+
307
+ filter_bibtex
308
+ end
309
+
310
+ def update_file tex_file, text
311
+ ext = tex_file.path.extname
312
+
313
+ new_text = ""
314
+ text.each_line do |line|
315
+ comment_match = line.match /(?:\\)*%/
316
+ if comment_match and (comment_match.end(0) - comment_match.begin(0)).odd?
317
+ comment = line[comment_match.end(0) .. -1]
318
+ line = line[0...comment_match.end(0)]
319
+ else
320
+ comment = ""
321
+ end
322
+ new_line = line.gsub(/(\\(include|input|includegraphics|bibliography)(?:\[[^\]]+\])?)\{([^}]+)\}/) { |m|
323
+ start = $1
324
+ cmd = $2
325
+ file = $3
326
+ if cmd == "includegraphics"
327
+ if TEXIMAGE_EXTENSIONS.include? ext
328
+ file = File.join(tex_file.file.dirname, file)
329
+ end
330
+ new_file = @output_image_directory.join(Pathname.new(file)).relative_path_from(@output_directory)
331
+ elsif cmd == "bibliography"
332
+ new_file = @output_bibtex.basename.to_s.gsub(/\.bib$/, '')
333
+ else
334
+ if TEXIMAGE_EXTENSIONS.include? File.extname(file)
335
+ new_file = @output_image_directory.join(Pathname.new(file)).relative_path_from(@output_directory)
336
+ else
337
+ new_file = @output_directory.join(Pathname.new(file)).relative_path_from(@output_directory)
338
+ end
339
+ end
340
+ "#{start}{#{new_file}}"
341
+ }
342
+ new_text.concat new_line
343
+ new_text.concat comment
344
+ end
345
+
346
+ return new_text
347
+ end
348
+
349
+ def filter_bibtex
350
+ if @bib
351
+ cites = @cites.to_a
352
+ seen_cites = cites.to_set
353
+ until cites.empty?
354
+ cite = cites.pop
355
+ entry = @bib[cite]
356
+ if entry
357
+ crossref = entry["crossref"]
358
+ if crossref
359
+ crossref.split(',').map(&:strip).each do |ref|
360
+ if seen_cites.add? ref
361
+ cites << ref
362
+ seen_cites << ref
363
+ end
364
+ end
365
+ end
366
+ else
367
+ puts "WARNING: Can't find BibTeX-entry #{cite}"
368
+ end
369
+ end
370
+
371
+ @bib = BibTeX::Bibliography.new( @bib.to_a.select{|entry| seen_cites.include? entry.key} )
372
+ end
373
+ end
374
+
375
+ def write_files( force = false )
376
+ cwd = Pathname.getwd.expand_path
377
+ write_data do |path, data|
378
+ puts "Write file #{path.relative_path_from(cwd)}"
379
+ FileUtils.mkdir_p path.dirname unless path.dirname.exist?
380
+ if data.kind_of? Pathname
381
+ FileUtils.copy data, path
382
+ else
383
+ File.open(path, "wb") do |f|
384
+ f.write data
385
+ end
386
+ end
387
+ end
388
+ end
389
+
390
+ def write_archive( archive_file, force = false )
391
+ archive_file = Pathname.new(archive_file).expand_path
392
+ return unless ask_overwrite(archive_file)
393
+
394
+ compression = case File.basename(archive_file.to_s)
395
+ when /\.tgz$/, /\.tar\.gz$/
396
+ :gzip
397
+ when /\.tbz2$/, /\.tar\.bz2$/
398
+ :bzip2
399
+ when /\.txz$/, /\.tar\.xz$/
400
+ :xz
401
+ when /\.tlzma$/, /\.tar\.lzma$/
402
+ :lzma
403
+ when /\.tZ$/, /\.tar\.Z$/
404
+ :Z
405
+ when /\.tar$/
406
+ :none
407
+ else
408
+ raise TeXzip::Error, "Can't derive archive-type from file name #{archive_file}"
409
+ end
410
+
411
+ puts "Write archive #{archive_file.relative_path_from(Pathname.getwd)}"
412
+ Archive.write_open_filename archive_file.to_s, compression, :tar do |ar|
413
+ write_data true do |path, data|
414
+ ar.add_entry do |e|
415
+ e.pathname = path.relative_path_from(@output_directory).to_s
416
+ if data.kind_of? Pathname
417
+ e.copy_stat(data.to_s)
418
+ File.open(data, "rb", &:read)
419
+ else
420
+ e.mode = 0644
421
+ e.atime = Time.now
422
+ e.mtime = Time.now
423
+ e.filetype = :file
424
+ data
425
+ end
426
+ end
427
+ end
428
+ end
429
+ end
430
+
431
+ def write_data( force = false, &block )
432
+ raise ArgumentError, "Block required" unless block
433
+
434
+ overwrite_all = force
435
+ commands = []
436
+
437
+ @modified_files.each_pair do |file, text|
438
+ if force or ask_overwrite(file.output_path)
439
+ commands << [file.output_path, text]
440
+ end
441
+ end
442
+
443
+ @image_files.each do |file|
444
+ if force or ask_overwrite(file.output_path)
445
+ commands << [file.output_path, file.path]
446
+ end
447
+ end
448
+
449
+ if @bib and (force or ask_overwrite(@output_bibtex))
450
+ commands << [@output_bibtex, @bib.to_s]
451
+ end
452
+
453
+ commands.each do |path, data|
454
+ block.call path, data
455
+ end
456
+ end
457
+
458
+ def ask_overwrite file
459
+ if !@overwrite_all and File.exist?(file)
460
+ ask("File #{file.relative_path_from(Pathname.getwd)} exists. Overwrite? [Ynaq]") do |q|
461
+ q.character = true
462
+ q.validate = /[ynaq\r ]/
463
+ q.case = :down
464
+ q.overwrite = false
465
+ q.answer_type = lambda{ |c|
466
+ case c
467
+ when "q"; raise Quit
468
+ when "y"; true
469
+ when "n"; false
470
+ when "a"; @overwrite_all = true; true
471
+ end
472
+ }
473
+ end
474
+ else
475
+ true
476
+ end
477
+ end
478
+ end
data/lib/texzip.rb ADDED
@@ -0,0 +1,60 @@
1
+
2
+ module TeXzip
3
+
4
+ # :stopdoc:
5
+ LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
6
+ PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
7
+ VERSION = ::File.read(PATH + 'version.txt').strip
8
+ # :startdoc:
9
+
10
+ # Returns the library path for the module. If any arguments are given,
11
+ # they will be joined to the end of the libray path using
12
+ # <tt>File.join</tt>.
13
+ #
14
+ def self.libpath( *args )
15
+ rv = args.empty? ? LIBPATH : ::File.join(LIBPATH, args.flatten)
16
+ if block_given?
17
+ begin
18
+ $LOAD_PATH.unshift LIBPATH
19
+ rv = yield
20
+ ensure
21
+ $LOAD_PATH.shift
22
+ end
23
+ end
24
+ return rv
25
+ end
26
+
27
+ # Returns the lpath for the module. If any arguments are given,
28
+ # they will be joined to the end of the path using
29
+ # <tt>File.join</tt>.
30
+ #
31
+ def self.path( *args )
32
+ rv = args.empty? ? PATH : ::File.join(PATH, args.flatten)
33
+ if block_given?
34
+ begin
35
+ $LOAD_PATH.unshift PATH
36
+ rv = yield
37
+ ensure
38
+ $LOAD_PATH.shift
39
+ end
40
+ end
41
+ return rv
42
+ end
43
+
44
+ # Utility method used to require all files ending in .rb that lie in the
45
+ # directory below this file that has the same name as the filename passed
46
+ # in. Optionally, a specific _directory_ name can be passed in such that
47
+ # the _filename_ does not have to be equivalent to the directory.
48
+ #
49
+ def self.require_all_libs_relative_to( fname, dir = nil )
50
+ dir ||= ::File.basename(fname, '.*')
51
+ search_me = ::File.expand_path(
52
+ ::File.join(::File.dirname(fname), dir, '**', '*.rb'))
53
+
54
+ Dir.glob(search_me).sort.each {|rb| require rb}
55
+ end
56
+
57
+ end # module TeXzip
58
+
59
+ TeXzip.require_all_libs_relative_to(__FILE__)
60
+
@@ -0,0 +1,39 @@
1
+ @Article{cite1,
2
+ author = {Alice},
3
+ title = {Alice's idea},
4
+ journal = {Film am Sonntag},
5
+ year = {2010},
6
+ }
7
+
8
+
9
+ @Article{cite2,
10
+ author = {Bob},
11
+ title = {Bob's idea},
12
+ journal = {Widerhall},
13
+ year = {2009},
14
+ }
15
+
16
+
17
+ @Article{cite2,
18
+ author = {Bob},
19
+ title = {Bob's idea},
20
+ journal = {Widerhall},
21
+ year = {2009},
22
+ }
23
+
24
+
25
+ @Article{cite2,
26
+ author = {Bob},
27
+ title = {Bob's idea},
28
+ journal = {Widerhall},
29
+ year = {2009},
30
+ }
31
+
32
+
33
+ @Article{cite3,
34
+ author = {Alice and Bob},
35
+ title = {We two},
36
+ journal = {Brennpunkt},
37
+ year = {2008},
38
+ }
39
+
@@ -0,0 +1,31 @@
1
+
2
+ @Article{cite3,
3
+ author = {Alice and Bob},
4
+ title = {We two},
5
+ journal = {Brennpunkt},
6
+ year = {2008},
7
+ }
8
+
9
+
10
+ @Article{cite3,
11
+ author = {Alice and Bob},
12
+ title = {We two},
13
+ journal = {Brennpunkt},
14
+ year = {2008},
15
+ }
16
+
17
+
18
+ @Article{cite3,
19
+ author = {Alice and Bob},
20
+ title = {We two},
21
+ journal = {Brennpunkt},
22
+ year = {2008},
23
+ }
24
+
25
+
26
+ @Article{cite42,
27
+ author = {Udo},
28
+ title = {Ugh?},
29
+ journal = {Apes' world},
30
+ year = {2008},
31
+ }
@@ -0,0 +1,2 @@
1
+
2
+ \cite{cite2, cite4}
@@ -0,0 +1,2 @@
1
+
2
+ \cite{cite2, cite4}
@@ -0,0 +1,4 @@
1
+ \include{chapter3.1}
2
+ \include{chapter3.2}
3
+ \include{chapter3.3}
4
+ \cite{cite2, cite4}
@@ -0,0 +1,3 @@
1
+ \include{chapter3/chapter3.1}
2
+ \include{chapter3/chapter3.2}
3
+ \cite{cite2, cite4}
@@ -0,0 +1,3 @@
1
+ \include{chapter3/chapter3.1}
2
+ \include{chapter3/chapter3.2}
3
+ \cite{cite2, cite4}
@@ -0,0 +1,3 @@
1
+ \include{chapter3/chapter3.1}
2
+ \include{chapter3/chapter3.2}
3
+ \cite{cite2, cite4}
@@ -0,0 +1,2 @@
1
+
2
+ \cite{cite2, cite4}
@@ -0,0 +1,19 @@
1
+ \documentclass{scrartcl}
2
+
3
+ \begin{document}
4
+
5
+
6
+ \input{chapter1}
7
+ \input{chapter2.tex}
8
+ \include{chapter3/chapter3}
9
+ \include{chapter4.tex}
10
+
11
+ \cite{cite1}
12
+ \cite{cite5, cite2}
13
+ \cite{cite3,
14
+ cite4}
15
+ \cite{cite5, cite2}
16
+
17
+ \bibliography{bib1, bib2, bib1}
18
+
19
+ \end{document}
@@ -0,0 +1,19 @@
1
+ \documentclass{scrartcl}
2
+
3
+ \begin{document}
4
+
5
+
6
+ \input{chapter1}
7
+ \input{chapter2.tex}
8
+ \include{chapter3-bad}
9
+ \include{chapter4.tex}
10
+
11
+ \cite{cite1}
12
+ \cite{cite5, cite2}
13
+ \cite{cite3,
14
+ cite4}
15
+ \cite{cite5, cite2}
16
+
17
+ \bibliography{bib1, bib2}
18
+
19
+ \end{document}
@@ -0,0 +1,19 @@
1
+ \documentclass{scrartcl}
2
+
3
+ \begin{document}
4
+
5
+
6
+ \input{chapter1}
7
+ \input{chapter2.tex}
8
+ \include{chapter3}
9
+ \include{chapter4.tex}
10
+
11
+ \cite{cite1}
12
+ \cite{cite5, cite2}
13
+ \cite{cite3,
14
+ cite4}
15
+ \cite{cite5, cite2}
16
+
17
+ \bibliography{bib1, bib2, bib2, bib3}
18
+
19
+ \end{document}
@@ -0,0 +1,15 @@
1
+
2
+ require File.expand_path(
3
+ File.join(File.dirname(__FILE__), %w[.. lib texzip]))
4
+
5
+ RSpec::Runner.configure do |config|
6
+ # == Mock Framework
7
+ #
8
+ # RSpec uses it's own mocking framework by default. If you prefer to
9
+ # use mocha, flexmock or RR, uncomment the appropriate line:
10
+ #
11
+ # config.mock_with :mocha
12
+ # config.mock_with :flexmock
13
+ # config.mock_with :rr
14
+ end
15
+
@@ -0,0 +1,56 @@
1
+
2
+ require File.join(File.dirname(__FILE__), %w[spec_helper])
3
+
4
+ require 'texzip'
5
+ require 'tempfile'
6
+
7
+ def init_env
8
+ Dir.chdir(File.dirname(__FILE__))
9
+ end
10
+
11
+ describe TeXzip, "on creation" do
12
+ before do
13
+ init_env
14
+ end
15
+
16
+ it "should fail if the file does not exist" do
17
+ lambda { TeXzip::Project.new(File.join("dummy", "nofile.tex")) }.should raise_error
18
+ end
19
+
20
+ it "should not fail if the file exists" do
21
+ lambda { TeXzip::Project.new(File.join("dummy", "root-file.tex")) }.should_not raise_error
22
+ end
23
+ end
24
+
25
+
26
+ describe TeXzip, "after creation" do
27
+ before do
28
+ init_env
29
+ @tex_file = TeXzip::Project.new("dummy/root-file.tex")
30
+ end
31
+
32
+ it "should return its correct path" do
33
+ @tex_file.master_file.should == Pathname.new("dummy/root-file.tex").expand_path
34
+ end
35
+
36
+ it "should return a list of included sub-files" do
37
+ @tex_file.tex_files.sort.should == %w( dummy/root-file.tex
38
+ dummy/chapter1.tex
39
+ dummy/chapter2.tex
40
+ dummy/chapter3.tex
41
+ dummy/chapter3.1.tex
42
+ dummy/chapter3.2.tex
43
+ dummy/chapter4.tex ).map{|p| Pathname.new(p).expand_path}.sort
44
+ end
45
+
46
+ it "should return a list of used bibtex files" do
47
+ @tex_file.bib_files.sort.should == %w( dummy/bib1.bib dummy/bib2.bib ).
48
+ map{|p| Pathname.new(p).expand_path}.sort
49
+ end
50
+
51
+ it "should return a list of used citations" do
52
+ @tex_file.cites.sort.should == %w( cite1 cite2 cite3 cite4 cite5 ).sort
53
+ end
54
+ end
55
+
56
+
data/version.txt ADDED
@@ -0,0 +1 @@
1
+ 0.1.3
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: texzip
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.3
6
+ platform: ruby
7
+ authors:
8
+ - Frank Fischer
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-04-12 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: bibtex-ruby
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.2.1
24
+ - - <
25
+ - !ruby/object:Gem::Version
26
+ version: "2.0"
27
+ type: :runtime
28
+ version_requirements: *id001
29
+ - !ruby/object:Gem::Dependency
30
+ name: trollop
31
+ prerelease: false
32
+ requirement: &id002 !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: "1.16"
38
+ type: :runtime
39
+ version_requirements: *id002
40
+ - !ruby/object:Gem::Dependency
41
+ name: ffi-libarchive
42
+ prerelease: false
43
+ requirement: &id003 !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: 0.1.2
49
+ type: :runtime
50
+ version_requirements: *id003
51
+ - !ruby/object:Gem::Dependency
52
+ name: ffi-inliner
53
+ prerelease: false
54
+ requirement: &id004 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 0.2.4
60
+ type: :runtime
61
+ version_requirements: *id004
62
+ - !ruby/object:Gem::Dependency
63
+ name: highline
64
+ prerelease: false
65
+ requirement: &id005 !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ~>
69
+ - !ruby/object:Gem::Version
70
+ version: "1.0"
71
+ type: :runtime
72
+ version_requirements: *id005
73
+ - !ruby/object:Gem::Dependency
74
+ name: bones
75
+ prerelease: false
76
+ requirement: &id006 !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: 3.6.5
82
+ type: :development
83
+ version_requirements: *id006
84
+ description: |-
85
+ A small tool to collect images and BibTeX references from tex-files
86
+ and repack them in a new directory with a new clean BibTeX file.
87
+ email: frank.fischer@mathematik.tu-chemnitz.de
88
+ executables:
89
+ - texzip
90
+ extensions: []
91
+
92
+ extra_rdoc_files:
93
+ - History.txt
94
+ - bin/texzip
95
+ files:
96
+ - History.txt
97
+ - README.md
98
+ - Rakefile
99
+ - version.txt
100
+ - bin/texzip
101
+ - lib/texzip.rb
102
+ - lib/texzip/Project.rb
103
+ - spec/spec_helper.rb
104
+ - spec/texzip_spec.rb
105
+ - spec/dummy/bib1.bib
106
+ - spec/dummy/bib2.bib
107
+ - spec/dummy/chapter1.tex
108
+ - spec/dummy/chapter2.tex
109
+ - spec/dummy/chapter4.tex
110
+ - spec/dummy/root-file.tex
111
+ - spec/dummy/root-file2.tex
112
+ - spec/dummy/root-file3.tex
113
+ - spec/dummy/chapter3/chapter3-bad.tex
114
+ - spec/dummy/chapter3/chapter3.1.tex
115
+ - spec/dummy/chapter3/chapter3.2.tex
116
+ - spec/dummy/chapter3/chapter3.tex
117
+ homepage: http://darcsden.com/lyro/texzip
118
+ licenses: []
119
+
120
+ post_install_message:
121
+ rdoc_options:
122
+ - --main
123
+ - README.md
124
+ require_paths:
125
+ - lib
126
+ required_ruby_version: !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: "0"
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ none: false
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: "0"
138
+ requirements: []
139
+
140
+ rubyforge_project: texzip
141
+ rubygems_version: 1.7.2
142
+ signing_key:
143
+ specification_version: 3
144
+ summary: A small tool to collect images and BibTeX references from tex-files and repack them in a new directory with a new clean BibTeX file.
145
+ test_files: []
146
+