File: plot2.usg

package info (click to toggle)
maxima 5.6-17
  • links: PTS
  • area: main
  • in suites: woody
  • size: 30,572 kB
  • ctags: 47,715
  • sloc: ansic: 154,079; lisp: 147,553; asm: 45,843; tcl: 16,744; sh: 11,057; makefile: 7,198; perl: 1,842; sed: 334; fortran: 24; awk: 5
file content (2430 lines) | stat: -rw-r--r-- 102,386 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
This is the documentation for PLOT2 (SHARE;PLOT2 USAGE).  This is a
long file.  If this is your first experience with PLOT2 read
SHARE;PLOT2 PRIMER with contains examples and brief explanations of
the most common PLOT2 capabilities.  These examples are run for you by
typing DEMO(PLOT2,DEMO,DSK,SHARE); (type spaces after the plots).
Please look at SHARE;PLOT2 RECENT as well for updates as to the
current state of affairs.  (Last revision of this file:  August 1981.)

Description of PLOT2

0) Introduction

This is a description of the functions contained in the following 7
files:
	APLOT2 > DSK CFFK
	TEKPLT > DSK CFFK
	PLOT3D > DSK CFFK
	WORLD  > DSK CFFK
	PRINT  > DSK CFFK
	IFFUN  > DSK CFFK
	EDIT   > DSK CFFK

    All of the important functions will get loaded up as needed.

    The capabilities of the routines described here include plotting
of several curves on a single graph, plotting several graphs in
different positions on the screen, saving plots, replotting plots
with different scales without having to recompute any points,
plotting of 3 dimensional surfaces, plotting of user defined dashed
lines and symbols.

    The devices supported are:  The Tektronix 4010, 4013, 4025 and
4662, the Imlac PDS 1 and PDS 4 (using ARDS graphics conventions),
the XGP, the Gould line-printer (in 38-246), the Dover, some
Versatecs on the MFE-NET and in a "preview" mode printing and display
consoles.

    Mail concerning bugs/features in PLOT2 should be addressed to
BUG-PLOT2.

Contents:
    1) 2D plotting
	1) PLOT2
	2) GRAPH2
	3) PARAMPLOT2
	4) WORLDPLOT2
	5) PLOTNUM
	6) PLOT2ERROR and PLOTUNDEFINED
    2) What to type at the end of a plot
	1) space
	2) return
	3) tab
	4) linefeed
	5) rubout
	6) ^A
	7) PLOTBELL
	8) Quitting
    3) 3D plotting
	1) PLOT3D
	2) GRAPH3D
	3) NOT3D
	4) PERSPECTIVE, REVERSE, VIEWPT and CENTERPLOT
	5) CROSSHATCH and UNDERSIDE
	6) HIDE, \3D, CONTOUR and NOT3D
	7) PLOTNUM0 and PLOTNUM1
    4) Contour plotting
	1) CONTOURPLOT2
	2) CONTOURS, ZMAX and ZMIN
	3) LABELCONTOURS
    5) Other plotting functions
	1) REPLOT
	2) PLOTMODE
	3) CLEAR
	4) HARDCOPY
	5) PLOTRESET
    6) Labels
	1) XLABEL, YLABEL, TITLE and NONE
	2) LABEL
	3) NOPRINT
	4) PLOTNUMPREC
	5) DATEPLOT
    7) Axes
	1) XAXIS and YAXIS
	2) TICKSIZE and TICKNUM
    8) Scales
	1) WINDOW
	2) XMIN, XMAX, YMIN and YMAX
	3) EQUALSCALE
	4) WINDOW1, XMIN1 etc.
    9) Line types
	1) TYPEL
	2) DEFINEDASH
	3) DEFINESYMBOL
    10) Plotting several curves
	1) CLEAR and WAIT
	2) FIRST, LAST and SAME
	3) REPLOT4
	4) TOP, BOTTOM, LEFT and RIGHT
    11) Device characteristics
	1) Tektronix
	2) Imlac
	3) Grinnell
	4) Printing and Display
	5) XGP
	6) Gould
	7) Versatec
	8) Dover
    12) Naming and saving of plots
	1) NAMEPLOT
	2) SAVEPLOTS
	3) LOADPLOTS
	4) KILLPLOTS
	5) DONT
	6) PLOTS
    13) Transformations on points
	1) POLAR, LOG, LINLOG, LOGLIN, LIN and TXTYPE
	2) SPECIAL, XFUN and YFUN
	3) 3D transformations and HOWCLOSE
    14) Editting plots
	1) EDIT
    15) Default settings
	1) Options
	2) Lines and Symbols
	3) PLOTMODE
    16) Primitives called by PLOT2
    17) What PLOT2 doesn't do
    18) Other examples
    19) Acknowledgements
1) 2D plotting
	1) PLOT2
	2) GRAPH2
	3) PARAMPLOT2
	4) WORLDPLOT2
	5) PLOTNUM
	6) PLOT2ERROR and PLOTUNDEFINED

1.1) PLOT2

Easy examples
  PLOT2(SIN(X), X, -%PI, %PI);	plots sin(X) against X as X takes on
				PLOTNUM values between -%PI to %PI
  LST:[1,1,2,3,5,8,13,21,34];	A list of the first Fibbonacci numbers
  PLOT2(LST[I], I, 1, LENGTH(LST), INTEGER);	plots the elements of
				list vs. the integer position in the
				list
  F(X) := SQRT(X+%PI);
  PLOT2(F(X), X, [-2,3,100.12]);    plots F(X) as X takes the values in
				the values in the list
  PLOT2([X+1, X^2+1], X, -1, 1);    plots 2 curves on top of each other

Complete description

PLOT2(<y-exprs>, <variable>, <var-range>, <optionals-args>); plots
    <y-exprs> as the y axis as <variable> (the x axis) takes on
    values specified by <var-range>.

<y-exprs> can take one of two forms:
    (i) <expr> plots a curve of <expr> against <variable>;
    (ii) [<expr1>, <expr2>, ..., <expri>, ..., <exprn>] plots n
	curves of <expri> against <variable>.
    <expri> gets evaluated in the following context
	FLOAT(EV(<expri>, <variable>=<value gotten from var-range>,
	     NUMER)).
    It is an error if this doesn't result in a floating point number.

<var-range> can have the following forms:
    (i) <low>, <high> where <low> and <high> evaluate to numbers.
	<low> may be either greater or less than <high>.  <variable>
	will take on PLOTNUM values equally spaced between <low> and
	<high>.  Note that the first argument will be evaluated at
	<low> first e.g., PLOT2(1/X, X, -1, -3); calculates 1/(-1.0)
	before 1/(-3.0).  This will only make a difference if the
	computation of the first arg changes a variable which changes
	the value returned by subsequent computation.  Whether or not
	<low> < <high>, min(<low>, <high>) will be on the left of the
	plot.  (This can be overridden using the SPECIAL (Sec 13.2)
	option with REFLECT as XFUN.)
    (ii) <low>, <high>, INTEGER as in (i) except <variable> will take
	on all integer values between <low> and <high> inclusive.
    (iii) [<val1>, <val2>, ..., <vali>, ..., <valn>] <variable> takes
	the values specified by the list.
    (iv) <arrayname> where <arrayname> is the name of a declared
	floating-point one-dimensional array (i.e., by
	ARRAY(<arrayname>, FLOAT, <max-index>);).  <variable> takes
	the values from <arrayname>[0] thru <arrayname>[<max-index>]
	(<max-index> is the maximum index of <arrayname>

<optional-args> can be any of the following:
    X-Label, Y-Label or Title descriptor (Sec 6.1),
    Line type descriptor (Sec 9.1),
    FIRST, SAME and LAST (Sec 10.2),
    POLAR, LOG, LINLOG, LOGLIN (Sec 13.1),
    TOP, BOTTOM, LEFT, or RIGHT (Sec 10.4).
    The optional arguments may appear in any order.  The rule for
    evaluation of the optional args is as follows.  If the argument is
    atomic it gets evaluated.  The resulting arguments are the ones
    that get used.

If you want to plot more than 3-4 curves on the same plot investigate
    using the NOT3D option to PLOT3D (Sec 3.3).

PLOT2(<y-funs>, <var-range>, <optionals-args>); The alternative form
    for PLOT2.  <y-funs> must be a function of 1 argument or a list of
    functions of 1 argument.  The functions must be either translated
    or compiled function which returns a floating point number when
    it is given floating point arg (or integer arg if the INTEGER arg
    to PLOT2 is given).  This form of PLOT2 acts as though you had
    given a argument to the <y-funs>, and also specified that
    argument as the <variable> in the form above.  e.g., PLOT2(F, -2,
    2); acts like PLOT2(F(X), X, -2, 2); This is supposed to provide
    a quicker evaluation of the first arg and for that reason NO
    checking is done on the result.  If the wrong sort of number is
    returned, you will get garbage plotted.

Examples
  TRANSLATE:TRUE;
  F(X) := (MODEDECLARE(X, FLOAT), EXP(-X*X));
  PLOT2(F, -2, 2);
  PLOT2(F, [-2,-1,0,1,2]);
  ARRAY(V, FLOAT, 10);
  FOR I FROM 0 THRU 10 DO V[I]:FLOAT(I-5);
  PLOT2(F, V);

1.2) GRAPH2

Easy examples
  GRAPH2([1,2,3], [5,10,6]);	draws a line connecting [1,5], [2,10],
				[3,6]

Complete description

GRAPH2(<x-lists>, <y-lists>, <optional-args>); plots points specified
    by the first <x-lists> and <y-lists>

The format for <x-lists> can be one of:
    (i) [<x-pt1>, <x-pt2>, ..., <x-pti>, ..., <x-ptn>] where <x-pti>
	evaluates to a number.
    (ii) <arrayname> where <arrayname> is the name of a declared
	one-dimensional array of floating point numbers.
    (iii) <2d-arrayname> where <2d-arrayname> is the name of a
	declared two-dimensional array of floating point numbers
	(i.e., by ARRAY(<2d-arrayname>, FLOAT, <max-row-index>,
	<max-col-index>);).
    (iv) [<x-list1>, <x-list2>, ..., <x-listi>, ..., <x-listk>] where
	<x-listi> can have the form of either (i) or (ii).

The format of <y-lists> is similar.  GRAPH2 performs as follows:
    arguments of form (i) or (ii) are converted to form (iv) (e.g.,
    <arrayname> ==> [<arrayname>]).  Arguments of form (iii) are
    converted to form (iv) by <2d-arrayname> ==> [<row0>, <row1>,
    ..., <rowi>, ..., <rowk>] where <rowi> is a list of the numbers
    in the i'th row of <2d-arrayname> (remember that array indexing
    begins from 0 in MACSYMA).  If the length of the resulting
    <x-lists> is shorter than that of the resulting <y-lists> then
    <x-lists> is filled with <x-listk> to make the lengths the same
    (similarly if <y-lists> is shorter than <x-lists>).  If the length
    of <y-lists> is, say, n, then n curves of <x-list1> vs.
    <y-list1>, ..., <x-listn> vs.  <y-listn> are plotted.  In the event
    of <x-listi> containing less numbers (or being a shorter array)
    than <y-listi> then the last numbers of <y-listi> are left
    unused.

The <optional-args> is the same as for PLOT2.

Note that GRAPH2 performs the same job as the MACSYMA function
    MULTIGRAPH and that GRAPH2 is thus slightly incompatible with
    GRAPH

1.3) PARAMPLOT2

Easy example
  PARAMPLOT2(COS(T), SIN(T), T, 0, 2*%PI);	Plots cos(T) for the
	x-axis and sin(T) for the y-axis as T takes on PLOTNUM (Sec
	1.5) values between 0 and 2*%PI.  (If EQUALSCALE is TRUE (Sec
	8.3) this draws a circle.)

Complete description

PARAMPLOT2(<x-exprs>, <y-exprs>, <variable>, <var-range>,
    <optional-args>); plots <x-exprs> as the x coordinate against
    <y-exprs> as the y coordinate.

The format for the first two arguments is the same as that for the
    first argument to PLOT2.  Thus if <x-exprs> is [<x-expr1>,
    <x-expr2>, ..., <x-expri>, ..., <x-exprn>] and <y-exprs> is
    [<y-expr1>, <y-expr2>, ..., <y-expri>, ..., <y-exprk>], then
    max(n,k) curves will be plotted.  they will be (assuming n > k):
	<x-expr1> vs. <y-expr1>, ..., <x-exprk> vs. <y-exprk>,
	<x-expr(k+1)> vs. <y-exprk>, ..., <x-exprn> vs. <y-exprk>.

The format for the remaining arguments is the same as for PLOT2.

PARAMPLOT2(<x-funs>, <y-funs>, <var-range>, <optional-args>);
    efficiently evaluates its first 2 arguments in the same way that
    the alternative form of PLOT2 works.

Example
  TRANSLATE:TRUE;	causes automatic translation
  F(X) := (MODEDECLARE(X, FLOAT), COS(X));
  G(X) := (MODEDECLARE(X, FLOAT), SIN(X));
  PARAMPLOT2(F, G, 0, 2*%PI);	plots F(x) vs G(x) as x goes from 0 to
	2*%PI (this is the same as the easy example at the beginning
	of this section).

1.4) WORLDPLOT2

Easy example
  LOAD('[WORLD, FASL, DSK, SHARE]);
  WORLDPLOT(-15, 10, 48, 60);	draws a map of the United Kingdom.

Complete description

WORLDPLOT(<min-long>, <max-long>, <min-lat>, <max-lat>); plots your
    favorite portion of the world.  The arguments are in degrees with
    latitude ranging from -90 to 90 and longitude from -180 to 180.
    the projection is unorthodox.  (The function is just a hack, don't
    expect any of the features available with the other plotting
    functions to be available.  Note too that WORLDPLOT has no
    auto-load property.  It must be explicitly loaded by LOAD('[WORLD,
    FASL, DSK, SHARE]); )

1.5) PLOTNUM

This is the number of points PLOT2 and PARAMPLOT2 plot when given the
    <low>, <high> type of variable range.  The default value is 20.

1.6) PLOT2ERROR and PLOTUNDEFINED

