$A MARK=2 $A PAGENO=1; JUST=1 $A TAB=12,20,28 $L1CUM LAYOUT: DOCUMENT PRODUCTION PROGRAM $P2 @THE BASIC FUNCTION OF .LAYOUT IS TO PRODUCE AN APPROPRIATELY PAGED AND FORMATTED DOCUMENT FROM A SOURCE FILE IN WHICH THE REQUIRED LAYOUT IS INDICATED BY %DIRECTIVES INTERSPERSED WITH THE TEXT; IN GENERAL, THE SPACING AND LINE-STRUCTURE OF THE SOURCE ARE NOT SIGNIFICANT. @A SECONDARY FUNCTION IS TO OUTPUT AN UPDATED SOURCE FILE SIMILAR TO THE ORIGINAL EXCEPT THAT THE LINE-STRUCTURE FOLLOWS THAT OF THE FORMATTED DOCUMENT (SUBJECT TO LIMITATIONS OF LINE LENGTH). $P @IN ADDITION THE PROGRAM OPTIONALLY PROVIDES FOR THE APPLICATION OF SHIFT CONVENTIONS TO THE SOURCE (AND UPDATED SOURCE) TO PERMIT THE REPRESENTATION OF UPPER AND LOWER CASE LETTERS AND UNDERLINED CHARACTERS WITHIN A RESTRICTED CHARACTER SET. @CODE CONVERSION IS UNDERSTOOD TO BE CARRIED OUT OUTSIDE THE LAYOUT PROGRAM PROPER, WHICH USES A CHARACTER SET IN WHICH BOTH UPPER AND LOWER CASE LETTERS AND UNDERLINED CHARACTERS ARE REPRESENTED BY SINGLE CODES. @THIS CHARACTER SET IS FULL .ASCII EXTENDED TO 8 BITS, WITH THE EIGHTH BIT SIGNIFYING UNDERLINING, AND IT IS AN ACCEPTABLE CODE FOR THE SOURCE (AND UPDATED SOURCE) WHERE A SYSTEM PERMITS IT. $P @THE INPUT SOURCE FILE IS TREATED AS A SEQUENCE OF %TEXT_ ATOMS SEPARATED BY %DELIMITERS; A DELIMITER IS ANY NUMBER OF SPACES, NEWLINES AND/OR DIRECTIVES. @THE BASIC OPERATION OF THE PROGRAM IS TO READ TEXT ATOMS FROM THE SOURCE FILE AND PLACE THEM - SEPARATED BY SINGLE SPACES - IN A LINE BUFFER, UNTIL THE NEXT TEXT ATOM WOULD EXCEED THE LINE LENGTH DEFINED FOR THE FORMATTED DOCUMENT. @AT THIS POINT THE PROGRAM MAY INSERT ADDITIONAL SPACES IN THE LINE IF JUSTIFICATION IS REQUESTED. @THE LINE IS THEN OUTPUT AND A NEW LINE IS BUILT UP. @A (NON-EMPTY) LINE IS ALSO TERMINATED ON READING MOST DIRECTIVES; JUSTIFICATION IS NOT APPLIED TO A LINE TERMINATED IN THIS WAY. $P @THE @TAB AND @COLUMN DIRECTIVES EXPLICITLY CONTROL THE PLACING OF TEXT ATOMS IN THE LINE BUFFER BY DEFINING THE COLUMN POSITION AT WHICH THE NEXT ATOM IS TO START. @WHENEVER A NEW LINE IS STARTED, THE CURRENT COLUMN POSITION IS SET TO 1, UNLESS INDENTATION IS IN FORCE, IN WHICH CASE THE COLUMN POSITION IS SET TO THE TAB SETTING ASSOCIATED WITH THE CURRENT INDENTATION LEVEL. @COLUMN POSITIONS ARE NUMBERED FROM 1 UP TO THE LINE LENGTH. $P @THE EFFECT OF MOST DIRECTIVES AND CERTAIN ASPECTS OF THE AUTOMATIC OPERATION OF THE PROGRAM DEPEND IN PART ON THE VALUES OF A NUMBER OF LAYOUT %PARAMETERS. @THE VALUE OF ANY PARAMETER MAY BE ALTERED DYNAMICALLY BY MEANS OF THE @ASSIGN DIRECTIVE. @SOME PARAMETERS ARE SCALARS AND SOME ARE VECTORS (TAB-SETTINGS, FOR EXAMPLE). @AN INDIVIDUAL PARAMETER TAKES EITHER NUMERIC VALUES, OR SYMBOL VALUES, OR BOOLEAN VALUES - DEPENDING ON THE SIGNIFICANCE OF THE PARAMETER. @THE INITIAL VALUE OF EACH PARAMETER IS SHOWN IN PARENTHESES IN THE FOLLOWING LISTS. $N $L1UC NUMERIC PARAMETERS $B $A INDENT=2 $C4 .TOP $T1 (2) $T2 BLANK LINES AT TOP OF PAGE $B $C4 .BOTTOM $T1 (4) $T2 BLANK LINES AT BOTTOM OF PAGE $B $C4 .LEFT $T1 (0) $T2 SPACES AT LEFT OF PAGE $B $C4 .PAGE $T1 (60) $T2 PAGE SIZE (EXCLUSIVE OF .TOP AND .BOTTOM) $B $C4 .LINE $T1 (72) $T2 LINE LENGTH (EXCLUSIVE OF .LEFT) $B $C4 .SLINE $T1 (80) $T2 SOURCE LINE LENGTH (FOR UPDATED OUTPUT) $B $C4 .NLS $T1 (1) $T2 PHYSICAL LINE SPACING (NEWLINES PER LINE ) $B $C4 .SGAP $T1 (2) $T2 SPACES BETWEEN SENTENCES $B $C4 .PGAP $T1 (3) $T2 SPACES AT START OF PARAGRAPH $B $C4 .SECTNO $T1 (0) $T2 SECTION NUMBER (NOT YET IMPLEMENTED) $B $C4 .PAGENO $T1 (0) $T2 PAGE NUMBER (PRINTED AND UPDATED ONLY IF NON-ZERO) $B1 $C4 .START $T1 (1) $T2 ACTUAL PAGE NUMBER AT WHICH PRINTING OF DOCUMENT IS TO START $B2 $L1UC SYMBOL PARAMETERS $B $C4 .ESCAPE $T1 ('$$') $T2 [FOLLOWED BY LETTER] - DIRECTIVE MARKER $B1 [OTHERWISE] - CAUSES IMMEDIATELY FOLLOWING SOURCE SYMBOL TO BE TREATED LITERALLY (IE NOT AS MARKER OR SEPARATOR) $B $C4 .CAP $T1 ('$@') $T2 CAPITAL MARKER - SINGLE CHARACTER $B $C4 .UND $T1 ('$_') $T2 UNDERLINE MARKER - SINGLE CHARACTER $A INDENT=4 $B $C4 .CAPSH $T1 ('$.') $T2 CAPITAL SHIFT - COMPLETE ATOM (RECOGNIZED AT START OF SOURCE ATOM ONLY) $B $C4 .UNDSH $T1 ('$%') $T2 UNDERLINE SHIFT - (REMAINDER OF) ATOM (EXCLUDING TERMINAL PUNCTUATION) $A INDENT=2 $B $C4 .CAPO $T1 ('$@') $T2 CAPITAL MARKER FOR OUTPUT (UPDATED SOURCE) $B $C4 .UNDO $T1 ('$_') $T2 UNDERLINE MARKER FOR OUTPUT $B $C4 .CAPSHO $T1 ('$.') $T2 CAPITAL SHIFT FOR OUTPUT $B $C4 .UNDSHO $T1 ('$%') $T2 UNDERLINE SHIFT FOR OUTPUT $B $N $L1UC BOOLEAN PARAMETERS $B $C4 .ASCII $T1 (ON) $T2 $C- ON - FORMATTED OUTPUT IS TO BE IN .ASCII CODE WITH UNDERLINING IMPLEMENTED BY @CARRIAGE @RETURN AND OVERPRINTING $B $C- OFF - FORMATTED OUTPUT IS TO BE IN @ATLAS @FLEXOWRITER CODE (NOT YET IMPLEMENTED) $B $C4 .JUST $T1 (OFF) $T2 $C- ON - FORMATTED OUTPUT IS TO BE JUSTIFIED $B $C- OFF - NOT JUSTIFIED $B $C4 .MARK $T1 (OFF) $T2 $C- ON - PAGE SEPARATION MARKERS ARE TO BE PRINTED AT THE HEAD OF EACH PAGE OF THE FORMATTED DOCUMENT $B $C- OFF - NO PAGE SEPARATION MARKERS $B $B3 $L1UC VECTOR PARAMETERS $B $A INDENT=3 $C4 .TAB $T2 TAB SETTINGS $B $C4 .TEMPA $T2 TEMPORARY HOLDING VECTOR 1 $B $C4 .TEMPB $T2 TEMPORARY HOLDING VECTOR 2 $B $A INDENT=0 $N $L1CU DIRECTIVES $P @ALL DIRECTIVES APART FROM @COLUMN AND @TAB IMPLY TERMINATION OF A (NON-EMPTY) LINE. $P0 @FOR DIRECTIVES WHICH HAVE A NUMERIC ARGUMENT, A VALUE OF 1 IS ASSUMED IF THE ARGUMENT IS OMITTED. $A INDENT=1; TAB=10,12,18 $B2 $C4 .$$C $T1 @COLUMN: SET COLUMN POSITION (ABSOLUTE OR RELATIVE) $B0 $$@CN: $T+ SET COLUMN POSITION $B0 $$@C+N: $T+ INCREASE COLUMN POSITION BY N $B0 $$@C-N: $T+ DECREASE COLUMN POSITION BY N $B2 $C4 .$$T $T1 @TAB: MOVE TO TAB SETTING (ABSOLUTE OR RELATIVE) $B0 $$@TN: $T+ SET COLUMN POSITION TO @T@A@B(N) $B0 $$@T+N: $T+ TAB FORWARD N TIMES (AT LEAST ONE SPACE FOR EACH) $B0 $$@T-N: $T+ TAB BACKWARD N TIMES (AT LEAST ONE SPACE FOR EACH) $B2 $C4 .$$I $T1 @INDENT: SET INDENTATION LEVEL (ABSOLUTE OR RELATIVE TO CURRENT VALUE OF .INDENT) FOR ONE LINE $B0 $$@IN: $T+ INDENT TO @T@A@B(N) $B0 $$@I+N: $T+ INDENT TO @T@A@B(@I@N@D@E@N@T+N) $B0 $$@I-N: $T+ INDENT TO @T@A@B(@I@N@D@E@N@T-N) $B2 $C4 $$@BN $T1 @BLANK: LEAVE N BLANK LINES $B2 $C4 $$@PN $T1 @PARAGRAPH: TAKE NEW PARAGRAPH (THAT IS, LEAVE N BLANK LINES, INDENT IF APPLICABLE, AND INCREMENT COLUMN POSITION BY .PGAP); A NEW PAGE IS TAKEN IF FEWER THAN N+2 LINES REMAIN ON THE CURRENT PAGE; BLANK LINES ARE NOT INSERTED AT THE TOP OF A PAGE $B2 $C4 .$$N $T1 @NEWPAGE: TAKE NEW PAGE (UNLESS CURRENT PAGE IS EMPTY) $B2 $C4 $$@VN $T1 @VERIFY: TAKE NEW PAGE IF FEWER THAN N LINES ARE LEFT ON THE CURRENT PAGE $B2 $C4 $$@LN $T1 @LINES: FOLLOW EXPLICIT LINE-STRUCTURE OF SOURCE FOR N LINES. $B0 @AFTER THE NUMERIC ARGUMENT, IF PRESENT, ONE OR MORE %MODIFIERS MAY BE PLACED TO INDICATE OPERATIONS TO BE APPLIED TO EACH OF THE N LINES. @THE COMPLETE $$@LNM DIRECTIVE SHOULD ALWAYS OCCUR AT THE END OF A SOURCE LINE; THE N LINES ARE THE N %FOLLOWING LINES. $B0 @THE SPACING OF ATOMS WITHIN THE N LINES IS PRESERVED, NO JUSTIFICATION IS PERFORMED, AND DIRECTIVES ARE ILLEGAL (BUT CODE CONVERSION IS CARRIED OUT AS USUAL). $B @THE MODIFIERS ARE: $B0 $T+ .C: CAPITALISE ALL LETTERS $B0 $T+ .U: UNDERLINE ALL SYMBOLS (INCLUDING SPACES) $B0 $T+ .M: CENTRE THE TEXT OF EACH LINE $B0 $T+ .I: APPLY INDENTATION (IF ANY) TO EACH LINE $N $C4 .$$A $T1 @ASSIGN: ASSIGN VALUES TO PARAMETERS. $P @THE REST OF THE SOURCE LINE CONSISTS OF A NUMBER OF PARAMETER ASSIGNMENT STATEMENTS SEPARATED BY SEMI-COLONS. @THE FORM OF THE ASSIGNMENT STATEMENT IS ILLUSTRATED IN THE FOLLOWING EXAMPLES. @IT IS NOT REQUIRED THAT THE REPRESENTATION OF A VALUE SHOULD MATCH THE TYPE OF THE PARAMETER (FOR EXAMPLE, QUOTED SYMBOL FOR SYMBOL PARAMETER). @BOOLEAN PARAMETERS ARE DEFINED TO BE TRUE (OR ON) IF THEY HAVE A NON-ZERO VALUE, AND FALSE (OR OFF) IF THEY HAVE A ZERO VALUE. $P @IF THE NUMBER OF VALUES SPECIFIED IN A VECTOR ASSIGNMENT IS LESS THAN THE VECTOR BOUND, THE REMAINING ELEMENTS IN THE VECTOR ARE NOT ALTERED. $P @CODE CONVERSION OPERATIONS CAN BE DISABLED BY SETTING THE ASSOCIATED PARAMETER(S) TO ZERO. $B .$$A .LEFT=4; .PAGE=64; .LINE=80; .JUST=1 $B .$$A .CAP=0; .ESCAPE=UND; .UND='#' $B .$%A .TEMPA=TAB; .TAB=4,10,18,20; .INDENT=2 $B2 $C4 .$$E $T1 @END: MARKS END OF SOURCE DOCUMENT $A INDENT=0 $B3 $L1CU ERROR REPORTS $P @IF AN ERROR IS DETECTED IN THE SOURCE FILE, AN EXPLANATORY COMMENT IS PRINTED ON THE REPORT STREAM, FOLLOWED BY THE OFFENDING SOURCE LINE AS IT APPEARS IN THE %UPDATED SOURCE FILE. $B3 $L1CU IMPLEMENTATION $B1 .PDP-9/15 $B1 $C6 COMMAND: $C+2 ..LAYOUT SOURCE / DOCUMENT , UPDATED-SOURCE $B1 $C6 ERROR REPORTS ARE OUTPUT TO STREAM ZERO $N $L1CU NOTES ON USE $P2 @WHEN PREPARING A SOURCE FILE FROM A MANUSCRIPT OR NORMAL TYPESCRIPT, IT WILL BE FOUND THAT THE USE OF THE CODE CONVERSION MARKERS SOON BECOMES AUTOMATIC. @NOTE THE FOLLOWING VALID COMBINATIONS: $L4 CAPITAL SHIFT, UNDERLINE SHIFT: $.$% CAPITAL SHIFT, UNDERLINE MARKER: $.$_ UNDERLINE SHIFT, CAPITAL MARKER: $%$@ UNDERLINE MARKER, CAPITAL MARKER: $_$@ $P @THE INSERTION OF @PARAGRAPH DIRECTIVES AND @BLANK DIRECTIVES AS REQUIRED IS ALSO FAIRLY STRAIGHTFORWARD. @THERE IS NO POINT AT THIS STAGE IN SEEKING TO MAINTAIN A UNIFORM LINE LENGTH IN THE SOURCE FILE. @IT IS ALWAYS NECESSARY TO BEAR IN MIND THAT IF A NEWLINE IS REQUIRED IN THE FORMATTED DOCUMENT, SOME DIRECTIVE WILL BE REQUIRED TO GET IT THERE (APART FROM LINES FOLLOWING A @LINES DIRECTIVE). $P @WHEN DEALING WITH SOURCE MATERIAL OTHER THAN RUNNING TEXT, IT IS USUALLY EASIER TO WORK OUT WHAT ASSIGNMENTS AND DIRECTIVES ARE REQUIRED IN ADVANCE AND MARK UP THE MANUSCRIPT ACCORDINGLY. $P @HEADINGS CAN OFTEN BE HANDLED MOST CONVENIENTLY BY USING THE @LINES DIRECTIVE WITH SOME SELECTION OF THE @CAPITALISE(@C), @UNDERLINE(@U), @CENTRE(@M), AND @INDENT(@I) MODIFIERS. $P @FOR TABLES AND OTHER SPECIAL LAYOUTS, IT IS FIRST NECESSARY TO ESTABLISH HOW MANY DIFFERENT FIELDS ARE INVOLVED AND AN APPROXIMATE STARTING POSITION FOR EACH FIELD. @AN @ASSIGN DIRECTIVE CAN THEN BE INSERTED BEFORE THE TEXT OF THE TABLE TO SET THE .TAB VECTOR TO THE REQUIRED COLUMN POSITIONS, AND @TAB DIRECTIVES CAN BE USED WITHIN THE TEXT TO SELECT THE APPROPRIATE FIELDS. @THE HOPE IS THAT IF A TEST RUN SHOWS THAT THE LAYOUT IS NOT QUITE RIGHT, IT SHOULD BE POSSIBLE TO CORRECT IT SIMPLY BY ALTERING THE TAB SETTINGS. $P @INDENTATION IS HANDLED BY THE USE OF AN @ASSIGN DIRECTIVE SPECIFYING THE REQUIRED INDENTATION LEVEL (OFTEN ACCOMPANIED BY NEW VALUES FOR .TAB), FOR EXAMPLE: .$$A .INDENT=2; .TAB=4,10. @WHEN IT IS NECESSARY TO OVERRIDE THE AUTOMATIC INDENTATION FOR SINGLE LINES (FOR EXAMPLE, WHEN NUMBERING POINTS) APPROPRIATE @INDENT %DIRECTIVES MAY BE PLACED AT THE START OF THE LINES CONCERNED. @INDENTATION IS CANCELLED BY SETTING .INDENT TO ZERO. $E