chiark / gitweb /
overflow-tube: cut adjustments
[quacks.git] / overflow-tube.ps.pl
1 #!/usr/bin/perl -w
2 # Books of Pumpkins, etc.  Extensions to Quacks of Quedlinburg
3 #  SPDX-License-Identifier: GPL-3.0-or-later OR CC-BY-SA-4.0
4 # Copyright 2020-2022 Ian Jackson
5
6 use strict;
7
8 BEGIN { unshift @INC, '.'; }
9 use Quacks;
10
11 sub o {
12   local $_;
13   for (@_) { $ps_framing .= $_ }
14 }
15
16 ps_start(<<END);
17 %90 rotate
18 %0 -210 translate
19 END
20
21 my $x_cut = 27;
22 my $x_cutd = 1;
23 my $x_cut2 = 38;
24 my $y_cut2 = 24;
25 my $y_cutd = 10;
26
27 my $coverup_x = 5;
28 my $coverup_y = 89;
29
30 my $cutd_slope = ($x_cut2-$x_cut)/$x_cut;
31 my $y_cut2d = $y_cutd * $cutd_slope;
32 my $y_cutdd = $x_cutd * $cutd_slope;
33
34 my $nrepis = 4;
35
36 my $paper_x = 210;
37
38 my $spacing = 23;
39 my $colspacing = 23;
40 my $vhalf = sqrt( $spacing ** 2 - ($colspacing*0.5) ** 2 );
41
42 my $y_cut = 2.75 * $spacing;
43
44 my $x_pl_zero = $paper_x*0.5 - 3*$colspacing;
45 my $y_pl_zero = $y_cut + $spacing - $y_cutd* 0.5 * $x_cut/$colspacing;
46
47 my $y_top = $y_pl_zero + $y_cutd + $spacing*1.25;
48
49 our $veep_bg = " 0.95 0.90 0.67 setrgbcolor ";
50
51 sub some_cut_line($) {
52   <<END;
53 gsave
54   0.25 setlinewidth
55   $_[0]
56 grestore
57 END
58 }
59
60
61 o <<GS, some_cut_line(<<GR), <<END;
62 /cut_line {
63 GS
64                                           newpath
65   $x_cut2     0                           moveto
66   $x_cut2     $y_cut2                     lineto
67   $x_cut $x_cutd add     $y_cut2   $y_cut2d add      lineto
68   $x_cut $x_cutd add      $y_cut   $y_cutdd add      lineto
69   0           $y_cut    $y_cutd add       lineto
70   0           $y_top                      lineto
71                                           stroke
72 GR
73 } def
74 END
75
76 my $veep_font = "/Helvetica-Bold findfont 6.5 scalefont setfont";
77 my $money_font = "/Helvetica-BoldOblique findfont 6.5 scalefont setfont";
78
79 o <<END;
80 $money_font
81 END
82
83 sub veepsq ($) {
84   my ($veeps) = @_;
85
86   my $sqx = 4.1;
87   my $sqy = 3.2;
88
89   <<END;
90   gsave
91     -1.5 -3.0 translate
92
93     gsave
94       newpath  -$sqx -$sqy moveto
95                -$sqx  $sqy lineto
96                 $sqx  $sqy lineto
97                 $sqx -$sqy lineto closepath
98
99        gsave 
100              $veep_bg
101              fill
102        grestore
103        0.19 0.35 0.25 setrgbcolor
104        0.5 setlinewidth
105        stroke
106     grestore
107
108     $veep_font
109     0 0 moveto
110     ($veeps) dup  stringwidth pop -0.5 mul -2.5 rmoveto  show
111   grestore
112 END
113 }
114
115 sub places ($) {
116   my ($repi) = @_;
117   my $data = <<END;
118     -1-L*H -1
119         -1  0   34 14
120         -H  V   34 14 1
121          0  0   34 15
122          0 -1   35 15
123          0 -2   35 16
124          H -2-V 35 16 1
125          1 -2   36 16
126          1 -1   37 16
127      1+R*H  0
128 END
129   my $line;
130   my $line_word = 'moveto';
131
132   my $o = '';
133
134   $o .= <<END;
135     gsave
136 END
137   foreach (split /\n/, $data) {
138     s{\#.*}{};
139     next unless m/\S/;
140     s{^\s*}{};
141     s{L}{ ($repi == 0         ? 1 : 0) }ge;
142     s{R}{ ($repi == $nrepis-1 ? 1 : 0) }ge;
143     s{H}{ 0.5 }ge;
144     s{V}{ $vhalf / $spacing }ge;
145     my ($x,$y,$money,$veeps,$ruby) = map { eval $_ } split /\s+/;
146     $ruby ||= 0;
147     $x *= $colspacing;
148     $y *= $spacing;
149     $x += $x_pl_zero;
150     $y += $y_pl_zero;
151
152     $line .= " $x $y $line_word";
153     $line_word = 'lineto';
154     next unless defined $money;
155
156     $money += 4 * $repi;
157     $veeps += 2 * $repi;
158
159     $o .= <<END;
160 % place $x $y $money $veeps $ruby
161 gsave
162   $x $y translate
163   gsave
164     newpath
165     0 0 chip 0.5 mul 0 360 arc
166     gsave 0.5 setlinewidth $black stroke grestore
167     0.80 0.89 0.63 setrgbcolor fill
168   grestore
169
170   -4.7 1 moveto ($money) show
171
172   ${\ veepsq($veeps) }
173 END
174
175     $o .= <<END if $ruby;
176  gsave
177    6 -1 translate
178    0.8 dup scale
179    ${ \ruby() }
180  grestore
181 END
182
183     $o .= <<END;
184 grestore
185 END
186   }
187   $o .= <<END;
188     grestore
189 END
190
191   $line = <<END;
192   newpath
193     0.66 0.85 0.75 setrgbcolor
194     4 setlinewidth
195   $line
196   stroke
197 END
198
199   ($line, $o)
200 }
201
202 sub repis () {
203   for my $places_i (qw(0 1)) {
204     for my $repi (0..$nrepis-1) {
205       o(<<END);
206 % repi $places_i $repi
207 gsave
208   $repi $colspacing 2 mul mul  0 translate
209 END
210
211       o( (places($repi))[$places_i] );
212       o(<<END);
213 grestore
214 END
215     }
216   }
217 }
218
219 sub set () {
220   o(<<END);
221     cut_line
222     gsave
223       $paper_x $x_cut sub  0 translate
224       cut_line
225     grestore
226 END
227   o some_cut_line <<END;
228                                  newpath
229     0                    $y_top  moveto
230     $paper_x $x_cut sub  $y_top  lineto
231                                  stroke
232 END
233
234   repis();
235
236   o <<END;
237     gsave
238       $coverup_x $coverup_y translate
239       /Times-Roman findfont 4.0 scalefont setfont
240       0 8 moveto  (cover) show
241       2 4.5 moveto  (up) show
242       0 0 moveto
243       /Helvetica-Bold-Italic findfont 3.5 scalefont setfont (35) show
244       1 0 rmoveto
245       /Helvetica-Bold findfont 3.5 scalefont setfont (15) show
246     grestore
247
248     gsave
249       $paper_x $x_cut sub  $y_top 7 sub translate
250
251       gsave
252         arrowlen 2 add neg  0 translate
253         ${\ arrow_any("arrowlen 0 moveto  -30 0 rlineto") }
254       grestore
255
256       -40 0 translate
257       /Helvetica-Bold findfont 6.5 scalefont setfont
258
259      -4.5 0 moveto
260      $money_font
261      (+16) show
262
263      4 -2 translate
264      ${\ veepsq('+8') }
265
266      4 4.5 moveto
267      /Times-Roman findfont 4.5 scalefont setfont
268      (per next page) show
269
270     grestore
271 END
272 }
273
274 set();
275 o <<END;
276 gsave 0 $y_top translate
277 END
278 set();
279 o <<END;
280 grestore
281 END
282
283 print $ps_framing or die $!;