PLOT2ERROR governs what happens when PLOT2 hits an error in trying to
    evaluate a point.  If PLOT2ERROR is TRUE (the default) an error
    occurs and PLOT2 exits.  However if DEBUGMODE is TRUE you can ask
    for the value of PLOT2ERROR which is temporally bound to the form
    being evaluated when the error occurs.  If PLOT2ERROR is a
    floating point number then that number will be used as the value
    of the erroneous form.  If PLOT2ERROR is FALSE, then the result is
    the value of PLOTUNDEFINED (i.e., it is the same as PLOT2ERROR :
    PLOTUNDEFINED;).  This causes the point to be skipped in the
    plotting.

PLOTUNDEFINED enables you to plot functions which are undefined in
    certain ranges of their arguments.  If the function that is being
    plotted returns the value PLOTUNDEFINED (which happens to be some
    large "random" number), then that point will not be plotted at
    all and the line will be discontinuous.  This is to implement
    inhibition of plotting in areas of discontinuities, or where the
    function is undefined.  This feature is only implemented for
    two-dimensional graphs in PLOT2.  These are plots produced by
    PLOT2, PARAMPLOT2 and GRAPH2.

Example
  PLOT2ERROR:FALSE;	plot no point on an error
  PLOT2([SQRT(X^2-1.), -SQRT(X^2-1.)], X, -3, 3);	plot a curve of
	+/- sqrt(X^2-1).  Such cases are usually more satisfactorily
	handled by parameterizing the curve and using PARAMPLOT2. E.g.,
  PARAMPLOT2([COSH(T), -COSH(T)], SINH(T), T, -ACOSH(3), ACOSH(3));
2) What to type at the end of a plot
	1) space
	2) return
	3) tab
	4) linefeed
	5) rubout
	6) ^A
	7) PLOTBELL
	8) Quitting

When a plot is finished the bell on your terminal will be dinged.
(This only in fact happens if WAIT is TRUE (Sec 10.1) and if you're
plotting on the terminal (Sec 5.2) and (Sec 11).)  The plotting
function is now waiting for you to type something before it exits and
prints the next C-Label on your nice plot.  It does nothing with most
characters; they are left to be part of the next C-Line.  However the
following characters are read and interpreted specially.

2.1) space

This is read and the plotting function exited.  This is the "normal"
    means of exitting.

2.2) return

Clears the screen and then exits.  This is disabled by setting
    CRCLEAR:TRUE; (default value is FALSE).  This switch is mainly for
    people coming through another computer which works a
    line-at-a-time (so that they have to terminate all their MACSYMA
    commands with e.g., ";<cr>").  CRCLEAR is not reset by
    PLOTRESET();.

2.3) tab

The previous plot is replotted.  This is useful if the line is noisy,
    or, in conjunction with ^A (Sec 2.6) if various of the plotting
    parameters need to be changed.  Note however that <tab> only
    affects the last call to one of the main plotting functions
    (PLOT2, PLOT3D, etc.).  Thus, it cannot be used to replot all the
    plots in a sequence of plots generated by (PLOT2(..., FIRST),
    ..., PLOT2(..., LAST)); (Sec 10.2).

2.4) linefeed

Sends out a hardcopy signal by calling the HARDCOPY() function (Sec
    5.4).  (This doesn't happen with HARDCOPY:TRUE; (Sec 5.4) because
    then you get an automatic HARDCOPY() with each plot.)

2.5) rubout

Names the plot.  PLOT2 types out "Enter name of plot" you reply
    <plotname>; this is identical to typing a space instead of a
    rubout, followed by NAMEPLOT(<plotname>); (Sec 12.1).

2.6) ^A

This is not really read by the plotting function, but enables you to
    enter a ^A break and change various options, before typing tab to
    have the plot replotted.  Make sure the plot has finished before
    you type this (Sec 2.8).  The most common things that need
    changing are the scaling options (Sec 8); but just about anything
    can be changed as long as they don't require that more points be
    calculated (e.g., don't try resetting PLOTNUM in a ^A break).
    There are a number of options that exist as explicit options only
    within a ^A break of this type.  (Normally they are set in the
    <optional-args> of the plotting function.)  They are TYPEL (Sec
    9.1), XLABEL, YLABEL, TITLE (Sec 6.1), TXTYPE (Sec 13.1) and \3D
    (Sec 3.6).  Unlike the other options these are local variables and
    will become unbound (or bound to their old values) when PLOT2 is
    exitted and in order for the changes made to them to be
    remembered by REPLOT (Sec 5.1) later on you must replot the plot
    after exiting the break.  In order to get your plot replotted in
    the new environment you have set up, just type EXIT; followed by
    a tab.

2.7) PLOTBELL

If you find the dinging of the bell annoying, you can shut it off by
    doing PLOTBELL:FALSE; (Its default value is TRUE.)

2.8) Quitting

While your plot is coming out your terminal is in a rather strange
    state (e.g., not echoing characters).  Thus it is OK to type ahead
    to Macsyma, but the ONLY way you should interrupt the plot is
    with ^G.  E.g., do not use ^A until the plot has finished.

Note:  The chars to create a plot get put in a buffer and normally
only get sent when the buffer is full or when the plot is complete.
The user can force the buffer contents to be sent by typing ^\
(control-shift-L on the Tektronix, control-\ on the imlac).  (This is
probably only of use to to users of WORLDPLOT, which because of its
ridiculously inefficient implementation will sometimes wait until it
has gone thru the whole world before sending anything out.)  Note
however that this feature is not reliable.
3) 3D plotting
	1) PLOT3D
	2) GRAPH3D
	3) NOT3D
	4) PERSPECTIVE, REVERSE, VIEWPT and CENTERPLOT
	5) CROSSHATCH and UNDERSIDE
	6) HIDE, \3D, CONTOUR and NOT3D
	7) PLOTNUM0 and PLOTNUM1

3.1) PLOT3D

Easy example
  PLOT3D(EXP(-X^2-Y^2)*X, X, -2, 2, Y, -1.5, 2.5);  Plots
	exp(-X^2-Y^2)*X as X takes on PLOTNUM values between -2 and 2
	and y takes on PLOTNUM1 values between -1.5 and 2.5.

Complete description

PLOT3D(<z-exprs>, <x-var>, <var-range>, <y-var>, <var1-range>,
    <optional-args>); makes a 3 dimensional plot of <z-exprs> against
    <x-var> and <y-var>.  the plot consists of curves of <y-exprs>
    against <x-var> (the x coordinate) with <y-var> (the y
    coordinate) held fixed.  Perspective is used and curves further
    away from the viewer have those parts of them which are hidden by
    the closer curves removed.

The format of <y-exprs> is the same as for PLOT2.  The context of
    evaluation is FLOAT(EV(<expri>, <x-var>=<value gotten from
    var-range>, <y-var>=<value gotten from var1-range>, NUMER))

The format for <var-range> and <var1-range> is the same as for PLOT2
    except that if <var1-range> is of the form <low>, <high> then
    <y-var> will take on PLOTNUM1 values.

The format of <optional-args> is the same as for PLOT2 except that an
    additional options NOT3D (Sec 3.3), \3D, CONTOUR are available
    (Sec 3.6).

PLOT3D(<z-funs>, <var-range>, <var1-range>, <optional-args>); This is
    analogous to the alternative form for PLOT2.  <z-funs> must be a
    function or list of functions of 2 arguments, which must return a
    floating point argument when given floating point (integer, if
    the INTEGER argument is used for either <var-range> or
    <var1-range>) arguments.  The functions must be translated or
    compiled.  If you expect to make several 3D plots this form is
    recommended.

Easy example
  TRANSLATE:TRUE;		causes automatic translation
  G(X, Y) := (MODEDECLARE([X,Y], FLOAT), EXP(-X*X-Y*Y));
  PLOT3D(G, -2, 2, -2, 2);	define a function G and plot it

3.2) GRAPH3D

GRAPH3D(<x-lists>, <y-lists>, <z-lists>, <optional-args>); Right now
    this is at a fairly rudimentary stage.  It takes 3 arguments where
    GRAPH2 took 2 and interprets them as lists of x, y and z points
    which it uses to draw lines using the 3d transformations.  It can
    be used to add lines (e.g., axes) to your 3D plot (see SAME option
    (Sec 10.2)).  The hidden line routines are not used.

3.3) NOT3D

Easy example
  PLOT3D(SIN(X)+A, X, -%PI, %PI, A, [-2,3,4,6], NOT3D); plots
	sin(X)+A for X from -%PI to %PI (PLOTNUM points) and A taking
	the values in the list.  This is equivalent to:
	PLOT2([SIN(X)-2,SIN(X)+3,SIN(X)+4,SIN(X)+6], X, -%PI, %PI);
	but requires less typing.

Complete description

The additional NOT3D argument to PLOT3D, causes exactly the same
    points as in the bare PLOT3D to be calculated.  Instead of
    plotting a 3-dimensional representation of the data, the data is
    plotted in a 2D one.  Specifically 1 2D curve of z vs.  x for each
    y value and so is a convenient way to plot several curves on the
    same plot.

3.4) PERSPECTIVE, REVERSE, VIEWPT and CENTERPLOT

These options govern the type of perspective view given.

PERSPECTIVE, if FALSE causes a non-perspective view to be taken.  This
    is equivalent to extending the viewing position out to infinity
    along a line connecting the origin and VIEWPT.

REVERSE, if TRUE cause a left-handed coordinate system to be assumed.

VIEWPT and CENTERPLOT determine the perspective view taken.  They are
    defaulted to be unbound - like XMAX etc.)  VIEWPT may be set to a
    list of 3 numbers and gives the point from which the projection
    should be made.  CENTERPLOT may likewise to set to a list of 3
    numbers and gives a point on the line of sight.  The projection
    will be made onto a plane perpendicular to a line joining VIEWPT
    and CENTERPLOT.

If VIEWPT and CENTERPLOT are unbound (the default) then they will be
    chosen as follows:  the extreme values of the coordinates are
    determined.  This gives the two points min:  [xmin,ymin,zmin],
    max:[xmax,ymax,zmax].  CENTERPLOT is chosen as (min+max)/2 and
    VIEWPT is chosen as max+3*(max-min).  The view is then one in
    which the z axis is vertical, the x axis is increasing towards
    you to the left and the y axis is increasing towards you to the
    right.

If CENTERPLOT is FALSE then the old type of perspective view will be
    given (like setting the x and z components of CENTERPLOT to the
    corresponding components of VIEWPT).

Before you set either VIEWPT or CENTERPLOT you might want to look at
    the values of VIEWPT1 or CENTERPLOT1, the values that PLOT3D
    assumed in doing the previous plot [see (Sec 8.4)].  Likewise
    XMAX3D, YMIN3D etc.  will be the values of xmax, ymin for the data
    points, that PLOT3D used to determine the default VIEWPT or
    CENTERPLOT.

If rather than changing the view you want to change the scale of the
    plot (to cause clipping or whatever), then you must change XMAX,
    XMIN, YMAX or YMIN (Sec 8.2).  However note that these numbers
    refer to the size of the plot AFTER the perspective routines have
    been used.  So again you will probably want to look at XMAX1 etc.
    to find what had been assumed.

Read also about REPLOT (Sec 5.1).  This allows you to rapidly explore
    a 3D plot by doing for instance PLOT3D(...); VIEWPT :  [...];
    REPLOT(); VIEWPT :  [...]; REPLOT(); etc.

Example
  PLOT3D(EXP(-X^2-Y^2)*X, X, -2, 2, Y, -1.5, 2.5, DONT);
	recreate easy example of (Sec 3.1).  Use DONT (Sec 12.5) to
	suppress plotting.
  VIEWPT : [-2.1,3,.05];	take a "closer" look.
  REPLOT();
  KILL(VIEWPT);

3.5) CROSSHATCH and UNDERSIDE

As a default PLOT3D will crosshatch, i.e., plot lines of constant x as
    well as constant y.  You can turn this off by doing CROSSHATCH:
    FALSE; (it will then plot only lines of constant y)

If UNDERSIDE is TRUE (the default) PLOT3D will show the underside of
    a figure (when it is visible).

Example (continued from previous section)
  CENTERPLOT:CROSSHATCH:FALSE;
  REPLOT();

3.6) HIDE, \3D, CONTOUR and NOT3D

Internally the plots generated by PLOT3D (with or without the NOT3D
    option), GRAPH3D and CONTOURPLOT2 (Sec 4.1) are the same and it
    is possible to switch between any of the 4 representations.

The 4 representations are accessible directly in the following ways
	(i) Hidden-Line		PLOT3D, GRAPH3D(..., HIDE)
	(ii) 3D (Hidden lines not removed) PLOT3D(..., \3D), GRAPH3D
	(iii) Contourplot	PLOT3D(..., CONTOUR), CONTOURPLOT2
	(iv) Not3d		PLOT3D(..., NOT3D)
    (In the above GRAPH3D(..., HIDE) means supply GRAPH3D with an
    optional argument of HIDE)

There are two ways of changing representations once the plot has been
    made.  In a ^A break, or using the REPLOT (Sec 5.1) function.

In a ^A break there are 2 variables which govern the representation
    \3D and TXTYPE (Sec 13.1).  (These variables are local to the ^A
    break.)  They should be reset according to the following table

			value of \3D	value of TXTYPE
	Hidden-Line	HIDE		FALSE
	3D		TRUE		FALSE
	Contourplot	CONTOUR		FALSE
	Not3d		FALSE		NOT3D

    (Note that TXTYPE only need to be touched switching to and from
    the Not3d representation.  It is a misfeature that it should have
    to be touched at all and this may be corrected someday.)

Having exited the plot, you can have it REPLOT'ed in another
    representation by using the following table.

	Hidden-Line	REPLOT(TRUE, HIDE);
	3D		REPLOT(TRUE, 3D);
	Contourplot	REPLOT(TRUE, CONTOUR);
	Not3d		REPLOT(TRUE, NOT3D);

    Again, as a misfeature when swapping from a Not3d representation
    to a Contourplot it necessary to supply an additional optional
    argument LIN (thus REPLOT(TRUE, CONTOUR, LIN);) The TRUEs in the
    calls to replot indicate the last plot.  The name of a named plot
    (Sec 12) may be used instead (see (Sec 5.1) for details).

Example (continued from previous section)
  REPLOT(TRUE,CONTOUR);

