erbtex 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6aa6baa55cd84b872ced3ccdd4a2935e5805ae29
4
- data.tar.gz: d5c069096815028c9eb786d1cd3920ad5fbe6116
3
+ metadata.gz: ba2d024e5db40939058098d4ee6cc9c3efa58c19
4
+ data.tar.gz: da8fc247a17a3e51ae2e8fa75a2f75eded1ace51
5
5
  SHA512:
6
- metadata.gz: eab55ecc60a34f11a6bdcd93d70ae8daf6a1c75443534e1913a7ac7495f45a80bed2291dacc8f4129ceef40349c9c7b6291f35d33ed9c8dd77d6ef942f81ca00
7
- data.tar.gz: 65c04c3b86a0a694e2e064716844908271b7ad569a0a067d4bfc9c853da367d1d81a20edc58ee273b7ee0fd438eec5563401c8288c249df244074a646edc1311
6
+ metadata.gz: 2bd38f093f3703bf0c1c55b3a649044d776aa68b7ef6243ebcea344e4eaa4cdab0b2b872ac62bf94f910028c92019ede620467084d54c43fedfe43d824c45c7f
7
+ data.tar.gz: e44d3414536cb37057be45e48d28f7c7a599f8732ed8a5ee1db803e5e7e35ae08805b1b6f73e675c650edc5d2c962b485826e163111aed8d774dc695f27da4c7
data/.bundle/config ADDED
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_BIN: .bundle/bin
data/.gitignore CHANGED
@@ -4,6 +4,9 @@
4
4
  *.out
5
5
  *.pdf
6
6
  *.gem
7
+ *.synctex.gz
7
8
  etc
8
9
  auto
9
- /.bundle/config
10
+ /.bundle/bin
11
+ *.fdb_latexmk
12
+ *.fls
data/Gemfile.lock CHANGED
@@ -1,25 +1,61 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- erbtex (0.2.0)
4
+ erbtex (0.3.0)
5
5
  erubis
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- byebug (3.1.2)
10
+ byebug (3.5.1)
11
11
  columnize (~> 0.8)
12
12
  debugger-linecache (~> 1.2)
13
- columnize (0.8.9)
13
+ slop (~> 3.6)
14
+ coderay (1.1.2)
15
+ columnize (0.9.0)
14
16
  debugger-linecache (1.2.0)
17
+ diff-lcs (1.2.5)
15
18
  erubis (2.7.0)
19
+ method_source (0.9.0)
20
+ minitest (5.5.0)
21
+ pry (0.11.3)
22
+ coderay (~> 1.1.0)
23
+ method_source (~> 0.9.0)
24
+ pry-byebug (3.0.1)
25
+ byebug (~> 3.4)
26
+ pry (~> 0.10)
27
+ pry-doc (0.11.1)
28
+ pry (~> 0.9)
29
+ yard (~> 0.9)
16
30
  rake (10.3.2)
31
+ rspec (3.3.0)
32
+ rspec-core (~> 3.3.0)
33
+ rspec-expectations (~> 3.3.0)
34
+ rspec-mocks (~> 3.3.0)
35
+ rspec-core (3.3.1)
36
+ rspec-support (~> 3.3.0)
37
+ rspec-expectations (3.3.0)
38
+ diff-lcs (>= 1.2.0, < 2.0)
39
+ rspec-support (~> 3.3.0)
40
+ rspec-mocks (3.3.1)
41
+ diff-lcs (>= 1.2.0, < 2.0)
42
+ rspec-support (~> 3.3.0)
43
+ rspec-support (3.3.0)
44
+ slop (3.6.0)
45
+ yard (0.9.12)
17
46
 
18
47
  PLATFORMS
19
48
  ruby
20
49
 
21
50
  DEPENDENCIES
22
51
  bundler
23
- byebug
24
52
  erbtex!
53
+ minitest
54
+ pry
55
+ pry-byebug
56
+ pry-doc
25
57
  rake
