erbtex 0.4.2 → 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +2 -2
- data/erbtex.gemspec +5 -6
- data/examples/dms.rb +55 -57
- data/lib/erbtex.rb +1 -0
- data/lib/erbtex/command_line.rb +1 -26
- data/lib/erbtex/file_names.rb +64 -0
- data/lib/erbtex/runner.rb +39 -76
- data/lib/erbtex/version.rb +1 -1
- data/spec/example_files/roots.tex +23 -0
- data/spec/example_files/roots.tex.erb +23 -0
- data/spec/lib/command_line_spec.rb +26 -49
- data/spec/lib/file_names_spec.rb +59 -0
- metadata +10 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da849bbae335cabdeb22f9817d5408660b1d37ed1036eba721ce8bdace2668f2
|
4
|
+
data.tar.gz: 4e933a21dfa948f00151d1cd695f425dfb17aec6f1ac1d940dd68d32799229d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b1cf7577a154c728e92b44d555e464b62ff714ddcccad23744f1d5dc0b53ddcbc88d43e31698aecc2a1b4494bcf0660e1677c42c70998bcc76da743a5aa893c5
|
7
|
+
data.tar.gz: '051332985184a47f5515dda043d598bf835488d0d812dd753e9ec05cdaafdeebf51279bfdc1fb7307b97ac8155d3007f8572340175ec1148bc80a13d2fee557c'
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
erbtex (0.4.
|
4
|
+
erbtex (0.4.3)
|
5
5
|
erubis
|
6
6
|
fat_core
|
7
7
|
|
@@ -19,7 +19,7 @@ GEM
|
|
19
19
|
damerau-levenshtein (1.3.1)
|
20
20
|
diff-lcs (1.3)
|
21
21
|
erubis (2.7.0)
|
22
|
-
fat_core (4.
|
22
|
+
fat_core (4.6.0)
|
23
23
|
activesupport
|
24
24
|
damerau-levenshtein
|
25
25
|
i18n (1.6.0)
|
data/erbtex.gemspec
CHANGED
@@ -7,15 +7,14 @@ Gem::Specification.new do |gem|
|
|
7
7
|
gem.version = ErbTeX::VERSION
|
8
8
|
gem.platform = Gem::Platform::RUBY
|
9
9
|
gem.date = %q{2012-05-13}
|
10
|
-
gem.homepage = ''
|
10
|
+
gem.homepage = 'https://github.com/ddoherty03/erbtex'
|
11
11
|
gem.authors = ['Daniel E. Doherty']
|
12
|
-
gem.email = %q{ded
|
12
|
+
gem.email = %q{ded@ddoherty.net}
|
13
13
|
gem.summary = %q{Preprocesses TeX and LaTeX files with erubis for ruby.}
|
14
|
-
gem.description = %q{
|
15
|
-
|
16
|
-
|
14
|
+
gem.description = %q{erbtex will act just like pdflatex except that it will
|
15
|
+
process ruby fragments between {: and :} markers,
|
16
|
+
greatly expanding the ability to generate
|
17
17
|
automated TeX and LaTeX documents.}
|
18
|
-
|
19
18
|
gem.files = `git ls-files`.split("\n")
|
20
19
|
gem.files.delete_if { |f| f =~ /\.(log|etc|aux|etx|pdf|gem|tmp)$/ }
|
21
20
|
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
data/examples/dms.rb
CHANGED
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
# A class for maipulating angles expressed as degreed, minutes,
|
4
4
|
# and seconds.
|
5
|
-
|
6
5
|
class DMS
|
7
6
|
include Comparable
|
8
7
|
|
@@ -10,21 +9,21 @@ class DMS
|
|
10
9
|
|
11
10
|
@@precision = 4
|
12
11
|
|
13
|
-
def initialize(
|
14
|
-
@degrees =
|
15
|
-
@minutes =
|
16
|
-
@seconds =
|
17
|
-
|
12
|
+
def initialize(deg, min = 0, sec = 0.0)
|
13
|
+
@degrees = deg.to_i
|
14
|
+
@minutes = min.to_i
|
15
|
+
@seconds = sec.to_f
|
16
|
+
normalize
|
18
17
|
end
|
19
18
|
|
20
|
-
def
|
21
|
-
if
|
22
|
-
|
19
|
+
def self.from_radians(rad)
|
20
|
+
if rad < 0
|
21
|
+
rad = -rad
|
23
22
|
sign = -1
|
24
23
|
else
|
25
24
|
sign = 1
|
26
25
|
end
|
27
|
-
deg =
|
26
|
+
deg = rad * (360.0 / (2.0 * Math::PI))
|
28
27
|
degrees = deg.floor
|
29
28
|
min = (deg - degrees) * 60.0
|
30
29
|
minutes = min.floor
|
@@ -32,10 +31,10 @@ class DMS
|
|
32
31
|
DMS.new(degrees, minutes, seconds)
|
33
32
|
end
|
34
33
|
|
35
|
-
def
|
34
|
+
def self.precision=(p)
|
36
35
|
@@precision = p
|
37
36
|
end
|
38
|
-
|
37
|
+
|
39
38
|
def to_s
|
40
39
|
"#{@degrees}* #{@minutes}' %0.*f''" % [@@precision, @seconds]
|
41
40
|
end
|
@@ -45,14 +44,14 @@ class DMS
|
|
45
44
|
end
|
46
45
|
|
47
46
|
def to_radians
|
48
|
-
|
47
|
+
to_f * ((2.0 * Math::PI) / 360.0)
|
49
48
|
end
|
50
49
|
|
51
50
|
# If degrees are at well-known values, eppress as radians
|
52
51
|
# symbolically, using TeX notation
|
53
52
|
def to_radians_tex
|
54
53
|
unless @seconds == 0.0 and @minutes == 0
|
55
|
-
return
|
54
|
+
return '$%0.*f$' % [@@precision, to_radians]
|
56
55
|
end
|
57
56
|
|
58
57
|
# This gets deg to 0 <= x <= 360, even for negative
|
@@ -60,51 +59,50 @@ class DMS
|
|
60
59
|
deg = @degrees.divmod(360)[1]
|
61
60
|
case deg
|
62
61
|
when 0
|
63
|
-
|
62
|
+
'$0$'
|
64
63
|
when 30
|
65
|
-
|
64
|
+
'$\\pi/6$'
|
66
65
|
when 60
|
67
|
-
|
66
|
+
'$\\pi/3$'
|
68
67
|
when 90
|
69
|
-
|
68
|
+
'$\\pi/2$'
|
70
69
|
when 120
|
71
|
-
|
70
|
+
'$2\\pi/2$'
|
72
71
|
when 150
|
73
|
-
|
72
|
+
'$5\\pi/6$'
|
74
73
|
when 180
|
75
|
-
|
74
|
+
'$\\pi$'
|
76
75
|
when 210
|
77
|
-
|
76
|
+
'$7\\pi/6$'
|
78
77
|
when 240
|
79
|
-
|
78
|
+
'$4\\pi/3$'
|
80
79
|
when 270
|
81
|
-
|
80
|
+
'$3\\pi/2$'
|
82
81
|
when 300
|
83
|
-
|
82
|
+
'5\\pi/3$'
|
84
83
|
when 330
|
85
|
-
|
84
|
+
'11\\pi/6$'
|
86
85
|
when 360
|
87
|
-
|
86
|
+
'$2\\pi$'
|
88
87
|
else
|
89
|
-
|
88
|
+
'$%0.*f$' % [@@precision, to_radians]
|
90
89
|
end
|
91
90
|
end
|
92
|
-
|
91
|
+
|
93
92
|
def to_tex
|
94
|
-
# "$#{@degrees}^\\circ #{@minutes}' %0.*f''$" % [@@precision, @seconds] #"
|
95
93
|
"$%02d^\\circ~%02d'~%02.*f''$" % [@degrees, @minutes, @@precision, @seconds] #"
|
96
94
|
end
|
97
|
-
|
95
|
+
|
98
96
|
def -@
|
99
97
|
DMS.new(-@degrees, @minutes, @seconds)
|
100
98
|
end
|
101
|
-
|
99
|
+
|
102
100
|
def +@
|
103
101
|
DMS.new(@degrees, @minutes, @seconds)
|
104
102
|
end
|
105
103
|
|
106
104
|
def <=>(other)
|
107
|
-
|
105
|
+
to_radians <=> other.to_radians
|
108
106
|
end
|
109
107
|
|
110
108
|
def +(other)
|
@@ -128,34 +126,34 @@ class DMS
|
|
128
126
|
end
|
129
127
|
|
130
128
|
def sin
|
131
|
-
Math.sin(
|
129
|
+
Math.sin(to_radians)
|
132
130
|
end
|
133
|
-
|
131
|
+
|
134
132
|
def cos
|
135
|
-
Math.cos(
|
133
|
+
Math.cos(to_radians)
|
136
134
|
end
|
137
|
-
|
135
|
+
|
138
136
|
def tan
|
139
|
-
Math.tan(
|
137
|
+
Math.tan(to_radians)
|
140
138
|
end
|
141
|
-
|
139
|
+
|
142
140
|
def sec
|
143
|
-
(1.0 / Math.cos(
|
141
|
+
(1.0 / Math.cos(to_radians))
|
144
142
|
end
|
145
|
-
|
143
|
+
|
146
144
|
def csc
|
147
|
-
(1.0 / Math.sin(
|
145
|
+
(1.0 / Math.sin(to_radians))
|
148
146
|
end
|
149
|
-
|
147
|
+
|
150
148
|
def cotan
|
151
|
-
(1.0 / Math.tan(
|
149
|
+
(1.0 / Math.tan(to_radians))
|
152
150
|
end
|
153
|
-
|
151
|
+
|
154
152
|
# Ensure that seconds and minutes are 0 <= x < 60.
|
155
153
|
# After normalization, only degrees can be negative,
|
156
154
|
# which will represent a negative quantity
|
157
155
|
def normalize
|
158
|
-
q, r
|
156
|
+
q, r = @seconds.divmod(60.0)
|
159
157
|
@seconds = r
|
160
158
|
@minutes += q
|
161
159
|
q, r = @minutes.divmod(60)
|
@@ -164,22 +162,22 @@ class DMS
|
|
164
162
|
end
|
165
163
|
end
|
166
164
|
|
167
|
-
class
|
165
|
+
class Integer
|
168
166
|
alias times *
|
169
|
-
def *(
|
170
|
-
case
|
167
|
+
def *(other)
|
168
|
+
case other
|
171
169
|
when DMS
|
172
|
-
|
170
|
+
other * self
|
173
171
|
else
|
174
|
-
|
172
|
+
times(other)
|
175
173
|
end
|
176
174
|
end
|
177
175
|
end
|
178
|
-
|
176
|
+
|
179
177
|
if __FILE__ == $0
|
180
|
-
print "Fifty seconds: #{DMS.new(0, 0, 50).to_radians}\n"
|
181
|
-
print "One minute: #{DMS.new(0, 1, 0).to_radians}\n"
|
182
|
-
print "Fifty seconds: #{DMS.new(0, 0, 50).to_f}\n"
|
183
|
-
print "One minute: #{DMS.new(0, 1, 0).to_f}\n"
|
184
|
-
print "#{DMS.from_radians(Math::PI / 2.0)}\n"
|
178
|
+
print "Fifty seconds in radians: #{DMS.new(0, 0, 50).to_radians}\n"
|
179
|
+
print "One minute in radians: #{DMS.new(0, 1, 0).to_radians}\n"
|
180
|
+
print "Fifty seconds in degrees: #{DMS.new(0, 0, 50).to_f}\n"
|
181
|
+
print "One minute in degrees: #{DMS.new(0, 1, 0).to_f}\n"
|
182
|
+
print "One-half PI radians in DMS: #{DMS.from_radians(Math::PI / 2.0)}\n"
|
185
183
|
end
|
data/lib/erbtex.rb
CHANGED
data/lib/erbtex/command_line.rb
CHANGED
@@ -59,7 +59,7 @@ module ErbTeX
|
|
59
59
|
# assumed to be the name of the input_file.
|
60
60
|
@input_file = nil
|
61
61
|
if !argv.empty? && argv[-1] !~ /\A[-&]/
|
62
|
-
@input_file =
|
62
|
+
@input_file = ErbTeX.expand_input_file(argv.pop)
|
63
63
|
end
|
64
64
|
|
65
65
|
# What remains in argv should be the tex program's '-options', which
|
@@ -75,31 +75,6 @@ module ErbTeX
|
|
75
75
|
"#{tex_file}"
|
76
76
|
.strip.squeeze(' ')
|
77
77
|
end
|
78
|
-
|
79
|
-
# Return the name of the input file based on the name given in the command
|
80
|
-
# line. Try to find the right extension for the input file if none is given.
|
81
|
-
def self.expand_input_file(input_file)
|
82
|
-
return '' if input_file.blank?
|
83
|
-
|
84
|
-
md = %r{\A(.*)(\.[\w.]+)?\z}.match(input_file)
|
85
|
-
if md
|
86
|
-
input_base = md[1]
|
87
|
-
input_ext = md[2]
|
88
|
-
end
|
89
|
-
if input_ext.nil?
|
90
|
-
if File.exist?("#{input_base}.tex.erb")
|
91
|
-
"#{input_base}.tex.erb"
|
92
|
-
elsif File.exist?("#{input_base}.tex")
|
93
|
-
"#{input_base}.tex"
|
94
|
-
elsif File.exist?("#{input_base}.erb")
|
95
|
-
"#{input_base}.erb"
|
96
|
-
else
|
97
|
-
input_base
|
98
|
-
end
|
99
|
-
else
|
100
|
-
input_base
|
101
|
-
end
|
102
|
-
end
|
103
78
|
end
|
104
79
|
end
|
105
80
|
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module ErbTeX
|
2
|
+
# Given an arbitrary file name, parse it into its components in one go. It
|
3
|
+
# separates three parts of a filename: (1) the directory, if any, (2) the
|
4
|
+
# base name (including such things as .configrc) which is considered a base
|
5
|
+
# name rather than an extension, and (3) any extension, including a compound
|
6
|
+
# extension such as .tex.erb
|
7
|
+
def self.parse_file_name(path)
|
8
|
+
fn_re = %r{\A(?<dir>([^\/]*\/)*) (?<base>.?[^\/.]*) (?<ext>\.[\w.]+)?}x
|
9
|
+
md = fn_re.match(path)
|
10
|
+
{ dir: md[:dir], base: md[:base], ext: md[:ext] }
|
11
|
+
end
|
12
|
+
|
13
|
+
# Return the name of the input file based on the name given in the command
|
14
|
+
# line. Try to add the right extension for the input file if none is given.
|
15
|
+
def self.expand_input_file(input_file)
|
16
|
+
return '' if input_file.blank?
|
17
|
+
|
18
|
+
fn = ErbTeX.parse_file_name(input_file)
|
19
|
+
input_dir = fn[:dir]
|
20
|
+
input_base = fn[:base]
|
21
|
+
input_ext = fn[:ext]
|
22
|
+
if input_ext.nil?
|
23
|
+
path = "#{input_dir}#{input_base}"
|
24
|
+
if File.exist?("#{path}.tex.erb")
|
25
|
+
"#{path}.tex.erb"
|
26
|
+
elsif File.exist?("#{path}.tex")
|
27
|
+
"#{path}.tex"
|
28
|
+
elsif File.exist?("#{path}.erb")
|
29
|
+
"#{path}.erb"
|
30
|
+
else
|
31
|
+
input_base
|
32
|
+
end
|
33
|
+
else
|
34
|
+
input_file
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Map the extension of the erbtex input file to the extension of the erubis
|
39
|
+
# output file in the following order of preference:
|
40
|
+
#
|
41
|
+
# base.tex.erb -> base.tex
|
42
|
+
# base.tex -> base.etx
|
43
|
+
# base.erb -> base.tex
|
44
|
+
# base.* -> base.tex
|
45
|
+
def self.out_file_name(in_file)
|
46
|
+
fn_parts = parse_file_name(in_file)
|
47
|
+
in_base = fn_parts[:base]
|
48
|
+
in_ext = fn_parts[:ext]
|
49
|
+
|
50
|
+
out_ext =
|
51
|
+
case in_ext
|
52
|
+
when '.tex.erb'
|
53
|
+
'.tex'
|
54
|
+
when '.tex'
|
55
|
+
'.etx'
|
56
|
+
when '.erb'
|
57
|
+
'.tex'
|
58
|
+
else
|
59
|
+
'.tex'
|
60
|
+
end
|
61
|
+
# Do not include the input directory, only output to current directory.
|
62
|
+
"#{in_base}#{out_ext}"
|
63
|
+
end
|
64
|
+
end
|
data/lib/erbtex/runner.rb
CHANGED
@@ -4,13 +4,15 @@ require 'English'
|
|
4
4
|
|
5
5
|
# Name space module for erbtex program.
|
6
6
|
module ErbTeX
|
7
|
+
# Perform the erubis pre-processing and the TeX processing on the input
|
8
|
+
# file.
|
7
9
|
def self.run(cmd_line)
|
8
10
|
report_version && exit(0) if cmd_line.print_version
|
9
11
|
report_help && exit(0) if cmd_line.print_help
|
10
12
|
|
11
|
-
|
12
|
-
tex_file = erb_to_tex(cmd_line.input_file,
|
13
|
-
run_tex(cmd_line.tex_command(tex_file),
|
13
|
+
in_dir = parse_file_name(cmd_line.input_file)[:dir]
|
14
|
+
tex_file = erb_to_tex(cmd_line.input_file, in_dir) if cmd_line.input_file
|
15
|
+
run_tex(cmd_line.tex_command(tex_file), in_dir)
|
14
16
|
end
|
15
17
|
|
16
18
|
def self.report_version
|
@@ -26,6 +28,7 @@ module ErbTeX
|
|
26
28
|
true
|
27
29
|
end
|
28
30
|
|
31
|
+
# Display the help for erbtex.
|
29
32
|
def self.report_help
|
30
33
|
puts <<~HELP
|
31
34
|
Usage: erbtex [erbtex_options] [tex_prog_args] [file]
|
@@ -49,44 +52,53 @@ module ErbTeX
|
|
49
52
|
true
|
50
53
|
end
|
51
54
|
|
52
|
-
# Run the TeX program
|
53
|
-
#
|
54
|
-
def self.run_tex(cmd,
|
55
|
+
# Run the TeX program on the erubis-processed output file, which is the
|
56
|
+
# input file to the TeX program. Return the exit status.
|
57
|
+
def self.run_tex(cmd, in_dir = nil)
|
58
|
+
# If the input file is located in another directory (in_dir), add that
|
59
|
+
# directory to TEXINPUTS if its not already there so that the input file
|
60
|
+
# can \include or \input files using relative file names.
|
55
61
|
new_env = {}
|
56
|
-
if
|
57
|
-
|
62
|
+
if in_dir
|
63
|
+
in_dir = File.absolute_path(File.expand_path(in_dir))
|
64
|
+
ENV['TEXINPUTS'] ||= ''
|
58
65
|
unless ENV['TEXINPUTS'].split(File::PATH_SEPARATOR)
|
59
66
|
.reject { |p| p.strip.empty? }
|
60
|
-
.any? { |p|
|
61
|
-
new_env['TEXINPUTS'] = "#{
|
67
|
+
.any? { |p| in_dir == File.absolute_path(File.expand_path(p)) }
|
68
|
+
new_env['TEXINPUTS'] = "#{in_dir}:#{ENV['TEXINPUTS']}"
|
62
69
|
end
|
63
70
|
end
|
64
|
-
|
71
|
+
# Call cmd with the environment augmented by possibly expanded TEXINPUTS
|
72
|
+
# environment variable.
|
73
|
+
unless system(new_env, cmd)
|
65
74
|
warn "Call to '#{cmd}' failed."
|
66
75
|
exit $CHILD_STATUS
|
67
76
|
end
|
77
|
+
# Run a second time unless its latexmk
|
78
|
+
unless cmd =~ /\A *latexmk/
|
79
|
+
unless system(new_env, cmd)
|
80
|
+
warn "Call to '#{cmd}' failed."
|
81
|
+
exit $CHILD_STATUS
|
82
|
+
end
|
83
|
+
end
|
68
84
|
$CHILD_STATUS
|
69
85
|
end
|
70
86
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
# the ruby load path if its not already in the load path. Return the name of
|
80
|
-
# the processed file.
|
81
|
-
def self.erb_to_tex(in_file, add_dir = nil)
|
82
|
-
if File.exist?(add_dir)
|
83
|
-
add_dir = File.absolute_path(File.expand_path(add_dir))
|
87
|
+
# Pre-process the input file with erubis, adding the in_dir to the front of
|
88
|
+
# the ruby load path if its not already in the load path so that requires in
|
89
|
+
# the input file can be found if they are in the in_dir. Return the name of
|
90
|
+
# the output file.
|
91
|
+
def self.erb_to_tex(in_file, in_dir = nil)
|
92
|
+
# Add input to ruby LOAD_PATH, $:,if its not already there.
|
93
|
+
if File.exist?(in_dir)
|
94
|
+
in_dir = File.absolute_path(File.expand_path(in_dir))
|
84
95
|
unless $LOAD_PATH
|
85
|
-
.any? { |p|
|
86
|
-
$LOAD_PATH.unshift(
|
96
|
+
.any? { |p| in_dir == File.absolute_path(File.expand_path(p)) }
|
97
|
+
$LOAD_PATH.unshift(in_dir)
|
87
98
|
end
|
88
99
|
end
|
89
100
|
|
101
|
+
# Read the input
|
90
102
|
in_contents = nil
|
91
103
|
File.open(in_file) do |f|
|
92
104
|
in_contents = f.read
|
@@ -95,7 +107,7 @@ module ErbTeX
|
|
95
107
|
|
96
108
|
pat = ENV['ERBTEX_PATTERN'] || '{: :}'
|
97
109
|
|
98
|
-
out_file = out_file_name(in_file)
|
110
|
+
out_file = ErbTeX.out_file_name(in_file)
|
99
111
|
File.open(out_file, 'w') do |f|
|
100
112
|
er = ::Erubis::Eruby.new(in_contents, pattern: pat)
|
101
113
|
f.write(er.result)
|
@@ -108,53 +120,4 @@ module ErbTeX
|
|
108
120
|
warn "Erubis pre-processing failed: #{e}"
|
109
121
|
exit 1
|
110
122
|
end
|
111
|
-
|
112
|
-
def self.out_file_name(in_file)
|
113
|
-
in_file_absolute = File.absolute_path(File.expand_path(in_file))
|
114
|
-
in_dir = File.dirname(in_file_absolute)
|
115
|
-
in_base = File.basename(in_file_absolute)
|
116
|
-
# Note that File.extname only gets the last extension. We want all
|
117
|
-
# extensions following the basename, but we don't count a dot at the
|
118
|
-
# beginning of a filename as introducing an extension. So, we cook our
|
119
|
-
# own solution here with Regexp's.
|
120
|
-
if in_base =~ /[^.](.[^.]+)+\z/
|
121
|
-
in_ext = $1
|
122
|
-
in_base = File.basename(in_base, in_ext)
|
123
|
-
else
|
124
|
-
in_ext = ''
|
125
|
-
end
|
126
|
-
|
127
|
-
out_ext = if in_ext.empty?
|
128
|
-
if File.exist?("#{in_file}.tex.erb")
|
129
|
-
'.tex'
|
130
|
-
elsif File.exist?("#{in_file}.tex")
|
131
|
-
'.etx'
|
132
|
-
elsif File.exist?("#{in_file}.erb")
|
133
|
-
'.tex'
|
134
|
-
else
|
135
|
-
'.tex'
|
136
|
-
end
|
137
|
-
else
|
138
|
-
case in_ext
|
139
|
-
when '.tex.erb'
|
140
|
-
'.tex'
|
141
|
-
when '.tex'
|
142
|
-
'.etx'
|
143
|
-
when '.erb'
|
144
|
-
'.tex'
|
145
|
-
else
|
146
|
-
'.tex'
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
# Find a writable directory, prefering the one the input file came
|
151
|
-
# from, or the current directory, and a temp file as a last resort.
|
152
|
-
if File.writable?(in_dir)
|
153
|
-
File.join(in_dir, "#{in_base}#{out_ext}")
|
154
|
-
elsif File.writable?('.')
|
155
|
-
File.join('.', "#{in_base}#{out_ext}")
|
156
|
-
else
|
157
|
-
Tempfile.new([in_base, out_ext]).path
|
158
|
-
end
|
159
|
-
end
|
160
123
|
end
|
data/lib/erbtex/version.rb
CHANGED
@@ -0,0 +1,23 @@
|
|
1
|
+
\documentclass{article}
|
2
|
+
\usepackage[mathbf]{euler}
|
3
|
+
\usepackage{longtable}
|
4
|
+
|
5
|
+
\begin{document}
|
6
|
+
\begin{longtable}[c]{r|r}
|
7
|
+
\hline\hline
|
8
|
+
\multicolumn{1}{c|}{\mathversion{bold}$x$}&
|
9
|
+
\multicolumn{1}{c}{\mathversion{bold}\rule{0pt}{12pt}$\sqrt{x}$}\\
|
10
|
+
\hline\hline
|
11
|
+
\endhead
|
12
|
+
\hline\hline
|
13
|
+
\endfoot
|
14
|
+
|
15
|
+
%% Here is the loop for the body of the table, which starts with
|
16
|
+
%% x one step beyond 0 and pre-computes some of the functions
|
17
|
+
{:0.upto(100).each do |x| :}
|
18
|
+
{:= "\\mathversion{bold}$%0.4f$" % x :}&
|
19
|
+
{:= "$%0.8f$" % Math.sqrt(x) :}\\
|
20
|
+
{:end:}
|
21
|
+
%% End the table and document---this version comes to 315 pages!
|
22
|
+
\end{longtable}
|
23
|
+
\end{document}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
\documentclass{article}
|
2
|
+
\usepackage[mathbf]{euler}
|
3
|
+
\usepackage{longtable}
|
4
|
+
|
5
|
+
\begin{document}
|
6
|
+
\begin{longtable}[c]{r|r}
|
7
|
+
\hline\hline
|
8
|
+
\multicolumn{1}{c|}{\mathversion{bold}$x$}&
|
9
|
+
\multicolumn{1}{c}{\mathversion{bold}\rule{0pt}{12pt}$\sqrt{x}$}\\
|
10
|
+
\hline\hline
|
11
|
+
\endhead
|
12
|
+
\hline\hline
|
13
|
+
\endfoot
|
14
|
+
|
15
|
+
%% Here is the loop for the body of the table, which starts with
|
16
|
+
%% x one step beyond 0 and pre-computes some of the functions
|
17
|
+
{:0.upto(100).each do |x| :}
|
18
|
+
{:= "\\mathversion{bold}$%0.4f$" % x :}&
|
19
|
+
{:= "$%0.8f$" % Math.sqrt(x) :}\\
|
20
|
+
{:end:}
|
21
|
+
%% End the table and document---this version comes to 315 pages!
|
22
|
+
\end{longtable}
|
23
|
+
\end{document}
|
@@ -18,6 +18,16 @@ module ErbTeX
|
|
18
18
|
-recorder -shell-escape -src-specials cr,display,hbox,math,par
|
19
19
|
-translate-file willy -version &myformat file_name.tex.erb
|
20
20
|
)
|
21
|
+
@argv_with_remote_file =
|
22
|
+
%w(
|
23
|
+
-draftmode -enc -etex -file-line-error -fmt junk
|
24
|
+
-halt-on-error -ini -interaction batchmode -ipc -ipc-start
|
25
|
+
-jobname junk -kpathsea-debug 8 -mktex tex --invoke=pdflatex
|
26
|
+
-mltex -nomktex tfm -ouptput-comment This\ is\ a\ long\ comment
|
27
|
+
-output-directory ~/texmf/tex -parse-first-line -progname pdflatex
|
28
|
+
-recorder -shell-escape -src-specials cr,display,hbox,math,par
|
29
|
+
-translate-file willy -version &myformat example_files/file_name.tex.erb
|
30
|
+
)
|
21
31
|
@argv_with_invoke_and_file =
|
22
32
|
%w(
|
23
33
|
--invoke=lualatex
|
@@ -69,6 +79,22 @@ module ErbTeX
|
|
69
79
|
EOS
|
70
80
|
end
|
71
81
|
|
82
|
+
it 'parse command line with remote file name' do
|
83
|
+
cl = CommandLine.new(@argv_with_remote_file)
|
84
|
+
expect(cl.erbtex_name).to eq('erbtex')
|
85
|
+
expect(cl.tex_program).to eq('pdflatex')
|
86
|
+
expect(cl.input_file).to eq('example_files/file_name.tex.erb')
|
87
|
+
expect(cl.tex_command).to eq(<<~'EOS'.tr("\n", ' ').strip)
|
88
|
+
pdflatex -draftmode -enc -etex -file-line-error -fmt junk -halt-on-error
|
89
|
+
-ini -interaction batchmode -ipc -ipc-start -jobname junk -kpathsea-debug 8
|
90
|
+
-mktex tex -mltex -nomktex tfm
|
91
|
+
-ouptput-comment This\ is\ a\ long\ comment
|
92
|
+
-output-directory \~/texmf/tex -parse-first-line -progname pdflatex
|
93
|
+
-recorder -shell-escape -src-specials cr,display,hbox,math,par
|
94
|
+
-translate-file willy -version \&myformat example_files/file_name.tex.erb
|
95
|
+
EOS
|
96
|
+
end
|
97
|
+
|
72
98
|
it 'parse command line with invoke and file name' do
|
73
99
|
cl = CommandLine.new(@argv_with_invoke_and_file)
|
74
100
|
expect(cl.erbtex_name).to eq('erbtex')
|
@@ -120,54 +146,5 @@ module ErbTeX
|
|
120
146
|
EOS
|
121
147
|
end
|
122
148
|
end
|
123
|
-
|
124
|
-
describe 'expand input file' do
|
125
|
-
before :all do
|
126
|
-
unless Dir.exist?('tmp')
|
127
|
-
FileUtils.mkdir_p('tmp')
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
before :each do
|
132
|
-
FileUtils.rm_f Dir.glob('tmp/*')
|
133
|
-
end
|
134
|
-
|
135
|
-
after :all do
|
136
|
-
FileUtils.rm_rf('tmp')
|
137
|
-
end
|
138
|
-
|
139
|
-
it 'expand file name with no extension and .tex existing' do
|
140
|
-
FileUtils.touch('tmp/junk.tex')
|
141
|
-
expect(CommandLine.expand_input_file('tmp/junk')).to eq('tmp/junk.tex')
|
142
|
-
end
|
143
|
-
|
144
|
-
it 'expand file name with no extension and .tex.erb existing' do
|
145
|
-
FileUtils.touch('tmp/junk.tex.erb')
|
146
|
-
expect(CommandLine.expand_input_file('tmp/junk'))
|
147
|
-
.to eq('tmp/junk.tex.erb')
|
148
|
-
end
|
149
|
-
|
150
|
-
it 'expand file name with no extension and .erb existing' do
|
151
|
-
FileUtils.touch('tmp/junk.erb')
|
152
|
-
expect(CommandLine.expand_input_file('tmp/junk'))
|
153
|
-
.to eq('tmp/junk.erb')
|
154
|
-
end
|
155
|
-
|
156
|
-
it 'expand file name with .tex extension and existing' do
|
157
|
-
FileUtils.touch('tmp/junk.tex')
|
158
|
-
expect(CommandLine.expand_input_file('tmp/junk'))
|
159
|
-
.to eq('tmp/junk.tex')
|
160
|
-
end
|
161
|
-
|
162
|
-
it 'expand file name with .tex extension and not existing' do
|
163
|
-
expect(CommandLine.expand_input_file('tmp/junk.tex'))
|
164
|
-
.to eq('tmp/junk.tex')
|
165
|
-
end
|
166
|
-
|
167
|
-
it 'expand file name with funny extension and not existing' do
|
168
|
-
expect(CommandLine.expand_input_file('tmp/junk.arb'))
|
169
|
-
.to eq('tmp/junk.arb')
|
170
|
-
end
|
171
|
-
end
|
172
149
|
end
|
173
150
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module ErbTeX
|
4
|
+
describe 'expand input file' do
|
5
|
+
before :all do
|
6
|
+
unless Dir.exist?('tmp')
|
7
|
+
FileUtils.mkdir_p('tmp')
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
before :each do
|
12
|
+
FileUtils.rm_f Dir.glob('tmp/*')
|
13
|
+
end
|
14
|
+
|
15
|
+
after :all do
|
16
|
+
FileUtils.rm_rf('tmp')
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'expand file name with no extension and .tex existing' do
|
20
|
+
FileUtils.touch('tmp/junk.tex')
|
21
|
+
expect(ErbTeX.expand_input_file('tmp/junk')).to eq('tmp/junk.tex')
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'expand file name with no extension and .tex.erb existing' do
|
25
|
+
FileUtils.touch('tmp/junk.tex.erb')
|
26
|
+
expect(ErbTeX.expand_input_file('tmp/junk'))
|
27
|
+
.to eq('tmp/junk.tex.erb')
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'expand file name with no extension and .erb existing' do
|
31
|
+
FileUtils.touch('tmp/junk.erb')
|
32
|
+
expect(ErbTeX.expand_input_file('tmp/junk'))
|
33
|
+
.to eq('tmp/junk.erb')
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'expand file name with no extension and .tex existing' do
|
37
|
+
FileUtils.touch('tmp/junk.tex')
|
38
|
+
expect(ErbTeX.expand_input_file('tmp/junk'))
|
39
|
+
.to eq('tmp/junk.tex')
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'expand file name with .tex extension and .tex existing' do
|
43
|
+
FileUtils.touch('tmp/junk.tex')
|
44
|
+
expect(ErbTeX.expand_input_file('tmp/junk.tex'))
|
45
|
+
.to eq('tmp/junk.tex')
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'expand file name with .tex extension and not existing' do
|
49
|
+
FileUtils.rm_rf('tmp/junk.tex') if File.exist?('tmp/junk.tex')
|
50
|
+
expect(ErbTeX.expand_input_file('tmp/junk.tex'))
|
51
|
+
.to eq('tmp/junk.tex')
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'expand file name with funny extension and not existing' do
|
55
|
+
expect(ErbTeX.expand_input_file('tmp/junk.arb'))
|
56
|
+
.to eq('tmp/junk.arb')
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: erbtex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel E. Doherty
|
@@ -137,11 +137,11 @@ dependencies:
|
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
139
|
description: |-
|
140
|
-
|
141
|
-
|
142
|
-
|
140
|
+
erbtex will act just like pdflatex except that it will
|
141
|
+
process ruby fragments between {: and :} markers,
|
142
|
+
greatly expanding the ability to generate
|
143
143
|
automated TeX and LaTeX documents.
|
144
|
-
email: ded
|
144
|
+
email: ded@ddoherty.net
|
145
145
|
executables:
|
146
146
|
- erbtex
|
147
147
|
extensions: []
|
@@ -165,11 +165,15 @@ files:
|
|
165
165
|
- examples/testbind.tex
|
166
166
|
- lib/erbtex.rb
|
167
167
|
- lib/erbtex/command_line.rb
|
168
|
+
- lib/erbtex/file_names.rb
|
168
169
|
- lib/erbtex/runner.rb
|
169
170
|
- lib/erbtex/version.rb
|
171
|
+
- spec/example_files/roots.tex
|
172
|
+
- spec/example_files/roots.tex.erb
|
170
173
|
- spec/lib/command_line_spec.rb
|
174
|
+
- spec/lib/file_names_spec.rb
|
171
175
|
- spec/spec_helper.rb
|
172
|
-
homepage:
|
176
|
+
homepage: https://github.com/ddoherty03/erbtex
|
173
177
|
licenses: []
|
174
178
|
metadata: {}
|
175
179
|
post_install_message:
|