tmac.gr: specifying graph aspect ratio
[neatroff_make.git] / tmac / tmac.gr
bloba3b226fa0c417f8a98bd78858f6f8f5c5ad65838
1 .\" A macro package for drawing simple charts and curves
2 .\"
3 .\" The main macros are as follows:
4 .\"
5 .\" .grbeg "xmin x1" "xmax x2" "ymin y1" "ymax y2" [opts]
6 .\"   Begin a graph; the arguments specify the minimum and maximum
7 .\"   x and y values.  The value of other variables may be specified
8 .\"   similarly.  For instance, adding "barwid 2" sets the width of
9 .\"   bars.
10 .\"
11 .\" .grend
12 .\"   End the current graph.
13 .\"
14 .\" .grbar pos height [opts]
15 .\"   Draw a bar at x=pos with the given height.  The width of
16 .\"   the bar can be specified as "barwid N".
17 .\"
18 .\" .grcurbeg [opts]
19 .\"   Begin a curve.
20 .\"
21 .\" .grcur x y
22 .\"   Specify the next point in the current curve.
23 .\"
24 .\" .grcurend
25 .\"   End and draw the current curve.
26 .\"
27 .\" .grnum x label
28 .\"   Specify x-axis label at x.
29 .\"
30 .\" .grval y label
31 .\"   Specify y-axis label at y.
32 .\"
33 .\" .grclr line fill
34 .\"   Specify graph colours.
35 .\"
36 .nr grlnsz 24           \" Line point size
37 .nr grptsz 12           \" Text point size
38 .nr grbarwid 1          \" Bar width
39 .nr grratio 133         \" Aspect ratio (width / height * 100)
40 .ds grclr.ln "#725      \" Line colour
41 .ds grclr.fl "#fff      \" Fill colour
42 .de grbeg
43 .       gr
44 .       nr grxmin 0
45 .       nr grxmax 0
46 .       nr grymin 0
47 .       nr grymax 0
48 .       gropt "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7"
49 .       nr grxwid 0\\n[grxmax]-\\n[grxmin]
50 .       nr grywid 0\\n[grymax]-\\n[grymin]
51 .       nr grwd \\n(.l-\\n(.i
52 .       nr grht \\n[grwd]*100/\\n[grratio]
53 .       nr grxoff \\n(.i
54 .       nr gryoff \\n(.d+\\n[grht]
55 .       ne \\n[grht]u
56 .       ev grenv
57 .       nf
59 .\" map graph positions to roff position
60 .ds grx \\n[grxoff]+((\\$1-\\n[grxmin])*\\n[grwd]/\\n[grxwid])
61 .ds gry \\n[gryoff]-((\\$1-\\n[grymin])*\\n[grht]/\\n[grywid])
62 .ds grwd ((\\$1)*\\n[grwd]/\\n[grxwid])
63 .ds grht ((\\$1)*\\n[grht]/\\n[grywid])
64 .\" read graph options
65 .de gropt
66 .       if \\n(.$>=1 .if !"\\$1"" .nr gr\\$1
67 .       if \\n(.$>=2 .if !"\\$2"" .nr gr\\$2
68 .       if \\n(.$>=3 .if !"\\$3"" .nr gr\\$3
69 .       if \\n(.$>=4 .if !"\\$4"" .nr gr\\$4
70 .       if \\n(.$>=5 .if !"\\$5"" .nr gr\\$5
71 .       if \\n(.$>=6 .if !"\\$6"" .nr gr\\$6
72 .       if \\n(.$>=7 .if !"\\$7"" .nr gr\\$7
74 .de grbar
75 .       gropt "\\$3" "\\$4" "\\$5" "\\$6" "\\$7"
76 .       nr grxdiff \\*[grwd \\n[grbarwid]]
77 .       nr grx1 \\*[grx \\$1]-(\\n[grxdiff]/2)
78 .       nr gry1 \\*[gry \\n[grymin]]
79 .       nr gry2 \\*[gry \\$2]
80 .       nr grydiff (\\n[gry2]-\\n[gry1])
81 .       ps \\n[grlnsz]
82 \m[\\*[grclr.fl]]\v'|\\n[gry1]u'\h'|\\n[grx1]u'\D'P \\n[grxdiff]u 0u 0u \\n[grydiff]u -\\n[grxdiff]u 0u'\m[]
83 \m[\\*[grclr.ln]]\v'|\\n[gry1]u'\h'|\\n[grx1]u'\D'p \\n[grxdiff]u 0u 0u \\n[grydiff]u -\\n[grxdiff]u 0u'\m[]
84 .       ps
85 .       sp -2
87 .de grnum
88 .       nr grx1 \\*[grx \\$1]
89 .       nr gry1 \\*[gry \\n[grymin]]
90 \v'|\\n[gry1]u+1v'\h'|\\n[grx1]u-(\\w'\\$2'u/2u)'\\$2
91 .       sp -1
92 .       if \\n(.$>2&\\$3 \v'|\\n[gry1]u'\h'|\\n[grx1]u'\D'l 0 -\\n[grht]u'
93 .       if \\n(.$>2&\\$3 .sp -1
95 .de grval
96 .       nr grx1 \\*[grx \\n[grxmin]]
97 .       nr gry1 \\*[gry \\$1]
98 \v'|\\n[gry1]u'\h'|\\n[grx1]u-\\w'\\$2'u-1m'\\$2
99 .       sp -1
100 .       if \\n(.$>2&\\$3 \v'|\\n[gry1]u'\h'|\\n[grx1]u'\D'l \\n[grwd]u 0'
101 .       if \\n(.$>2&\\$3 .sp -1
103 .de grcurbeg
104 .       gropt "\\$1" "\\$2" "\\$3" "\\$4" "\\$5"
105 .       ds grcur.s "
106 .       nr grcur.x 0
107 .       nr grcur.y 0
108 .       nr grcur.beg 0
109 .       nr grcur.xbeg 0
110 .       nr grcur.ybeg 0
112 .de grcur
113 .       nr grx \\*[grx \\$1]
114 .       nr gry \\*[gry \\$2]
115 .       if !\\n[grcur.beg] .nr grcur.xbeg \\n[grx]
116 .       if !\\n[grcur.beg] .nr grcur.ybeg \\n[gry]
117 .       nr grxdiff \\n[grx]-\\n[grcur.x]
118 .       nr grydiff \\n[gry]-\\n[grcur.y]
119 .       if \\n[grcur.beg] .as grcur.s "\D'l \\n[grxdiff]u \\n[grydiff]u'
120 .       nr grcur.x \\n[grx]
121 .       nr grcur.y \\n[gry]
122 .       nr grcur.beg 1
124 .de grcurend
125 .       ps \\n[grlnsz]
126 \m[\\*[grclr.ln]]\v'|\\n[grcur.ybeg]u'\h'|\\n[grcur.xbeg]u'\\*[grcur.s]\m[]
127 .       ps
128 .       sp -1
130 .de grend
131 .       ps \\n[grlnsz]
132 \v'|\\n[gryoff]u'\h'|\\n[grxoff]u'\D'p \\n[grwd]u 0 0 -\\n[grht]u -\\n[grwd]u 0'
133 .       ps
134 .       sp |\\n[gryoff]u
135 .       ev
137 .de grclr
138 .       if \\n(.$>0 .if !'-'\\$1' .ds grclr.ln "\\$1
139 .       if \\n(.$>1 .if !'-'\\$2' .ds grclr.fl "\\$2
141 .de grloop
142 .       nr grnext \\$2+\\$4
143 .       \\$1 \\$2
144 .       if \\n[grnext]<\\$3 .grloop \\$1 \\n[grnext] \\$3 \\$4