58
+ rspec
59
+
60
+ BUNDLED WITH
61
+ 1.16.0
data/README.org ADDED
@@ -0,0 +1,137 @@
1
+ * ErbTeX: Ruby pre-processing for TeX and LaTeX Documents
2
+
3
+ ** Description
4
+
5
+ ~erbtex~ is a ruby gem that provides a command line program that pre-processes
6
+ TeX and LaTeX source files with ruby's erubis and then passes the resulting file
7
+ along to a real TeX program.
8
+
9
+ ** Installation
10
+
11
+ Install ~erbtex~ with:
12
+
13
+ #+BEGIN_SRC sh
14
+ gem install erbtex
15
+ #+END_SRC
16
+
17
+ ** Usage
18
+
19
+ After the gem is installed, ~erbtex~ is placed in your PATH. ~erbtex~ recognizes
20
+ only one command-line option, --invoke=<tex_program>, which specifies what TeX
21
+ variant will process the TeX file after erubis has pre-proceesed the input file.
22
+ By default, ~erubis~ uses ~pdflatex~ if no --invoke option is given.
23
+
24
+ ~Erbtex~ will then read the input file and execute any ruby code between the
25
+ special delimiters `{:` and `:}` instead of the erubis default of `<% %>`. The
26
+ brace-colon form of delimiters is less disruptive of syntax highlighting than
27
+ the default delimiters, which get confused with TeX and LaTeX comments. Any text
28
+ not between the delimiters is passed through untouched to the TeX program.
29
+
30
+ If the opening delimiter has an ~=~ appended to it, the delimited ruby
31
+ expression is converted into a string (with ruby's ~.to_s~ method) and inserted
32
+ in-place into the TeX manuscript at that point. For example, the text ~{:=
33
+ "Hello, world".reverse :}~ places the string ~'dlrow ,olleH'~ at that point in
34
+ the TeX file.
35
+
36
+ Without the `=` the ruby code is simply executed. You can use these, for
37
+ example, to ~require~ ruby libraries or to embed loops into the file.
38
+
39
+ Loops started in one ruby fragment can be continued or terminated in a later
40
+ fragment, and variables defined in one fragment in one fragment are visible in
41
+ later fragments according to Ruby's usual scoping rules. The result is that you
42
+ can use the ruby programming language to greatly increase the computational
43
+ capabilities of a normal TeX or LaTeX.
44
+
45
+ The resulting output is then processed as a normal TeX file.
46
+
47
+ ** Example
48
+
49
+ For example, the following LaTeX file will produce a table of square
50
+ roots when run through erbtex. It uses a ruby iterator to supply the
51
+ rows of the table, a feat that would tedious at best with bare TeX or
52
+ LaTeX.
53
+
54
+ #+BEGIN_SRC latex
55
+ \documentclass{article}
56
+ \usepackage[mathbf]{euler}
57
+ \usepackage{longtable}
58
+
59
+ \begin{document}
60
+ \begin{longtable}[c]{r|r}
61
+ \hline\hline
62
+ \multicolumn{1}{c|}{\mathversion{bold}$x$}&
63
+ \multicolumn{1}{c}{\mathversion{bold}\rule{0pt}{12pt}$\sqrt{x}$}\\
64
+ \hline\hline
65
+ \endhead
66
+ \hline\hline
67
+ \endfoot
68
+ % The following line starts a ruby enumerator loop but does not
69
+ % produce any output, since the delimiters are {: :}.
70
+ {: 0.upto(100).each do |x| :}
71
+ % But the following two lines produce output since the opening delimiter is
72
+ % '{:='. Both call the sprintf method in ruby via the percent operator, and the
73
+ % second line calls ruby's Math module to compute the square root. Notice that
74
+ % the '%' inside the delimiters does not have the effect of commenting out
75
+ % the following text. It is interpreted as a ruby '%' operator.
76
+
77
+ {:= "\\mathversion{bold}$%0.4f$" % x :}&
78
+ {:= "$%0.8f$" % Math.sqrt(x) :}\\
79
+ {: end :}
80
+ \end{longtable}
81
+ \end{document}
82
+ #+END_SRC
83
+
84
+ With the above in file `roots.tex`, running `$ erbtex roots.tex` at the command
85
+ line will generate a `PDF` file with a nicely typeset table of square roots.
86
+
87
+ As a by-product, the pre-processed file ~roots.etx~ is left in the same
88
+ directory, so you can see what the effect of the erbtex fragments were. This is
89
+ often very handy when you are trying to debug the document; otherwise, feel free
90
+ to delete it. Here, for example is a portion of the `roots.etx` file generated
91
+ by the foregoing:
92
+
93
+ #+BEGIN_SRC latex
94
+ \begin{document}
95
+ \begin{longtable}[c]{r|r}
96
+ \hline\hline
97
+ \multicolumn{1}{c|}{\mathversion{bold}$x$}&
98
+ \multicolumn{1}{c}{\mathversion{bold}\rule{0pt}{12pt}$\sqrt{x}$}\\
99
+ \hline\hline
100
+ \endhead
101
+ \hline\hline
102
+ \endfoot
103
+ \mathversion{bold}$0.0000$&
104
+ $0.00000000$\\
105
+ \mathversion{bold}$1.0000$&
106
+ $1.00000000$\\
107
+ \mathversion{bold}$2.0000$&
108
+ $1.41421356$\\
109
+ \mathversion{bold}$3.0000$&
110
+ $1.73205081$\\
111
+ \mathversion{bold}$4.0000$&
112
+ $2.00000000$\\
113
+ \mathversion{bold}$5.0000$&
114
+ $2.23606798$\\
115
+ \mathversion{bold}$6.0000$&
116
+ $2.44948974$\\
117
+ \mathversion{bold}$7.0000$&
118
+ $2.64575131$\\
119
+ \mathversion{bold}$8.0000$&
120
+ $2.82842712$\\
121
+ \mathversion{bold}$9.0000$&
122
+ $3.00000000$\\
123
+ \mathversion{bold}$10.0000$&
124
+ $3.16227766$\\
125
+ \mathversion{bold}$11.0000$&
126
+ $3.31662479$\\
127
+ \mathversion{bold}$12.0000$&
128
+ $3.46410162$\\
129
+ \mathversion{bold}$13.0000$&
130
+ $3.60555128$\\
131
+ \mathversion{bold}$14.0000$&
132
+ #+END_SRC
133
+
134
+ And many more lines like it.
135
+
136
+ The examples directory installed with the erbtex gem has a few more
137
+ examples.
data/Rakefile CHANGED
@@ -1,15 +1,12 @@
1
- require 'rake/testtask'
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+ require 'rdoc/task'
2
4
 
3
- require 'bundler'
4
- Bundler::GemHelper.install_tasks
5
-
6
- task :default => :test
7
- desc "Run all the unit tests"
8
- task :test do
9
- Dir.foreach('test') do |t|
10
- next if t == 'test_helper.rb'
11
- next if t =~ /^\.\.?/
12
- cmd = "ruby -I 'test' -C 'test' #{t}"
13
- system cmd
14
- end
5
+ RDoc::Task.new do |rdoc|
6
+ rdoc.main = 'README.rdoc'
7
+ rdoc.rdoc_files.include('README.rdoc', 'lib')
15
8
  end
9
+
10
+ RSpec::Core::RakeTask.new(:spec)
11
+
12
+ task default: :spec
data/bin/erbtex CHANGED
@@ -1,49 +1,8 @@
1
1
  #! /usr/bin/env ruby
2
2
 
3
- verbose = true
4
-
5
- # This adds our lib subdirectory to the ruby load path
6
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
7
-
8
- # This adds our RUBYLIB env to ruby load path
9
- if ENV['RUBYLIB']
10
- STDERR.puts "ENV['RUBYLIB']:" if verbose
11
- ENV['RUBYLIB'].split(':').each do |p|
12
- $LOAD_PATH.unshift p
13
- STDERR.puts "\t#{p}" if verbose
14
- end
15
- else
16
- STDERR.puts "ENV['RUBYLIB'] is EMPTY" if verbose
17
- end
18
-
19
3
  require 'erbtex'
20
4
 
21
- progname = File.basename($0)
22
- commandline = progname
23
- ARGV.each do |a|
24
- if a =~ /\s/
25
- a = "'" + a + "'"
26
- end
27
- commandline += " #{a}"
5
+ module ErbTeX
6
+ cl = CommandLine.new(ARGV)
7
+ exit ErbTeX.run(cl).exitstatus
28
8
  end
29
-
30
- if verbose
31
- STDERR.puts "Program name: #{progname}"
32
- STDERR.puts "Command line: #{commandline}"
33
- STDERR.puts "Ruby Load path:"
34
- $:.each do |p|
35
- STDERR.puts "\t#{p}"
36
- end
37
- STDERR.puts 'ARGV:'
38
- ARGV.each do |a|
39
- STDERR.puts "\t#{a}"
40
- end
41
- STDERR.puts 'PATH:'
42
- ENV['PATH'].split(':').each do |p|
43
- STDERR.puts "\t#{p}"
44
- end
45
- STDERR.puts "Executable: "
46
- STDERR.puts ErbTeX.find_executable($0)
47
- end
48
-
49
- ErbTeX.run(commandline)
data/erbtex.gemspec CHANGED
@@ -7,8 +7,8 @@ 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 = ""
11
- gem.authors = ["Daniel E. Doherty"]
10
+ gem.homepage = ''
11
+ gem.authors = ['Daniel E. Doherty']
12
12
  gem.email = %q{ded-erbtex@ddoherty.net}
13
13
  gem.summary = %q{Preprocesses TeX and LaTeX files with erubis for ruby.}
14
14
  gem.description = %q{Create a local link called pdflatex to erbtex and it will
@@ -17,13 +17,17 @@ Gem::Specification.new do |gem|
17
17
  automated TeX and LaTeX documents.}
18
18
 
19
19
  gem.files = `git ls-files`.split("\n")
20
- gem.files.delete_if {|f| f =~ /(log|etc|aux|etx|pdf|gem)$/}
20
+ gem.files.delete_if { |f| f =~ /\.(log|etc|aux|etx|pdf|gem|tmp)$/ }
21
21
  gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
22
22
  gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
- gem.require_paths = ["lib"]
23
+ gem.require_paths = ['lib']
24
24
 
25
- gem.add_dependency "erubis"
25
+ gem.add_dependency 'erubis'
26
26
  gem.add_development_dependency 'rake'
27
- gem.add_development_dependency "bundler"
28
- gem.add_development_dependency "byebug"
27
+ gem.add_development_dependency 'bundler'
28
+ gem.add_development_dependency 'rspec'
29
+ gem.add_development_dependency 'minitest'
30
+ gem.add_development_dependency 'pry'
31
+ gem.add_development_dependency 'pry-doc'
32
+ gem.add_development_dependency 'pry-byebug'
29
33
  end
@@ -10,9 +10,9 @@
10
10
  \usepackage{fancyhdr}
11
11
  \pagestyle{fancy}
12
12
  \renewcommand{\headrulewidth}{0pt}
13
- \rhead{\large\mathversion{bold}$\firstmark$}
14
- \rfoot{\large\mathversion{bold}$\botmark$}
15
- \lhead{}
13
+ \setlength{\headheight}{14.0pt}
14
+ \lhead{\large\mathversion{bold}$\firstmark$}
15
+ \rhead{\large\mathversion{bold}$\botmark$}
16
16
 
17
17
  \begin{document}
18
18
 
@@ -9,10 +9,10 @@
9
9
  %% flipping pages.
10
10
  \usepackage{fancyhdr}
11
11
  \pagestyle{fancy}
12
+ \setlength{\headheight}{14.0pt}
12
13
  \renewcommand{\headrulewidth}{0pt}
13
- \rhead{\large\mathversion{bold}\firstmark}
14
- \rfoot{\large\mathversion{bold}\botmark}
15
- \lhead{}
14
+ \lhead{\large\mathversion{bold}\firstmark}
15
+ \rhead{\large\mathversion{bold}\botmark}
16
16
 
17
17
  \begin{document}
18
18
 
@@ -30,6 +30,8 @@
30
30
  end
31
31
  :}