3.7) PLOTNUM0 and PLOTNUM1

If the <low>, <high> form is used with <var1-range> in PLOT3D, the
    <y-var> takes on PLOTNUM1 values.  PLOTNUM1 defaults to 20.  Since
    PLOTNUM*PLOTNUM1 points are normally calculated when PLOT3D is
    called, the alternative form (Sec 3.1) for calling PLOT3D is
    highly recommended.

Normally when the <low>, <high> form of <var-range> is used in PLOT3D
    the <x-var> takes on PLOTNUM values.  However if PLOTNUM0 is bound
    to a numeric value, then PLOTNUM0 points are plotted instead.
    PLOTNUM0 is initially unbound.  For example, if you normally like
    fairly high definition two-dimensional plots, but can't afford to
    wait for comparable resolution three-dimensional plots, you could
    set (PLOTNUM:100, PLOTNUM0:PLOTNUM1:20);
4) Contour plotting
	1) CONTOURPLOT2
	2) CONTOURS, ZMAX and ZMIN
	3) LABELCONTOURS

4.1) CONTOURPLOT2

Easy examples
  CONTOURS:10;		Do 10 contours
  LABELCONTOURS:FALSE;	Don't label the contours
  CONTOURPLOT2(Y^2/2+COS(X)+X/2, X, -6, 6, Y, -3, 3); Do a contour
	plot of Y^2/2+cos(X) as X takes PLOTNUM values between -6 and
	6 and as Y takes PLOTNUM1 values between -3 and 3.  (This
	gives you the phase space orbits of a particle in a periodic
	potential superimposed on a constant field).
  PLOT3D(Y^2/2+COS(X)+X/2, X, -6, 6, Y, -3, 3, CONTOUR); The same
  CONTOURS:[0];		Plot only the zero contour.
  CONTOURPLOT2([REALPART((X+%I*Y)^3-1), IMAGPART((X+%I*Y)^3-1)], X,
	-1.5, 1.5, Y, -1.5, 1.5, [0,1]); Finds the zeroes of Z^3=-1
	in the complex plane.
  CONTOURS:PLOTNUM:PLOTNUM1:10;	Work with a 10x10 grid
  CONTOURPLOT2(RANDOM(100), X, 0, 1, Y, 0, 1);	Plot something random

Complete description.

CONTOURPLOT2(...); is exactly the same as PLOT3D(..., CONTOUR).  That
    is it calculates the same points as PLOT3D(...)  would, but
    displays the points as a contour plot.  What contours are drawn is
    governed by the variable CONTOURS (Sec 4.2).  Changing CONTOURS
    does not require any more points to be calculated, so it makes
    sense to change CONTOURS in the ^A break after a plot (Sec 2.6)
    or before using REPLOT (Sec 5.1).  The contours are drawn using
    linear interpolation, so they tend to look rough (especially near
    saddle points) unless PLOTNUM (or PLOTNUM0) and PLOTNUM1 are
    large.  The contour tracking algorithm is quite smart so all
    contours should either terminate at the boundaries of the region
    or be closed loops.

4.2) CONTOURS, ZMAX and ZMIN

If CONTOURS is a positive integer (the default value is 20), then
    approximately CONTOURS contours will been drawn and the levels
    will be "nice" values.  ("Nice" means in multiples of a*10^n,
    where "a" is 1, 2, or 5.  The levels are computed by the same
    function that determines where to put the tick marks on the axes
    (Sec 7.2).)  The contour levels are chosen between the maximum and
    minimum z values to be plotted (the first argument to
    CONTOURPLOT2 and PLOT3D is considered to be a z variable).  If
    either ZMAX or ZMIN has a value then that value will be used
    instead of the actual maximum or minimum.  (The default is for
    ZMAX and ZMIN to be unbound; that's done by KILL(ZMAX, ZMIN);)

If CONTOURS is a negative integer then ABS(CONTOURS) evenly spaced
    contours will be drawn.  In this case the levels will be at
    "nasty" values and you may want to set LABELCONTOURS to FALSE, to
    suppress the printing of long numbers on the contours.  Again the
    range for these contours can be restricted by setting ZMAX and
    ZMIN appropriately.

If CONTOURS is a list of numbers (e.g., CONTOURS:[1,.5,%PI];) then
    those numbers will be used to determine the heights of the
    contours.  The number in the list can be in any order.

4.3) LABELCONTOURS

CONTOURPLOT2 will label the contours will their height unless
    LABELCONTOURS is FALSE.  PLOTNUMPREC (Sec 6.4) digits of precision
    are given.
5) Other plotting functions
	1) REPLOT
	2) PLOTMODE
	3) CLEAR
	4) HARDCOPY
	5) PLOTRESET

5.1) REPLOT

Easy examples
  PLOT2(1, X, 0, 2*%PI);	Plots a straight line
  REPLOT(TRUE, POLAR); Plots it in polar coordinates (Sec 13.1).  This
	will appear as an ellipse unless EQUALSCALE:TRUE (Sec 8.3)
  EQUALSCALE:TRUE;
  REPLOT(); Replots the ellipse with EQUALSCALE equal to TRUE; this
	will then appear as a circle.

Complete Description

REPLOT(<plotname>, <optional-args>); replots the plot named
    <plotname> (Sec 12).  REPLOT(TRUE); and REPLOT(); both replot the
    last plot.  If any of the options for determining the scale, etc.
    have been changed since the plot was saved the new values of
    those options will be used.

If the arrays of <plotname> were destroyed either by a
    KILLPLOTS(<plotname>); (Sec 12.4) or by SAVE'ing <plotname> and
    LOADFILE'ing it into another MACSYMA, REPLOT checks to see if
    <plotname> was ever saved using the SAVEPLOTS command (Sec 12.2),
    if it was it finds the <filespec> under which it was saved and
    then attempts a LOADPLOTS(<filespec>); (Sec 12.3) (but taking
    care not to change the current file defaults) and replots
    <plotname> if it was found in the file.

<optional-args> may be any of the optional arguments to the main
    plotting functions.  These optional args will be merged in with
    those supplied to the original plot.  (The exceptions are FIRST,
    LAST and SAME (Sec 10.2), TOP, BOTTOM, LEFT and RIGHT (Sec 10.4),
    and DONT (Sec 12.5).  These optional argument don't stick around
    with the plot.)  If you want the last plot replotted with some
    optional args supplied you must use the form REPLOT(TRUE,
    <optional-args>); (REPLOT(<optional-args>); won't work because it
    will try and use the first optional arg as a <plotname>).

There are two additional optional arguments that it makes sense to
    give to REPLOT, but not to the original plotting function.  They
    are NONE, to suppress a label (Sec 6.1) and LIN, to suppress a
    transformation (Sec 13).

REPLOT(<list-of-plots>, <optional-args>); where <list-of-plots> is
    [<plotname1>, <plotname2>, ...  ] is identical to
    (REPLOT(<plotname1>, <optional-args>), REPLOT(<plotname2>,
    <optional-args>)); If the first arg to REPLOT is atomic then it
    is evaluated and the evaluated form is used if is a list.

Example
  REPLOT(PLOTS);	Replots all named plots (Sec 12.6).

5.2) PLOTMODE

Easy example
  PLOTMODE(DISPLAY, XGP); Set things up for plotting on the XGP and a
	datapoint.

Complete description

PLOTMODE(<dev1>, <dev2>, ...  ); sets PLOT2 up to plot on the devices
    specified by <devi>.  at present <devi> can be one of T (or TEK or
    TEKTRONIX), I (or IMLAC), GR (or GRINNELL), D (or DISPLAY), P (or
    PRINTING), X (or XGP), G (or GOULD), or V (or VERSY or VERSATEC)
    for Tektronix, Imlac, a display console, printing terminal, the
    XGP, the Gould in 38-246, or an MFE-NET Versatec.  Any number of
    arguments may be given with the restriction that no 2 of [I, T,
    GR, D, P] appear together.  The arguments may appear in any order,
    with the first argument being used to determine what the
    character size will be assumed.  The defaults performed when PLOT2
    is loaded is PLOTMODE(T), PLOTMODE(I), PLOTMODE(D) or
    PLOTMODE(P), depending on the terminal type [see (Sec 15.3) for
    details]

Details of the peculiarities of the various devices in given in (Sec
    11).

PLOTMODE:<dev>; PLOTMODE:[<dev1>, <dev2>, ...  ]; are equivalent to
    PLOTMODE(<dev>) and PLOTMODE(<dev1>, <dev2>, ...); respectively.
    This allows you the bind PLOTMODE (e.g., in a BLOCK).

PLOTMODE; returns a list of the devices PLOT2 currently is plotting
    for.  PLOTMODE(); also does this.

5.3) CLEAR

CLEAR(); clear the screen

5.4) HARDCOPY

HARDCOPY(); queues up the plot for the appropriate device if PLOTMODE
    contains GOULD, XGP, or VERSATEC, else it sends out a hardcopy
    signal to the Tektronix if PLOTMODE contains TEKTRONIX, else it
    prints "HARDCOPY failed".  This is what happens when you type a
    linefeed at the end of a plot.

HARDCOPY(<plot-spec>); If <plot-spec> is a list, then it is assumed
    that it is the name of a plot file as produced by NAMEFILE (Sec
    11.5).  If the current plotmode specifies a non-terminal device
    (i.e., one of XGP, Gould, or Versatec), then the file is queued
    for printing on that device.  If <plot-spec> is not a list, then
    it should be TRUE (for the last plot) or a named plot produced by
    NAMEPLOT (Sec 12.1) or <rubout> at the end of the plot (Sec 2.5).
    In this case REPLOT(<plot-spec>); HARDCOPY(); is done

HARDCOPY(<plot-spec>, <plotmode>); where <plotmode> is one of XGP,
    GOULD, or VERSATEC, or one of the abbreviations of these, is
    equivalent to BLOCK([PLOTMODE:<plotmode>],HARDCOPY(<plot-spec>));

If the variable HARDCOPY (default FALSE) is TRUE, then a HARDCOPY();
    is done after each plot (as long as WAIT is also TRUE).  In this
    case a linefeed does nothing.  HARDCOPY is not reset by
    PLOTRESET();.  This switch allows PLOT2 to run in "batch" mode.
    Put your program in a BATCH file and preface it with for
    instance:  (PLOTMODE:'XGP, TTYOFF:HARDCOPY:TRUE); Then once the
    batch has started up, you can do ^Z, :PROCEED, :DISOWN.  This
    isn't necessarily the best way of operating because your plots
    may well get lost in the mess around the XGP.  If this is a
    problem then use NAMEFILE after each plot and queue them to be
    printed at a more convenient time.

5.5) PLOTRESET

PLOTRESET(); resets most of the options effecting plotting back to
    their default values.  The exceptions are the terminal related
    options.  See (Sec 15.1) for details.
6) Labels
	1) XLABEL, YLABEL, TITLE and NONE
	2) LABEL
	3) NOPRINT
	4) PLOTNUMPREC
	5) DATEPLOT

6.1) XLABEL, YLABEL, TITLE and NONE

Easy example
  PLOT2(EXP(X), X, 0, 3, X, EXP(X), "THIS IS A PLOT OF EXP(X) VS. X");
	plots a curve of exp(X) with an x-label of "X", a y-label of
	"EXP(X)" and a title of "THIS IS A PLOT OF EXP(X) VS. X" (the
	labels don't appear with the "'s)
  A:3;
  PLOT2(SIN(X)+A, X, -%PI, %PI, FALSE, FALSE, LABEL(A)); plots
	sin(X)+A and sticks an the title "A=3".
  PLOT2(SIN(X), X, -%PI, %PI, FALSE, SIN(X)); labels the y-axis with
	"SIN(X)".

Complete description

<xlabel>, <ylabel>, <title> If the optional arguments to the plotting
    functions aren't any of the recognized keywords (FIRST, LAST
    etc.)  they are taken to be specifications for the x-label,
    y-label and the title of the plot.  If it is (a) an atom, (b) of
    the form 'FOO or '(...), (c) of the form EV(...)  or CONCAT(...)
    or LABEL(...)  (Sec 6.2), then the label gets evaluated, else it
    is used literally.  [Note that the evaluation of 'FOO is FOO for
    all FOO, so if you want to get a label of FOO and FOO has a value
    use 'FOO.  ("FOO" also works in most instances.)]

If one of them is FALSE then nothing gets printed.  Only as many of
    the three to be non-ambiguous need be specified; thus if only a
    y-label is required then FALSE, <ylabel> would be sufficient.
    None of these options may be a list (to avoid confusion with the
    line-type list (Sec 9.1).

Within a ^A break at the end of a plot (Sec 2.6), the x-label,
    y-label and title of the current plot are the values of the local
    variable XLABEL, YLABEL and TITLE.  These variable will be FALSE
    if there is no corresponding label.  You can change the values of
    these variables in the ^A break and they will be incorporated into
    your plot when you exit the break and type a tab (Sec 2.3).

In the optional arguments to REPLOT (Sec 5.1) FALSE has the meaning
    "Don't change the corresponding label".  If it is desired to
    remove a label when REPLOTting then NONE should be given instead.

Examples
  PLOT2(SIN(X), X, -%PI, %PI, FALSE, FALSE, "THE CAT SAT ON THE MAT");
	title is set to "THE CAT SAT ON THE MAT"
  REPLOT(TRUE, "X-AXIS");
	title is "THE CAT SAT ON THE MAT" and x label is "X-AXIS"
  REPLOT(TRUE, FALSE, "SIN(X)", NONE);
	x label is "X-AXIS", y label "SIN(X)" and no title
  REPLOT(TRUE, FALSE, "Y-AXIS"); replots with new ylabel.

6.2) LABEL

This is a special form of CONCAT for use with PLOT2.  It takes any
    number of arguments and returns an atom containing the arguments
    concatenated together.  It differs from CONCAT in the following
    respects:
    (i) It sticks spaces between the items.
    (ii) The arguments needn't be atoms.
    (iii) If an argument is of the form 'FOO, then FOO appears in the
	result.
    (iv) Otherwise it evaluates the arguments.  Then if the evaluation
	is different from the argument <arg>=<evaluation> appears in
	the result, else just <evaluation>.
    (v) In (iv) if <evaluation> is a floating point number then only
	PLOTNUMPREC (Sec 6.3) sig.  figs.  of it appear in the answer.
    The label is evaluated inside an ERRCATCH, so if you have an
    error in the evaluation of your label, you will see an error
    message, but the plot will still come out (with no label where
    you goofed).

Example
  PHASE:EV(%PI, NUMER);
  AMPLITUDE:2;
  PLOTNUMPREC:5;
  PLOT2(AMPLITUDE*SIN(X-PHASE), X, 0, 2*%PI, LABEL(AMPLITUDE, PHASE));
	produces a plot with an XLABEL of "AMPLITUDE=2 PHASE=3.1416"

6.3) NOPRINT

