TweetFollow Us on Twitter

Printing Techniques 2
Volume Number:1
Issue Number:11
Column Tag:Basic School

Printing Techniques for Basic

By Dave Kelly, Hybrids Engineer, MacTutor Editorial Board

Managing BASIC Font Printing

Sometimes when talking about the Macintosh, people have asked "How many columns does the Macintosh have?". My answer to them is that it depends. Many of you like myself started out on other computers such as the Apple //. Many of the early computers had only 40 columns of text display. This severely limited the usefulness of word processing software until the introduction of 80-col display plug in boards. Back in those days it was very important to ask how many columns there were because of the limitations that are imposed by the lack of 80 column display. The Macintosh is an entirely different animal though. Because of the ability of the Macintosh to display proportional spaced fonts on the screen just as it will look when printed, it is not applicable to refer to the Macintosh screen as an 80-col display. It is important in development of applications for the Macintosh that we realize the difference between the Macintosh and other computers when it comes to displaying and printing data. Some may have experienced some frustration in trying to format text when using proportional fonts. I'll try to discuss a few items to keep in mind when using proportional spacing. There are some advantages and disadvantages to be aware of. This month we will explore some of the ins and outs of printing in different size fonts.

First, lets take a look at the difference between proportional and monospaced fonts. The unit of measurement for the spacing is the size of the character "0" in the current font. For monospaced fonts the character "0" happens to be the same width as the rest of the characters in the font. For the proportional spaced font, the "0" is an average width but not necessarily the same width as the other characters. Notice that the spacing of all the uppercase characters for a monospaced font is the same as for the lower case characters. Also note that the proportional spaced "A" is wider than the "a".

The advantage of using the monspaced type of font is that you can always be sure of just where each character will be printed or displayed. In the proportional font each of the letters are a different width depending on how much spacing each character requires. Now that we have a feel for proportional characters, try the following lines of BASIC and compare the results of printing with monospacing and proportional spacing:

' Sample program #1 
' Dave Kelly 
' MACTUTOR ©1985 

l1$="Name #1":r1$="Name #2" 
l2$="123 Main St.":r2$="456 Central Ave." 
l3$="Anyplace, USA":R3$="Anywhere, USA" 

FOR i=1 TO 40     
 zero$=zero$+"0" 
NEXT i 

WIDTH 40,20 
TEXTFONT(4):TEXTSIZE(12) 'Monaco 
GOSUB printit 
TEXTFONT(2):TEXTSIZE(12) 'New York 
GOSUB printit 
END 

printit: 
PRINT  l1$,r1$ 
PRINT  l2$,r2$ 
PRINT  l3$,R3$ 
PRINT  zero$

PRINT  l1$;TAB(21);r1$ 
PRINT  l2$;TAB(21);r2$ 
PRINT  l3$;TAB(21);R3$ 
PRINT  zero$
RETURN 

In the sample program it is clear that the spacing of "0" is different for the 2 fonts, which explains why the second column does not line up. RULE 1: Remember that when mixing fonts you can't expect them to line up. This program demonstrates the use of the BASIC WIDTH command. The syntax of the WIDTH command is defined on page 264 of the MSBASIC manual. In general the syntax is: WIDTH [size ] [,print-zone ] . The size is the number of standard characters that a line may contain. In other words, BASIC will force a carriage return after the line size is full. If the size is 255 then BASIC will not force any carriage returns. The print-zone assigns the width of the print zone. The print zones are similar to tab stops, and they are forced by comma delimiters in the PRINT or LPRINT statements. In the sample program you can see that by using TAB or by using WIDTH the same result can be achieved. Using WIDTH the position of the 2nd column is determined by the print-zone. By using TAB(I), print position moves to the position indicated by I. An understanding of how these commands may be used is helpful when you are trying to format your printed output. An example would be the printing of a multiple column roster or newsletter where different fields might be combined together to create an entire line. The traditional way to do this would be to combine the fields together as one string variable and then to print the variable. The spacing of each field is filled to the size of the print-zone before combining all the fields, so that the total width of all the fields will fit. This works fine with monospaced fonts but it quite difficult to accomplish with proportional spaced fonts. An alternative solution is to use TAB or WIDTH functions to specify where each field will be printed. It is still important to check the length of each field before printing to make sure that each field will fit into the specified print zone. If it won't fit then either the field must be truncated or the print-zone should be adjusted. If not, then the field will print past the assigned print-zone and into the next print-zone. The next field to be printed will be pushed over to the next available print-zone.

