texlab 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,16 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "rake4latex"
4
+ gem "plusminus"
5
+ gem "easystats"
6
+ gem "to_latex"
7
+ gem "gnuplot"
8
+ gem "latex"
9
+
10
+ group :development do
11
+ gem "rspec", "~> 2.8.0"
12
+ gem "rdoc", "~> 3.12"
13
+ gem "bundler", "~> 1.0.0"
14
+ gem "jeweler", "~> 1.8.3"
15
+ gem "rcov", ">= 0"
16
+ end
@@ -0,0 +1,54 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ diff-lcs (1.1.3)
5
+ easystats (0.1.0)
6
+ flt (1.3.0)
7
+ git (1.2.5)
8
+ gnuplot (2.4.1)
9
+ jeweler (1.8.3)
10
+ bundler (~> 1.0)
11
+ git (>= 1.2.5)
12
+ rake
13
+ rdoc
14
+ json (1.6.5)
15
+ knut_tools (0.1.0)
16
+ latex (0.1.3)
17
+ log4r (1.1.10)
18
+ nio (0.2.5)
19
+ flt (>= 1.0.0)
20
+ plusminus (0.1.0)
21
+ nio
22
+ rake (0.9.2.2)
23
+ rake4latex (0.1.3)
24
+ knut_tools
25
+ log4r
26
+ rake
27
+ rcov (1.0.0)
28
+ rdoc (3.12)
29
+ json (~> 1.4)
30
+ rspec (2.8.0)
31
+ rspec-core (~> 2.8.0)
32
+ rspec-expectations (~> 2.8.0)
33
+ rspec-mocks (~> 2.8.0)
34
+ rspec-core (2.8.0)
35
+ rspec-expectations (2.8.0)
36
+ diff-lcs (~> 1.1.2)
37
+ rspec-mocks (2.8.0)
38
+ to_latex (0.4.0)
39
+
40
+ PLATFORMS
41
+ ruby
42
+
43
+ DEPENDENCIES
44
+ bundler (~> 1.0.0)
45
+ easystats
46
+ gnuplot
47
+ jeweler (~> 1.8.3)
48
+ latex
49
+ plusminus
50
+ rake4latex
51
+ rcov
52
+ rdoc (~> 3.12)
53
+ rspec (~> 2.8.0)
54
+ to_latex
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 Bernát Kalló
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,19 @@
1
+ = texlab
2
+
3
+ Description goes here.
4
+
5
+ == Contributing to texlab
6
+
7
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
8
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
9
+ * Fork the project.
10
+ * Start a feature/bugfix branch.
11
+ * Commit and push until you are happy with your contribution.
12
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
13
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
14
+
15
+ == Copyright
16
+
17
+ Copyright (c) 2012 Bernát Kalló. See LICENSE.txt for
18
+ further details.
19
+
@@ -0,0 +1,5 @@
1
+ = TEXLAB
2
+
3
+ TEXLAB is a software toolkit for authoring documents and do complex calculations in the same file. It is based on _latex_, _ruby_, _gnuplot_ and _vim_.
4
+
5
+
@@ -0,0 +1,50 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "texlab"
18
+ gem.homepage = "http://github.com/cie/texlab"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{a tool to create documents with latex and ruby}
21
+ gem.description = %Q{texlab a toolkit based on erb that for creating documents and doing calculations at the same time. It is capable to output the proper number of significant digits, generate tables and plots using gnuplot. It has a simple DSL.}
22
+ gem.email = "kallo.bernat@gmail.com"
23
+ gem.authors = ["Bernát Kalló"]
24
+ gem.executables = ["texlab-compile"]
25
+ # dependencies defined in Gemfile
26
+ end
27
+ Jeweler::RubygemsDotOrgTasks.new
28
+
29
+ require 'rspec/core'
30
+ require 'rspec/core/rake_task'
31
+ RSpec::Core::RakeTask.new(:spec) do |spec|
32
+ spec.pattern = FileList['spec/**/*_spec.rb']
33
+ end
34
+
35
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
36
+ spec.pattern = 'spec/**/*_spec.rb'
37
+ spec.rcov = true
38
+ end
39
+
40
+ task :default => :spec
41
+
42
+ require 'rdoc/task'
43
+ Rake::RDocTask.new do |rdoc|
44
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
45
+
46
+ rdoc.rdoc_dir = 'rdoc'
47
+ rdoc.title = "texlab #{version}"
48
+ rdoc.rdoc_files.include('README*')
49
+ rdoc.rdoc_files.include('lib/**/*.rb')
50
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.0
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: ASCII-8bit
3
+
4
+
5
+
6
+
7
+ require 'erb'
8
+ require 'to_latex'
9
+
10
+ $: << File.expand_path(__FILE__+"/../../lib")
11
+
12
+ class TEXERB < ERB
13
+ end
14
+
15
+ begin
16
+ # load code
17
+ #
18
+ infile = ARGV[0] || fail
19
+ outfile = ARGV[1] || infile.sub(/(\.texlab)?$/, ".tex")
20
+
21
+ src = nil
22
+ File.open infile do |f|
23
+ src = f.read
24
+ end
25
+ fail if !src
26
+
27
+ rescue
28
+ STDERR.puts File.basename($0) + " <inputfile> <outputfile>"
29
+ STDERR.puts <<EOU
30
+ Compile texlab inputfile to tex.
31
+ EOU
32
+
33
+ else
34
+
35
+ # load boot code
36
+ File.open File.expand_path(__FILE__+"/../../lib/texlab/boot.rb") do |f|
37
+ src = "<%\n" << f.read << "\n%>\n" << src
38
+ end
39
+
40
+ # run erb
41
+ erb = TEXERB.new(src.untaint, nil, "%>", "$_erbout")
42
+
43
+ File.open outfile, "w" do |f|
44
+ f.print erb.result(TOPLEVEL_BINDING.taint)
45
+ end
46
+
47
+ end
48
+
File without changes
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ require 'pp'
5
+
6
+ def get_binding
7
+ binding
8
+ end
9
+
10
+ begin
11
+ # load code
12
+ src = $<.read
13
+ fail unless src
14
+ rescue
15
+ STDERR.puts File.basename($0) + " [inputfile] [ > outputfile]"
16
+ STDERR.puts <<EOU
17
+ Debug texlab inputfile in console.
18
+ EOU
19
+ else
20
+
21
+ # load boot code
22
+ File.open File.expand_path(__FILE__+"/../../lib/texlab/boot.rb") do |f|
23
+ src = "<%\n" << f.read << "\n%>\n" << src
24
+ end
25
+
26
+ b = get_binding
27
+
28
+ # run erb
29
+ erb = ERB.new(src.untaint, nil, "%>", "$_erbout")
30
+ $_src = erb.src
31
+ b.eval $_src + expr
32
+
33
+
34
+ def getline
35
+ print "texlab> "
36
+ STDIN.gets
37
+ end
38
+
39
+ # run REPL
40
+ while s = getline do
41
+ begin
42
+ pp b.eval(s)
43
+ rescue
44
+ STDERR << $! << $!.backtrace.join("\n") << "\n"
45
+ end
46
+ end
47
+
48
+ end
49
+
@@ -0,0 +1,284 @@
1
+ <%
2
+ documentHeader :usePackages => {
3
+ :babel => "magyar", :inputenc=>"utf8" }
4
+ %>
5
+ \begin{document}
6
+
7
+
8
+ Helló!
9
+
10
+ Ez a TEXLAB program rövid leírása.
11
+
12
+ TEXLAB fájlból először tex fájlt kell csinálni a texlab-compile paranccsal, aztán lehet futtatni pdflatex-szel így:
13
+
14
+ ruby "......./texlab-compile.rb" "..../a-te-fájlod.texlab"
15
+
16
+ pdflatex "....../a-te-fájlod.tex"
17
+
18
+
19
+ Ez, amit olvasol, egy TEXLAB fájl. A TEXLAB fájlban Ruby és LaTeX kódok váltogatják egymást. LaTeX kóddal kezdődik, és Ruby módba a kisebb-százalék jelekkel lehet átmenni, illetve a százalék-nagyobb jelekkel visszamenni.
20
+
21
+ A százalékjelek között lehet ruby parancsokat adni. Az egyik ilyen parancs a documentHeader, amit a fájl elején látsz. Ez elkészíti a LaTeX fájl elejére írandó sorokat A paraméterei:
22
+
23
+ usePackages: milyen csomagokat használjunk. A babel csomag a nyelvi speciális dolgokat csinálja. Az inputenc-nek kell megadni, hogy milyen formátumú a fájl. Ezeken kívül is jónéhány csomagot alapból betölt.
24
+
25
+ twocolumn: ha true, akkor kéthasábos lesz a dokumentum
26
+
27
+ fontsize: "12pt", "11pt" vagy "10pt" (default). a fontméret.
28
+
29
+ landscape: true esetén a dokumentum fekvő lapon lesz.
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+ A másik parancs a puts, ami kiír egy kifejezést:
39
+
40
+ <% puts "Helló" %>
41
+
42
+ A sor elején lévő százalékjel is átvisz ruby módba.
43
+
44
+ % puts ":)"
45
+
46
+ Ha LaTeX megjegyzést szeretnél írni, akkor sajnos dupla százalékjelet kell írni:
47
+
48
+ %% Ez egy latex megjegyzés, senki se fogja látni.
49
+
50
+ A harmadik lehetőség, hogy ha egy Ruby kifejezés értékét szeretnéd betenni a fájlba, akkor a kisebb-százalék-egyenlő jellel kell nyitni:
51
+
52
+ <%= "Helló" %>
53
+
54
+ Ez lényegében ugyanolyan, mint a puts.
55
+
56
+
57
+ A Rubyban lehet matematikai kifejezéseket írni. Pl. öt meg öt az <%= 5+5 %>. A hatványozás **, a tizedestörtekben pont van.
58
+
59
+ Tudsz definiálni változókat:
60
+ <% alma = 29*2 %>
61
+
62
+ Most <%=alma%> darab almánk van.
63
+
64
+ A konstansok nagybetűvel kezdődnek. Két konstansunk is van, <%= E %> és <%=PI%>. Te is definiálhatsz konstast:
65
+ <% R=8.314 %>
66
+
67
+ A számokra meg lehet adni a pm (pluszminusz) metódussal hibahatárt: <%= 12.5.pm(0.00005).to_latex%>. Ilyenkor kézzel kell konvertálni Latex képletté a to\_latex metódussal, különben az eredeti szám jelenik meg. Ha puts-t használsz, akkor nem kell, mert automatikusan megcsinálja.
68
+ <% puts 13.5.pm(0.000005) %>
69
+
70
+ Relatíve is meg lehet adni a hibát <%= 0.5.pm_rel(0.01).to_latex %>
71
+
72
+ Szép exponenciális alakokat tud csinálni: <%= 0.00000000012.pm_rel(0.01).to_latex%>.
73
+
74
+
75
+
76
+
77
+ Vannak függvényeink. 90 fok az <%=radians(90)%> radián, ennek a szinusza <%=sin(radians(90))%>. Ha egyértelmű, hogy mit akarsz, akkor nem muszáj kiírni a zárójeleket, hanem írhatod pl., hogy <%=sin radians 90%>. De ha erre nagyon rászoksz, még sok gondot fog okozni :).
78
+
79
+ Te is definiálhatsz füvvgényeket:
80
+ <%
81
+ def cosh(x)
82
+ (E**x + E**(-x))/2
83
+ end
84
+ %>
85
+ cosh 4 = <%=cosh(4)%>
86
+ De ez a függvény már amúgy is létezik.
87
+
88
+ Az adatokat néha érdemes listában tárolni:
89
+ <%
90
+ adatok = [1,2,3]
91
+ %>
92
+ <%=adatok%>
93
+
94
+ Ezeken végig lehet menni kétféleképpen is:
95
+
96
+ <%
97
+ for a in adatok
98
+ puts a
99
+ puts " alma "
100
+ end
101
+ %>
102
+
103
+ vagy
104
+
105
+ <%
106
+ adatok.each do |a|
107
+ puts a
108
+ puts " alma "
109
+ end
110
+ %>.
111
+
112
+ Az adatokat néha érdemes hash-ben tárolni:
113
+
114
+ <%
115
+ test = {
116
+ m: 9.1,
117
+ V: 8.1
118
+ }
119
+ %>
120
+ A test tömege <%=test.m%>, térfogata <%=test.V%>, sűrűsége <%=test.m/test.V%>.
121
+
122
+ A program tud számolni hibaterjedést, úgyhogy érdemes megadni minden adatban a hibahatárt, hogy az eredmény szebb legyen:
123
+
124
+ <%
125
+ test = {
126
+ m: 9.1.pm(0.05),
127
+ V: 8.10.pm(0.02)
128
+ }
129
+ %>
130
+ A test tömege <%=test.m.to_latex%>, térfogata <%=test.V.to_latex%>, sűrűsége <%=(test.m/test.V).to_latex%>.
131
+
132
+
133
+ Táblázatokat lehet csinálni.
134
+ <%
135
+ table("cím") do
136
+ row("sorcím") do
137
+ column("oszlopcím") do
138
+ "érték"
139
+ end
140
+ end
141
+ end
142
+ %>
143
+
144
+ Lehet több oszlopot és sort is. A do..end helyett lehet kapcsos zárójelet használni
145
+ <%
146
+ table("állatok") do
147
+ row("okos") do
148
+ column("nagy") { "kutya" }
149
+ column("kicsi") { "macska" }
150
+ end
151
+ row("buta") do
152
+ column("nagy"){ "bálna" }
153
+ column("kicsi"){ "egér" }
154
+ end
155
+ end
156
+ %>
157
+
158
+ Lehet több szintű oszlopokat is, de többszintű sorokat (még) nem.
159
+ <%
160
+ table("adatok") do
161
+ row("test1") do
162
+ column("tömeg") do
163
+ column("előtte"){ 90.0.pm(1) }
164
+ column("utána"){ 0.00075.pm_rel(0.05) }
165
+ end
166
+ end
167
+ end
168
+ %>
169
+
170
+ Figyeld meg, hogy a .to\_latex automatikusan megtörténik, tehát itt sem kell kiírni, akárcsak a puts-nál. Azt is figyeld meg, hogy mindig table, row, column a sorrend az egymásba ágyazásnál.
171
+
172
+ Érdemes az adatokat ciklusból táblázatba konvertálni:
173
+ <%
174
+ table("számolás") do
175
+ adatok.each do |a|
176
+ row(a) do
177
+ column("kétszerese") { a*2 }
178
+ end
179
+ end
180
+ end
181
+ %>
182
+
183
+ A rowTitle opcióval lehet megadni, hogy mi legyen a sarokban. Így lehet csinálni szorzótáblát:
184
+ <%
185
+ table("Szorzótábla", rowTitle: "x") do
186
+ (1..10).each do |i|
187
+ row(i) do
188
+ (1..10).each do |j|
189
+ column(j) { i*j }
190
+ end
191
+ end
192
+ end
193
+ end
194
+ %>
195
+
196
+ A lehetséges beállítások: \\
197
+ placement: "H" - legyen a táblázat pont itt, és ne külön lapon. \\
198
+ rowTitle: a sarokban mi legyen \\
199
+ a többit lásd http://rubydoc.info/gems/latex/LatexFile:table
200
+
201
+ Összetett táblázatok:
202
+ <%
203
+ tables("Táblák") do
204
+ table("Első") do
205
+ row("h") do
206
+ column("valami") {"k"}
207
+ end
208
+ end
209
+ table("Második") do
210
+ row("x") do
211
+ column("semmi") {"o"}
212
+ end
213
+ end
214
+ end
215
+ %>
216
+
217
+ Grafikonok:
218
+
219
+ <%
220
+ plot "$x^2$ függvény" do
221
+ dataset "x**2"
222
+ end
223
+ %>
224
+
225
+ Adatpontok:
226
+ <%
227
+ plot "adatok", xlabel: "$x$", ylabel: "$x^2$" do
228
+ dataset do
229
+ data(0, 0**2)
230
+ data(1, 1**2)
231
+ data(2, 2**2)
232
+ data(3, 3**2)
233
+ data(4, 4**2)
234
+ data(5, 5**2)
235
+ end
236
+ end
237
+ %>
238
+
239
+ Illesztés:
240
+ <%
241
+ a,b = fit "a*x+b", via: "a,b" do
242
+ dataset do
243
+ data(0, 0**2)
244
+ data(1, 1**2)
245
+ data(2, 2**2)
246
+ data(3, 3**2)
247
+ data(4, 4**2)
248
+ data(5, 5**2)
249
+ end
250
+ end
251
+ %>
252
+ $<%=a.to_latex%>x+<%=b.to_latex%>$
253
+
254
+ Illesztett egyenes a grafikonon:
255
+ <%
256
+ plot "adatok", xlabel: "$x$", ylabel: "$x^2$" do
257
+ dataset do
258
+ data(0, 0**2)
259
+ data(1, 1**2)
260
+ data(2, 2**2)
261
+ data(3, 3**2)
262
+ data(4, 4**2)
263
+ data(5, 5**2)
264
+ end
265
+ dataset "#{a}*x+#{b}", title: "illesztett egyenes"
266
+ end
267
+ %>
268
+
269
+ Változók használata szövegben: <%= "Helló, #{a}!" %>
270
+
271
+
272
+ Makrók:
273
+
274
+ <%
275
+ macro kij: "k_{ij}"
276
+ %>
277
+
278
+ Használata: Latexben: \kij a négyzeten vagy $\kij^2$, rubyban: <%= $kij %> a négyzeten vagy <%= :kij.to_latex %> a négyzeten vagy <%= :kij + "^2" %> vagy <%= "$ #{$kij} ^ 2 $" %> vagy ennek a rövidítése: <%= "$ #$kij ^ 2 $" %>. Szóval mindenféle krix-kraxszal elő lehet hozni.
279
+
280
+ Az egész csak akkor működik rendesen, ha a makró nevében CSAK BETŰK vannak.
281
+
282
+ Figyeld meg, hogy a makró automatikusan átmegy math módba, úgyhogy mindegy hogy dollárjelek közé teszed vagy nem. A :kij + valami egy bónusz egyszerűsítés, ez is magától átmegy math módba.
283
+
284
+ \end{document}