As a default the 2D plotting functions include a line at the bottom
    with the Max and Min of X and Y printed.  NOPRINT:TRUE; causes
    this line to be suppressed.

6.4) PLOTNUMPREC

The numbers that PLOT2 prints out in the Min and Max line at the
    bottom of the plot (Sec 6.3), in the Min and Max labels on the
    axes (Sec 7.1), in LABEL (Sec 6.2) and on the contours (Sec 4.3)
    are given to a precision of PLOTNUMPREC significant figures.
    (This is done using JONL's FFORMAT package on LIBLSP;) A trailing
    ".0" is stripped off so that "2" is printed instead of "2.0".  The
    default is to give the numbers to full precision.  If you want to
    have less precision given (particularly useful with the labelling
    of contour levels) set PLOTNUMPREC to a smaller number (say 2 or
    3).

6.5) DATEPLOT

The date is normally given at the top right corner of the plot, in a
    long form if no title is specified, or in a shorter form if a
    title is specified.  Sometimes the date overlaps with the title.
    You can shut off the printing of the date by doing
    DATEPLOT:FALSE;
7) Axes
	1) XAXIS and YAXIS
	2) TICKSIZE and TICKNUM

7.1) XAXIS and YAXIS

The default action of PLOT2 for 2D plots is to provide the plots with
    x and y axes (which go through the origin if the origin is within
    the plot) to give the axes approximately 10 tickmarks in
    reasonable places to give the max and min values of x and y by
    the axes and on a line beneath the plot.

XAXIS:FALSE; YAXIS:FALSE; cause the x axis and y axis not to be
    drawn.  Their tickmarks will not be drawn either.  The other values
    these options can take are:
    TRUE draw the axis and the tick marks;
    ALL (the default) draw the axis, the tick marks and give the max
	and min values of this coordinate.

7.2) TICKSIZE and TICKNUM

TICKNUM:<no-of-ticks>; TICKSIZE:<size-of-ticks>; causes TICKNUM ticks
    to be given on each axis.  The size of the ticks will be TICKSIZE
    raster units either side of the axes.  The ticks will always come
    at "nice" values of the x or y variable.  "Nice" values are
    defined to be multiples of <k>*10^<n> where and <n> are integers
    and <k> is 1, 2 or 5.

TICKSIZE:0;  results in there being no ticks and

TICKSIZE:2000; results in the ticks going all the way across the
    WINDOW (Sec 8.1), causing the ticks to turn into grids.

Setting TICKNUM to a negative number causes about abs(TICKNUM) ticks
    to be drawn, but PLOT2 won't round the max and min values on your
    axes to the nearest tickmark.

Both TICKSIZE and TICKNUM may be lists of two numbers the first
    referring to the ticks on the xaxis and the second to the ticks
    on the y axis.

Example
  TICKNUM:10;  (the default)
  PLOT2(X, X, 5, 25);  gives scales from 4 to 26 on the x and y axes
  TICKNUM:[-10,5];  the -10 refers to the x axis and 5 to the y axis
  TICKSIZE:[6,2000];
  REPLOT();	(Sec 5.1) replots the last plot with grid line every
	multiple of 5 up the y axis, and tickmarks every multiple of 2
	along the x axis.  Both scales go from 5 to 25.

As yet no axes are provided for 3D plots.  Suggestions for their
implementation are welcome.
8) Scales
	1) WINDOW
	2) XMIN, XMAX, YMIN and YMAX
	3) EQUALSCALE
	4) WINDOW1, XMIN1 etc.

If the user takes no action the scale of his plots will be chosen for
him.  in general the scale will be as large as possible, while still
allowing everything to fit on the screen.  the user is provided with
various ways of overriding the default settings for the scales:

8.1) WINDOW

WINDOW:[<min-x>, <max-x>, <min-y>, <max-y>]; This sets the area of
    the screen that PLOT2 tries to plot in.  The elements of the list
    are in raster units.  The maximum permissible size of the WINDOW
    is [0,1023,0,1023]; garbage will be produced if the WINDOW is
    larger than this.  If PLOT2 tries to plot outside the window, the
    plot will be clipped correctly.  If WINDOW is unbound then the
    default settings will be used (corresponding to the full
    tektronix screen), thus you can get back the default value be
    doing KILL(WINDOW);

8.2) XMIN, XMAX, YMIN and YMAX

In choosing the scale for a plot PLOT2 looks at the maximum and
    minimum values of x and y of the points it has calculated.
    However if one of XMIN, XMAX, YMIN, YMAX has a numeric value then
    that value will be used instead of the one found from the points
    themselves.  As with WINDOW do KILL(XMIN, etc) to get back to the
    default values.  The maximum and minimum values of x and y that
    PLOT2 obtains are rounded up and down to the nearest tick mark,
    unless TICKNUM is negative (Sec 7.2).

8.3) EQUALSCALE

EQUALSCALE:TRUE; tells PLOT2 to ensure that the scales are the same
    in both directions.  Thus if the WINDOW is rectangular, a circle
    will normally appear as an ellipse, whereas with EQUALSCALE:TRUE
    it will appear as a circle.

8.4) WINDOW1, XMIN1 etc.

All the plotting options whose default state is unbound (e.g., XMAX,
    WINDOW) have corresponding options obtained by sticking a "1" on
    the end (e.g., XMAX1, WINDOW1).  These options should only be read
    (not set), and their values may be loosely defined to be the
    value that PLOT2 assumed for the option.  The value will only be
    right if PLOT2 needed to calculate it.

Example
  PLOT2(X, X, 0, 10.1);  YMAX; ==> YMAX
  YMAX1; ==> 11.0 (the max value of y on the y axis)

Variables in this class are:
    XMAX1, XMIN1, YMAX1, YMIN1.  These refer to the quantities after
	the transformation functions (Sec 13) have been applied, and
	after rounding to the nearest tickmark.
   ZMAX1, ZMIN1.  Only of use for contour plots (sec 4).  Equal to
	ZMAX and ZMIN if they have values.  Equal to the max and min
	values of the first argument to CONTOURPLOT2, if ZMAX and
	ZMIN are unbound.  There values are meaningless if CONTOURS is
	a list, since then CONTOURPLOT2 doesn't need to compute zmax
	and zmin.
    WINDOW1.  The window in which plotting is done.  Does not include
	the room used by titles etc.
    XMAX3D, XMIN3D, YMAX3D, YMIN3D, ZMAX3D, ZMIN3D.  Only of use for
	3D plots (Sec 3).  These are the values of the 3D data before
	transforming it to 2d.  This will only be up to date
	information if PLOT3D needed to calculate it to determined
	either the default VIEWPT or the default CENTERPLOT.)
    VIEWPT1, CENTERPLOT1.  Only of use with 3d plots.  Useful to look
	at before you change VIEWPT or CENTERPLOT.

These variables are especially important when changing the scale of
    3D plots (Sec 3), because YMAX etc.  refer to the values after the
    perspective transformations, and so may be quite unrelated to the
    data points.

Example
  PLOTNUM:PLOTNUM1:20;
  PLOT3D(1/(X^2+Y^2), X, -3, 3, Y, -3, 3);	Has a big peak in the
	middle which we wish to clip
  YMAX1; ==> -0.896...
  YMIN1; ==> -0.957...
  YMAX:-0.92;	Try a value of YMAX about 1/2 way between the old YMAX
	and YMIN
  REPLOT();	Replot on new scale.
9) Line types
	1) TYPEL
	2) DEFINEDASH
	3) DEFINESYMBOL

9.1) TYPEL

Easy examples
  PLOT2([SIN(X), COS(X)], X, -%PI, %PI, [0,1]);	Plots sin(X) with line
	type 0 (a solid line) and cos(X) with line type 1 (a dashed
	line)
  PARAMPLOT2(RANDOM(), RANDOM(), X, 0, 1, [19]);	Plots PLOTNUM
	"random" points with symbol 1 (no connecting lines drawn)
  TT:[0,1,2,3,4,5,6,7,8];
  PLOTNUM1:9;
  PLOT3D(SIN(X)+A, X, -%PI, %PI, A, 0, 2, TT, NOT3D);	Gives the full
	repertory of line types
  TT:9+10*(TT+1);	TT is now [19,29,39 ... ]
  REPLOT(TRUE, TT);	Gives the full repertory of symbol types.

Complete description

If a list (or an atom that evaluates to a list) appears as an
    optional argument to a plotting function, then that list is taken
    as a specification of the line type to be used for the plot.  The
    elements of the list are evaluated once and the elements of the
    resultant list must be all integers.  If this list has the form
	[<type1>, <type2>, ..., <typei>, ..., <typek>]
    then the i'th curve is to be plotted with line of type <typei>.
    The (k+1)th curve is plotted with line of type <type1> etc.
    Omitting this optional argument is the same as specifying [0],
    i.e., all the curves are plotted with line of type 0 (i.e., solid
    line with no symbols).

The curves drawn by the PLOT2 functions may be drawn as 1 of 9 types
    of dashed line, with 1 of 9 types of symbol drawn at the data
    points.  In general the line type <typei> is of the form of a
    decimal number abbcd where a b c and d are digits between 0 and 9
    (leading 0's may be omitted of course) and have the following
    meanings:

    d = line-type.  (specified by the DEFINEDASH (Sec 9.2) command)
	Line-type 0 (the default) is defined as being a solid line
	Line-type of 9 defaults to meaning no line
    c = symbol-type.  The symbol is defined by the DEFINESYMBOL (Sec
	9.3) command Symbol 0 is defined to mean no symbol Symbol 9
	is defined to mean a dot.
   bb = number of data points with no symbol between the data points
	with a symbol.  If bb = 99 then bb is set to PLOTNUM-1.  If bb
	= 98 then bb is set to PLOTNUM-2.  (PLOTNUM is taken here to
	mean the number of point in the plot.)
    a.  the first symbol is put at data point number 1 if a = 0 and
	at bb+2-a otherwise.

Examples
abbcd =  0 ==> plain line
        10 ==> symbol 1 at every pt + plain line
        19 ==> symbol 1 at every pt
	99 ==> a dot at every point
       124 ==> symbol 2 at every other pt + line 4
      9874 ==> line 4 with symbol 7 at endpoints
      9974 ==>   "     "    "     " at first point
     19974 ==>   "     "    "     " at last point
  PLOT3D(2*X^2+A, X, -0.95, 0.95, A, 0, 7, INTEGER, NOT3D,
	[0,10,19,99,124,9874,9974,19974]);	Try them out

9.2) DEFINEDASH

DEFINEDASH(<line-no>, <line-spec>); redefines line number <line-no>
    according to <line-spec>.  <line-spec> may be one of the
    following:
    FALSE then the line is defined to be a solid line.
    TRUE then no line is drawn (useful in conjunction with a symbol).
    A list which defines a sequence of line segments separated by
	gaps.  Example:  DEFINEDASH(3, [1,5,5,5]); defines line 3 to
	start with 1 raster position on, 5 off, 5 on, 5 off, 1 on, 5
	off etc.
    A character (e.g., A, "1", \$) or its ASCII value.  This defines
	the character to be used for line <line-no> when plotting on
	printing or display consoles, see (Sec 11.4).  In order to
	specify no line give 0 as the second argument (not space or
	32, as this will cause existing lines, axes etc, to get
	over-written and, maybe erased, by spaces).
    <line-no> must lie between 0 and 9.

Note that dashed lines are implemented by drawing a sequence of small
undashed lines.  Since these lines are about 4 - 10 raster units long,
there are only a small number of directions in which they can point
and the chances are that none of these directions coincide with the
direction of the dashed line as a whole.  Hence dashed lines often
appear to weave about.

9.3) DEFINESYMBOL

DEFINESYMBOL(<symbol-no>, <symbol-spec>); redefines symbol number
    <symbol-no> according to <symbol-spec>.  <symbol-spec> may one of
    the following:
    FALSE meaning no symbol
    TRUE meaning a point
    A list of lists given a sequence of setpoint and vector commands
	(relative to starting position) to be used in drawing the
	symbol.  Example:
	DEFINESYMBOL(3, [[5,5], [5,-5,-5,-5,-5,5,5,5], [0,0],
	[0,0]]); This defines symbol 3 to be drawn by a setpoint to
	5,5 (relative to the starting position) following by vectors
	to 5,-5; -5,-5; - 5,5; 5,5, followed by setpoint to origin
	and a vector to origin.  this will draw a box with a dot in
	it.  The numbers are in raster positions.  DEFINESYMBOL should
	always end with a setpoint or vector to [0,0].
    A character or its ASCII value.  This is interpreted the same way
	as for DEFINEDASH.

Example
  DEFINESYMBOL(1, [[0,9], [4,-6,-7,2,7,2,-4,-6,0,9], [0,0]]);
	This defines symbol 1 to be a 5 pointed star.
  PLOT2(1,X,0,2*%PI,POLAR,[19]);
10) Plotting several curves
	1) CLEAR and WAIT
	2) FIRST, LAST and SAME
	3) REPLOT4
	4) TOP, BOTTOM, LEFT and RIGHT

10.1) CLEAR and WAIT

By governing when PLOT2 clears the screen it is possible to either
    superimpose plots or have plots come out in different parts of
    the screen.

CLEAR:FALSE; causes the screen not to get cleared before starting a
    new plot.

WAIT:FALSE; causes PLOT2 not to wait for a character to be typed
    after finishing a plot.

Example
  (CLEAR:TRUE, WAIT:FALSE,	turn on clearing, turn off waiting
   PLOT2(..),		the screen will be cleared
   CLEAR:FALSE,		turn off screen clearing
   PLOT2(..),		plot more stuff
   GRAPH2(..), etc.,
   WAIT:TRUE,		turn waiting back on
   PLOT2(..),		last plot
   CLEAR:TRUE);		reset CLEAR