This can be demonstated by changing the sample program. In the program the print-zone is set at 20 characters wide. If fewer than 20 characters are printed then the next print field will begin 20 characters after the start of the first print field. Try changing the line: l1$="Name #1":r1$="Name #2" to a field that has more than 20 characters, for example: l1$="Name #1 is too long now":r1$="Name #2" to demonstate the problem. To fix the line change it to:

l1$=LEFT$("Name #1 is too long now",20):r1$="Name #2" or adjust the WIDTH statement to: WIDTH 40,25.

Another consideration when using fonts of different sizes and widths is that each font will use a different number of lines to print the same thing. Because there are so many different fonts and sizes available it is difficult to examine the effect of each one. So, before using any set of fonts you should test each one out to see how many lines will fit on a page and adjust your program to count the lines as they are printed. If you are printing in a 10 pt. font it is probable that you will have more lines than for a 12 pt. font. The Disk Labeler program is a quick sample of what might be done with the WIDTH statement. Keep in mind that this is just a sample and may or may not be a useful application, however it may be modified to meet your needs.

Disk Labeler Program Sample

The program will read filenames one at a time from the disk and place them in an array called filename$(i). I have limited the size to 10 files to simplify the program. Choose Add/Remove from the files menu to add or remove a file. The selected files are printed in window 1. The second menu lets you select the font info. This illustrates a method of changing the fonts and sizes that will be used. This could be expanded to select various attributes such as Bold or Italics. Keep in mind that the different attributes will also change the width of each character. The printlabel routine demonstrates printing different fonts to the printer. If you have had trouble changing fonts when printing to the printer you may want to take a closer look at this routine. The key is the WINDOW OUTPUT #1 statement. This statement is necessary to direct all graphics commands, including those which change the fonts, to the printer. The Set Disk Label item of the files menu will let you set the number of lines and the number of columns that will be printed. The columns are formatted with the WIDTH statement. Disk labels may be printed in any desired font by adding additional fonts to the menu. I recommend printing labels in a small font (9 point) in order to fit more on a label. Have any useful printing tips? Send your best suggestions to me care of MacTutor!

' Disk Labeler 
' By Dave Kelly 
' MACTUTOR ©1985
 
' Watch line breaks. A few Basic lines are longer than 
' this Journals column width, but the breaks are
' obviously placed so that it is clear the Basic line
' continues from the previous line. 

number.of.files=0:DEFINT i-m:maxfiles=10 number.of.lines=5:number.of.col=2 

DIM filename$(maxfiles)
 
'fonts 
chicago=0: Appl=1: Newyork=2: Geneva=3: Monaco=4 
activefont=Geneva: activesize=12
WINDOW 1,"",(200,50)-(400,275),2 
'menu clear 
FOR i=1 TO 5:MENU i,0,0,"":NEXT i 

'set new menus 

MENU 1,0,1,"File" 
MENU 1,1,1,"Add/Remove a file" 
MENU 1,2,1,"Clear all files" 
MENU 1,3,0,"-" 
MENU 1,4,1,"Print Disk Label" 
MENU 1,5,1,"Set Disk Label" 
MENU 1,6,1,"Quit"
 
MENU 2,0,1,"Font Info" 
MENU 2,1,0,"Fonts" 
MENU 2,2,1,"NewYork" 
MENU 2,3,2,"Geneva" 
MENU 2,4,1,"Monaco" 
MENU 2,5,0,"-" 
MENU 2,6,1,"9 point" 
MENU 2,7,1,"10 point" 
MENU 2,8,2,"12 point"
 
ON MENU GOSUB Menucheck:MENU ON 
idle: GOTO idle
 
Menucheck:     
Menunumber=MENU(0): Menuitem=MENU(1)     
ON Menunumber GOSUB Filemenu, Fontmenu     
RETURN      

Filemenu:     
MENU     
ON Menuitem GOSUB Add, Clearfiles,Blank,Printlabel,      Setlabel, Quit 
    
RETURN      

Add:     
x$=FILES$(1)     
IF x$="" THEN GOSUB display:RETURN     'x$=MID$(x$,INSTR(x$,":")+1) 
'optional line:use to strip volume name     

FOR i= 1 TO number.of.files         
IF x$=filename$(i) THEN filename$(i)="zzzzz":      i=number.of.files+2: 
CALL Sort(filename$(),  number.of.files): number.of.files= number.of.files-1 
    
NEXT i     

