summaryrefslogtreecommitdiff
path: root/support/lametex/doc/lametex_doc.txt
blob: c11edf5382b556982e74ec7ed8cc273b56912920 (plain)
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







                                    LameTeX 


                      A text formatter for special effects 






            Combining the magic of PostScript with the ease of LaTeX 



                       Version 1.1 by Jonathan Monsarrat 

                               September 8, 1992 



















                       Copyright 1992 Jonathan Monsarrat 
             Permission is granted to freely distribute or edit any 
                            portion of this manual. 



          Chapter 1 

          Getting to Know LameTeX 

          Hackers, just skip to the section "Fast Track". 

          1.1 Copyright 

          Don't sell LameTeX  or this documentation,  or use parts of 
          it in programs you sell. Don't even think about selling it. 
          This isn't about money. It's about cool hacking. Permission 
          granted for everything else. Thank you. 

          1.2 About Text Formatters 

          A  text formatter  is a  program that  helps you  make nice 
          looking reports  and documents.  You write  the document by 
          typing the text into  an editor, adding formatting commands 
          as needed. A formatting command is not meant to be printed. 
          Instead it is interpreted by  the text formatter program to 
          accomplish special tricks such as centering a line of text, 
          that you would  otherwise have to  do by laboriously typing 
          the space bar a number of times. 
            LameTeX  is a  text  formatting program  that understands 
          many of  the most important  text formatting  commands of a 
          popular text formatter, LaTeX. Although not as powerful for 
          normal text formatting, LameTeX  has a number of additional 
          features for special effects. 

          1.3 LameTeX is for Special Effects 

          That said, if you  want to write a  plain report or do some 
          fancy mathematics, you should use LaTeX instead. LaTeX does 
          a better job for normal-looking  documents (this page is an 
          example  of  a  normal-looking  LaTeX  page),  and  LameTeX 
          version 1.0  is not  capable of  handling some  of the more 
          esoteric LaTeX  functionality like  mathematics and command 
          definition. That's why it's called "Lame" TeX! 

          1.3.1 What LameTeX Can Do 

          LameTeX's specialty is complete  versatility of the printed 
          page. The standard model for  text formatters is that every 
          page  is  necessarily  rectangular.  LameTeX  will  let you 
          format text  inside a  triangular page,  or a  circle page. 
          Just like  professional magazine  editors, you  can include 
          pictures of any shape and ask  the text to flow around them 
          or inside them. 
            These flexible arbitrarily-shaped  margins are PostScript 
          paths. If you don't know PostScript, there is a big library 
          of interesting LameTeX page  margins here. With LameTeX you 
          can  fit  several "pages"  onto  one 8.5x11  inch  piece of 
          paper,  so you  can easily  make  index cards,  labels, and 
          half-pages of text. 
            Also, if  you know how  to write  programs in PostScript, 
          LameTeX allows you  to very tightly  integrate your LameTeX 
          commands with your PostScript code. In fact, the PostScript 
          that LameTeX outputs  is nicely formatted  and commented so 
          that  you can  modify it  yourself and  see how  it's done. 
          LameTeX is written with PostScript  version 1, so it should 
          run on all PostScript printers. 
            Finally,  everything  about  LameTeX  is  set  up  to  be 
          compatible  with LaTeX.  LameTeX  can't do  everything that 
          LaTeX can, but the  special stealth commands guarantee that 
          your  fancy LameTeX  document  can be  processed  by normal 
          LaTeX. This allows you to  share it with anyone who doesn't 
          happen  to have  LameTeX. (Better  yet:  give them  a copy; 
          LameTeX is free!) 

          1.3.2 What you Need to Know to Learn LameTeX 

          LameTeX is a tool to make  things simple. You don't have to 
          be  a  LaTeX  expert  to use  LameTeX,  but  you  should be 
          somewhat  familiar with  some  basic LaTeX  commands before 
          reading this document. 
            You don't  need to  know any  PostScript to  use LameTeX, 
          although there is  a lot extra  you can do  with LameTeX if 
          you can do just a little. 
            You definitely don't  need to know  anything about TeX to 
          use LameTeX. 
            LameTeX is written in C++ and PostScript from scratch. It 
          is not based on  TeX macros or anything  like that. It just 
          happens to  know the  same language  as LaTeX,  and also it 
          snarfs fonts from LaTeX. 

          1.4 The Fast Track 


          If  it's 3  a.m. and  you  are a  juggling, tetris-addicted 
          hacker with a taste for reheated Chinese take-out food, you 
          may want  to skip  to the good  parts. Look  for the Little 
          Wizard  icon for  interesting notes  for experts  who won't 
          need to read this whole manual. 

          * The LameTeX  code for  this document, lametex_doc.tex, 
            and all the files it  includes, are good examples of what 
            LameTeX code  looks like.  Read through  it and  you will 
            notice it's  not hard to  make a few  special effects. In 
            general,  just try  lots of  LaTeX commands,  and LameTeX 
            will   either  handle  them   or  attempt  to  skip  them 
            gracefully. 

          * Look  in  the  appendix  to  see  what  commands  LameTeX 
            supports  if in  doubt. Warning!  LameTeX lets  you write 
            sloppy code. Try writing your document in LaTeX first, to 
            work the  bugs out  of the  "normal look"  and then start 
            using LameTeX. Then you're  guaranteed that your document 
            will work on both text formatters. 

          * Also glance at the section on Stealth Commands, which are 
            LameTeX   commands  over  and   above  the  normal  LaTeX 
            commands. The stealth command 

            ignore tells LameTeX to  ignore LaTeX commands it doesn't 
            know and can't skip gracefully. 

          * LameTeX  is  written  in  C++,  and  the  code  itself is 
            documented separately. 

          * The  PostScript routine  for  breaking a  PostScript path 
            into tiles  is breakpath.ps. And  the formatting language 
            is handled  by format.ps.  You might  find these programs 
            useful  outside of  LameTeX. For  example,  I wrote  a 3D 
            drawing environment which used breakpath.ps for tiling. 

          * There is an appendix at the back on installing LameTeX. 

          * The author is  a nice guy  who will be  happy to help you 
            out. Send  e-mail to  jgm@cs.brown.edu. I  would like to 
            know  what  you think  of  LameTeX  and if  you  found it 
            useful. I am also accumulating  a list of enhancements to 
            make  to the  program and  would gratefully  receive your 
            ideas on this subject. 

          1.5 Major LaTeX Commands LameTeX Cannot Handle 


          The  most obvious  difference between  the two  programs is 
          that LameTeX will  never hyphenate words,  and will tend to 
          not have quite  as nice spacing as  LaTeX does. LameTeX can 
          only produce PostScript code, and  the code it does produce 
          is complicated and therefore a little long. 
            LameTeX  uses the  LaTeX fonts  and handles  the computer 
          modern font robustly, but  it cannot currently handle other 
          font families  or normal  PostScript fonts.  You cannot use 
          fancy non-ascii characters like the heart and the copyright 
          symbol. 
            You  cannot define  new commands  in LameTeX,  make boxes 
          around   words,   or  use   fancy  document   formats  like 
          "titlepage", or  "letter". You  cannot do  fancy tabbing or 
          horizontal spacing. Math mode is right out. 
            A  lot of  new functionality  will be  added in  the next 
          version  of  LameTeX coming  late  this year,  but  for the 
          moment keep  in mind  that LameTeX  is meant  primarily for 
          placing  special  effects on  rather  basic  documents. Use 
          normal LaTeX, or cut and paste between the two, if you need 
          math mode or  want to nest  lots of TeX  code in your LaTeX 
          files. 



          Chapter 2 

          Simple LameTeX Formatting 



          This chapter  introduces to  the essentials  of running the 
          LameTeX  program, but  is  primarily an  overview  of LaTeX 
          buzzwords and syntax. Those grossly familiar with LaTeX can 
          just glimpse  at the  little wizards  and skip  to the next 
          section. 

          2.6 Running LameTeX 



          2.6.3 Useful Buzzwords To Know 

          A  LaTeX file  is a  text file  full of  the words  of your 
          document, plus  some fancy  formatting commands.  The LaTeX 
          text  formatter  knows  how  to  interpret  the  formatting 
          commands from your LaTeX file and produce a printed result. 
          The filename of  a LaTeX file usually  ends with the suffix 
          ".tex" but this is not required. 
            A LameTeX  file is  just like  a LaTeX  file, except that 
          LameTeX has some extra  text formatting commands that LaTeX 
          doesn't  know.  Also,  LameTeX  doesn't  know  all  of  the 
          commands  that  LaTeX  knows.  Fortunately,  for  the basic 
          commands, both programs work  fine. For reference, there is 
          a  complete  list  of  all  text  formatting  commands that 
          LameTeX understands at the end of this document. 
            LaTeX will  understand any  well-written LameTeX document 
          because  the  fancy LameTeX  commands  are  "hidden" inside 
          comments. Any  LameTeX command  that LaTeX  doesn't know is 
          called a stealth command. 
            A big part of LameTeX is being able to make your own very 
          fancy page descriptions. A page  description file is a file 
          full of some  PostScript page descriptions,  written in the 
          PostScript programming language. 

          2.6.4 Example 1 - A Plain Vanilla Text File 

          LameTeX comes with a number  of example LameTeX files. They 
          all begin with the prefix "example", then a number, and end 
          with the conventional suffix ".tex". 
            Try formatting  the LameTeX  file example1.tex  by typing 
          lametex  example1.tex.  LameTeX  will  process  the  file, 
          converting  it to  the  graphics language  PostScript. Your 
          screen should look something like this: 
              vegas % lametex example.tex 

            This is LameTeX, C++ Version pre 1.0 

            Processing example1.tex... 

            Opening example1.PS for temporary output... 

            Including PostScript file /home/jgm/PS/Lametex/page/page 
            _latex.ps 

            Making dummy file for snarfing LaTeX fonts... 

            Snarfing LaTeX fonts... 

            This is TeX, C Version 3.0 

            (lametex.tex 

            LaTeX Version 2.09 (24 May 1989) 

            (/cs/lib/tex/inputs/report.sty 

            Document Style `report' (13 Nov 89). 

            (/cs/lib/tex/inputs/rep10.sty) 
            (/cs/lib/tex/inputs/titlepage.sty)\) 

            (/cs/lib/tex/inputs/10pt.sty) (lametex.aux) [ 1 ] 
            (lametex.aux) ) 

            Output written on lametex.dvi (1 page, 344 bytes). 

            Transcript written on lametex.log. 

            This is dvips 5.47 Copyright 1986-91 Radical Eye Software 

            ' TeX output 1992.08.22:0325' - lametex.ps 

            (tex.pro). [ 1 ] 

            ** SNARF! ** 

            Created PostScript file example1.ps 

            vegas % 

            LameTeX has produced a new file, example1.ps that you can 
            print on  any PostScript  printer using  the lpr command. 
            Alternatively,   you   can  view  it   on-line  by  using 
            GhostScript  or some  other  PostScript previewer.  It is 
            recommended that  you always  use a  PostScript previewer 
            before printing, just to make  sure that you get what you 
            want. 
              As part  of the  text formatting  process, LameTeX must 
            acquire  the correct  "official" LaTeX  fonts, and  to do 
            this, it makes a small trojan horse file and tricks LaTeX 
            into  interpreting  it.  The  dummy  file  it  creates is 
            lametex.tex   which  is  formatted  by  LaTeX  to  become 
            lametex.ps.   All  temporary  files  are  deleted  after 
            they're used. 
              You are  welcome to omit  the suffix .tex  if you wish, 
            just as  with LaTeX.  For example,  you could  have typed 
            lametex example1. 

            2.6.5 Specifying the Default Page Description File 

            The default page description  is the PostScript file that 
            is used to decide what the  page should look like, if you 
            don't  specify a  page description.  You  can use  the -p 
            command line  option to  specify a  new page description. 
            Try  typing  lametex  -p  page_skew.ps  example1.ps  to 
            format  the same  example LameTeX  file with  a different 
            page   description.   You  can   use  any   of  the  page 
            descriptions in the LameTeX page description directory. 
              If you don't  specify the default  page description, it 
            automatically defaults to page_latex.ps. 
              You can use the -t  command to produce plain ASCII text 
            output. Just type lametex  -t yourfile.tex and the result 
            will be placed in yourfile.txt. 

            2.7 A Brief Review of LaTeX 


            Following is a brief review of what normal LaTeX commands 
            look like. You should peek at a real LaTeX manual if this 
            section confuses you. 
              If  you  formatted  example1.tex,  you  saw  that  the 
            printed result  was placed  so that  it lined  up on both 
            columns. Each new  paragraph was indented,  and the title 
            was centered on the page. 
              Take a look at example1.tex, and you will see that the 
            plain LameTeX file  is not nearly  so pretty! LameTeX was 
            responsible  for  doing  the  formatting.  LameTeX shares 
            responsibility  for decision-making  with you,  the user. 
            For  example,  there  is a  special  notation  that makes 
            LameTeX  center  the  title  of  the  document.  A normal 
            LameTeX   document   is  full   of  such  decision-making 
            commands, either to ask for something new, or to override 
            a LameTeX decision (like whether to indent a paragraph). 

            2.7.6\documentstyle 

            The   most  important  command   in  this  example  is  \ 
            documentstyle{report}. 
              LaTeX  wants  to know  what  kind of  document  you are 
            trying to produce. LameTeX,  it turns out, doesn't really 
            care! All document  styles look the  same to LameTeX, but 
            unfortunately you  must have  the\documentstyle command 
            anyway, just because  that is the way  the cruel world is 
            sometimes. Plus, you need it if you are ever going to run 
            your document through normal LaTeX. 
              There are three  alternate versions of  this command, \ 
            documentstyle [ 10pt ]{report}, 

            \ documentstyle [ 11pt ]{report}, 

            and \  documentstyle [ 12pt  ]{report}, which specify 
            that the default  font size for this  document will be 10 
            point, 11 point, or 12 point respectively. The real LaTeX 
            text formatter  can do a  lot of other  fancy things with 
            the\documentstyle command, but  this version of LameTeX 
            cannot. 

            2.7.7\begin and\end Delimit Environments 

            An environment  is an  important LaTeX  concept. It tells 
            LaTeX  where to  start and  stop  doing fancy  stuff. For 
            example, in  the example LameTeX  file example1.tex there 
            are two commands, \ begin{center } and\end{center} 
            . The\begin  command says  "start doing  a fancy thing, 
            which  is  to center  every  line.".  Likewise, the\end 
            command is very important because it tells LaTeX where to 
            stop  centering. We  say that  the text  in-between the\ 
            begin and\end command is "in a\center environment". 
              A  shorthand  notation  for an  environment  is  to use 

            braces. For example, the line of text 

              \ begin{center } this text is centered\end{center 

            } 

              could be re-written as follows: 

              {\center this text is centered} 


            2.7.8 Text Goes in the\document Environment 

            Whenever you  use LaTeX,  you must  place any  text to be 
            printed inside  of a\document  environment. Don't place 
            text  outside of  a\document environment,  although you 
            may place text formatting commands there. 
              The two commands  you will always want  to make part of 
            your    LameTeX   documents   are\documentstyle   and\ 
            document. 

            2.7.9 Example 2 - Environments Can Be Fancy 

            Try running  the second  example file,  by typing lametex 
            example2.tex. This LameTeX file doesn't have any stealth 
            commands   either.  Like  example1.tex,  it  is  just  a 
            demonstration   that  LameTeX   can  handle  some  pretty 
            complicated normal LaTeX text formatting commands. 
              This   file  contains   some  fancy  environments.  For 
            example, the\verse command  modifies the environment in 
            several ways to allow a natural look to poems. 
              The\enumerate   environment  indents   the  text  and 
            numbers   all  paragraphs   that  begin  with  the\item 
            command. 

            2.7.10 Environments Can Be Nested 

            Also notice  that the\enumerate commands  can be nested 
            inside one another. Also the\bf command for boldface is 
            nested inside  the\Huge command for  Huge text. Putting 
            the  boldface  environment  inside  the  Huge environment 
            yields text that is both bold and Huge. 
              In general,  when you  nest environments,  "it does the 
            right thing."  In general you  can trust LaTeX  to do the 
            right thing.  Can you trust  LameTeX? Well  ... you know 
            the old saying: "Trust your mother. But watch her!" 



    Chapter 3 

    Stealth Commands 



    LameTeX doesn't  understand all  the commands  that LaTeX  does, but it 
    does know  a few  extra that  can be  used for  special graphics. These 
    commands  are called  stealth commands,  and are  used like  any other 
    LaTeX command, except that they appear inside comments! 
      Stealth commands are  difficult to explain,  but easy to demonstrate. 
    Try looking for  examples of stealth  commands inside lametex_doc.tex 
    and the files it includes. 

    3.8\begin{stealth} 


    Normally  it would  be nice  if  you could  make real  comments without 
    LameTeX inserting the text into  your document. This is especially true 
    if  you  are  converting a  LaTeX  file  to LameTeX  and  want  to make 
    extensive use of the  comment symbol to take  out commands that LameTeX 
    cannot handle. 
      So, in  order to begin  a use  a stealth command,  you have  to use a 
    stealth environment  by using\begin{stealth},  which is  the only 
    command that is interpreted by LameTeX  inside a comment but outside of 
    a stealth environment. You cannot just say\stealth. If you want that, 
    use\STEALTH, which will  continue the stealth  environment to the end 
    of the line, and the revert  back to normal. If you begin a\postcript 
    environment  then  the\STEALTH  will  wait for  it  to  end  and then 
    terminate on the next newline. 
      You are welcome to do a\begin{stealth  } at the very beginning of 
    your  document  and  end  it with\end{stealth  }  at  the  end, but 
    although  this  will  be  simpler, it  will  also  mean  that  all text 
    (including  plain  text)  in  your  comments  will  be  interpreted and 
    included in your document.  So to avoid confusion  and mistakes, and to 
    allow you to use real comment, it is best if you actually begin a local 
    stealth   environment  only  when  needed,  and  close  it  immediately 
    afterwards. 
      The stealth command is useful when  you have some plain text that you 
    don't want  normally included in  LaTeX. For example,  in this document 
    whenever it  says to "look  for the  little Wizard icons"  found in the 
    LameTeX  version, the  text referring  to  the icons  is imbedded  in a 
    stealth environment  in comments,  so that  normal LaTeX  will skip the 
    text. 
      Warning!  The  stealth  command does  not  really  start  a delimited 
    environment. For example, if you were to have 

    \ begin{Huge }\bf FOO\end{Huge } BAR 

    then the FOO would be Huge and  boldface, but the BAR would be neither. 
    This  is  because  the  Huge  environment  serves  as  a  delimiter for 
    everything inside of it. 
      The  stealth  command  is  different.  Unlike  every  other begin/end 
    combination, if you were to say 

    %\begin{stealth }\bf FOO\end{stealth } BAR 

    then FOO would be boldface, and BAR would also be boldface. 

    3.9 Including a PostScript file 


    You can use  the\includeps command to include  a PostScript file. For 
    example, to  include a file  of PostScript definitions  in gummi.ps you 
    would type the stealth command \ includeps{gummi.ps}. 

    3.10 Choosing a Page Description 


    You can use the\pspage command to include a new page description. See 
    the chapter on pages to learn more about this command. 

    3.11 For Fancy LaTeX Stuff 


    You can tell LameTeX to "skip over" some part of your file in which you 
    might, for example, imbed LaTeX  commands that LameTeX cannot handle or 
    skip gracefully. You must say\begin{ignore } and use\end{ignore 
    } inside a stealth environment to do this enclosure. 

    3.12 Free text PostScript 


    You can type any  PostScript commands you want  directly by using the\ 
    postscript  command.  For example,  to  change  the gray  scale  of the 
    printed text,  you can type  \ begin{postscript  } .6 setgray\end{ 
    postscript}. 
      You cannot just say\postscript. 
      There are  a lot  of special  things to  learn about  exactly where a 
    postscript command (like a grayscale) that you supply will be applied. 

    3.13 Hacks Just Like Mom Used To Make 


    Here's a fancier  way to get your  PostScript commands executed exactly 
    where you want them to. Use the\pscmd command to specify a PostScript 
    function to run, and the function will be run exactly in the text where 
    you have specified. 
      You would use this command only  inside a line of text. Between lines 
    of text, just using the\postscript environment is appropriate. 
      Everything  you  type  in a  PostScript  environment  gets  dumped to 
    PostScript, except for the first comment character ' you want to make a 
    comment in your PostScript, make sure to use two ' 
      Read  the  chapter  on  pages  to  learn  how  to  use  this  "direct 
    stranglehold" on PostScript correctly -- unless you enjoy surprises! 



          Chapter 4 

          How Pages are Handled in LameTeX 



          If you're going  to use the fancy  pages included with this 
          release of LameTeX, but not try  to design your own or make 
          any PostScript  hacks, then  you don't  need to  read about 
          LameTeX pages.  However, if you  are going to  try your own 
          hand  at designing  pages  and fancy  graphics,  you should 
          learn a little  bit about how LameTeX  works so that things 
          fit together smoothly. 
            I'd love  to hear  what you've  used LameTeX  for. Please 
          send e-mail to jgm@cs.brown.edu. 

          4.14 Behind the Scenes of LameTeX 



          4.14.11 The Page Description 

          A Page Description is a short program written in PostScript 
          that defines some  standard stuff about  the page that text 
          gets placed on. 
            Take a  look at  page_latex.ps, which  is the standard 
          plain  vanilla LaTeX-looking  page.  Here are  the routines 
          defined in this file: 

          PageShape 
            is a required routine that  defines a PostScript path for 
            the page. A path is basically a squiggle on the page that 
            never gets drawn. It is a closed loop of arbitrary shape. 
            It is pretty easy  to make a simple  path out of straight 
            lines using  the PostScript  moveto and  lineto commands, 
            but it  is possible  to define  a very  complex path with 
            curves and  fancy wiggles also.  You can  read more about 
            paths in  the PostScript blue  book, or chapter  4 of the 
            red book. 
            The PageShape routine should leave  a number on the stack 
            called  a setflat  value.  If your  path  contains fancy 
            curves, it  is going  to get  flattened into  a series of 
            lines using the  PostScript flattenpath operator. Usually 
            "currentflat 8 mul" works fine, although if you want more 
            preciseness  and think  your printer  can handle  it, try 
            smaller values.  If you  don't understand  this, just use 
            "currenflat 8 mul" and you should be fine. 

          StartPage 
            is  a required  routine that  draws  anything or  sets up 
            anything required at  the beginning of  a page. Feel free 
            to put some fancy graphics here. 

          EndPage 
            is  a required  routine that  draws  anything or  sets up 
            anything required  at the end  of the  page. For example, 
            the one in page_latex.ps prints 

          InitPage 
            is  not  required.  It is  just  a  simple  enclosure for 
            defining some variables that are all required: 

            fillout 
               tells LameTeX  whether you  want to  place text inside 
               the defined path, or outside of it. If you set fillout 
               to true  LameTeX will not  place any  text inside your 
               path. 

            evenodd 
               is  a  fancy  PostScript way  of  determining  what is 
               inside and what is outside of  a path. If this is true 
               then it  uses the evenodd  rules; false  means use the 
               winding rule. There's  a description of  what the heck 
               this means  in the PostScript  red book  in Chapter 4, 
               section  6. Basically  setting  this variable  to true 
               means   that  every  part  of  the  path  delimits  an 
               outside-inside boundary. 

            BM 
               In the event that fillout  is true, this is the bottom 
               of  the bounding  rectangle that  will be  filled with 
               text. If  parts of  the path  extend below  this given 
               number, it will be reset to be below the path. 

            TM 
               In the event that fillout is  true, this is the top of 
               the bounding rectangle that  will be filled with text. 
               If parts of  the path extend  above this given number, 
               it will be reset to be above the path. 

            LM 
               In the event that fillout is true, this is the left of 
               the bounding rectangle that  will be filled with text. 
               If parts of the path extend  to the left of this given 
               number, it  will be  reset to  be to  the left  of the 
               path. 

            RM 
               In the event  that fillout is true,  this is the right 
               of  the bounding  rectangle that  will be  filled with 
               text. If parts of the path extend to the right of this 
               given number, it will  be reset to be  to the right of 
               the path. 

          LeftMarginIcon 
            is not required. I  just use it do  define where the left 
            margin is, in case I want to place an Icon there. 

          4.14.12 The Page Cycle 

          LameTeX has three modes that it can be in: 

         1. In-Between Pages 

         2. On a Page, In-Between Lines 

         3. On a Page, On a Line 
            The cycle generally goes like this: 

         1. LameTeX starts off in "In-Between Pages" mode. 

         2. In-Between   Pages  mode   processes  commands  until  it 
            encounters any plain  text or LameTeX  command that might 
            require that a new page  be started. When this happens it 
            does the following: 

         3. Execute the save command 

           (a) Start a page by calling the /StartPage routine. 

           (b) Do    some  internal   initialization  and   call  the 
               /PageShape routine 

           (c) Change to "On a Page, In-Between Lines" Mode. 

           (d) On a  Page, In-Between  Lines mode  processes commands 
               until it encounters any  plain text or LameTeX command 
               that might  require that a  new line  be started. When 
               this happens it does the following: 

              i. Change to "On a Page, On a Line" mode. 

             ii. Find a new  line. NOTE: If you  have broken the page 
                 up into two or  more horizontal regions (like page_ 
                 dagger.ps does,  then know  that a  "newline" really 
                 means a new "open space to put words". It's possible 
                 to  have "two  new lines"  horizontally next  to one 
                 another. One  goes on  the left  side of  the dagger 
                 page description.  The next  new line  starts on the 
                 right side at  the same horizontal  position. If you 
                 don't  like  this functionality,  then  don't define 
                 regions   that  have  two   sides  like  the  page_ 
                 dagger.ps. Instead define "two pages" like how page 
                 _check.ps  works. The  first  page will  get filled 
                 before the second is begun. 

            iii. Initialize a word list that will contain information 
                 about this  line. The very  first item  on this word 
                 list  will  be  a  command  to  change  to  what  is 
                 considered the proper font when this line was begun. 

             iv. If appropriate for each new word or command read in, 
                 it will either add the word  to the word list or add 
                 the command itself to the  word list. For example, a 
                 boldface command  in between  the words  FOO and BAR 
                 gets inserted in the word  list between FOO and BAR. 
                 It also get executed immediately. 

              v. Also for each new word read  in, it checks to see if 
                 the word list it is  building overflows the width of 
                 the current line (as defined  in a very fancy way by 
                 the   PostScript   Page  Definition   file  and  the 
                 PostScript path given by /PageShape). If there is an 
                 overflow, or a  natural end of line  given by a text 
                 formatting command, then it does the following: 

                 A. Go through  the word  list from  the beginning to 
                    the end and for each  element, either print it if 
                    it is a word,  or execute it if  it is a command. 
                    Since  the  word  list  was  initialized  with  a 
                    font-setting command,  the first  thing this loop 
                    will do is  choose the proper  font. Add a little 
                    space  between words  if text  is supposed  to be 
                    fully justified. 

                 B. If the cause of printing  this line was a natural 
                    end of line, then go to step 3.3. 

                 C. Otherwise,  create  a  new  word  list,  and keep 
                    cycling in "On a Page, On a Line" mode. 

           (e) Eventually, going to  a new line  means falling off of 
               the  bottom  of the  page,  and  a we  change  back to 
               "In-Between pages mode", and do the following: 

         4. Execute the restore command 

         5. End a Page by calling the /EndPage routine. 

         6. Go to step 2. 
            LameTeX horizontally aligns the  words by remembering all 
          the words on the current  line, and then printing the whole 
          line at once when the line gets filled up. Printing all the 
          words at once means that it  can be smart enough to justify 
          the text to exactly match both margins. 
            There is no concept  of vertical alignment. Unlike LaTeX, 
          LameTeX does not remember all  the lines in a paragraph and 
          then print the paragraph all at once in the right place. 
            The save and restore commands are PostScript operators to 
          do memory management.  Basically what happens  is that when 
          the  restore  command is  encountered,  the  entire current 
          memory of  the printer  is replaced  with what  it was like 
          when the save command was executed. 
            This means that  if you set a  variable in your StartPage 
          routine,   you  will  be   able  to  access  that  variable 
          throughout the length of the page, but you will not be able 
          to access it  in the EndPage  routine. If you  want to have 
          some  always-changing always-remembered  variable  like the 
          page number, use the InitPage and EndPage routines instead. 
            Note that the  InitPage and EndPage  routines are outside 
          of the save-restore loop. So anything that happens in these 
          two routines stays around forever. 
            Which Commands Force A New Page Or A New Line? 

          Check it out in Operator.C. Yes, that's a C++ source file. 
          Don't be afraid of it - it  won't hurt you. In this file at 
          the top is a huge table  of command names. The first row is 
          the command name, the second is  a boolean (either a 0 or a 
          1) saying  whether this command  is a  stealth command. The 
          third is a boolean (either a  0 or 1) saying whether or not 
          a new page or new line should be started if this command is 
          executed In-Between Pages or Not-On-A-Line. 
            Also,  all  plain  text  words  force  On-A-Line-ness and 
          On-A-Page-ness. 
            Specifying the Page Description Directories 

          LameTeX will  look in  the current  directory to  find page 
          description files or any other  postscript files, but if it 
          cannot find them  you must tell  it where to  look. You can 
          use the  -p command, explained  in the  startup chapter, or 
          set your  environment variable  LAMETEX_PS_PATH to some 
          path  which  will  be searched  for  postscript  files. The 
          current directory  and the  LameTeX main  library directory 
          will always be searched. 
            There is a  great deal more about  this in the PostScript 
          chapter. 



 Chapter 5 

 How to Get Normal LaTeX Stuff 




 5.15 A Note to TeX Professionals 


 I love LaTeX.  It's great. I  just learned it  as I was  writing LameTeX. I'm 
 sure TeX is cool too, although I have not gotten around to learning it yet. I 
 was a Scribe Math hacker and have  done lots of letterpress printing. TeX has 
 a bad reputation though. I  thought that learning it would  be so hard that I 
 might  as  well  write  my  own formatter!  Others  think  that  TeX  kind of 
 straight-jackets you into professional documents. 
   Normally that's great.  My Mom isn't around  any more to  clean my room and 
 tell me how  to write professionally.  And a letterpress  doesn't care if you 
 place your letters upside down. 
   But occasionally  (or often if  you're strange like  me) I get  the urge to 
 splash  100 point  type  or stick  random  bugs all  over  the page.  Once to 
 advertise an  event I hung  up a  huge 18 foot  poster taped  together out of 
 PostScript pages. You ever get that urge? 
   Anyway, LameTeX is a fun toy. Just don't take it too seriously. 
   And no, it's not written in TeX macros! 

 5.16 The LaTeX Length Parameters 


 If LaTeX is royalty, then LameTeX is  a prostitute. If you want to change the 
 margins in the middle of the page using\textwidth, LaTeX kind of sticks its 
 nose up at you and says to  go implement your own margin library font program 
 hierarchy system out of TeX macros. LameTeX just says "OKAY!" and hops in the 
 sack with you. No questions. 
   So feel free  to change a lot  of stuff. LameTeX won't  care. I really urge 
 you to  put random stuff  inside of  a stealth environment,  however, so that 
 normal LaTeX won't balk at it and refuse to serve you. 
   It's like  playing an adventure  game. If you  die, who cares,  it's just a 
 program. But if you don't try various things, you won't have any fun. 
   There is no "textwidth" in LameTeX. When you set textwidth it just sets the 
 right margin to 8.5 inches minus the textwidth given minus the left margin. 
   Similarly there is  no "textheight". When  you set textheight  it just sets 
 the  bottom margin  to 11  inches minus  the textheight  given minus  the top 
 margin. 
   Please note that  just like LaTeX, LameTeX  defaults to ridiculous margins. 
 There's a good  chance that if your  margins are large at  all, that the text 
 may not fit inside the page description  path! This is especially true of the 
 page_check.ps page description,  which breaks the page  into boxes that are 
 only and inch wide or so. 

 5.17 Tiny Differences from LaTeX 


 You can't use fine-tune  spacing commands. You won't  get a table of contents 
 anywhere, and you can't do table and figures. 
   \vspace  is  meant to  give  the  absolute vertical  distance  between the 
 current line and the last line (or top of  page). If you use two of them in a 
 sequence, you're likely to have the larger one apply only, not both together. 
   There is no concept  of "glue" in LameTeX. I  bent over backwards trying to 
 make it possible  to put a  backslash next to  a command when  I want to type 
 something like\myfancycommand.  Unfortunately, LameTeX  views these  as two 
 tokens from  which the  space in-between  has been  "deleted". It's  happy to 
 break a  line in  the middle. You'll  probably see  that scattered throughout 
 this document. It only happens when  you print the special characters\% ,\ 
 _ ,  and the like.  This "ungluing"  will also occur  if you  change fonts or 
 change environments in any way in the middle  of a word. So if my sentence is 
 in italic but  the period at  the end of  the sentence is  in roman type, the 
 period might be placed on a newline by itself! 
   In general, LameTeX  will occasionally screw  up the spacing.  Oops. No, it 
 doesn't do kerning! Geez ... 
   To  avoid  this  it's  best to  include  sentence  punctuation  in whatever 
 environment happens to precede it. For example, use "Pay me in {\em cash.} 
 " instead of "Pay me in {\em cash}." 
   You can't make  small caps, typewriter,  or sans serif  font into italic or 
 bold face. I  didn't know it was  possible until recently so  I didn't put it 
 into the program. 
   LameTeX is  quite happy  to give you  widows and  orphans. If  this sort of 
 thing keeps  you awake  at night,  you are  taking LameTeX  too seriously and 
 should go play  Tetris until you go  insane (this doesn't  take long). If you 
 don't know what widows and orphans are, good. I won't tell you. 

 5.18 PostScript is a Great Language, Too Bad it Sux 


 I love PostScript. LameTeX makes  extensive use of the PostScript programming 
 language. I  think PostScript  is great.  However, when  a PostScript program 
 breaks, your printer is  more likely to say  "ARGH" or silently start whining 
 rather than to print out some message like "I say, old man. You've got a spot 
 of trouble on line 36 you see. It  seems (if I may venture to take a liberty) 
 that you made a misspelling  error in the word 'sux'."  If it's a LameTeX bug 
 then get  in touch  with me  and I'll try  to fix  it. But  if you're hacking 
 PostScript through LameTeX it's very easy to screw things up. The solution is 
 not to get scared and stop playing with  it. Send me some mail and we'll work 
 it out together. Chances are I  forget to document some assumption I'm making 
 somewhere about  how to  use the  cool PostScript  routines. Once  I tell you 
 about it things will be fine. 

 5.19 LameTeX Fonts 


 To  get  different  fonts in  LameTeX,  you  can just  use  the  normal LaTeX 
 font-changing  operators.  It  is  not  possible  right  now  to  get  normal 
 PostScript fonts using a LameTeX operator. However there is a cool workaround 
 if  you  want to  try  it out.  The  program  originally worked  that  way on 
 PostScript fonts but then I figured  that people would really really want the 
 normal LaTeX fonts, so I put those  in, instead. For sure the next version of 
 LameTeX will  allow the  user to  choose "normal"  scaleable PostScript fonts 
 instead of the somewhat tedious LaTeX  bitmaps. Documents which used only the 
 scaleable fonts would be much smaller and compile faster. 
   It is  possible for  you to  make your  own PostScript  hack to  change the 
 appearance of a word,  and this can certainly  include using a scaleable font 
 if you wish. This is described in the hacks chapter with the command\pscmd. 
   LameTeX is very versatile about  changing margins in mid-document and stuff 
 like that. 

 5.20 Getting References 


 LameTeX allows  you to  use the  LaTeX commands\ref  and\label, but not\ 
 pageref.  If you  have forward  references, you  do not  need to  run LameTeX 
 twice. LameTeX  is smart enough  to do its  own recovery if  you have forward 
 references. Pretty neat, huh? 



 Chapter 6 

 Including Your Own PostScript Hacks 



 Let's face it.  This manual is nice,  but let's get into  the nitty gritty of 
 the examples  presented here and  maybe I  can show you  how to  do some cool 
 stuff with LameTeX. If  you have questions, we can  chat in person over mail. 
 Here goes. 

 6.21 How to Use Include Files To Do Stuff 


 This manual can be  formatted by running either LaTeX  or LameTeX on the file 
 lametex_doc.tex. There  are a  lot of  other files,  but lametex_doc.tex 
 includes them using the LaTeX command\include. 
   While  reading this  section on  examples,  you will  probably want  to run 
 LameTeX over just one chapter, not all  of them. If you edit the file lametex 
 _doc.tex you can  "comment out" everything  you don't want.  For example, if 
 you wanted to run LameTeX over the  chapter on pages, you could edit the file 
 so that it looked like: 
   \documentstyle [ 10pt ]{report } 

 \setlength{\textwidth}{6 in } 

 \setlength{\textheight}{9 in } 

 \setlength{\topmargin}{0 in } 

 \setlength{\oddsidemargin}{0.25 in } 

 %\begin{stealth }\includeps{icons.ps }\end{stealth } 

 \begin{document } 

 %\include{titlepage } 

 %\include{introduction } 

 %\include{starting } 

 %\include{stealth } 

 \include{pages } 

 %\include{normality } 

 %\include{hacks } 

 %\include{future } 

 %\include{errors } 

 %\include{commands } 

 \end{document } 

 Notice  how all  the  chapters, except  for  pages.tex, have  been  placed in 
 comments using the  '%' character. This  means that both  LaTeX and LameTeX 
 will ignore them. 

 6.22 White Text Hack 


 Look in titlepage.tex, just before where  it says "Copyright 1992". Here is a 
 demonstration of changing the  color of the text so  that it is white instead 
 of black. This  is done using the  special LameTeX stealth commands\stealth 
 and\postscript. 
   All the  stealth commands  are located inside  comments so  that the normal 
 LaTeX  won't see  them. So  I have  to start  a stealth  environment, because 
 without that none  of the other commands  I type inside  the comments will be 
 interpreted. 
   Then I start  a postscript environment.  From that point  on, everything in 
 the file gets dumped  directly to the postscript  output. So "1 setgray" gets 
 included  directly in  the  PostScript output  file.  This is  the PostScript 
 command to paint things white, not black. 
   Naturally after the one line has been painted white, I must put the default 
 color back to black or else my whole document will be in white! The\stealth 
 and\postscript  environments  are  special  because  they  don't  as  scope 
 delimiters for internal changes. 
   So if you did a  boldface in a Huge environment  you'd expect that when the 
 Huge  environment ended,  that the  boldface  would go  away. The  "scope" of 
 boldface  was  limited to  the  Huge  environment.\stealth and\postscript 
 don't limit scope like that. 
   Here's a trick  to try out.  Try placing the  words "Copyright 1992" before 
 the  "1 setgray"  line and  the words  "Jonathan Monsarrat"  afterwards. What 
 happens? Does "Copyright 1992" come out in white or black? 
   The answer  is that is  comes out in  white, and  if you refer  to the Page 
 chapter I  can show you  why. LameTeX  is trying to  center this  line on the 
 page. To  do that  it needs  to know  how long  this line  is. So  instead of 
 printing out the words one at a time, LameTeX stores the words in a big list, 
 and then  prints them at  the end once  the line has  been completed. LameTeX 
 always does this. 
   So in the  modified version I asked  you to make, first  a procedure to get 
 the correct font  is put on the  word list. Then "Copyright"  is added to the 
 word list. Then "1992"  is added. So far, nothing  has been printed. Then the 
 "1 setgray" gets executed.  Then "Jonathan" and "Monsarrat"  get added to the 
 word list.  Finally we reach  the end  of the line,  and when  the whole line 
 prints out, all four words are in white because of the "1 setgray" command. 
   The word list,  as well as having  words and commands on  it, can also have 
 numbers. A number  on a word list  means to move  over an amount horizontaly. 
 The\hspace command and others add in horizontal whitespace in this way. 

 6.23 The Dagger Hack 


 LameTeX is written  for PostScript version 1  because I wanted  it to work on 
 all PostScript printers.  I love PostScript  but it was  very awkward to work 
 with. For one  thing, PostScript 1  doesn't have very  good memory management 
 tools. If you're not careful, even a simple hack like piping a thousand words 
 through a  small program  and printing  them will  take up  a lot  of memory, 
 because each word  is stored in a  string, and that  string is never deleted, 
 not even when the string is printed and cannot be accessed. 
   Fortunately, there  is a workaround.  LameTeX uses  the PostScript commands 
 save and restore to do memory cleanup. If  it didn't, it would use up so much 
 memory that  your document  could not  print out  if it  were long.  The save 
 command takes a snapshot of the current state of computer (or printer) memory 
 and the restore command erases the current state and returns the computer (or 
 printer)  to exactly  the  state it  was  in whe  the  last save  command was 
 executed. 
   This happens  at the beginning  and end of  each page, as  mentioned in the 
 chapter on Pages. 
   Now here's an interesting question for  you. I have this immense picture of 
 a dagger that I  want to include in  my PostScript page. I  want text to flow 
 around the dagger. What should I do? 
   Look in stealth.tex and  page_dagger.ps to find the  answer. If I were to 
 place the huge Dagger routine outside  of a save-restore block, then it would 
 hang around in memory forever, even if I didn't intend to use that particular 
 picture any more in my document. This would be unclean. What I really want to 
 do is to  insert the Dagger  picture, including the  definition - because the 
 definition takes  up a  lot of  room too  as well  as variables  - inside the 
 StartPage routine. 
   The StartPage routine gets called after the save and before the restore. So 
 whatever  garbage I  throw into  memory  drawing the  dagger will  neatly get 
 erased at the end of the page. 
   Also  there is  the matter  of the  path defined  in PageShape.  The dagger 
 itself is some 200 lines of curveto  commands! This is way too much curviness 
 and way too detailed for something as  macroscopic as placing text. So I have 
 drawn an irregular polygon around the  dagger. The polygon works just as well 
 for the simple  blocky task of placing  text around the dagger.  Plus it is a 
 lot simpler because it is made entirely of straight lines. 
   You can view  this path by  uncommenting the line  where it says "Uncomment 
 me" in page_dagger.ps. 
   Actually  the  description  of  the  dagger  itself  gets  thrown  into the 
 In-Between Page space that  is not cleaned up,  because the StartPage routine 
 is defined along with the page itself in the In-Between Page space. 
   One way to get around this I have implemented for page_demon.ps. That is 
 to have the page description just contain a small bounding box, just like the 
 description for the dagger.  The actual drawing of  the fancy demon I include 
 in normality.tex, once  on each of the  three pages. Why  would I include the 
 file three times? Doesn't that make my PostScript file bigger? 
   Yes, that is certainly true. But the demon hack is immense, some 25K of raw 
 PostScript code. I really  don't want to define  a PostScript routine to draw 
 all of that.  If I use the  include function, the routines  that draw the get 
 demon are executed  without ever being saved.  So it's OK to  have a very big 
 PostScript file as long as  the file is a long  stream of commands. You start 
 getting  into  trouble  when  you  define  procedures  with  long  streams of 
 commands. 
   Unfortunately, this does indeed mean that  I have to "guess" where to place 
 the\include demon.ps command, once for each of the three pages. 

 6.24 The Titlebar Hack 


 The best thing  about LameTeX is that  if you want to  do some pretty radical 
 stuff,  LameTeX says  "OK! Let's  go for  it!", whereas  TeX and  LaTeX would 
 probably say  "B-B-But, why would  you want  to do that?  That wouldn't be... 
 (trumpet flare) professional!" 
   Here's  a  great  example. On  the  title  page there  are  two  big hacks, 
 /Weird-Stuff and /Title. Both of these  PostScript programs take a string off 
 of the stack and display it in an unusual way. 
   Using these two  programs is as  simple as starting  a stealth environment, 
 starting a postscript environment, and then just inserting the commands! 
   NOTE: Notice  how the LameTeX  title has  holes in it!  An omen?  A sign of 
 portent about the program itself? 
   Also note that  of course I put  all of the major  graphics coding into the 
 StartPage routine, including the definitions, so that when they are no longer 
 needed these definitions will be  erased. The definitions persist between the 
 save and restore,  and since all the  printed text on  the page comes between 
 the  save and  restore,  I can  still call  these  routines from  the LameTeX 
 document as long  as I do it  before the restore  command associated with the 
 EndPage. 

 6.25 Page Number Hack 


 This hack is the logical opposite of the dagger hack. With the dagger hack, I 
 wanted to stuff a lot of PostScript  code into the /StartPage routine, get it 
 to draw some stuff, and then destroy it. 
   With the page number, I want the  page number to be preserved across pages. 
 It would  be a  crime if  I changed  page number  2 to  3, and  then when the 
 restore command came along it reverted back  to 2! So instead of placing this 
 code in /StartPage, it goes in /EndPage instead. 
   The /EndPage routine gets  called after the restore  from the previous page 
 and  before the  save  from the  next page.  It's  in-between pages,  and any 
 variables  changed  here,  like  pagenumber,  will  remain  around.  Also the 
 InitPage routine gets called  before the first save is  done for the page, so 
 it is in-between pages also. 
   Here's another quirk to  inbetween-pages. When you're on  a page, a special 
 dictionary is used called  formatdict. A dictionary is  just a place to store 
 variables in  PostScript. These variables  are accessed  directly like normal 
 variables when you're  on a page. But  in-between, you need  a special way to 
 get  at  the variables.  One  exception:  InitPage does  have  access  to the 
 variables directly,  which is  how it sets  formatdict variables  like BM and 
 evenodd without using dictionaries. 
   For example, if I want the bottommargin, I can't just say "bottommargin" to 
 put the bottommargin onto the stack.  I have to say "formatdict /bottommargin 
 get", which does the same thing. If  you are a PostScript expert, you'll know 
 what I say  when I note  that I do  this to keep  plenty of room  open in the 
 generic user dictionary. 

 6.26 The Format Dictionary 


 The most important variables in the format dictionary are: 

 baselineskip 
    The number of lines to skip between lines. 

 bottommargin 
    The  margin at  the bottom  of the  page. The  LaTeX words  textheight and 
    textwidth don't mean  anything to LameTeX. They  get translated into left, 
    right, top, and bottom  margins on the assumption  that the textheight and 
    textwidth commands apply to a normal-sized 8.5x11 inch paper. 

 bslot 
    The X coordinate of the left hand side of the current line. 

 coords 
    A very complex representation of the page path. 

 eslot 
    The X coordinate of the right hand side of the current line. 

 justify 
    An  integer,  can be  102  (or 'f')  for  full  justify, 99  (or  'c') for 
    centered, 114 (or 'r') for flush right, or 108 (or 'l') for flush left. 

 leftmargin 
    The margin  at the  left hand side  of the  page. There  is no distinction 
    between evensidemargin and oddsidemargin. 

 newfontcmd 
    The command of the "currently used  font", which doesn't really have to be 
    a font command at all. 

 para 
    Whether the end of this line will mark a new paragraph. 

 parindent 
    The amount of indentation for the first line of each paragraph. 

 parskip 
    The amount of vertical space to skip in-between paragraphs. 

 rightmargin 
    The margin at the right hand side  of the page. The LaTeX words textheight 
    and textwidth  don't mean  anything to  LameTeX. They  get translated into 
    left, right, top, and bottom margins on the assumption that the textheight 
    and textwidth commands apply to a normal-sized 8.5x11 inch paper. 

 savetype 
    The currently saved state, saved by the save command. 

 topmargin 
    The margin at the top of the page. 

 vspace 
    The amount of vertical space to skip for the next paragraph. 

 welem 
    The number of elements in the word list. 

 wlen 
    The total  length of all  the words in  the word list,  including a single 
    space between each word. 

 wlist 
    The word list itself.  Feel free to mess around  with it. Please make sure 
    to set "welem", "wlen", and "woids"  to appropriate values or it'll break! 
    The correct way to add stuff to wlist  is put doing an indexed get and put 
    into the array. The maximum length  of wlist is 100 elements. It's defined 
    at the top of format.ps if you want to change it. 

 woids 
    The number of elements in the word list that are actually words. 

 xpos 
    The current X position. 

 ypos 
    The current Y position of this line. 

 6.27 The Icon Hack 


 Notice   how   each  page   description  has   a  different   definition  for 
 LeftMarginIcon. This is because each page is a little different and "where to 
 put icons in the left margin" varies a little. 
   So putting the little Wizard in the text is as simple as starting a stealth 
 environment,    starting   a   postscript   environment,   and   called   the 
 /LeftMarginIcon routine to display the Wizard. 
   Notice that the LeftMarginIcon uses one (or two) formatdict variables: ypos 
 (and maybe  bpos). Because  the LeftMarginIcon  routine is  being called from 
 inside the page,  there is no  need to do  a fancy dictionary  lookupt to get 
 their values. 

 6.28 Doing it Yourself in PostScript 


 If you want to schlep a word  onto the wordlist, say "(elephantine) NW" which 
 is the  PostScript command  that puts  the word  "elephantine" onto  the word 
 list. A space will automatically be added for you. Do not put a space in your 
 words. Instead use two PostScript calls. For example, do not say "(ice cream) 
 NW". Instead say "(ice) NW (cream) NW". 
   If you  have a  really long sentence,  then you  can just  say "(ice cream) 
 Parse". Parse is a PostScript routine that  will break a string up by spacing 
 into "(ice) NW (cream) NW". 
   If you want to schlep some horizontal whitespace onto the wordlist, you can 
 use the LaTeX\hspace  command. If you  really want to  do it in postscript, 
 then "54.0 HSpace" is  the PostScript command to  add 54 points of horizontal 
 space to the word list. There are 72 points in an inch. 
   Also, naturally  you can  gronk the value  of any  of the  variables in the 
 fontdict directly. Grok-p? Keep in mind that if you change them in PostScript 
 instead of  in LameTeX, then  LameTeX will "lose  track" of them  and may not 
 reset them for you. You  will have to put them  back to their original values 
 yourself. 

 6.29 Using\pscmd to Do It When You Want It 


 the  white-painting applied  to the  whole line,  not just  parts of  it. You 
 couldn't paint just part of a line white. 
   Well, here's  how. I'm going  to tell you  twice. This section  is the easy 
 slick way. The  next section tells  you the same  thing, if you  want to get 
 your hands dirty, which I encourage. 
   Anyway, for the easy way, take a look at example5.tex. 
   Here I  define a  command /Smiley that  alternately either  draws a picture 
 without changing the currentpoint, or calls READJUST. 
   Sometimes LameTeX will  be building a line  made out of  10 point type when 
 suddenly the user wants to get 30 point type. Well, since the line started on 
 this 10 point line, all the 30  point letters are too tall and will overwrite 
 the previous line just above the  current line! There is a PostScript command 
 that LameTeX calls automatically when such oopses occur. That's /READJUST. It 
 takes a  vertical length  to skip  from the  stack, in  points. There  are 72 
 points  in an  inch. I  have some  command "in"  defined somewhere  that just 
 multiplies any number by 72 to convert it into points. 
   You can call  /READJUST yourself no problem.  For example, I  do it here in 
 example5.tex to make the line tall enough to accept the smiley face. 
   Don't  forget! At  the  end of  every page,  everything  gets wiped  by the 
 PostScript restore routine. Here  Smiley is defined On-Page  in the middle of 
 page 1. On  page 2 it  would be undefined.  If you want  your routine to hang 
 around for page two,  you either need to define  it In-Between Pages (the bad 
 wicked way) or define it in /StartPage (the good way of lightness and being). 
   Notice that the\pscmd command in placed inside braces. This delimits what 
 is now the "Smiley" environment. For example, if Smiley had changed the font, 
 the font change would have remained  in effect until the end-brace delimiter. 
 The way this is implemented  is really for fonts, and  being able to add your 
 own PostScript functions is  not something I had  envisioned at first. I will 
 fix this later, but for the time  being realize that your function Smiley, if 
 it not delimited, will  be executed at the beginning  of each new line. Also, 
 any font changes like italics or  boldface will kill your Smiley environment. 
 Try taking out the braces around the\pscmd and you will see what I mean. 
   I hope you can see  how you could use this  to include really big pictures, 
 not just small  smiley faces. You get  to have complete  control over how big 
 the picture is, by passing its width and height to READJUST. Alternately, you 
 can modify the wlist  array directly if you  want something special. In later 
 versions,  the  READJUST  command  will  be  able  to  handle non-rectangular 
 boundaries just like pages do. 
   There is no way to do this currently  unless you modify the Page on the fly 
 by defining the "current page" as something new (including the box around the 
 Smiley" and forcing a re-assessment of the dimensions of the page. 
   Here are the rules for a routine that you use with\pscmd: 

1. When your routine is called, the currentpoint  will be set to where the next 
  word would normally  be placed. Make  sure that the  currentpoint is defined 
  when your routine is finished. You  can accomplish this neatly by just doing 
  a  Postscript "gsave"  at the  beginning  of your  routine and  a "grestore" 
  afterwards. 

2. Don't  forget  that you  have  access to  the  entire word  list  and format 
  dictionary. 

3. When your routine  gets called, either false  or true will  be on the stack. 
  The value will be "false" if LameTeX is building the word list and "true" if 
  LameTeX is printing the word  list. You gotta either use  this or pop if off 
  the stack by making the first command in your PostScript routine be "pop". 

4. When you  split up  a word,  like by  saying Will  you be  my SWEET  \ pscmd 
  /drawheart HEART? LameTeX will make an attempt to put Sweet and Heart all in 
  the same  word. It  won't try  really hard  though. There  is no  concept of 
  "glue" in LameTeX. I gotta add this sometime soon. So if a pagebreak occurs, 
  or a line break,  LameTeX will gladly put  SWEET at the end  of one line and 
  HEART at the beginning of another. Oops! 

 6.30 Behind the Scenes of\pscmd 


 Remember the "Word List"? You too can  schlep things onto the word list. This 
 is exactly what the\pscmd  does, but if for some  reason it doesn't work or 
 you want  to try  fiddling with  the PostScript  code directly,  it's simple. 
 Here's how. 
   The most interesting part is schlepping  a command onto the word list. Take 
 a look at example3.tex. 
   To  schlep a  command onto  the word  list,  I have  to first  register the 
 command by placing it onto the end of the fontnames array. From now on I just 
 refer to this command by its number which I store in the variable FUNKYnum. 
   The actual syntax for schlepping a command  onto the world list is to say \ 
 [ FUNKYnum false ] NewFont", where FUNKYnum is an index to my function in the 
 fontnames array, and  the boolean is false  if I want LameTeX  to add a space 
 after this  NewFont command.  If the  boolean is  false then  LameTeX puts no 
 space between a word before the NewFont command and a word afterwards. 
   The  line \  [ temp  false ]  NewFont"  is important.  Once I  have started 
 playing God with  the LameTeX PostScript  code, I should  remember to put the 
 font back to the way it was. 
   I hope  it's obvious that  the routine  would't have to  be a Font-changing 
 routine at all. It could be any routine. Here are some things to keep in mind 
 though. Remember the flow  chart from the chapter  on pages? The routine will 
 be executed twice, once when the word  list is being compiled, and once when 
 the word list is being printed. 

 6.31 The Wigglies Hack: using SHOWIT 


 I have  written a PostScript  hack called  format.ps that does  all the major 
 formatting for LameTeX. The command that it  uses to show words is the SHOWIT 
 routine, which is defined as follows: "/SHOWIT { show } bind def". 
   Feel free to redefine this routine if  you want to change the way the words 
 look in any way. The routine will  be called with the currentpoint set to the 
 appropriate place and the string to be printed on the stack. 
   I wrote a cool hack based on  this. Try it out with example4.tex. And don't 
 forget: When you  play God with  LameTeX's PostScript output,  be sure to put 
 things back! When I have finished hacking up SHOWIT with my own definition, I 
 put it back by saying "/SHOWIT { show } bind def". 
   You  can't do  this  stuff with  TeX macros!  (Although  you could  argue I 
 suppose that only a loony would try...) 

 6.32 Forcing Word Positions with NW 


 NW is defined  as follows: "/NW  NextWord bind def".  NextWord is the routine 
 that is called repeatedly, once for each word, to place the words in the word 
 list.  Feel free  to modify  this routine  too  if you  want to  perform some 
 operation to the strings before they get included in the word list. 

 6.33 The Skew Page Hack 


 Look in the files starting.tex and  page_skew.ps for an example of diagonal 
 text.  LameTeX  is not  really  capable of  placing  text in  any  way except 
 horizontally (unless you redefine the  SHOWIT and NW routines). So therefore, 
 in order to get diagonal text, the page must be slanted. So although it looks 
 to the user like the text is slanted and the page is an upright rectangle, to 
 LameTeX it  appears as  if the page  is a  very wide page  in the  shape of a 
 diamond on its end. And the text appears horizontally. 

 6.34 The Checkerboard Hack 


 Check out example6.tex. Here is an example of two virtual pages being placed 
 on a  single physical 8.5x11  inch piece of  paper, using a  variable flip to 
 determine  which  virtual page  comes  "next". I  hope  you can  see  that it 
 wouldn't be hard  to define several  virtual pages on  a single physical page 
 (like for making index cards or mailing labels). 

 6.35 Bugs? 


 There are no bugs in LameTeX. 



          Chapter 7 

          The Future of LameTeX 



          Most of my  effort was to make  this understand LaTeX code. 
          Now I can  concentrate on other  functionality, like making 
          it work better, understand more LaTeX functions, and - best 
          of all - providing easier  ways to include PostScript hacks 
          into the document. 
            I want to try out  some experiments with on-line document 
          viewing. There's no reason why a TeX-like language like the 
          Stealth   Commands  couldn't   drive  PostScript  animation 
          through a  previewer or let  the user include  audio in the 
          document. 
            Although  I love  PostScript  dearly, more  coding really 
          should go  into C++. I'll  let PostScript do  all the fancy 
          graphics, but  C++ should do  more of  the decision making, 
          because it  is very difficult  to write  and maintain large 
          programs in  Postscript version  1.0. I  would make  use of 
          some  fancy  PostScript  interpreter  to  do  some  of  the 
          PostScript processing while processing the input file. 
            LameTeX  should in  general produce  a smaller  output. I 
          would   like  to  write  a  compress  mode  to  make  sleek 
          uncommented PostScript. 
            There is no  glue in LameTeX  currently, which means that 
          two  words  that happen  to  be  side by  side  may  have a 
          pagebreak or a  linebreak in-between them.  There is no way 
          to prevent this in the current version of LameTeX. 
            You  can't use  a previewer  program  that looks  for the 
          fancy   Adobe  PageBreak  PostScript  comment.  Sorry.  The 
          PostScript program doesn't "know" where the page breaks are 
          going to come until run time. 
            I   would   like  to   write  better   tools  and  better 
          documentation so that people unfamiliar with PostScript can 
          still try out a few hacks like grayscale or font changing. 
            Obviously,  LameTeX  should  handle  spacing  better.  It 
          should  do  vertical  alignment.  LameTeX  should  be smart 
          enough to handle the TeX hyphenation dictionary and be able 
          to  handle the  fonts directly,  which are  currently being 
          done in a big hack that barely works. 
            Using normal PostScript scaleable  fonts should be simple 
          and  let the  user save  a  lot of  room in  the PostScript 
          output file. 
            The user should  be able to  define new LameTeX commands. 
          This  includes  normal  ones attach  to  LaTeX  made with\ 
          newcommand\newenvironment\newtheorem,     and   special 
          Stealth ones hooked either to C, C++, or PostScript code. 
            I'm hoping  to hear a  slew of  requests for enhancements 
          and (ahem) bug fixes! So I should have plenty to do. 
            I'm going to  have to do  some investigation to  see if I 
          can "trick"  LaTeX or  TeX into  giving me  a raw paragraph 
          with a bounding  box. If so,  then I could  hook up a great 
          deal of  functionality like math  mode by  fooling TeX into 
          making the output and then snarfing the result. 
            The token parsing is done all wrong and should be cleaned 
          up and made to model LaTeX parsing. 
            TeX is a trademark of the American Mathematical Society. 

          PostScript is a trademark of Adobe Systems Incoporated. 

          LameTeX ain't a trademark! 



          Chapter 8 

          Errors 



          If  you get  an  error like  this  "stackoverflow offending 
          command: pathforall Stack: [ /coords -mark- ..... ] ", this 
          means that  the path  you are  using for  the page  is very 
          curved  and  not particularly  flat.  PostScript  is having 
          trouble keeping track of all  the points! You should double 
          or triple the setflat value. 
            If you  get an  error undefined  in\end, you  ended a\ 
          begin{postscript }  command with something  else that was 
          not\end{postscript}. 
            A lot of problems come from having your margins too wide! 
          Make sure  that you margins  are small enough  so that your 
          text will fit around the pictures. 
            If you get an error  "false false false false false false 
          false  stack  overflow"  then  you're  using\pscmd  on  a 
          routine that doesn't handle  the incoming boolean. Just add 
          a PostScript pop to the beginning of the PostScript routine 
          you call with\pscmd. 



          Chapter 9 

          Commands 



          This   is  the  complete  list  of  commands  that  LameTeX 
          understands.    It's   formatted  in   an   easy   to  read 
          alphabetically sorted list. 
            The    stealth   commands   are:\stealth\postscript\ 
          includeps\pspage\ignore\pscmd\STEALTH 
            The normal LaTeX commands are:\#\%\&\Huge\LARGE 
          \Large\\\_\addtolength\backslash\begin\bf\ 
          bigskip\center\chapter\chapter*\clearpage\ 
          description\document\documentstyle\em\end\ 
          enumerate\flushleft\flushright\footnotesize\hspace 
          \hspace*\huge\include\it\item\itemize\label\ 
          large\ldots\medskip\newlength\newline\normalsize 
          \par\paragraph\paragraph*\part\part*\quotation\ 
          quote\raggedleft\raggedright\ref\rm\sc\ 
          scriptsize\section\section*\setlength\sf\sl\ 
          small\smallskip\subparagraph\subparagraph*\ 
          subsection\subsection*\subsubsection\subsubsection*\ 
          tiny\today\tt\verse\vspace\vspace*\\ 



          Chapter 10 

          Plain Text 



          If  you want  to make  LameTeX  produce plain  text output, 
          which is to say a plain ASCII output, it can do that. 
            Just type lametex -t yourfile.tex  and the result will be 
          placed in the file yourfile.txt.