32
32
 
33
+ \def\tstrut{\rule[-1pt]{0pt}{11pt}}
34
+
33
35
  %% Set up the longtable environment by specifying the header for
34
36
  %% each page and the footer.
35
37
  \begin{longtable}[c]{c|llllll}
@@ -63,7 +65,7 @@
63
65
 
64
66
  %% Treat the first line of the table, for an x value of 0 specially
65
67
  %% by giving exact answers in symbolic form.
66
- {:= "\\multicolumn{1}{c|}{{\\mathversion{bold}\\mark{%s}$0$}}" % d0.to_tex :}&
68
+ {:= "\\multicolumn{1}{c|}{\\tstrut{\\mathversion{bold}\\mark{%s}$0$}}" % d0.to_tex :}&
67
69
  {:= "\\multicolumn{1}{c}{{$0$}}" :}&
68
70
  {:= "\\multicolumn{1}{c}{{$1$}}" :}&
69
71
  {:= "\\multicolumn{1}{c}{{$0$}}" :}&
@@ -84,7 +86,7 @@
84
86
  {:
85
87
  ## Here is where each line of the main body of the table is set.
86
88
  ## We use the digs function defined above to make sure that every
87
- ## column as the same number of significant digits for the functions
89
+ ## column has the same number of significant digits for the functions
88
90
  ## that tend toward infinity.
89
91
  ##
90
92
  ## NB: I could write this comment as a LaTeX comment outside a code
@@ -94,7 +96,7 @@
94
96
  ## around 2MB.
95
97
  -:}