IF number.of.files>=maxfiles THEN GOSUB display:   RETURN     
IF i=number.of.files+1 THEN filename$(i)=x$:       number.of.files=i 
    
CALL Sort (filename$(),number.of.files )     
GOSUB display     
RETURN      

Clearfiles:     
number.of.files=0     
GOSUB display     
RETURN      

display:     
TEXTFONT(chicago):TEXTSIZE(12)     
CLS:PRINT number.of.files;"files have been selected."     TEXTFONT(activefont):TEXTSIZE(activesize) 
    
FOR i=1 TO number.of.files    
  maxlength=30     
 IF activesize<=10 THEN maxlength=40     
 PRINT LEFT$(filename$(i),maxlength)     
NEXT i 
   
IF number.of.files=maxfiles THEN 
 PRINT"Max.";maxfiles;"files allowed"     
RETURN      

Blank:RETURN
 
Printlabel:    
IF number.of.files=0 THEN RETURN    
OPEN "LPT1:PROMPT"  FOR OUTPUT AS #1     
WINDOW OUTPUT #1     TEXTFONT(activefont):TEXTSIZE(activesize)     
colwid=30:IF number.of.col=2 THEN colwid=20     
WIDTH "LPT1:",(colwid+1)*2,colwid+1     
PRINT: items=number.of.files     
ON ERROR GOTO Error.handle 'check for printing abort     
IF number.of.col=1 THEN onecol    
IF number.of.lines<number.of.files/2 THEN    items=number.of.lines*2 
   
 FOR i= 1 TO items STEP 2         
PRINT #1,LEFT$(filename$(i),colwid), LEFT$(filename$(i+1),colwid)    

NEXT i 
    
CLOSE #1 

Exit.printing:     
WINDOW OUTPUT 1     
GOSUB display     
RETURN 

onecol:     
IF number.of.lines<number.of.files THEN      items=number.of.lines 
    
FOR i= 1 TO items         
 PRINT #1,LEFT$(filename$(i),colwid)     
NEXT i 
    
CLOSE #1     
GOTO Exit.printing     

Error.handle: RESET:RESUME
 
Exit.printing:STOP 

Setlabel:     
CLS:TEXTFONT(0):TEXTSIZE(12)     
LOCATE 1,1:PRINT"Lines per label:"     
LOCATE 3,1:PRINT "# of columns:"     lines$=STR$(number.of.lines)    
 
cwid$=STR$(number.of.col)     
EDIT FIELD 2,cwid$,(125,31)-(155,46),1,2
 EDIT FIELD 1,lines$,(125,1)-(145,16),1,2     
BUTTON 1,1,"OK",(25,70)-(75,88)    

 i=1     

loop:         
d=DIALOG(0)         
IF d=1 THEN Done ' got OK button         
IF d=2 THEN i=DIALOG(2):EDIT FIELD i 'got field 
IF d=6 THEN Done 'got return key         
IF d=7 THEN i=(i MOD 2)+1:EDIT FIELD i 'got TAB key         GOTO loop 
    

Done:         
lines$=EDIT$(1)         
number.of.lines=VAL(lines$)         
IF number.of.lines<1 OR  number.of.lines>9 THEN loop         cwid$=EDIT$(2) 
        
number.of.col=VAL(cwid$)         
IF number.of.col<1 OR number.of.col>2 THEN loop        
EDIT FIELD CLOSE 1:EDIT FIELD CLOSE 2         
BUTTON CLOSE 1         
CLS         
GOSUB display 
RETURN          

Quit:    
 MENU RESET     
WINDOW 1,"Disk Labeler",(2,40)-(510,250),1     
END 

Fontmenu:     
ON Menuitem GOSUB Blank,NY,Geneva,Monaco,          Blank,Pt09,Pt10,Pt12 
    
GOSUB display     
RETURN      

NY:     activefont=Newyork     
MENU 2,2,2: MENU 2,3,1:  MENU 2,4,1     
RETURN      

Geneva:     activefont=Geneva     
MENU 2,2,1: MENU 2,3,2:  MENU 2,4,1     
RETURN      

Monaco:     activefont=Monaco     
MENU 2,2,1: MENU 2,3,1: MENU 2,4,2     
RETURN     

 Pt09:     activesize=9     
MENU 2,6,2: MENU 2,7,1: MENU 2,8,1     
RETURN 

Pt10:     activesize=10     
MENU 2,6,1:  MENU 2,7,2: MENU 2,8,1     
RETURN      

Pt12:     activesize=12     
MENU 2,6,1: MENU 2,7,1: MENU 2,8,2     
RETURN      

