diff options
Diffstat (limited to 'Master/texmf-dist/doc/generic/shapepar/proshap.py')
-rw-r--r-- | Master/texmf-dist/doc/generic/shapepar/proshap.py | 350 |
1 files changed, 350 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/generic/shapepar/proshap.py b/Master/texmf-dist/doc/generic/shapepar/proshap.py new file mode 100644 index 00000000000..e91e65e0a55 --- /dev/null +++ b/Master/texmf-dist/doc/generic/shapepar/proshap.py @@ -0,0 +1,350 @@ +""" +proshap.py v. 1.1 + +Desc: +Rasterizer for producing shapes useful for the LaTeX package +shapepar. It's a python script. www.python.org. + + +Copyright Manuel Gutierrez Algaba January 2003 +All rights reserved. +Released under GPL license. + +Contact: algaba@gmx.net + +Changes: +1.1 : New {10}{0}b{5.6} command, automatic now. +1.1 : New copyright notice + +known Bugs: + + Watch when have two forks at the same line. Example: + -------------------------------------------- + ----- --------------- -------- + +Solution: Increase the resolution (number of lines and height) and +don't put the two forks at the same line. + +It _may_ fail a 'bit'. + +""" + +import string + +test1 = """ + 3333 + 33333333333 + 33333333333333 + 3333333333333333 + 333333 + 333333 + 3333333 + 3333333 + 3333333 3333 + 3333333 33333333 + 3333333 33333333333 3 + 3333333 333333 33333 33 + 333333 333333 33333 3333 + 333333 333333 33333 3333 + 33333333333333333 3333333333 + 33333333333333 33333333 +""" + +test3 = """ + 33333333333333333 + 33333333333333333333333333333 + 333333333333333333333333333333333 + 33333333333333333333333333333333333 + 3333333333333333333333333333333333333 + 333333 3333333 333333 + 33333 33333 33333 + 333333 3333333 33333 + 33333333333333333 33333333333333333 + 333333333333333 333333333333333 + 3333333333333 3333333333333 + 333333333333333333333333333333 + 3333333333333333333333333333 + 33 333 + 333333 333333333 + 3333333333333333333333 +""" + +test4 = """ + 33 + 333333 + 33333333 + 3333333333 + 333333333333 + 33333333 + 3333333333333333 + 3333 + 3333 +""" + + +test5 = """ + + 333333333333333333333 + 3333333333333333333333 + 33333333333 3333 + 3333333 333 + 33333333 + 33333333333 + 3333333333333333333333333333333333333333333333 + 3333333333333333333333333333333333333333333333 + 3333333333333333333333333333333333333333333333 + 3333333333333333333333333333333333333333333333 + 3333333333333333333333333333333333333333333333 + 33333 333333333 3333333 + 333 3333333 33333 + 33 33333333333 333 + 3 3333333333333333 33 + +""" + +test6 = """ +3 +333 +333333333 + 333333333333 + 33333333333333333 + 33333333333333333 + 33333333333333333 + 33333333333333333 + 333333333333333333 + 3333333333333333333 + 3333333333333333333 + 33333333333333333333 + 33333333333333333 +""" + +test7 = """ + + 3333 33333 333333 333 33 + 333333333333 333 333 33 33 33 + 333 333 333 333 33 333 333 3333 +3333 33333333 333333 33 + + +""" +test8 = """ + + 33333333333333333333333333333333 + 33333333333333333333333333 + 33333 33333 + 3333333 3333333 + 333333333 333333333 + 333333333 333333333 + 3333333 3333333 + 33333333333333333333333333 +""" + +test9 = """ +333333333333333333333333333333333333333333333333333333333333 +333333333333333333333333333333333333333333333333333333333333 + 3333333333333333333333333333333333333333333333 + 33333333333333333333333333333333333333 + 33333333333333333333333333333333 + 333333333333333333333 + 33333333333333333 + 33333333333333333 + 33333333333333333 + 333333333333333333333 + 33333333333333333333333333333333 + 333333333333333333333333333333333333333 + 3333333333333333333333333333333333333333333333 +333333333333333333333333333333333333333333333333333333333333 +""" +test10 = """ + 3 + 3 + 3 + 33333 + 3333333 + 333 + 3 + 3 +""" + +test11 = """ + + 3 + 3333 + 333 +33 +""" + +test12 = """ +3333 3333 3333 3333 +33333 333333 333333 33333 +3333333 333333333 3333333333 333333 +33333333333333333333333333333333333333333333333 +""" +test = test3 +list_of_lines = string.split(test,"\n") + +def detect_start(line, index = 0): + """ + line : not containing \n + """ + c = index + for i in line: + if i!=" ": + return c + c = c +1 + return None + +def detect_end(line, index): + """ + line : not containing \n + """ + c = index + for i in line: + if i==" " : + break + c = c + 1 + return c + +def generate(current, last): + """ + current, last : list of segments, perhaps requiring a + join or a split + + """ + for i in xrange(0,len(current)): + if i == len(current) -1: + break + for j in last: + if j.overlaps(current[i], current[i+1]): + j.make_joint() + #print "o" + + for i in xrange(0,len(last)): + if i == len(last) -1: + break + for j in current: + if j.splits(last[i], last[i+1]): + #print "s" + j.make_split() + +class segment: + def __init__(self, start, end, number ): + self._start = start + self._end = end + self._split = 0 + self._joint = 0 + self._numberofline = number + + def get_no_line(self): + return self._numberofline + + def make_height(self, h): + self._height = h + + def make_joint(self): + self._joint = self._joint + 1 + + def make_split(self): + self._split = self._split + 1 + + def overlaps(self, seg1, seg2): + """ + This segment is the 'father' of seg1 , seg2 , See drawing: + -------------------- <-- seg this + --------- -------- <-- seg1 and seg2 + """ + return seg1._end > self._start and seg2._start < self._end + + def splits(self, seg1, seg2): + """ + This segment is the 'son' of seg1 , seg2 , See drawing: + --------- -------- <-- seg1 and seg2 + -------------------- <-- seg this + """ + return seg1._end > self._start and seg2._start < self._end + + def generate_line(self, factor, heading = None): + dev = "" + if not heading is None : + dev = dev + "{"+ str(self._height)+ "}" + dev = dev +"t{" + l = self._end - self._start + l = l * factor + if self._split: + c = "j" + else: + c = "s" + if self._split or self._joint: + a = self._split + self._joint # one of them will be 0 + div_f = a + 1.0 + dev = dev + str(self._start* factor) + "}{" + str(l/div_f) + \ + "}" + for i in xrange(0,a): + dev = dev + c+ "t{"+ \ + str(self._start* factor + (i+1)*l/div_f)+ \ + "}{" + str(l/div_f) +"}" + else: + dev = dev = dev + str(self._start* factor) + "}{" + str(l)+ "}" + return dev + +list_of_segments = [] +last_line_segments = [] +current_line_segments = [] + +numberofline = 0 +for i in list_of_lines: + numberofline = numberofline + 1 + s = detect_start(i) + if s is None: + continue + e = detect_end(line = i[s:], index = s) + while 1: + #print s,e + current_line_segments.append(segment(s,e, numberofline)) + s = detect_start(line = i[e:], index = e) + if s is None: + break + e = detect_end(line = i[s:], index = s) + + generate(current_line_segments, last_line_segments) + list_of_segments = list_of_segments + current_line_segments + last_line_segments = current_line_segments + current_line_segments =[] + +each_char = 0.4 +height = 0 +inc_height = 0.8 +numberofline = -1 + +#{20}{0}b{1.6} +result = "" +max = -1 +for i in list_of_segments: + if i._end > max: + max = i._end + i.make_height(height) + height = height + inc_height + nl= i.get_no_line() + if nl != numberofline: + numberofline = nl + result = result + "\\\\" + result = result + i.generate_line(each_char,heading = 1) + "\n" + else: + result = result + i.generate_line(each_char) + "\n" + +height = height + inc_height + +# str(list_of_segments[0]._start) +middle = str(each_char *max/2.0) + +result = "\\gdef\\bassshape{{"+ middle + \ + "}{0}b{"+ middle +"}\n" + result + + +result = result+ "\\\\{"+str(height) +"}e{"+ middle +"}" + "}\n" +print result +f = open("result.tex","w") +f.write(result) +f.close() + + |