96
98
  \mark{{:= x.to_tex :}}
97
- {:= "\\mathversion{bold}#{x.to_tex}" :}&
99
+ \tstrut{:= "\\mathversion{bold}#{x.to_tex}" :}&
98
100
  {:= "$%0.8f$" % x.sin :}&
99
101
  {:= "$%0.8f$" % x.cos :}&
100
102
  {:= "$%0.*f$" % [ digs(tanx), tanx ] :}&
@@ -127,3 +129,5 @@
127
129
  %% End the table and document---this version comes to 649 pages!
128
130
  \end{longtable}
129
131
  \end{document}
132
+
133
+ % Take /that/ Charles Babbage!
File without changes
File without changes
@@ -4,136 +4,106 @@ module ErbTeX
4
4
  class NoInputFile < StandardError; end
5
5
 
6
6
  class CommandLine
7
- attr_reader :command_line, :marked_command_line, :input_file
8
- attr_reader :progname, :input_path, :output_dir, :run_dir
9
-
10
- def initialize(command_line)
11
- @command_line = command_line
12
- @input_file = @marked_command_line = nil
13
- @run_dir = Dir.pwd
14
- find_output_dir
15
- find_progname
16
- find_input_file
17
- find_input_path
18
- mark_command_line
19
- end
7
+ attr_reader :erbtex_name, :tex_program, :tex_options
8
+ attr_reader :tex_commands, :input_file
20
9
 