SUB  Sort (item$(maxfiles),N) STATIC      
FOR i=1 TO  N-1        
 FOR j=i+1 TO  N             
IF  item$(i)> item$(j) THEN SWAP item$(i),item$(j)         
NEXT  j     
NEXT  i
END SUB 
 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Trend Micro 11.0.2062 - An essential sec...
Trend Micro Antivirus provides essential security for macOS with real-time malware detection and mitigation in an affordable solution with a simple, intuitive interface. However, be aware that more... Read more
Backblaze 7.0.2.490 - Online backup serv...
Backblaze is an online backup service designed from the ground-up for the Mac. With unlimited storage available for $6 per month, as well as a free 15-day trial, peace of mind is within reach with... Read more
Pro Video Formats 2.2.1 - Updates for pr...
Pro Video Formats includes support for the following professional video codecs: Apple Intermediate Codec Apple ProRes AVC-Intra 50 / 100 / 200 / 4:4:4 / LT AVC-LongG XAVC XF-AVC DVCPRO HD HDV XDCAM... Read more
Boom 3D 1.3.11 - $19.99
Boom 3D is a revolutionary app with 3D Surround Sound and phenomenally rich and intense audio that is realistic and works on any headphones. Features 3D surround sound Built-in audio player... Read more
Final Cut Pro 10.5.2 - Professional vide...
Redesigned from the ground up, Final Cut Pro combines revolutionary video editing with a powerful media organization and incredible performance to let you create at the speed of thought.... Read more
Chromium 89.0.4389.72 - Fast and stable...
Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all Internet users to experience the web. Version 89.0.4389.72: Complete list of changes can... Read more
iMovie 10.2.3 - Edit personal videos and...
With a streamlined design and intuitive editing features, iMovie lets you create Hollywood-style trailers and beautiful movies like never before. Browse your video library, share favorite moments,... Read more
OmniPlan 4.2.5 - Professional-grade proj...
With OmniPlan, you can create logical, manageable project plans with Gantt charts, schedules, summaries, milestones, and critical paths. Break down the tasks needed to make your project a success,... Read more
Compressor 4.5.2 - Adds power and flexib...
Compressor adds power and flexibility to Final Cut Pro X export. Customize output settings, work faster with distributed encoding, and tap into a comprehensive set of delivery features. Features:... Read more
Motion 5.5.1 - Create and customize Fina...
Motion is designed for video editors, Motion 5 lets you customize Final Cut Pro titles, transitions, and effects. Or create your own dazzling animations in 2D or 3D space, with real-time feedback as... Read more

Latest Forum Discussions

See All

Frogger in Toy Town's latest update...
Konami Digital Entertainment has announced today that their Apple Arcade title Frogger in Toy Town has been updated to introduce a new ranked Endurance Mode. This new game variant's arrival is also accompanied by a few other changes. [Read more] | Read more »
Mitoza is surreal adventure toy you can...
The folks behind the Rusty Lake games have just put a new title onto the App Store. Second Maze, Rusty Lake's collaborative publishing brand, has just brought this 10 year old adventure game from Gal Mamalya to mobile. The best part about all of... | Read more »
Pocket Gamer Awards 2021: You have five...
Three weeks ago our sister site, Pocket Gamer, entered the voting stage for the upcoming Pocket Gamer Awards 2021 and is now in the final stretch. You only have a few hours left to vote for the games you’ve enjoyed on mobile in the past year, as... | Read more »
Patty Stack is a casual arcade game, ava...
Patty Stack is a casual arcade title that's available now for iOS and Android. It's the debut game from developer Feeka Games tasks players with making an increasingly giant burger tower. Think of it as Tower Bloxx but more edible. [Read more] | Read more »
Distract Yourself With These Great Mobil...
There’s a lot going on right now, and I don’t really feel like trying to write some kind of pithy intro for it. All I’ll say is lots of people have been coming together and helping each other in small ways, and I’m choosing to focus on that as I... | Read more »
Genshin Impact Guide - Gacha Strategy: W...
This is part 2 of our Genshin Impact gacha strategy guides. See part 1 here. You can check out more guides for Genshin Impact here. | Read more »
Slashy Camp is a new endless runner insp...
Blue Wizard Digital has released Slashy Camp onto iOS and Android after it spent a short amount of time in early access. [Read more] | Read more »
Kinder World is a relaxing game about lo...
Lumi Interactive is releasing a game called Kinder World later this year on iOS and Android, which is all about looking after houseplants. [Read more] | Read more »
Steam Link Spotlight - Fights in Tight S...
Steam Link Spotlight is a feature where we look at PC games that play exceptionally well using the Steam Link app. Our last entry was on Hades. Read about how it plays using Steam Link over here. | Read more »
Lyxo, the light-based puzzler for mobile...
Vienna-based independent game studio Emoak has just released its unique light-based puzzler for iOS and Android. Founded in 2014 by Tobias Sturn, the company is also the creative force behind the infinite climbing game Paper Climb, as well as the... | Read more »

