PostScript ON THE SINCLAIR ------------------------ John Pazmino NYSkies Astronomy Inc www.nyskies.org nyskies@nyskies.org 1991 January 1 initial 1997 January 1 current
[This set of four articles are placed together here as a history piece. They illustrate in this 21st century one example of the vigorous experiment and experience in the earlier years of home computers, The home computer was the Sinclair Spectrum. It runs off the Z80 CPU, 8MHz clock speed, 64kb RAM, BASIC operating system An American veriosn of this machine was the Timex-Sinclair. The dates of issue span the initial composition and the latest revision, based on clues within the articles.]
= = = = [I came onto some old issues of 'LISTing', newsletter of the Long Island Sinclaiar-Timex computer club, with a series of articles I wrote about running PostScript on a Sinclair computer. Being that they were written before Internet pervaded into common use and that PostScript programming is an intriguing application for Sinclair, I pass them along to you now in the COMP.SYS.SINCLAIR newsgroup. I did minor editing to clean up wording. There are four articles in the series but your local Internet service may split each into several pieces. Be sure to capture each of them. Have fun!]
POSTSCRIPT ON THE SINCLAIR ------------------------ Oy!, you noticed! How pretty and lovely this article looks! Oh!, the letters are so sharp and crisp and neat! What's with that Pazmino, already?
[Original article was printed in a fancy typestyle in 'LISTing'.]
Did he get attitude and turn to one of those other computers? No, I'm still in the Sinclair flock. I merely typed this out on my SInclair in a new language. The language PostScript. PostScript on a Sinclair? What is PostScript? You probably surmised already that it has something to do with the appearance of this article. You don't get such beautiful typography out of a Sinclair, right? A little history. In 1985 a group of computer companies teamed up to sic PostScript on the world: Adobe, Aldus, and Apple, These firms assembled Adobe's vector character system, Aldus's PageMaker program, and Apple's LaserWriter printer into a magical engine for typography. By a secret process the mouseclicks and keystrokes on the computer were turned into finished pages from the printer. Pages so good they substituted for those produced by orthodox type setting and graphic rendering. Thus was born the present gigantic industry of desktop publishing. Because the three companies kept their internal workings tightly to themselves, no one could dope out what happened between the key and mouse action and the spitout of the finished page. Never the less, a major feature of PostScript is the manner of handling characters. You, a Sinclair enthusiast, will find it easy to appreciate. For there is a strong parallel to Sinclair's graphics functions. Key in, save, and run the 'A' program here.
10> REM 'A' program 28> DRAW -12*x,18*y 12> LET x=1; LET y=1 30> DRAW -46*x,0 14> PLOT 0,0 32> DRAW -12*x,-18*y 16> DRAW 10*x,5*y 34> DRAW 10*x,-5*y 18> DRAW 40*x,60*y 36> DRAW -25*x,0 20> DRAW 40*x,-60*y 38> DRAW 29*x,27*y 22> DRAW 10*x,-5*y 40> DRAW 42*x,0 24> DRAW -2*x,0 42> DRAW -21*x,32*y 26> DRAW 10*x,5*y 44> DRAW -21*x,-32*y
You get a [sort of] neat capital letter 'A' on the screen. It is made of PLOT and DRAW operations. Fundamentally, there is no difference between this 'A' and a shape made from the same PLOT/DRAW functions. From your immersion in the Latin environment you say that this is a letter 'A' and not a tree or a goat. With the 'A' still printed on the screen do a screensave of it. You just captured a block of the memory containing the image of the 'A'. Each pixel on the screen is mapped one-to-one to a bit in the memory. You in truth created a bitmapped file of the 'A'. The original 'A' program is a vector or outline file of the same letter 'A'. Do NEW. Now you want to restore the 'A' to the screen. You can load and run the 'A' program or you can load the 'A' screen. The 'A' screen -- the bitmapped file -- is way the longer of the two at several kilobytes. The vector program is only a few hundred bytes long. Hence, one distinction between bitmapped files and the outline file is the greatly larger size of the former. There's more. Edit line 12 so x=0.6 and y=1.2, then run the program. You get a slimmer and taller 'A'. Try other values for x and y and get all sorts of stretched and sized 'A's. You may hit against an 'out of range' error if the letter spills off of the screen. But apart from that you can make any 'A' you like. Not so in the bitmapped scheme. You got to have a new and other file for each variety of 'A' you want. If your text calls for eight sizes of 'A' you need eight bitmapped files of that 'A'. Yet each variety of 'A'is generated by a simple edit of the one and same 'A' outline program. Ergo, in the place of a battery of bitmap files you have but a one vector file. There is a further and momumental difference between the two systems of character. The bitmapped character must be designed to coordinate with the peculiar printer you got. An 'A' made to look good on a 9-pin Epson may look lousy on a 9-pin Citizen or a 24-pin Panasonic. This is due to the diverse shape, size, and spacing of the pixels among the printers. The vector method employs a phantom mathematical coordinate system, unattached to any particular output device; it is 'device independent'. The drawing instructions are sent to the printer, which does what ever is necessary to reproduce the character the way it's supposed to look. You glimpsed this already in the 'A' program. You plugged in x and y values in full disregard of the pixel grid. The coordinate of any point in the 'A' can well be a noninteger number of pixels. Yet the 'A' looks rather nice anyway. (By the way, did you know that Sinclair does round off noninteger coordinates?) PostScript uses the outline or vector scheme of character generation. It is device independent. That is, once you work out the drawing instructions for the 'A' you can apply them to any printer and get a fair and proper realization of the 'A'. In the outline system you can -- no kidding -- code the entire Algonquin pubesence oath onto a pinpoint. Or an 'SOS' from Earth large enough to read from Jupiter. Try it with the 'A' program. Let x = 1e-10, y = 1e-10. See? A [very] miniature 'A'. Uh, wait a minute; that's just a dot there. Go and look closer. Yep, it is a dot. Yet Sinclair really did carry out mathematicly the scaling and that dot just happens to be a set of individual coordinates all rounded to (0,0). If you send that program to a microphotoetcher, used for inscribing computer chips, and look at the output thru a microscope, lo!, there before your eyes is a perfectly formed 'A'. And this is a good thing. Such microscopic size of character is impossible in the bitmap system. There is no way to form a recognizable letter out of a single pixel! At the other extreme there is no (at least for a year or so) computer big enough to hold the squillions of bits for the 'SOS'. Now the 'A' program has one style of 'A'. You can redefine the basic shape with PLOT/DRAW statements. This new 'A' shape is a new file, named appropriately. You build up a suite of character sets, or fonts, and load in the one you want. In PostScript, the fonts are stored on disc or cartridge and you feed them to the printer (or, in some cases, to the computer) so you have onboard the stable of fonts your text calls for. Yes, yes, yes, but how does all this PostScript shtik work? One bright and sunny day ...
= = = = = A BOWL OF ASCII SALAD ------------------- ... some grunts tapped into the cable connecting the computer to the LaserWriter. What before their wondering eyes spilled out? Out gushed letters! Numbers! A few symbols! And nothing else. They were all pure and simple ASCII characters. What the hell was this junk? It was a veritable program. A stream of code. All in a fullblown mature sophisticated language. This was the PostScript language! The desktop publisher running on the computer took all the keystrokes and mouseclicks and turned them into a PostScript program in unmitigated ASCII text. It then piped this code to the printer, where it was digested into finished pages. The publisher was an early -- and most successful - example of CASE, Computer Assisted Software Engineering, a program that writes programs to satisfy your desires. In this situation the desire is a page of true typographic quality and the output program is the PostScript code. Now, if the printer sees only this stream of ASCII chars piping into it, can you not set the publisher aside and write the code yourself with a wordproc or by typing directly to the printer on the keyboard? Yes!, you can!! When the intermedium of the PostScript ASCII textfile was discovered, in 1987, the monopoly of Aldus PageMaker was broken and the LaserWriter lost its aura. In 1988 Adobe threw open the entire specification and many of the internal technica of PostScript for public enjoyment. Today there are hundreds of applications that can output their design and text as a PostScript ASCII textfile. You don't need any of these; you can type in your own textfile. It'll look the same to the printer. Just make sure the file is truly pure ASCII, with no funny characters mixed in. On Sinclair, Tasword and Mscript, for example, produce pure ASCII textfiles. This is an excellent vehicle for writing PostScript code. The text within LPRINT statements in BASIC are pure ASCII (provided you do not deliberately insert any hidden characters like BRIGHT or INK).
['Tasword', 'Mascript' and other proper names in this series are software and hadware for the Sinclair conmputer. With Sinclair long retired into history, they are no longer available in the 21st century. Much Sinclair software was eventually converted and some hardware is simulated in emulators on modern computers.]
In examining sample PostScript code you notice s strong resemblance to Forth. If you be versed in, say, Aberforth or White Lightning, you'll catch on to PostScript very easily. (A hushhush feature of White Lightning is that it can be tweaked into a subset of PostScript!) PostScript is essentially a stack-based scheme. Parms and args are pushed onto a stack and the commands work on them. The result of the command is pushed on the stack in the place of the original parms. PostScript, like Forth, has a fistful of commands to manipulate the stack and query it. You need these because you must at every instant be aware of the stack's contents. Along with the stack system is the postfix notation. The parms come first, left to right, followed by the command that works on them. PostScript says "130 30 MOVETO" to set the 'pen' to the coord point (130, 30); compare with "PLOT 130,30". There are no discrete statements or records in PostScript. The code can run on and on in one entrainment with linebreaks for your own convenience. However, spaces are critical. Where a space is required between words of code it must be at least one blank or a newline. You may insert many blanks, as to indent or group logical segments, but PostScript counts all these blanks as one 'whitespace'. You can make up allnew commands and refer to them in your program somewhat like subroutines. "/LIST {20 300 MOVETO /Helvetica FINDFONT 30 SCALEFONT SETFONT (LONG ISLAND SINCLAIR TIMEX) SHOW SHOWPAGE} DEF" captures the stuff "20 ... SHOWPAGE" into a new command called "LIST". When you do "LIST" within a PostScript code the name of America's premier Sinclair advocate is printed. Case is important in that once a command is defined with one spelling it must thereafter be refered by that exact same spelling. Attempting to do "List" or "list" in the above example earns you an nothing; the new command is "LIST". Also, the names of fonts must be exactly as they are spelled. For the 'AdvantagePrestige Bold' font, you must say "AdvantagePrestige Bold" just like that. PostScript is truly a general purpose language, the equal of BASIC or Pascal, It has maths, booleans, conditionals, arrays, files, loops, strings, and so on. The emphasis on graphics and text functions makes PostScript a lingua franca for CADs, publishers, wordprocs, artists, illustrators, and other kindred programs. It is the basis of Carousel and Acrobat, schemes for audio and video handling in a manner analogous to the massaaging of text and graphics. In fact, the character sets themselves, being merely a set of graphics instructions like the 'A' program, are written in PostScript. And, what's more, you can make up your own sets by coding them in PostScript. I can not give here even a cursory tuition in PostScript. I do, in the stead, offer a bibliography. You can chew on this until we set out into PostScript territory two sessions from now. The litterature of PostScript, quite thoro and rigorous, is still small enough to fit within a ha'meter of bookshelf. The pressruns of the early titles were short, due to the circumscribed world of PostScript enforced during the Adobe-Aldus-Apple regime. Hence, the older books may be tough to acquire nowadays.
Adobe Systems Inc, "Adobe Type-1 Font Format", 1990 Adobe Systems Inc, "PostScript Language Program Design", 1986 Adobe Systems Inc, "PostScript Language Reference Manual", 1990 Adobe Systems Inc, "PostScript Language Tutorial and Cookbook", 1985 Braswell, "Inside PostScript", 1989 Campione & McGilton, "PostScript by Example", 1992 Dubin & Spring, "Hands-On PoatScript", 1992 Glover, "Running PostScript from DOS", 1989 Holzgang, "DIsplay PostScript Programming", 1990 Holzgang, "PostScript Programming Reference Manual", 1989 Holzgang, "Understanding PostScript Programming", 1987 Kunkel, "Graphic Design in PostScript", 1990 Reid, "Thinking in PostScript", 1990 Roth, "Real World PostScript", 1988 Smith, "Learning PostScript", 1990 Thomas, "A PostScript Cookbook", 1988 Wollenweider, "Encapsulated PostScript", 1990
There are one or two new titles yearly, as opposed to dozens in just about any other computer topic. The paucity of new offerings is largely the result of the completeness and tightness of the original language and the dominion that Adobe still exerts over it. To maintain the absolute portability of PostScript programs, off-Adobe products observe fielty before the specs & regs handed down by Adobe. Ah, there's a catch here. Like with duck stew, you need ...
= = = = = EAST OF THE PARALLEL, WEST OF THE SERIAL -------------------------------------- ... a duck. You see, to speak PostScript with the Sinclair, you do need a printer that understands PostScript. You just knew there was some vital & fatal gotcha, didn't you! A 'PostScript printer' is a printer that has within it the animus of PostScript, the wherewithall to turn the PostScript ASCII code into those lucious pages you want. Some models, like the original LaserWriter, have PostScript welded shut inside; it can't get out. Others, like the HP LaserJet, take on the PostScript demeanor by a plugin cartridge. Still others have a socket to accept a ROM inscribed with PostScript. In all cases, the printer also functions in some native mode, typically IBM Graphics or HP LaserJet. It is set to PostScript by however means the printer instructions tell you. Make sure the printer is de acto atque facto in PostScript mode. In native mode you get only a regular printout of the very code you send to it. After all, that code is nothing but a stream of ASCII charactrs. The printer will almost always be a laser printer, which produces its output much like a photocopier. The image is first deployed in the onboard memory and then splatted in one blow onto the paper. For curiosity's sake, the minimum memory for PostScript to compose and store a letter page is 1-1/2Mb; it's 2Mb for a legal page. If the printer at hand does function properly in PostScript mode it already got enough memory, at least for letter pages. The base standard resolution of the laser printer is 120 pixels or 'dots' per centimeter. You must look closely under a loupe to see any jagged edges in the output. The newer models offer 180 or 240 d/cm. This approaches the quality of orthodox typesetting. The best printers deliver 960 or 1,000 d/cm, which is practicly indistinguishable from true typesetting. I understand fully well that you are unlikely to have at home a PostScript printer. And it is improbable you are fixing to get one soon. They still are rather pricey as home appliances. On the other hand, it is quite probable that you have or can get cheaply an ordinary laserjet printer. Since 1990 a laserjet fell so precipitously in price that it almost completely displaced dot-matrix printers on the store shelfs. You can get a laserjet for under $400 [in the United States]. Now, with such a printer in hand (or within ready reach) you can scout around for a PostScript upgrade. This may be a board or cartridge fitted into the printer. Check with the manufacturer of your printer being that such accesories are peculiar to each brand of printer. Adobe offers cartridgs that work with printers truly a clone of the Hewlett-Packard LaserJet while Pacific makes them fro a variety of printer systems. Cost, in 1996, range from $100 to $200; this reflects the number and variety of embedded fonts. Once in a while you'll find a bargain like I did in 1995. Panasonic issued a compact tower printer that has both LaserJet and PostScript engines built in. They are selectable from the front panel or by sending a control code from the computer. Price? $270. Yes, it was a bargain. However, PostScript printers are common at work or school and you may be allowed to play with one of them. Let's be considerate. What ever you do with the printer, make very sure you restore it to its original settings before you release it for others to use. You really don't want angry associates, do you? For the record, I myself use at work an HP LaserJet II fitted with an Adobe PostScript cartridge. The printer is part of the office equipage but the cartridge is my own item. I got it from a computer bazaar for $90 in 1988. In any manner you get entree to a PostScript printer, you can drive the muddah thru a Sinclair. And this is a good thing. Naively you bring your Sinclair to the printer and cable the two together. You'll earn a lot of condolence lunches for sure. Because the stock Sinclair has no printer port you need an interface. Get one that matches the cable already attached to the printer, be it serial or parallel. ByteBack and Gray & Clifford are good brands of serial interface. Aerco and Tasman are standard parallel interfaces. You may also need a 9/25-pin adaptor for the serial port cable. Serial ports normally expect a telcomms program to talk thru them. Use Mterm or Specterm in their 'terminal' mode. Due to the slow speed of the Sinclair, you must set the parms on both the computer and the printer to 1200bps, 8-N-1 xon/xoff. Serial printers are usually set to 9600bps. To send code to the printer, either type it in at the keyboard or upload it as a prepared file by a 'text' or 'ASCII' transfer. When a telcomms application is the vehicle to talk to the printer you have an added potential. Most PostScript printers can act like a 'remote' or 'host'. You type in the commands and the printer kicks back a response at the instant, much like when you talk to a regular remote computer. Parallel ports do better with wordprocs or plain BASIC. Write the code into a document and do a 'print' on it within the wordproc. No printer driver is needed because you are sending only ASCII characters with no hidden codes. In BASIC put the code into LPRINT statements and then run the program. Where it is impractical or impossible to get the Sinclair and the printer together, there is a way out. Write the code at home on the Sinclair and upload it to a BBS or email service as a private file addressed to you. At the printer's computer download the file to disc, where it behaves like a natively written file. Send this file, by the normal DOS "COPY <file> <port>", or "PRINT <file>", to the printer. The Sinclair and the other computer, obviously, must be fitted out for telcomms in the first place. This up & down loading is the only way to meld the Sinclair to a PostScript implemented in the computer rather than in the printer. Such is accomplished by plugin cards or software on disc. Because in this scheme there is no PostScript animus in the printer, tying the Sinclair to it will not get you any PostScript capability. You must get your Sinclair ASCII file into the computer itself via the up & down loading trick.
[Sinclair was built to store its files on audio cassettes. It never devloped its own disc system. Third party devices were offered which didn't interoperate among themselfs or with other systems, like IBM. Else the PostScript code typed on SInclair could be saved to disc and then opened by the other computer.]
Can't the printer's computer run a Sinclair emulator and produce PostScript code thru it? Of course, but there is no point to it. You may as well go and write PostScript with that computer's native wordproc in the first place. We want to demonstrate that the real McCoy machine can produce genuine PostScript code saved on cassette. An other reason is that some emulators embed codes in the output text so it looks like the Sinclair printer produced it, with all the little dotty bits. This may be misinterpreted by PostScript and you get no output at all. You're drumming your fingers, eh? What's the matter? Oh? The fonts? What about them? Where are they? Ah!, the fonts! Yes, yes, yes, the fonts. Erm, the fonts. Not a worry here. All PostScript printers come with a selection of fonts, a dozen to a few score. These are onboard and ready to call up as you need. There's nothing special to do. You do not need fonts from other sources, at least not for the initial experiments. The onboard fonts are Times-Roman, Helvetica, and Courier, plus some others which vary from printer to printer. Times-Roman looks like newspaper type. Helvetica looks like the signs for highways and transport depots. Courier mimics a typewriter style. Well, are you ready for PostScript? All systems are go. Countdown for launch. 9, 8, 7, 6. We got ignition! 5, 4, 3, ...
= = = = = THE OUTLAND OF POSTSCRIPT ----------------------- ... 2, 1, liftoff! Good burn! Trajectory insertion! You're looking good up there. PostScript, we come in peace for all mankind. What a land this is! Vast! Immense! I can't ever show any but the merest part of it! For starts, PostScript is an interpreted language, like BASIC. The code is digested en train as it reaches the printer. There is no compilation or translation into a low-level code. Much like the BASIC interpreter in Sinclair, that of PostScript is a sanctum. You don't have to understand it to appreciate it and use it well. As long as you feed it the [correct!] code, the PostScript interpreter will do what you want it to do. There are a few considerations in exploring PostScript. It is slow. The drag comes from the interpreter's work and also the preparation within the printer of the image. It has to be fully formed before it's printed onto the paper. You may wait many seconds or minutes to see the output. PostScript is pretty brutal about correct syntax and grammar. It has crummy error checking and reporting. Ever so slight a mistake will get you ridiculous output. Or no output at all. A fatal error will bomb the program and reset the printer to its ready state. It offers no progress or status reports. You must wait until the paper is ejected from the printer to see what happened. This you can simulate by attaching the Sinclair printer to your rig and editing the "A" program in the firstof these articles. Add '11> INK 7: PAPER 7: CLS' and '46> COPY'. You'll see nothing on the screen. You must judge your results only from the printout. All this is mighty infuriating, being that you are so comfortable with Sinclair BASIC! You just have to stay awake and alert and pay attention to your coding. Let's move on. I assume for now that you are tied to the printer thru a parallel port and you use BASIC to convey the code. Check that the printer was previously set to PostScript, not native, mode. Key in the 'B' program here. Double- check your typing, paying particular attention to the case and spacing. (The gap in linenumbers belongs there.) OK? Now save and run it.
10> REM 'B' program 20> LPRINT "0.5 setgray" 12> LPRINT "/Times-Roman findfont" 22> LPRINT "(B) show" 14> LPRINT "600 scalefont" 30> LPRINT "showpage" 16> LPRINT "setfont" 32> LPRINT "quit" 18> LPRINT "100 100 moveto"
Man!, that's arpsly fairblus! A letter 'B' in muted gray over the whole page!! It's, it's, beautiful!!! How did I do that?!?! You can probably hack out what's going on if you know Forth. We take a closer look anyway. Line 10 is a REM statement, ignored by BASIC. In a PostScript file written as ASCII text, comments are preceded by a "%" instead. Line 12 fetches the character set called "Times-Roman" from the stable of sets onboard the printer. The name must be spelled exactly as listed in the printer's manual, including caps and puncts. Line 14 scales the font to 600 points. PostScript works on the typographer's point. Nearly enough there are 28-1/2 points per centimeter (actually 28.45756). The size is taken from the top of the acendent to the bottom of the descendent in the alphabet. Individual letters are proportionately smaller. In this case the 'B' comes out about 14cm tall, not the full 21cm height answering to 600 points.
[A very good approcimation is that 100 points equals 35mm. The point system comes from Mediaeval typograhy long before a uniform measurement system was extablished, making for irrational equivalents between points and metric, or even oldstyle, length units.]
Line 16 arms the fetched and scaled font for service, like installing a daisy wheel or cartidge. The font is now ready for use. Line 18 moves the 'pen' to coordinate (100,100). The origin is the lowerleft corner of the page. Up and right are positive. The units are points, so the pen is moved about 35mm up and right from the origin. Line 20 sets the darkness of the pen to 0.5 gray. '0' is black and '1' is white. How the gray turns out is up to the printer. The HP LaserJet renders it as a stipple that looks quite smooth and even all over at reading distance. Line 22 offers the litteral string 'B' and deploys it in the virtual image. The 'B' starts at coordinate (100,100) and extends up and right over the page. Each letter has a homepoint near the lowerleft corner of it by which it is positioned in the page. Line 30 finally, finally, transfers the virtual image onto the paper and ejects the paper from the printer. Until and unless you issue the SHOWPAGE command everything remains in the phantom space. Line 32 terminates the PostScript session and reverts the printer to its ready state. It remains in PostScript mode; you must separately reset it to native mode. Aren't you just tingling? Of course you are. This is a very elementary PostScript program, yet it is amazingly versatile. Run it several times, each time with line 22 edited so the 'B' is 'S', 'I', 'N', 'C', &c. Put all the pages together, with some overlap, and you got a smashing banner! Try small letters, other scales, other starting coords. Try entire phrases, other character sets (look them up in the printer instructions). You'll get some awfully unexpected results sometimes, but that's part of the exploration process. By adding more MOVETO and SHOW commands you can actually lay out a sign, poster, or flyer. Be careful. Once a font is fetched, scaled, and set, it remains in force until you deliberately change it. So if you start with 150 point size for a title, change to a smaller size for running text. Do this by a set of FINDFONT/SCALEFONT/SETFONT commands before you offer text to the new font. Note that the pen stands at the end of the last text written, like "PRINT ;". Do MOVETO to reset it to the start of the new text. MOVETO resembles "PRINT AT". When you write several lines of text, leave at least as many points between the rows as the size of the font. Else you'll get overlapping text. PostScript does not by itself wordwrap or linefeed. You have to insert the linebreaks and then move the pen to the next row. Further to the parallel between PostScript and Sinclair, you can freely put text anywhere on the page in any sequence you like. Only the ultimate image is printed by SHOWPAGE, just like the entire finished screen is printed by COPY. This makes it easy to lay out all the stuff in one font & scale first, then go back and fill in the stuff in an other font & scale, and so on. To stretch or squash the text there's "x y SCALE". The x and y are the ratios for the x and y direction, like in the 'A' program. These stay in force until you change them on purpose. Moreover, each scaling compounds with all earlier ones. To get things back to unity scale you must undo the scaling. That is, if you do '1.5 .75 SCALE', and then want to return to unity scale, you must do '.667 1.333 SCALE'. Doing '1 1 SCALE' will merely assert the instant scaling as unity! In your giddiness you probably saw what happens when you write on top of previous writing. The new oblitterates the old. You can exploit this overlaying or superposition of PostScript. Add these lines to the 'B' program (now you know why I had a linenumber gap):
24> LPRINT "120 110 moveto" 26> LPRINT "0 setgray" 28> LPRINT "(B) show"
Run this. You just lurve the purritty shadow effect! To enforce the notion of superposition, change the "0" to "1" in line 26 and run the program again. Hmmm, very very interesting. I have to let you go, now. You can roam around on your own. To set you on your way, key in and run the program below. I willn't tell you what it does, but the result will look, ugh!, so gorgeous on the wall over your Sinclair rig. You can substitute Times-Roman, available on all PostScript printers, in line 44 if you don't got Times-Bold. What's the problem? The what symbols? Oh, the "{" and "}"? They're right over here, under the "F" and "G" keys. Watch me. "{". And "}".
[The sinclair keyboard waspeculiarly laid out. The alphanumberic chars were in the QWERTY locations but
10> REM on your own 60> LPRINT "360 mul" 12> LPRINT "/roundtext {" 62> LPRINT "rotate" 14> LPRINT "/points exch def" 64> LPRINT "text" 16> LPRINT "/radius exch def" 66> LPRINT "{" 18> LPRINT "/text exch def" 68> LPRINT "/char exch def" 20> LPRINT "/char 0 def" 70> LPRINT "0 radius moveto" 22> LPRINT "/str 1 string def" 72> LPRINT "str 0 char put" 24> LPRINT "/circum radius 2 mul" 74> LPRINT "str stringwidth" 26> LPRINT "3.14159 mul def" 76> LPRINT "pop" 28> LPRINT "/outline {" 78> LPRINT "circum div" 30> LPRINT "true charpath" 80> LPRINT "360 mul" 32> LPRINT "gsave" 82> LPRINT "/charot exch def" 34> LPRINT "0.8 setgray" 84> LPRINT "gsave" 36> LPRINT "fill" 86> LPRINT "0 radius translate" 38> LPRINT "grestore" 88> LPRINT "charot 2 div" 40> LPRINT "stroke" 90> LPRINT "neg rotate" 42> LPRINT "} def" 92> LPRINT "str outline" 44> LPRINT "/Times-Bold findfont" 94> LPRINT "grestore" 46> LPRINT "points scalefont" 96> LPRINT "charot neg rotate" 48> LPRINT "setfont" 98> LPRINT "} forall" 50> LPRINT "306 396 translate" 100> LPRINT "} def" 52> LPRINT "text stringwidth" 102> LPRINT "( My Sinclair can really speak PostScript )" 54> LPRINT "pop" 104> LPRINT "200 63 roundtext" 56> LPRINT "2 div" 106> LPRINT "showpage" 58> LPRINT "circum div" 108> LPRINT "quit"
= = = = =