21
- def find_progname
22
- @progname = @command_line.split(' ')[0]
23
- end
10
+ def initialize(argv)
11
+ # Note: argv will be the command line arguments after processing by the
12
+ # shell, so if we see things such as '&', '~', '\' in the args, these were
13
+ # quoted by the user on the command-line and need no special treatment
14
+ # here. For example, '~/junk' on the commandline will show up here as
15
+ # '/home/ded/junk'. If we see '~/junk', that means the user has quoted the
16
+ # ~ on the command line with something like '\~junk', so we should assume
17
+ # that the user wants to keep it that way. Likewise, an arg with spaces in
18
+ # it will have been quoted by the user to be seen as a single argument.
19
+ # When we output these for use by the shell in the system command, we
20
+ # should apply shellquote to everything so that the receiving shell sees
21
+ # the args in the same way.
24
22
 
25
- def find_output_dir
26
- args = @command_line.split(' ')
27
- # There is an -output-comment option, so -output-d is the shortest
28
- # unambiguous way to write the -output-directory option. It can use
29
- # one or two dashes at the beginning, and the argument can be
30
- # seaparated from it with an '=' or white space.
31
- have_out_dir = false
32
- out_dir = nil
33
- args.each do |a|
34
- if have_out_dir
35
- # Found -output-directory on last pass without an equals sign
36
- out_dir = a
37
- end
38
- if a =~ /^--?output-d(irectory)?=(\S+)/
39
- out_dir = $2
40
- elsif a =~ /^--?output-d(irectory)?$/
41
- # Next arg is the out_dir
42
- have_out_dir = true
43
- end
44
- end
45
- if out_dir.nil?
46
- if File.writable?(Dir.pwd)
47
- @output_dir = Dir.pwd
48
- else
49
- @output_dir = File.expand_path(ENV['TEXMFOUTPUT'])
50
- end
51
- else
52
- @output_dir = File.expand_path(out_dir)
23
+ @erbtex_name = File.basename($0)
24
+
25
+ # Find the tex_commands
26
+ @tex_commands = []
27
+ if argv.any? { |a| a =~ /\A\\/ }
28
+ # All args after first starting with '\' should be interpreted as TeX
29
+ # commands, even if they don't start with '\'
30
+ @tex_commands = argv.drop_while { |a| a !~ /\A\\/ }
31
+ first_tex_command_k = argv.size - @tex_commands.size
32
+ argv = argv[0..first_tex_command_k - 1]
53
33
  end