Price Scanner via MacPrices.net

Weekend Sale: $100 off Apple iPad Magic Keybo...
Amazon has Apple iPad Magic Keyboards on sale for $100 off MSRP for a limited time. Amazon’s prices are the lowest available for iPad Magic Keyboard from any Apple reseller this weekend: – Magic... Read more
Gazelle now offering a full line of refurbish...
Gazelle is now offering a full range of discounted, refurbished, unlocked Apple iPhone 12 models starting at $649. iPhones are offered in Fair, Good, and Excellent conditions, and multiple colors are... Read more
These are the latest discounted iPhones Apple...
Apple has a range of Certified Refurbished iPhones available right now starting at only $339. Apple includes a standard one-year warranty, new outer shell, and shipping is free. According to Apple, “... Read more
Save up to $64 on new M1 MacBook Airs at Expe...
Apple reseller Expercom has 2020 13″ M1 MacBook Airs on sale for $51-$64 off Apple’s MSRP with prices starting at $947.96. In addition to their MacBook Air sale prices, take $50 off AppleCare+ when... Read more
Discounts available on 16″ MacBook Pros with...
Upgrade a 16″ 6-Core or 8-Core MacBook Pro from 16GB of standard RAM to 32GB at Adorama, and save $100-$210 over Apple’s price for this custom option: – 16″ 6-Core MacBook Pro/32GB RAM: $2699, save $... Read more
10.9″ iPad Airs on sale for $50-$70 off Apple...
Amazon has new 2020 10.9″ Apple WiFi iPad Airs in stock and on sale today for up to $70 off MSRP with prices starting at $549. Note that Amazon’s sale price might be restricted to certain colors (see... Read more
Apple restocks 2020 27″ 5K iMacs for up to $3...
After an initial offering in January, Apple has restocked a full line of Certified Refurbished 2020 27″ 5K iMacs starting at $1529 and up to $350 off original MSRP. Apple’s one-year warranty is... Read more
Sale! 16″ 8-Core MacBook Pro for $2449, $350...
Apple reseller Adorama has the 16″ 2.3GHz 8-Core Space Gray MacBook Pro in stock and on sale today for $2449 including free shipping. Their price is $350 off Apple’s MSRP for this model, and it’s the... Read more
Roundup of 13″ Multi-Core Intel MacBook Pro s...
Apple resellers are offering significant sales & deals this week on 2020 13″ MacBook Pros with 10th generation Intel CPUs. Take up to $250 off Apple’s MSRP, get free fast shipping, and/or pay no... Read more
64GB iPhone 8 Plus available for $379 at Appl...
Apple has the 64GB iPhone 8 Plus in Space Gray & Gold colors available for $379 today, Certified Refurbished. Each phone is unlocked and comes with Apple’s standard 1-year warranty and free... Read more

Jobs Board

Geek Squad Advanced Repair *Apple* Professi...
**795178BR** **Job Title:** Geek Squad Advanced Repair Apple Professional **Job Category:** Store Associates **Store Number or Department:** 001406-Allen Park-Store Read more
Geek Squad *Apple* Consultation Professiona...
**796549BR** **Job Title:** Geek Squad Apple Consultation Professional **Job Category:** Store Associates **Store Number or Department:** 001800-Hot Springs-Store Read more
*Apple* Mobility Specialist - Best Buy (Unit...
**796014BR** **Job Title:** Apple Mobility Specialist **Job Category:** Store Associates **Store Number or Department:** 001776-Woodmore Towne Centre-Store **Job Read more
Systems Architect, *Apple* Production Engin...
…package beginning on your first day? If so, we hope you'll keep reading! The Apple Sales Engineering and account team is looking for a stellar presales engineer with Read more
Systems Engineer, Webscale, *Apple* Retail,...
…beginning on your first day? If so, we hope you'll keep reading! The Apple Sales Engineering team is looking for a pre-sales engineer with Enterprise engineering Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.