summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/generic/shapepar/proshap.py
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/generic/shapepar/proshap.py')
-rw-r--r--Master/texmf-dist/source/generic/shapepar/proshap.py350
1 files changed, 350 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/generic/shapepar/proshap.py b/Master/texmf-dist/source/generic/shapepar/proshap.py
new file mode 100644
index 00000000000..e91e65e0a55
--- /dev/null
+++ b/Master/texmf-dist/source/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()
+
+