54
- end
55
34
 
56
- def find_input_file
57
- # Remove the initial command from the command line
58
- cmd = @command_line.split(/\s+/)[1..-1].join(' ')
59
- cmd = cmd.gsub(/\s+--?[-a-zA-Z]+(=\S+)?/, ' ')
60
- infile_re = %r{(\\input\s+)?(([-.~_/A-Za-z0-9]+)(\.[a-z]+)?)\s*$}
61
- if cmd =~ infile_re
62
- @input_file = "#{$2}"
63
- if @input_file =~ /\.tex(\.erb)?$/
64
- @input_file = @input_file
65
- else
66
- @input_file += ".tex"
67
- end
68
- elsif cmd =~ %r{(\\input\s+)?(["'])((?:\\?.)*?)\2} #"
69
- # The re above captures single- or double-quoted strings with
70
- # the insides in $3
71
- @input_file = "#{$3}"
72
- if @input_file !~ /\.tex$/
73
- @input_file += ".tex#{$1}"
74
- end
75
- else
76
- @input_file = nil
35
+ # Look for our --invoke=tex_command option
36
+ @tex_program = 'pdflatex'
37
+ if argv.any? { |a| a =~ /\A--invoke=(\w+)/ }
38
+ @tex_program = $1
39
+ argv.reject! { |a| a =~ /\A--invoke=(\w+)/ }
77
40
  end
78
- end
79
41
 
80
- def find_input_path
81
- # If input_file is absolute, don't look further
82
- if @input_file =~ /^\//
83
- @input_path = @input_file
84
- elsif @input_file.nil?
85
- @input_path = nil
86
- else
87
- # The following cribbed from kpathsea.rb
88
- @progname.untaint
89
- @input_file.untaint
90
- kpsewhich = "kpsewhich -progname=\"#{@progname}\" -format=\"tex\" \"#{@input_file}\""
91
- lines = ""
92
- IO.popen(kpsewhich) do |io|
93
- lines = io.readlines
94
- end
95
- if $? == 0
96
- @input_path = lines[0].chomp.untaint
97
- else
98
- raise NoInputFile, "Can't find #{@input_file} in TeX search path; try kpsewhich -format=tex #{@input_file}."
99
- end
42
+ # The last argument, assuming it does not start with a '-' or '&', is
43
+ # assumed to be the name of the input_file.
44
+ if !argv.empty? && argv[-1] !~ /\A[-&]/
45
+ @input_file = CommandLine.expand_input_file(argv.pop)
100
46
  end
47
+
48
+ # What remains in argv should be the tex program's '-options', which
49
+ # should be passed through untouched. So, can form the full command line
50
+ # for tex_processing
51
+ @tex_options = argv.dup
101
52
  end
102
53
 
103
- def new_command_line(new_progname, new_infile)
104
- ncl = @marked_command_line.sub('^p^', new_progname)
105
- # Quote the new_infile in case it has spaces
106
- if new_infile
107
- ncl = ncl.sub('^f^', "'#{new_infile}'")
108
- end
109
- ncl
54
+ def tex_command(tex_file = input_file)
55
+ "#{tex_program} " \
56
+ "#{tex_options.shelljoin} " \
57
+ "#{tex_commands.shelljoin} " \
58
+ "#{tex_file}"
59
+ .strip.squeeze(' ')
110
60
  end
111
61
 
112
- def mark_command_line
113
- # Replace input file with '^f^'
114
- infile_re = %r{(\\input\s+)?(([-.~_/A-Za-z0-9]+)(\.[a-z]+)?)\s*$}
115
- quoted_infile_re = %r{(\\input\s+)?(["'])((?:\\?.)*?)\2} #"
116
- if @input_file.nil?
117
- @marked_command_line = @command_line
118
- elsif @command_line =~ infile_re
119
- @marked_command_line = @command_line.sub(infile_re, "#{$1}^f^")
120
- elsif @command_line =~ quoted_infile_re
121
- @marked_command_line = @command_line.sub(quoted_infile_re, "#{$1}^f^")
62
+ # Return the name of the input file based on the name given in the command
63
+ # line. Try to find the right extension for the input file if none is given.
64
+ def self.expand_input_file(input_file)
65
+ full_ext = input_file[/\A(.*)(\.[\w.]+)\z/, 2]
66
+ if full_ext.nil? || full_ext.empty?
67
+ if File.exist?("#{input_file}.tex.erb")
68
+ "#{input_file}.tex.erb"
69
+ elsif File.exist?("#{input_file}.tex")
70
+ "#{input_file}.tex"
71
+ elsif File.exist?("#{input_file}.erb")
72
+ "#{input_file}.erb"
73
+ else
74
+ input_file
75
+ end
122
76
  else
123
- @marked_command_line = @command_line
77
+ input_file
124
78
  end
125
- # Replace progname with '^p^'
126
- @marked_command_line = @marked_command_line.lstrip
127
- @marked_command_line = @marked_command_line.sub(/\S+/, '^p^')
128
79
  end
129
80
  end
130
81
  end
131
82
 
132
83
  # NOTES:
133
-
134
84
  # The following text is from the Web2C documentation at
135
85
  # http://tug.org/texinfohtml/web2c.html#Output-file-location
136
86
  #
87
+ # 4.1 TeX invocation
88
+ #
89
+ # TeX, Metafont, and MetaPost process the command line (described here)
90
+ # and determine their memory dump (fmt) file in the same way (*note Memory
91
+ # dumps::). Synopses:
92
+ #
93
+ # tex [OPTION]... [TEXNAME[.tex]] [TEX-COMMANDS]
94
+ # tex [OPTION]... \FIRST-LINE
95
+ # tex [OPTION]... &FMT ARGS
96
+ #
97
+ # TeX searches the usual places for the main input file TEXNAME (*note
98
+ # (kpathsea)Supported file formats::), extending TEXNAME with '.tex' if
99
+ # necessary. To see all the relevant paths, set the environment variable
100
+ # 'KPATHSEA_DEBUG' to '-1' before running the program.
101
+ #
102
+ # After TEXNAME is read, TeX processes any remaining TEX-COMMANDS on
103
+ # the command line as regular TeX input. Also, if the first non-option
104
+ # argument begins with a TeX escape character (usually '\'), TeX processes
105
+ # all non-option command-line arguments as a line of regular TeX input.
106
+
137
107
  # 3.4 Output file location
138
108
  #
139
109
  # All the programs generally follow the usual convention for output