Much more convenient ways are provided for doing this.  See (Sec 10.2)
and (Sec 10.3)

10.2) FIRST, LAST and SAME

All these three are possible optional args to the plotting functions
    and to REPLOT.  These optional arguments are non-sticky; the fact
    that they were supplied is not remembered by REPLOT, although you
    can supply them to REPLOT.

FIRST or LAST.  This says that this plot is to be the first (or last)
    of a series of plots that are to be superimposed or plotted in
    different parts of the screen.  They work by setting the WAIT and
    CLEAR flags (Sec 10.1) to achieve the right effect.  (FIRST sets
    CLEAR to TRUE and WAIT to FALSE before plotting and CLEAR to
    FALSE after plotting.  LAST sets WAIT to TRUE before plotting and
    CLEAR to TRUE after plotting.

Example
  In order to get 4 plots out in different corners of the screen a
	typical sequence might be:
  (WINDOW:<window1>, PLOT2(..., FIRST),
   WINDOW:<window2>, PARAMPLOT2(...),
   WINDOW:<window3>, REPLOT(...),
   WINDOW:<window4>, GRAPH2(..., LAST),
   KILL(WINDOW));

Obviously it is necessary to use a compound statement to prevent the
printing of unwanted cruft on the screen.  Since plotting 4 graphs
together is quite common, the REPLOT4 (Sec 10.3) command is provided to
do that automatically.

SAME. This tells PLOT2 to plot this plot on the same scale as the
    previous plot and in the same WINDOW (Sec 8.1).  Plotting of axes
    and printing of the date and the line giving XMAX etc is
    suppressed.  The intention is to allow the convenient
    superposition of plots.  Specification of a title and labels is
    allowed, but if the previous plot which defines the scale of this
    plot didn't have them they may appear in the wrong place (having
    wrapped around the screen).  if you want to specify a title, then
    you should probably specify a null title "" in the original plot.

Example
  In order to superimpose plots the normal sequence is:
  (PLOT2(..., FIRST), 
   PLOT2(..., SAME), 
   PLOT2(..., SAME), 
   ...
   PLOT2(..., SAME, LAST));

  PLOTNUM:40;
  PLOT2(1, T, 0, 2*%PI, FALSE, FALSE, "", POLAR);  Plot a circle.
	Note the null title [see (Sec 13.1) for how POLAR works]
  EQUALSCALE:TRUE;
  NAMEPLOT(TEMPLATE);	Name the circle TEMPLATE (Sec 12.1)
  FOR PLOTNUM FROM 4 THRU 10		Bind PLOTNUM
  DO (REPLOT(TEMPLATE, FIRST),		Replot the circle (Sec 5.1)
      PLOT2(1, T, 0, 2*%PI, FALSE, FALSE, CONCAT("N = ", PLOTNUM-1),
	     POLAR, SAME, LAST) );
	Plot a polygon with PLOTNUM-1 faces inscribed in the circle
	and with a title computed with CONCAT (Sec 6.1).

10.3) REPLOT4

REPLOT4(<plot1>, ..., <plotk>); conveniently replots up to 4 plots in
    different parts of the screen.  <plot1> etc must be named plots
    (Sec 12).  It plots the first plot in the upper left hand corner
    of the default window (or of your own window, if WINDOW (Sec 8.1)
    has a value), the second arg in the upper right hand corner etc.
    It stops when it runs out of things to plot.  This function takes
    care of the business of specifying the FIRST and LAST options to
    REPLOT, so dont give them to REPLOT4.  REPLOT4 only puts the date
    on the top right plot (assuming DATEPLOT:TRUE;).  The exception is
    if you only ask REPLOT4 to plot only 1 plot (by giving it 1
    argument) in which case the date goes on that plot.

Example
  PLOT2(X, X, 0, 1);	plots X vs X
  NAMEPLOT(A1);		names it A1
  PLOT2(SIN(X), X, 0, 2*%PI); etc.
  NAMEPLOT(B[1]);
  PLOT2(X^2, X, 0, 1);
  NAMEPLOT(FOO);
  REPLOT4(A1, B[1], FOO);	replots A1, B[1] and FOO

10.4) TOP, BOTTOM, LEFT and RIGHT

These govern where in your plotting window the plot will actually
    appear.  e.g., TOP and LEFT mean put the plot in the top left
    corner, BOTTOM means in the bottom half of the window, RIGHT in
    the right half, etc.  Non-contradictory flags can appear together.
    These flags are non-sticky, meaning that REPLOT doesn't remember
    them, although it recognizes them.  The gap left between the plots
    you get using these flags is PLOTGAP screen coordinates (default
    value 20).

Example
  (PLOT2(X, X, 0, 1, TOP, FIRST), PLOT2(1-X, X, 0, 1, BOTTOM, LAST));
  PLOT2(SIN(X), X, -%PI, %PI, DONT);
  REPLOT(TRUE, TOP, LEFT);	Replots in top left corner.
  REPLOT();			Replots in the whole window.

REPLOT4 with 4 arguments could be defined by:
  REPLOT4(PL1,PL2,PL3,PL4) := BLOCK([DATEPLOT:FALSE, DP:DATEPLOT, 
				     PLOTGAP:20], 
				    REPLOT(PL1, TOP, LEFT, FIRST), 
				    BLOCK([DATEPLOT:DP], 
				          REPLOT(PL2, TOP, RIGHT)), 
				    REPLOT(PL3, BOTTOM, LEFT), 
				    REPLOT(PL4, BOTTOM, RIGHT, LAST));

Note the flag SAME means to keep the same window as well as the same
scale.  Thus SAME overrides TOP, BOTTOM, etc.  If you want to preserve
the scale, the thing to do is to do all the plots but the first
inside a BLOCK([YMAX:YMAX1, YMIN:YMIN1, XMAX:XMAX1, XMIN:XMIN1], ...)
(Sec 8.2) (Sec 8.4).
11) Device characteristics
    1) Tektronix
    2) Imlac
    3) Grinnell
    4) Printing and Display
    5) XGP
    6) Gould
    7) Versatec

A number of different devices are supported by PLOT2.  You set things
up for a particular device using the PLOTMODE command (Sec 5.2).  Each
has its peculiarities, which will be described here.

Note that if you plotting on a terminal you should only interrupt a
plot by doing ^G, because your terminal will be left in a screwy
state otherwise (Sec 2.8).

11.1) Tektronix

The Tektronix has problems keeping up with PLOT2 at 9600 baud (the
    speed at which the one in 38-246 runs) if short vectors are used.
    For that reason PLOT2 will not normally use short vectors if your
    speed is greater than 2400 baud.  This is governed by the variable
    PADDED (default value IS(SPEED>2400)).  If the vectors are coming
    out smeared try setting PADDED:TRUE;.  (PADDED is recomputed on
    each call to PLOTMODE; so you should do PLOTMODE(); after
    changing speeds.)

The other function for which padding is important on the Tektronix is
    screen clearing.  (You can't plot for 1 second afterwards.)  The
    padding is sent out by ITS in this case and it determines the
    amount of padding from your speed.  You should therefore ensure
    that ITS knows what your speed is.  (You can check it by doing
    :TCTYP DESC (in DDT), and set it by e.g., :TCTYP SPEED 1200 .)

For Tektronix's with graphic cross-hairs the EDIT function (Sec 14)
    can be used to edit plots.  (Put the labels in the right place
    etc.)

PLOT2 also supports other than the standard Tektronix terminals
    (4010, 4013, etc.).  Plotting is also possible on the Tektronix
    4025 and 4662.

For the Tektronix 4025 set PLOTMODE:'TEK; TEK4025:TRUE; and then
    PLOT2( ...  ) or whatever.  The Tektronix 4025 is supported by
    :CRTSTY TK4025.  The terminal has to be told to expect the regular
    Tektronix graphics that is used by the Tektronix 4010 terminal.

[How this is done is described by KAT.  In the 4025 the screen is
split into two regions, the work space and the monitor.  The monitor
is the space that communicates with the host unless the host is
transmitting graphics, in which case the graphics goes to the work
space.  The user has to specify the size of the work space (which
specifies the size of the monitor by giving it whats left) and
defining the a graphics region in the work space.  To have the 4025
accept 4010 graphics an additional command is needed, the shrink
command.  So to get the 4025 to do 4010 graphics the following TEK
commands are needed (` is the command character that CRTSTY uses to
communicate with the terminal):  "`wor n <cr>" set the size of the
workspace to n.  I use n=20 which leaves 13 lines for the monitor.
"`graphic 1,35 <cr>" makes the graphic region occupy the first 35
lines of the workspace, the args to graphic can define the graphics
to be anywhere in the workspace as long as it defines 35 lines
because that is the size of the 4010 graphics region; i.e., graphic
35,69 would be fine.  It's OK that the graphic region is defined to be
larger than the workspace, since the picture can be scrolled into
view; the wor command just defines the size of the visible portion of
the workspace.  "`shrink <cr>" tells the 4025 to behave like the 4010.
I think that the above three commands are best done by the users
because (1) the `wor command also has the effect of erasing the
workspace and the monitor which might not be desired.  (2) the size of
the monitor depends on whether the user needs to see a lot of the
host interaction or is just executing plots.]

Tektronix 4662s are supported by doing PLOTMODE:'TEK; TEK4662:TRUE;

11.2) Imlac

Ards graphics conventions are used.  Only Imlacs supporting these
    conventions are recognized by PLOT2.  Imlacs do not have infinite
    room for storing vectors, thus some plots (especially 3D and
    Contour plots) won't fit.  It may be necessary to locally clear
    the screen (with the CLEAR button) during a plot.  If you are also
    plotting for the Gould or the XGP output to those devices will
    not be effected.

11.3) Grinnell TV's (These are 512x512 TV terminal in Building 38)

Ards graphics conventions are used, however the coordinates are
    divided by 2 before being plotted, so WINDOW etc.  should be
    chosen as though the screen coordinates ran from 0 to 1023 each
    way.

11.4) Printing and Display

These are really only intended to give a preview of the plot before
    it comes out on a higher resolution device like the XGP or the
    Gould.  Internally PLOT2 keeps a resolution appropriate for the
    standard graphics devices (about 1000 x 1000), so that good
    Hardcopies can be obtained.  Instead of attempting to draw dotted
    lines or symbols for the various line types (Sec 9) different
    characters are used, although dotted lines and symbols will be
    drawn on the Hardcopy device.  Line type 0 is drawn with .'s.  The
    other line types (1 - 9) are drawn with other symbols (*, #, $
    etc.).  The symbols (specified by the tens digit of the line type)
    are defined by the letters (A, B, C etc.).  Unfortunately if you
    choose a line type that specifies both a line and a symbol, the
    line will in most cases overprint and so erase the symbol.

When plotting on another device, say the XGP, you might find that
    PLOTMODE:[X,D]; (Sec 5.2), results in your seeing only a corner
    of the plot.  This is because it is assuming the XGP's character
    size.  You can correct this by doing PLOTMODE:[D,X]; since this
    will use the terminal's character size.  The copies you get out of
    the XGP will have the characters slightly widely placed, but will
    otherwise be OK.

The difference between how PLOT2 handles Printing and Display
    terminals, is that with Display terminals PLOT2 knows that it can
    move the cursor around and so it will plot your graph in the same
    order that it would on say a Tektronix.  With a Printing terminal,
    it stores up the entire plot and spits it out at the end in a
    line by line fashion.  Multiple plots (Sec 10) are handled
    correctly, the entire plot coming out only after the LAST call to
    a plotting function.

The plotting is done on a character grid that is PLOTHEIGHT high and
    LINEL wide.  You may change these if you want, but the changes
    must be followed by a call to the PLOTMODE function (PLOTMODE();
    will do) to re-initialize things.  With PLOTMODE(D) you will
    probably lose badly if PLOTHEIGHT or LINEL is set larger than
    your terminal can handle.  Note that you can restrict the area of
    the screen used, with more flexibility, by changing WINDOW (Sec
    8.1).  Don't forget that you can look at WINDOW1 to see what the
    default was.

You might want to change the value of CHARRATIO (default value 2.5).
    This should equal the ratio of line-pitch to the character-pitch
    for your terminal.  (This enables the EQUALSCALE:TRUE (Sec 8.3)
    mode to work and ensures that what you see on your screen/paper
    is the same shape as what will come out on the XGP.)

11.5) XGP

Plotting on the XGP works by writing a file of ARDS graphics commands
    in a file on the .TEMP.; directory.  The filenames are .PLOT.
    <uname>.  Since the XGP won't accept ARDS graphics commands, this
    file must be processed into a SCN file by the Gould spooler.  This
    is done whenever HARDCOPY(); (Sec 5.4) is called or if you type
    linefeed at the end of a plot (Sec 2.4).  If AI is up and the
    queuing for the XGP is successful, you will receive a message
    from the XGP spooler when your plot is printed.  If AI is down,
    your plot will be processed into an XGP scan file, .GLPR.; > SCN,
    and the Gould spooler will send you a warning message telling you
    that AI is down.  You must copy the SCN file to AI:.GLPR.;
    yourself when AI comes up and queue it by doing in DDT
	:XGP ;SCAN AI:.GLPR.;* SCN

The parameters PLOTSCALE (default value 1.0) and PLOTTHICK (default
    value 2) govern the scale of the Gould output (the larger
    PLOTSCALE the larger the copy) and the thickness of the lines.
    PLOTTHICK must be an integer.  The default PLOTSCALE and WINDOW
    (Sec 8.1) produce a plot which nicely fits into an 8.5 x 11 piece
    of paper.  (Actually, PLOTSCALE gets multiplied by 1.75 to
    determine the correspondence of screen coordinates and Gould
    pixels.)

There are two additional parameters PLOTLFTMAR (default value 150)
    and PLOTBOTMAR (default value 150) which govern the left margin
    and bottom margin for plots output to the XGP.  Both of these
    parameters must be integers and the default values cause a plot
    to fit on an 8.5 x 11 piece of paper.

Since the XGP has slightly different nominal resolutions across and
    along the page (200/inch vs. 192/inch), EQUALSCALE produces plots
    that are somewhat misshapen on the XGP.  The Gould and Versatec
    devices don't suffer from this defect.

NAMEFILE(<filespec>) takes the scratch file that PLOT2 uses in
    PLOTMODE(GOULD); or PLOTMODE(XGP); and copies it to <filespec>.

The advantage of this is that the scratch file (which contains ARDS
    graphics commands) is usually much shorter than the corresponding
    SCN file, thus if you want to generate several plots for the XGP,
    but aren't able to actually get them out on the XGP for a while
    then use NAMEPLOT now and queue them to be printed by
    HARDCOPY([<filespec>], XGP) (Sec 5.4).  Or else, you can print the
    plot file later by doing in DDT
	:GLP <filespec>/A/O[X]
    where <filespec> is an ITS-style filespec (i.e., dir;fn1 fn2).

Incidently since the file produced by NAMEFILE is ARDS graphics
    commands the plot it contains can be viewed by :IMPRNT'ing the
    file on an Imlac.

11.6) Gould

The method of producing a plot on the Gould is the same as for the
    XGP except that PLOTMODE:[GOULD, ...]  is specified.  The options
    PLOTSCALE etc.  have the same effect.  If you want to queue a file
    that you have created with the NAMEFILE command to the Gould
    either use HARDCOPY([<filespec>], GOULD) or :GLP <filespec>/A in
    DDT.

Hardcopy can be produced off the Gould either by typing <linefeed>
    after the plot has finished (Sec 2.4) or by executing HARDCOPY();
    (Sec 5.4).

Note: Often people forget to say e.g., PLOTMODE(G, T); before doing a
    plot.  The thing to do in that case is:  HARDCOPY(TRUE, GOULD);
    (Sec 5.4).  This will only work if your plot consisted of a single
    call to a plotting function (the normal case).

11.7) Versatec

This enables you to generate scan files for 100/inch Versatec
    printer/plotters which exist at various sites on the MFE-NET.  As
    far as PLOT2 goes, the Versatec is like the Gould.  When a
    HARDCOPY is requested, the Gould spooler generates a scan file
    .GLPR.;> VER .  These VER files can then be FTP'ed to your local
    computer and renamed as PLT files (by RENAME *.PLT=*.VER) which
    can then be printed on the Versatec with the PRINT *.PLT command.

[The PLT files consist of a sequence of 8-bit bytes packed in the
high 32 bits of each word.  The first byte is 016 (octal) (this
specifies the format for the PPL Versatec).  Thereafter the format is
as described by R. H. Frobose, Compression of Graphic Data in Raster
Format, Livermore report UCRL-51858 (June 1975).]

11.8) Dover

Plotting on the Dover is not fully supported yet.  However there are
    functions for directing the temporary file of ARDS vector
    commands to the Dover.  To get this file created use
    PLOTMODE:'XGP; (or GOULD or VERSATEC or [XGP,GRINNELL] etc).  The
    command DOVARD_FILE(); takes the ARDS file produced by PLOT2, and
    creates a PRESS file suitable for output to the DOVER.  The
    command DOVER_FILE(); will queue the file.  For example, after you
    have done PLOTMODE:'[G,GR], and PLOT2(X,X,0,1); you can then do
    (DOVARD_FILE(),DOVER_FILE()); to queue the plot.

In the near future the HARDCOPY and PLOTMODE commands may be extended
    to include this option, calling the functions in question for
    you.

The Dover produces higher quality output than most other hard copy
    devices and using it in this way is less of a drain on the system
    than getting hardcopys on the XGP or Gould.  However, the Dover
    has a higher chance of jamming, and complicated 3d-plots may bomb
    out.  Also DOVARD_FILE() and DOVER_FILE() both go into DDT to do
    their jobs.  This means that your MACSYMA will need to TTY to
    execute these functions.
12) Naming and saving of plots
	1) NAMEPLOT
	2) SAVEPLOTS
	3) LOADPLOTS
	4) KILLPLOTS
	5) DONT
	6) PLOTS

Plots can be given names, saved in files, killed just like other
MACSYMA data types.  However since plots aren't really something
MACSYMA knows about there are a number of commands specifically for
manipulating plots.

12.1) NAMEPLOT

NAMEPLOT(<plotname>); names the last call to one of the plotting
    functions <plotname>.  <plotname> must be either an atom (e.g.,
    FOOP) or an array element (e.g., SNOO[4]).  <plotname> is stuck
    onto the list PLOTS (Sec 12.6) so it becomes for instance
    [<plotname>].  If <plotname> is an atom, then the plot is made
    into the PLOT property of <plotname> (so it appears also in the
    PROPS list).  If <plotname> is an array element then the plot is
    the value of that array element, so <plotname> gets put on the
    ARRAYS list.  (Don't try manipulating this value, because most of
    Macsyma doesn't understand what a plot is.  Thus
    NAMEPLOT(SNOO[4]); BAR:SNOO[4]; REPLOT(BAR); won't work.)  Typing
    rubout at the end of a plot causes a <plotname> to get read in
    and NAMEPLOT applied to it (Sec 2.5).

The argument to plotname is not evaluated.  Thus you can say
    NAMEPLOT(FOOP) without having to worry whether FOOP has a value
    or not.  However if the argument is an array element the
    subscripts are evaluated.  Thus if you have a program which plots
    several plots (for instance with different values of some
    parameter) you may want to use the array element form.  Thus FOR
    I THRU 3 DO (PLOT2(F(X,I), X, 0, 1), NAMEPLOT(PLT[I])); produces
    plots PLT[1], PLT[2], PLT[3].

What actually gets saved by NAMEPLOT are the unscaled data points
    plus most of the optional arguments to thee plotting function
    (the exceptions are FIRST, LAST, SAME (Sec 10.2), TOP, BOTTOM,
    LEFT and RIGHT (Sec 10.4) and DONT (Sec 12.5)).  This is why it
    works to change the scale before replotting the plot using REPLOT
    (Sec 5.1).

12.2) SAVEPLOTS

SAVEPLOTS([<filespec>], <plotname1>, <plotname2>, ...  ); saves the
    plots <plotname1>, <plotname2> etc in the file <filespec>.
    Defaulting of <filespec> is traditional (e.g., FOO is the same as
    FOO,>).  [<filespec>] may be omitted altogether in which case the
    filespec used is [PLOTS,>,''DEVICE,''UNAME].  (This will normally
    be [PLOTS,>,DSK,uname].  DEVICE and UNAME are also used by SAVE in
    a similar manner.)  SAVEPLOTS always sets the file defaults.

SAVEPLOTS([<filespec>], ALL); saves all the plots in PLOTS.  (or else
    you can say SAVEPLOT([<filespec>], PLOTS); ) Another action of
    SAVEPLOTS is the put the <filespec> into the value of the saved
    plots.  Thus a subsequent SAVE([<filespec1>], FUNCTIONS,
    <plotname>); although it won't correctly save the data in
    <plotname> will remember what file it was saved in using the
    SAVEPLOTS command.  SAVEPLOTS returns a list of plots it succeeded
    in saving.

12.3) LOADPLOTS

LOADPLOTS(<filespec>); loads a file of plots created by SAVEPLOTS.
    <filespec> defaults exactly as with LOADFILE.  It also sets the
    file defaults.  LOADPLOTS may be done within a batch (unlike
    LOADFILE).

12.4) KILLPLOTS

KILLPLOTS(<plotname1>, <plotname2>, ...  ); frees up the array storage
    used by <plotname1> etc.  KILLPLOTS(PLOTS), KILLPLOTS(ALL) and
    will apply KILLPLOTS to all the members of PLOTS.  Note the
    KILLPLOTS does not KILL <plotname1> etc.  and in particular it
    leaves the <filespec> information stuck in by SAVEPLOTS.  (If you
    never want to reference a plot again it is probably better to do
    a KILLPLOTS followed by a KILL, since KILLPLOTS takes care to
    totally exorcise the arrays of the plot from the system,
    something that KILL might not manage to do).  If you doing a lot
    of plotting then you may get a message like NO CORE ARRAY when
    trying the name a plot (either by invoking NAMEPLOT explicitly or
    by typing rubout after a plot.)  If that happens all you have to
    do is check that all the plots that are important are saved using
    the SAVEPLOTS command, then do KILLPLOTS(); NAMEPLOT(<plotname>);

12.5) DONT

If DONT appears as an optional argument to the plotting functions
    then the points will be calculated, but not plotted.  This is
    primarily of use for creating plots that are to be named and used
    later.  DONT is a non-sticky option (like FIRST and LAST), and so
    doesn't get saved when the plot is named (so PLOT2(EXP(X), X, -1,
    1, DONT); REPLOT(); will plot something).

12.6) PLOTS

In order to assist the manipulating of plots, a list of plots is
    kept.  The list is called PLOTS and it contains all the plots
    present in the Macsyma.  After KILLPLOTS is executed on a plot it
    is removed from PLOTS.  However if it had been previously saved
    with the SAVEPLOTS (Sec 12.2) command an attempt to REPLOT (Sec
    5.1) that plot it cause to reloaded from the file it was saved in
    and it will be put back on the PLOTS list.

Examples
  PLOT2(SIN(X), X, -%PI, %PI);
  <rubout>
  SNOO;
  REPLOT(SNOO); replots snoo
  PLOTS; ==> [SNOO]
  KILLPLOTS(ALL); kills the plots in PLOTS i.e., SNOO
  REPLOT(SNOO); ==> SNOO not a plot (and it wasn't saved)
  REPLOT(); replots the last plot (which so happens to be the same as
	SNOO)
  <rubout>
  ARF;
  SAVEPLOTS([CFFK,PLOT,USERS], ALL); saves the plots in PLOTS
  KILLPLOTS(ALL);
  PLOTS; ==> [] there are now no active plots around
  PROPS; ==> [SNOO,ARF]  both SNOO and ARF got put on the values list
	but only ARF is any good because:
  SAVE([CFFK], PROPS); ==> [[CFFK, 1, DSK, USERS], SNOO, ARF]
  ^Z
  MACSYM^K
  LOADFILE(CFFK, >, USERS);
  PROPS; ==> [SNOO,ARF]  as before
  PLOTS; ==> []
  REPLOT(SNOO); ==> SNOO not a plot (It was never SAVEPLOTS'ed)
  REPLOT(ARF); ==> DSK:USERS;CFFK PLOT being loaded
  loading done (ARF is automatically loaded in and replotted)
  PLOTS; ==> [ARF]  ARF is stuck back into PLOTS
  KILLPLOTS(ALL); kills the arrays in ARF but saves the fact that it
	came from CFFK PLOT
  REPLOT(ARF); DSK:USERS;CFFK PLOT being loaded loading done etc.
13) Transformations on points
	1) POLAR, LOG, LINLOG, LOGLIN, LIN and TXTYPE
	2) SPECIAL, XFUN and YFUN
	3) 3D transformations and HOWCLOSE

13.1) POLAR, LOG, LINLOG, LOGLIN, LIN and TXTYPE

Easy examples
  PLOT2(1, T, 0, 2*%PI, POLAR);	Plots a circle
  REPLOT(TRUE, LIN);		Replots the previous plot on a linear
	scale (i.e., gives a horizontal line)
  PLOT2(EXP(X), X, 0, 10, LINLOG);	Plots exp(X) on a Lin-Log scale
	(appears as a straight line)
  GRAPH2([1,2,5,10,50,100], [1,1.5,2.5,3,7,10], LOG);	Plots some
	random points on Log-Log scale.  Slope shows that y=sqrt(x).

Complete description

If one of POLAR, LOG, LINLOG, LOGLIN appear as an optional argument
    to one of the 2D plotting functions, then the plots appear on the
    appropriate scale.
    With POLAR the first arg to PLOT2 or the second arg to GRAPH2
	etc.  (i.e., what is normally considered to be the y
	coordinate) becomes r, the radius; and what is normally
	considered to be the x coordinate becomes theta, the angle.
    LOG causes both axes to appear on a log (base 10) scale.
    LINLOG causes the y axis to appear on a log scale.
    LOGLIN causes the x axis to appear on a log scale.
    LOGLOG is the same and LOG.

The optional arguments LOG and LOGLIN also cause PLOT2 to choose
    logarithmic intervals for the x variable, if the <low>, <high>
    form of range specification is used (Sec 1.1).  (Something less
    than optimal probably happens for PARAMPLOT2 in this case).

CONTOURPLOT2 (Sec 4.1) is regarded as being a 2D plotting function
    (since it does not transform its x and y coordinates).  Thus the
    above optional args work on it and CONTOURPLOT2(Y, X, 0, 2*%PI,
    Y, 0, 1, POLAR); does the right thing.

Note that when a plot is saved the points before their transformation
    are saved, together with the type of transformation.  Thus is
    possible to change the transformation either using REPLOT (Sec
    5.1) or a ^A break (Sec 2.6).

With REPLOT all that is necessary is to supply an optional arg
    overriding the one originally given.  LIN is an optional argument
    that specifies no transformation (i.e., a LINear scale in both
    directions).  This can be given to REPLOT to turn off any
    transformations.

In a ^A break the variable TXTYPE is (locally bound) to the type of
    transformation.  Thus within a polar plot TXTYPE is POLAR.  A value
    of FALSE implies no transformation (like LIN in REPLOT).  The
    possible values of TXTYPE are FALSE, POLAR, LOG, LINLOG, LOGLIN,
    SPECIAL (for user defined transformations (Sec 13.2)), and NOT3D
    (for Not3d plots (Sec 3.3) and (Sec 13.3)).  Remember that after
    exiting the break the plot must be replotted (with a tab (Sec
    2.3)) for the change in TXTYPE to be saved.

13.2) SPECIAL, XFUN and YFUN

If the optional argument SPECIAL appears in the call to PLOT2 then
    immediately before sticking your data up on the screen PLOT2
    looks at the values of XFUN and YFUN (default values are FALSE).
    If they are FALSE the data gets scaled in the normal way and is
    plotted without further ado.  If either is non-FALSE then it
    should be the name of a function of 1 to 3 arguments which
    defines a transformation between the data and the x and y screen
    coordinates.  (The standard linear scaling is still applied the
    result of this transformation, to make your plot fit on the
    screen.)  The functions must be translated or compiled and must
    return a floating point result.  the way they work is best
    illustrated by an example.

Suppose
  XFUN:POLARX;
  YFUN:POLARY;
	where POLARX and POLARY are defined by
  TRANSLATE:TRUE;
  POLARX(X, Y) := (MODEDECLARE([X,Y], FLOAT), Y*COS(X));
  POLARY(X, Y) := (MODEDECLARE([X,Y], FLOAT), Y*SIN(X));
        (note that X and Y are the THETA and R coordinates of a polar
	system) then
  PLOT2(1, X, 0, 2*%PI, SPECIAL);
	produces PLOTNUM x data points (ranging from 0 to 2*%PI)
	and PLOTNUM corresponding y data points (all 1 in this case).
	These x and y are given to the POLARX and POLARY functions as
	the first and second arguments and the value of these two
	functions is what is supplied to the normal scaling routines.
	Thus this PLOT2 command will produce a circle (if
	EQUALSCALE:TRUE (Sec 8.3), an ellipse otherwise).  What I've
	just described could of course all be done with the POLAR
	optional arg (Sec 13.1).  But then I've just described pretty
	much what happens when you give the POLAR optional arg.

The arguments that XFUN and YFUN take are
		1 arg	2 args	3 args
	XFUN	x	x,y	x,y,z
	YFUN	y	x,y	x,y,z

The first argument to PLOT2 is considered a y variable and it's
    second argument an x variable.  For PARAMPLOT2 and GRAPH2 the
    first arguments are x variables and the second arguments are y
    variables.  For all the 2D plotting functions the z variable is
    0.0.  (See (Sec 13.3) for the coordinate conventions for the 3d
    plotting functions).

In fact POLARX and POLARY come predefined in the PLOT2 files.  Other
    XFUN's and YFUN's that may be of use are (omitting the
    MODEDECLARE's):

	CLOG(X) := (IF X=0.0 THEN -90.0 ELSE LOG(ABS(X)))/LOG(10.0);
	REFLECT(X) := -X;
	YTOX(X,Y) := Y;
	XTOY(X,Y) := X;
	ZTOY(X,Y,Z) := Z;
	ZTOX(X,Y,Z) := Z;  (just the same function really)
	ROTATEX(X,Y) := X*COSANG-Y*SINANG;
	ROTATEY(X,Y) := X*SINANG+Y*COSANG;
	(SINANG and COSANG are set up by
	 INITROTATE(ANG) := (COSANG:COS(ANG), SINANG:SIN(ANG));)

Example
  XFUN:YTOX;
  YFUN:XTOY;	These cause X and Y to be swapped
  PLOT2(SIN(X), X, -%PI/2, %PI/2, SPECIAL);	Plots arcsin(x) vs. x !

The XFUN's and YFUN's implied by the optional args in (Sec 13.1) are:

	optional arg	XFUN		YFUN
	POLAR		POLARX		POLARY
	LOG		CLOG		CLOG
	LINLOG		FALSE		CLOG
	LOGLIN		CLOG		FALSE
	LIN		FALSE		FALSE

13.3) 3D transformations and HOWCLOSE

The perspective transformations (Sec 3.4) work by the same XFUN and
    YFUN mechanism documented above.  In case to want to try changing
    the transformation here are the names of the functions used
    (although it is probably quite easy to confuse the function that
    figures out the hidden lines).

The hidden line routine also makes use of the variable HOWCLOSE.
HOWCLOSE should evaluate a the name of a function of 3 arguments (x,
y and z) and should give a measure of how close the point [x,y,z] is
to the viewer.  It is not necessary that this function return the
exact distance [x,y,z] is away, just that the further away [x,y,z]
is, the larger the number the function should return.

CENTERPLOT  PERSPECTIVE  REVERSE  XFUN	     YFUN	HOWCLOSE
-----------------------------------------------------------------------
non-FALSE   TRUE	 FALSE	  P3DX	     P3DY	HOWCLOSE3D
non-FALSE   TRUE	 TRUE	  P3DXR	     P3DYR	HOWCLOSE3D
non-FALSE   FALSE	 FALSE	  NP3DX	     NP3DY	HOWCLOSENP3D
non-FALSE   FALSE	 TRUE	  NP3DXR     NP3DYR	HOWCLOSENP3D
FALSE	    TRUE	 FALSE	  OLD3DX     OLD3DY	HOWCLOSEOLD3D
FALSE	    TRUE	 TRUE	  OLD3DXR    OLD3DYR	HOWCLOSEOLD3D
FALSE	    FALSE	 FALSE	  OLDNP3DX   OLDNP3DY	HOWCLOSEOLDNP3D
FALSE	    FALSE	 TRUE	  OLDNP3DXR  OLDNP3DYR	HOWCLOSEOLDNP3D

The type of view is setup by doing
	INITPERSPEC(CX,CY,CZ,VX,VY,VZ);
    where [VX,VY,VZ] the VIEWPT and [CX,CY,CZ] is the CENTERPLOT

The optional argument NOT3D now causes YFUN to be bound to ZTOY.
14) Editting plots
	1) EDIT

Tektronix users only:  there exists a facility for editting pictures
using the crosshairs on a Tektronix terminal.  This enables you to
position labels accurately and add in additional lines, arrows etc.
To load the editting package do
	LOAD('[EDIT, FASL, DSK, CFFK]);

The behavior of a particular Tektronix terminal to characters typed
while the crosshairs are displayed is governed by strap settings
inside the terminal.  Of importance to this package is whether the
terminal sends out a following <return> after the position
information.  The variable EDITCR (default FALSE) should reflect this
strap setting.  (A TRUE value means that EDIT expects a following
<return>.)  This parameter is set to its default value when the
package is loaded; so set it to the correct value after loading in
EDIT.


14.1) EDIT

The main function in the package is called EDIT and its intention is
    to allow you to enter labels and various odd lines onto an
    existing plot.  To use it you must have a function of no
    arguments, whose body is a BLOCK and the last statement in the
    BLOCK must be EXITGRAPH().  If the function is P(), say then P();
    should plot as much of your picture as can be conveniently
    specified by PLOT2, GRAPH2 etc.

EDIT(P); will execute P(), but will stop before the final EXITGRAPH()
    and display the cross-hairs.  By typing various letters EDIT will
    enter commands into the function P directly before the
    EXITGRAPH(),

Allowed letters are:
    Rubout or Q or q, exit from EDIT
    Space, save the location of the crosshairs (for use with L and A)
    S or s, enters a SETPOINT command into your function
    V or v, enters a VECTOR command (should be preceded by a SETPOINT
	or another VECTOR command)
    L or l, draws a line between the saved location and the
	crosshairs and enters it in the function.
    A or a, draws an arrow head pointing in the direction from the
	saved location to the crosshairs.  The tip of the arrow is at
	the crosshairs.  The size of the arrow is ARROWSIZE (a
	floating point number in raster units, default value 20.0)
	and its half angle is ARROWANG (a floating point number in
	radians, default value 0.2).  (The arrow is drawn using the
	?ARROW function, defined in EDIT FASL.  It takes 4 integer
	arguments, similarly to ?LINE (Sec 16).  Thus
	?LINE(20,20,100,100), ?ARROW(20,20,100,100) draws a line with
	an arrow head on it.)
    P or p, reads text from the keyboard and prints it left justified
	at the cursor.  Echoing is suppressed while it is reading the
	text.  Reading continues until a Carriage-Return is
	encountered.  The case of the text is remembered, but if you
	want it preserved after, say, STRINGOUT'ing and BATCH'ing you
	should set BOTHCASES:TRUE;
    C or c, same as P, except the text is centered.
    R or r, same as P, except the text is right justified
			
Remember that after exiting EDIT your function will have been
    changed, so that P(); should give you the updated PLOT.  Items may
    be be removed using the MACSYMA editor, or TECO.  To draw a
    picture from scratch you could do:

  HOUSE() := BLOCK([], ENTERGRAPH(), SCREENSIZE(0,0,1023,790),
		   EXITGRAPH()); the call to SCREENSIZE is advisable
	in case the previous call to PLOT2 set the plotting window
	to less than the whole screen.
  EDIT(HOUSE);  now with a sequence of S's and V's you can draw a
	house terminating it with a Rubout.
  HOUSE();  re-draws your house.

Setting WINDOW is not going to have any effect, since only the top
    level plotting functions pay any attention to it (and they then
    call SCREENSIZE).

Here's how you might define a function to enable you to use EDIT to
    insert anotations.

  ANOTATE():=BLOCK([],
		   PLOT2([SIN(X),COS(X)],X,-%PI,%PI,[0,1],FIRST),
		   ENTERGRAPH(),
		   CLEAR:WAIT:TRUE,	undo the effect of the FIRST
		   CHANGEDASH(0),	undo the dashed line mode
		   EXITGRAPH());
  EDIT(ANOTATE);
15) Default settings
	1) Options
	2) Lines and Symbols
	3) PLOTMODE

15.1) Options

The defaults for the options are:
    PLOTNUM:20;
    PLOTNUM0 unbound
    PLOTNUM1:20;
    EQUALSCALE:FALSE;
    NOPRINT:FALSE;
    DATEPLOT:TRUE;
    XAXIS:ALL;
    YAXIS:ALL;
    TICKNUM:10;
    TICKSIZE:6;
    UNDERSIDE:TRUE;
    REVERSE:FALSE;
    PERSPECTIVE:TRUE
    PLOTNUMPREC:7;
    CONTOURS:20;
    LABELCONTOURS:TRUE;
    VIEWPT unbound
    CENTERPLOT unbound
    CROSSHATCH:TRUE;
    WINDOW unbound
    XMAX,XMIN,YMAX,YMIN,ZMAX,ZMIN unbound
    XFUN:FALSE;
    YFUN:FALSE;
    CLEAR:TRUE;
    WAIT:TRUE;
    PLOTBELL:TRUE;
    PLOT2ERROR:TRUE;
    PLOTGAP:20;
**  PLOTSCALE:1.0;
**  PLOTTHICK:2;
**  PLOTLFTMAR:150
**  PLOTBOTMAR:150
**  CHARRATIO:2.5;
**  CRCLEAR:TRUE;
**  HARDCOPY:TRUE;
**  PADDED:IS(SPEED>2400);
**  LINEL	(terminal dependent)
**  PLOTHEIGHT	(terminal dependent)
**  PLOTMODE	(terminal dependent) (Sec 15.3)
**  TEK4662:FALSE;
**  TEK4025:FALSE;
(** not reset by PLOTRESET();)

The switches whose default state is unbound are put on the VALUES
    list when they are given a value.  The other switches get put on
    the MYOPTIONS list when they get changed.  So all options can be
    saved by doing SAVE([<fn1>, <fn2>, <dir>],MYOPTIONS,VALUES);)

The following are "read-only" options (sec 8.4)
    XMAX1,XMIN1,YMAX1,YMIN1,ZMAX1,ZMIN1
    VIEWPT1,CENTERPLOT1
    WINDOW1
    XMAX3D,XMIN3D,YMAX3D,YMIN3D,ZMAX3D,ZMIN3D

15.2) Lines and Symbols

See (Sec 9).  The defaults for the dashed lines are (not reset by
    PLOTRESET();):
	DEFINEDASH(0,FALSE);		(solid line)
	DEFINEDASH(1,[40,8]);
	DEFINEDASH(2,[15,8]);
	DEFINEDASH(3,[1,7]);
	DEFINEDASH(4,[30,8,1,8]);
	DEFINEDASH(5,[30,8,1,8,1,8]);
	DEFINEDASH(6,[40,8,1,8,5,8,1,8]);
	DEFINEDASH(7,[8,30]);
	DEFINEDASH(8,[1,20]);
	DEFINEDASH(9,TRUE]);		(no line)

The defaults for the symbols are (not reset by PLOTRESET();):
	DEFINESYMBOL(0,FALSE);		(no symbol)
	DEFINESYMBOL(1,[[0,6],[0,-6],[-6,0],[6,0],[0,0]]);
	DEFINESYMBOL(2,[[4,4],[-4,-4],[4,-4],[-4,4],[0,0]]);
	DEFINESYMBOL(3,[[6,6],[6,-6,-6,-6,-6,6,6,6],[0,0],[0,0]]);
	DEFINESYMBOL(4,[[8,0],[0,-8,-8,0,0,8,8,0],[0,0],[0,0]]);
	DEFINESYMBOL(5,[[0,8],[6,-4,-6,-4,0,8],[0,0],[0,0]]);
	DEFINESYMBOL(6,[[0,-8],[6,4,-6,4,0,-8],[0,0],[0,0]]);
	DEFINESYMBOL(7,[[8,0],[-4,6,-4,-6,8,0],[0,0],[0,0]]);
	DEFINESYMBOL(8,[[-8,0],[4,6,4,-6,-8,0],[0,0],[0,0]]);
	DEFINESYMBOL(9,TRUE);		(point)


For PLOTMODE(PRINTING); or PLOTMODE(DISPLAY) the default line and
    symbol characters (defined by e.g., DEFINESYMBOL(1,"A");) are

			   0  1  2  3  4  5  6  7  8  9
		lines      .  *  #  $  %  &  +  @  - none
		symbols  none A  B  C  D  E  F  G  H  I

15.3) PLOTMODE

See (Sec 5.2).  Unless you set the PLOTMODE before PLOT2 is loaded,
    PLOTMODE gets initialized according to LISP's TTY variable as
    follows:
	TTY	PLOTMODE
	0	PRINTING
	1	DISPLAY		(datapoint)
	2	DISPLAY		(datapoint)
	3	IMLAC
	4	TEKTRONIX
	5	DISPLAY		(TV these may soon be supported)
	6	PRINTING	(memowreck)
	7	(software tty) depends on the terminal characteristics
		as follows (this is the order the questioning are
		asked)
		Can't do cursor positioning	PRINTING
		Can't selectively erase		TEKTRONIX
		Can't overprint			DISPLAY
		An IMLAC (%TOIML)		IMLAC
		Not an AI-TV			GRINNELL
		Else				DISPLAY
	8	PRINTING		(terminet)
	9	DISPLAY			(other display)

If WINDOW is unbound then it is chosen according to PLOTMODE as
    follows:
	if GOULD then [0, 1023, 5, 790]
	else if TEKTRONIX then [0, 1023, 5, 790]
	else if IMLAC then [0, 1023, 200, 1006.))
	else if PRINTING or DISPLAY then
	      [0, <char-width>*LINEL-1, 0, <char-height>*PLOTHEIGHT-1]
	else [0, 1023, 0, 1023]

    E.g if PLOTMODE:[I,G], WINDOW is chosen to be [0, 1023, 5, 790]
    (because the GOULD condition is satisfied first).

For PRINTING or DISPLAY terminals <char-width> and <char-height> are
    chosen to make WINDOW be close to that for the other devices.  The
    formulas used are:
	<char-width>  = 1 + ENTIER(1023/LINEL)
	<char-height> = ENTIER(0.5 + CHARRATIO*<char-width>)
16) Primitives called by PLOT2

With the following functions practically no argument checking is
    done.  So make sure a function gets floating-point numbers or
    integers as it needs them.  In particular <xf>, <xf1>, <yf>, <yf1>
    should all be floating point (unscaled) screen coordinates and
    <x>, <x1>, <y>, <y1> should be integer screen coordinates after
    all scaling.  Some of the basic functions below come in 3
    versions.
    The one with the ?  in front is the most basic.  Its arguments are
	in screen raster coordinates.
    The middle one accepts floating point arguments as screen
	coordinates before the last stage of (linear) scaling is
	done.
    The last one with a 3 at the end takes x, y and z arguments and
	applies the transformation functions (set up with ?CALL\-INIT
	to them).

?SETPOINT(<x>,<y>);	absolute setpoint
SETPOINT(<xf>,<yf>);
SETPOINT3(<xf>,<yf>,<zf>);

?POINT(<x>,<y>);	absolute point
POINT(<xf>,<yf>);
POINT3(<xf>,<yf>,<zf>);

?VECTOR(<x>,<y>);	absolute vector
VECTOR(<xf>,<yf>);
VECTOR3(<xf>,<yf>,<zf>);

?LINE(<x1>,<y1>,<x>,<y>);	line
LINE(<xf1>,<yf1>,<xf>,<yf>);
LINE3(<xf1>,<yf1>,<zf1>,<xf>,<yf>,<zf>);

CHANGEDASH(<n>);	change to dashed line <n>
PUSHDASH();		change to dashed line 0 temporally
POPDASH();		undo PUSHDASH()

?DRAWSYMBOL(<x>,<y>,<n>);	draw symbol n
DRAWSYMBOL(<xf>,<yf>,<n>);
DRAWSYMBOL3(<xf>,<yf>,<zf>,<n>);

?TEK\-X(<xf>);	converts unscaled screen coordinates to raster coords.
?TEK\-Y(<yf>);

?TEK\-XF(<x>);  converts raster coordinates to unscaled screen coords.
?TEK\-YF(<y>);

SCREENSIZE(<min-x>,<min-y>,<max-x>,<max-y>);	sets the window in
	which plotting is done.  If a vector goes outside this window
	it will be clipped

SCREENSIZE1(<min-x>,<min-y>,<max-x>,<max-y>);	same as SCREENSIZE
	except that the scale is left unchanged.  SCREENSIZE leaves
	<min-xf> etc. unchanged
SIZE(<min-xf>,<min-yf>,<max-xf>,<max-yf>);	sets the scale so that
	<min-xf>,<min-xf> gets plotted at <min-x>,<min-y> etc.

?CALL\-X(<xf>,<yf>,<zf>);	applies transformation routines to give
?CALL\-Y(<xf>,<yf>,<zf>);		unscaled screen coords.

?CALL\-INIT(<xfun>,<yfun>);	initialized transformation routines to
	use <xfun> and <yfun>

CLEAR();		clears the screen.
ENTERGRAPH();		should be done before a sequence of plotting.
	It will clear the screen if CLEAR is TRUE.
EXITGRAPH();		should be done after a sequence of plotting.
	If WAIT is TRUE it will wait for you to type in a char and
	will return its ASCII value.  If HARDCOPY is also TRUE will
	do a HARDCOPY().
HARDCOPY();		sends out a hardcopy signal (Sec 5.4).

GHPRINT(<l>,<x>,<y>,<a>);	prints <l> at (raster) coordinates
	<x>,<y>.  <a>=0 ==>left justify, <a>=1 ==> center, <a>=2 ==>
	right justify.  Add 10 to <a> to get <l> underlined.  <l> may
	be a list, in which case its element are concatenated together
GVPRINT(<l>,<x>,<y>,<a>);	prints <l>.  <a>=1, 2, or 3 meaning
	top justify, center, or bottom justify.
17) What PLOT2 doesn't do

Currently PLOT2 doesn't do all that you might ask of a plotting
package.  Here is a list of these shortcomings.  Some of them may get
fixed one of these days.

Decent numbering of axes.  (Labelling of each tickmark, provision for
    major and minor tick intervals, labelling of the axes in such a
    way that the labels don't overlap, provision for a remote
    exponent, etc.)  This is provided by most other plotting
    packages.  The numbering in PLOT2 is something of an afterthought.
    The problem is that getting the numbers done right will need a
    fair amount of code which will take up precious room in your
    MACSYMA.  My suggestion to those who need beautiful numbering is
    to get PLOT2 to only plot the lines and curves and then to get a
    draftsman to put in the labels exactly where you want them.  Those
    who dislike the intrusion of a third party into the preparation
    of their plots should try using the EDIT function on a Tektronix.
    (I have successfully used this to prepare the figures for my
    thesis.  This required additional hacking to get the whole process
    interfaced with TXJ.)

Tickmarks at log-spaced intervals on LOG plots.  (Currently the axes
    are treated exactly the same as for linear plots.)  This would be
    easier to put in.  In the meantime, it is fairly easy to write a
    routine to put them in "manually" using GRAPH2 (Sec 18).

Axes on 3D plots.  These can be put in with some effort using GRAPH3D.
    (No hidden line removal will happen though.)

Spline or polynomial interpolation of curves.

Provision for having the symbols on curves being characters.  PLOT2
    used to do this.  But it was dis-installed when the graphic
    symbols were introduced.  At present they can be put in with
    GHPRINT (Sec 18).

Shading of arbitrary areas.

3D plots on something other than a rectangular grid.  In theory this
    is possible using the transformation routines.  However these will
    only work for rather simple transformations.  (I suppose the
    restriction is that the space has to be topologically Euclidean
    in the region being plotted.)  Thus there is no convenient way to
    plot, for instance, the surface of a torus.

Something goes wrong with the 3D transformation used by PLOT3D when
    the scales of the various directions are vastly different.  (E.g.,
    if the x range is 1.E-6 and the z range is 1.E6.)  If this happens
    you must prescale your points.  If enough people complain, I could
    put the scaling as an option in the defaults 3D transformation
    routines (Sec 13.3).
18) Other examples

Here is a collection of more complicated examples and some other
information that people might need to get the most out of PLOT2.

The following program plots the FFT (fast Fourier transform) of 2
    randomly placed delta functions (idea from some Tektronix
    literature).  This generates a quite pleasing sequence of
    pictures.
  ARRAY([AR,AI],FLOAT,255);
  LOAD('[FFT,FASL,DSK,SHARE]);
  PL():=BLOCK([EQUALSCALE:TRUE, XAXIS:FALSE, YAXIS:FALSE],
	      FILLARRAY(AR,'[0.]), FILLARRAY(AI,'[0.]),
	      THRU 2 DO AR[RANDOM(256)]:1.,
	      FFT(AR,AI),
	      GRAPH2(ENDCONS(AR[0],LISTARRAY(AR)),
		     ENDCONS(AI[0],LISTARRAY(AI))));
  PL();	each call gives a different picture.

Here's how to put characters on a plot.  We draw sine and cosine
    curves and label the points with S and C.
  PRT(L,X,Y):=GHPRINT(L,?TEK\-X(X),?TEK\-Y(Y),1);
  BLOCK([A:0.,B:EV(%PI/2,NUMER),RANGE:[]],
	PLOT2([SIN(X), COS(X)], X, 0, %PI/2, FIRST),
	ENTERGRAPH(),
	CLEAR:WAIT:TRUE,
	FOR I FROM 0 THRU PLOTNUM-1 DO 
		RANGE:CONS(FLOAT(A+I*(B-A)/(PLOTNUM-1)),RANGE),
	FOR X IN RANGE DO PRT("S", X, SIN(X)),
	FOR X IN RANGE DO PRT("C", X, COS(X)),
	EXITGRAPH());

Compiling PLOT2 functions.  Because most of the main plotting
    functions evaluate their arguments specially, the compiler is
    inhibited from generating very efficient code for any function
    containing one of PLOT2's main functions.  Here is what to do if
    you want to get the extra speed of compiled code:  Don't write one
    big long function that does everything, initialization of
    parameters, the main calculation, and the plotting.  Rather try
    and split things up so that the time consuming stuff is off in
    its own functions.  The results of the calculation can either be
    communicated to the rest of the world via the value of the
    function or (when it is more convenient to have a lot of results
    calculated at once) via arrays.  An example might be to plot
    INTEGRATE(INTEGRATE(F(X,Y,A), X, 0, 1), Y, 0, 1) as a function of
    A.  Here you would want to just define a function P(A) which
    numerically evaluates this integral for a particular value of A
    (you could call the SHARE; routine ROMBERG for instance), and
    then do PLOT2(P(A),A,0,1);.  Here you could write P(A) is such a
    way that it compiles well because it doesn't involve any calls to
    plotting functions.  This approach is also preferable because it
    enhances the maintainability and readability of the program.
    Furthermore it is easy to switch it into "batch" mode where
    MACSYMA can be calculating and storing values overnight and you
    can then peruse the results graphically in the morning.

Note on contour plotting.  CONTOURPLOT2 sometimes gives what look like
    wrong results.  Here's a brief description of how the contouring
    works which will help you to understand these results.
    CONTOURPLOT2 calculates the value of your function on a
    rectangular grid of points.  These values alone are not enough to
    determine the topology of the contours.  So CONTOURPLOT2 inserts a
    new point in the center of each rectangular cell whose height is
    the mean of the 4 corners.  The surface to be contoured is then
    assumed to made up of triangles each of whose bases is one of the
    sides of the cell and whose vertices is the center of the cell.
    CONTOURPLOT2 then plots the exact contours for this surface.  This
    method guarantees that the contours have all the properties
    contours should have (no 2 contours of different heights cross, a
    contour of a given height cannot form a "Y", etc.); however, they
    are sometimes jagged near saddle points.  There is a variable DIAG
    (which is not maintained as a proper user-settable variable)
    which governs one detail of the contouring.  If it is TRUE (the
    default), then contours are drawn as described above.  In general
    the contours of the triangular surface change direction on both
    the edges and diagonals of the rectangular cells.  However if you
    do DIAG:FALSE; then only the intercepts of the contours with the
    edges of the cells are used in drawing the contours.  This
    sometimes gives "better" results.

Stochastic plot.  There are times when you want masses of data plotted
    and the computation of the data is cheap.  Then it is better to
    use the screen as a storage medium, rather than sticking the data
    into arrays.  Here's how to get a plot generated by a stochastic
    map:
  (TPI:EV(2*%PI,NUMER),K:0.);
  INIT(K1):=BLOCK([XMIN:0., YMIN:0., XMAX:TPI, YMAX:TPI,
		   EQUALSCALE:TRUE],
		  K:K1,
		  GRAPH2([], [], FALSE, FALSE, LABEL(K), FIRST),
		  ENTERGRAPH(),
		  CLEAR:WAIT:TRUE);
  PLT(X0,Y0,N):=(DECLARE([TPI,K], SPECIAL),
		 MODEDECLARE([X0,Y0], FLOAT, N, FIXNUM),
		 DRAWSYMBOL(X0,Y0,2),
		 BLOCK([X:X0,Y:Y0],
		       MODEDECLARE([TPI,K,X,Y], FLOAT, I, FIXNUM),
		       FOR I THRU N DO (Y:Y-K*SIN(X),
				        Y:Y-TPI*FLOAT(ENTIER(Y/TPI)),
				        X:X+Y,
				        X:X-TPI*FLOAT(ENTIER(X/TPI)),
				        POINT(X,Y))));
  COMPILE(PLT);
  (INIT(1.), PLT(TPI/2.,1.E-3,5000), EXITGRAPH());

People sometimes complain that the numbers labelling the axes often
    appear inside plotting window and 2 numbers appear on top of each
    other because of this.  If this is a serious problem the following
    will solve it (although admittedly not very easily).  Suppose you
    want do PLOT2(X, X, 1, 2); then you could do:
  BLOCK([YMAX, YMIN, XMAX, XMIN, DATEPLOT, NOPRINT, XAXIS, YAXIS,
	 WINDOW, OWINDOW],
	WINDOW:OWINDOW:[100,1023,100,790], allow 100 raster units for
		writing in later
	DATEPLOT:XAXIS:YAXIS:FALSE, turn off things that print
	NOPRINT:TRUE,
	PLOT2(X, X, 1, 2, FIRST), plot
	YMAX:YMAX1, YMIN:YMIN1, XMAX:XMAX1, XMIN:XMIN1, save XMAX etc
	BLOCK([XMIN, XMAX, YAXIS],  push XMIN etc
	      XMIN:-1, XMAX:1,
	      WINDOW:COPYLIST(OWINDOW), WINDOW[1]:0, WINDOW[2]:200,
	      YAXIS:ALL,
	      GRAPH2([], [])), plot Y axis
	BLOCK([YMAX, YMIN, XAXIS],   do same for X axis
	      YMAX:1, YMIN:-1,
	      WINDOW:COPYLIST(OWINDOW), WINDOW[3]:0, WINDOW[4]:200,
	      XAXIS:ALL,
	      GRAPH2([], [], LAST)));
19) Acknowledgements

PLOT2 was primarily written by me (Charles Karney) during 1975-76
while I was a graduate student in the Plasma Physics Group of the
Department of Electrical Engineering and Computer Sciences at MIT.
Several other members of the Plasma Physics Group contributed
assistance and ideas.  In particular John Kulp was responsible for
overseeing the computational side of the group's activities and
installed the system of graphics terminals that allowed MACSYMA to
become a useful tool for online graphics.

This work was supported by the Department of Energy.