|
|
1.1 root 1: |include(macro.h)
2: |include(list.h)
3: |include(whitespace.h)
4: |include(style.h)
5:
6: |attribute(page.offset; init;
7: [
8: . po \nOu
9: ]
10: $ [
11: . po $
12: ])
13:
14: |attribute(line.length; init;
15: [
16: . ll \nWu
17: . lt \nWu
18: ]
19: $ [
20: . ll $
21: . lt $
22: ])
23:
24: |attribute(page.length; init;
25: [
26: . pl \nLu
27: ]
28: $ [
29: . pl $
30: ])
31:
32: |attribute(spacing; init off;
33: on [
34: . rs
35: ] off [
36: . ns
37: ])
38:
39: |attribute(new.page; nostack;
40: [
41: . bp
42: ])
43:
44: |attribute(line.spacing; stack, init;
45: $ [
46: . ls $
47: ] [
48: . ls 1
49: ])
50:
51: |attribute(blank.lines; nostack;
52: $ [
53: . sp $
54: ] [
55: . sp 1
56: ])
57:
58: |attribute(horizontal.motion; nostack;
59: $ [\h'$'])
60:
61: |attribute(vertical.motion; nostack;
62: $ [\v'$'])
63:
64: |attribute(concatenate; nostack;
65: [\c])
66:
67: |attribute(new.line; nostack;
68: [
69: . br
70: ])
71:
72: |attribute(indent; stack, init;
73: $ [
74: . in $
75: ] [
76: ' in 0
77: ])
78:
79: |attribute(indent.line; nostack;
80: $ [
81: . ti $
82: ] [
83: ' ti 0
84: ])
85:
86: |attribute(fill; stack, init on;
87: on [
88: . fi
89: ] off [
90: . nf
91: ])
92:
93: |attribute(adjust; stack, init both;
94: right [
95: . ad r
96: ] left [
97: . ad l
98: ] both [
99: . ad b
100: ] on [
101: . ad
102: ] off [
103: . na
104: ])
105:
106: |attribute(center; stack, default off;
107: on [
108: . ce 9999
109: ] off [
110: . ce 0
111: ])
112:
113: |attribute(center.block; stack, default off;
114: on [
115: . di :1 \" begin second diversion
116: ] off [
117: . br \" get last partial line
118: . di \" end diversion of centered block
119: . nr ;q \n(.u \" save prevailing fill/no-fill mode
120: . nf \" bring it back in no-fill
121: . nr ;L \n(.L \" save line spacing
122: . ls 1 \" output display in ls 1
123: . nr ;i \n(.i \" save prevailing indent
124: . nr ;y 1 \" initialize width of block
125: . if \n(dl>\n(;y .nr ;y \n(dl
126: . if \n(;y<\n(.l .in (\n(.lu-\n(;yu)/2u \"indent by half of white-space
127: . :1 \" text
128: . if \n(;q .fi \" restore fill if necessary
129: . ls \n(;L \" restore line spacing
130: . in \n(;iu \" restore prevailing indent
131: . rr ;y \" free storage
132: . rm :1
133: ])
134:
135: |attribute(text; nostack;
136: $ [$])
137:
138: |attribute(error; nostack;
139: $ [
140: . tm "__FILE__":__LINE__: $
141: ])
142:
143: |attribute(width; stack, default full;
144: narrow [
145: . if \n(:C \{\
146: . ll \nW \" go narrow
147: . lt \nW \}
148: ] full [
149: . if \n(:C \{\
150: . ll \n(:W \" go wide
151: . lt \n(:W \}
152: ])
153:
154: |attribute(here; stack, default off;
155: on [
156: '\" group mechanism
157: '\" :0 store for initally diverted text
158: '\" :1 store for centered block text
159: '\" :C 0=one column, 1=first column, 2=second column
160: '\" :W page width for full page output
161: '\" :d prevent )h from outputting a floating group
162: '\" :m initial footer place and partial footnote diverter trap
163: '\" :o footer trap location
164: '\" :r position at end of page header macro
165: '\" :y flag indicating group/float in progress
166: '\" W page width
167: '\" ;L remembered line spacing TEMP
168: '\" ;i remembered indent TEMP
169: '\" ;q remembered fill/no-fill mode TEMP
170: '\" ;y initialize width of block TEMP
171: . if \n(:y .tm "__FILE__":__LINE__: Groups can not be nested
172: . nr :y 1 \" set flag indicating group
173: . br \" output partial line before display
174: . di :0 \" collect in :0
175: ] off [
176: '\" Control page orientation of blocks.
177: '\" Blocks are output as soon after their definition as
178: '\" feasible. The following rules are used:
179: '\" 1. if the block will fit on the current page, output it there.
180: '\" 2. if the block won't fit on any page, and we have used less than
181: '\" half of the current page, then output the block on the
182: '\" current page.
183: '\" 3. skip to the next page.
184: . br \" get last partial line
185: . di \" end diversion
186: '\" The following if condition tests: (1) if the block is too large to
187: '\" fit on the current page and either (2) it will fit on an unused page
188: '\" or (3) we have already used more than half of the current page. (the
189: '\" three conditions are grouped in the form 1 & (2 : 3)). If this
190: '\" total condition is true, then a page is ejected and the block output
191: '\" on the next page.
192: . nr :d 1 \" prevent )h from outputting a floating group
193: . if (\n(dn>=\n(.t)&((\n(dn<(\n(.p-\n(:r-\n(:m)):\
194: (\n(nl>(\n(.p-\n(:r-\n(:o/2u+\n(:r)))\
195: . ne \n(.tu+1v \" spring the trap
196: . nr ;q \n(.u \" save prevailing fill/no-fill mode
197: . nf \" bring it back in no-fill
198: . nr ;L \n(.L \" save line spacing
199: . ls 1 \" output display in ls 1
200: . nr ;i \n(.i \" save prevailing indent
201: . in 0 \" indent back
202: . rs \" restore spacing
203: . :0 \" text
204: . nr :d 0 \" allow )h to output a floating group
205: . if \n(;q .fi \" restore fill if necessary
206: . ls \n(;L \" restore line spacing
207: . in \n(;iu \" restore prevailing indent
208: . nr :y 0 \" reset flag indicating group
209: . rr ;L ;i ;q \" free storage
210: . rm :0
211: ])
212:
213: |attribute(around; stack, default off;
214: on [
215: '\" float mechanism
216: '\" !{a-z} width of stored floating 0=narrow, 1=wide
217: '\" :0 store for initally diverted text
218: '\" :1 store for centered block text
219: '\" :C 0=one column, 1=first column, 2=second column
220: '\" :W page width for full page output
221: '\" :m initial footer place and partial footnote diverter trap
222: '\" :o footer trap location
223: '\" :r position at end of page header macro
224: '\" :w output counter for floating keeps
225: '\" :y flag indicating group/float in progress
226: '\" :z input counter for floating keeps
227: '\" W page width
228: '\" ?{a-z} text of stored floating
229: '\" |{a-z} size of stored floating
230: '\" ;L prevailing line spacing
231: '\" ;f prevailing font
232: '\" ;i prevailing indent
233: '\" ;j prevailing adjust
234: '\" ;l prevailing line length
235: '\" ;o prevailing page offset ??????? bug with .po
236: '\" ;s prevailing point size
237: '\" ;u prevailing fill/no-fill mode
238: '\" ;v prevailing vertical spacing
239: '\" ;w convert to alpha format
240: '\" ;y initialize width of block
241: . if \n(:y .tm "__FILE__":__LINE__: Groups can not be nested
242: . nr :y 1 \" set flag indicating group
243: . nr ;s \n(.s \" save prevailing point size
244: . nr ;f \n(.f \" save prevailing font
245: . nr ;u \n(.u \" save prevailing fill/no-fill mode
246: . nr ;j \n(.j \" save prevailing adjust
247: . nr ;v \n(.v \" save prevailing vertical spacing
248: . nr ;L \n(.L \" save prevailing line spacing
249: . nr ;l \n(.l \" save prevailing line length
250: . nr ;i \n(.i \" save prevailing indent
251: . ev 1 \" use footnote environment
252: . ps \n(;s \" restore point size
253: . vs \n(;sp+2p \" restore vertical spacing
254: . ft \n(;f \" restore font
255: . nf \" bring it back in no-fill
256: . if \n(;u .fi \" restore fill if necessary
257: . ad \n(;j \" restore page adjust
258: . vs \n(;vu \" restore vertical spacing
259: . ls \n(;L \" restore line spacing
260: . ll \n(;lu \" restore line length
261: . in \n(;iu \" restore indent
262: . ti \n(;iu \" turn off indentation
263: . hy 14 \" turn on hyphenation
264: . lt \n(;lu \" restore title length
265: . di :0 \" collect in :0
266: ] off [
267: '\" Control page orientation of floats.
268: '\" Floats are output as soon after their definition as
269: '\" feasible. The following rules are used:
270: '\" 1. if the queue contains only this float and it will fit on the
271: '\" current page, output it there.
272: '\" 2. if the queue contains only this float and it won't fit on any
273: '\" page, and we have used less than half of the current page,
274: '\" then output the float on the current page.
275: '\" 3. let the top of page macro handle it.
276: . br \" get last partial line
277: . di \" end diversion of centered block
278: . ev \" back to previous environment
279: . nr :z \n(:z%26+1 \" get index of next output element
280: . if \n(:z-\n(:w=0 .tm "__FILE__":__LINE__: too many floating displays
281: . af ;w a \" conversion register for display queue names
282: . nr ;w \n(:z \" form the next queue element name
283: . rn :0 ?\n(;w \" put the display into the queue
284: . nr !\n(;w 0 \" narrow
285: . if !\n(:C .nr !\n(;w 1 \" wide display if only one column
286: . nr |\n(;w \n(dn \" put the size of text
287: '\" The following if condition tests: (1) if there is only one float
288: '\" on the queue to output and (2) if wide displays and (3) we are on the
289: '\" first column and (4) if the float fits on the current page or
290: '\" (5) the float is too large to fit on any one page, and (6) we have used
291: '\" less than half of the current page. (the six conditions are grouped
292: '\" in the form (1 & (2 & 3) & (4 : (5 & 6))). If this total condition is true,
293: '\" then a float is output.
294: . if ((\n(:z-\n(:w=1)&((\n(!\n(;w=1)&(\n(:C<2))&\
295: ((\n(dn<\n(.t):((\n(dn>(\n(.p-\n(:r-\n(:m))&\
296: (\n(nl<=(\n(.p-\n(:r-\n(:o/2u+\n(:r))))) .)z
297: . nr :y 0 \" reset flag indicating group
298: . rr ;L ;f ;i ;j ;l ;o ;s ;u ;v ;w \" free storage
299: ])
300:
301: |attribute(around_placement; nostack;
302: [
303: . )w
304: ])
305:
306: |attribute(footnote; stack, default off;
307: on [
308: '\" :C 0=one column, 1=first column, 2=second column
309: '\" :F Footnote text
310: '\" :W page width for full page output
311: '\" :m initial footer place and partial footnote diverter trap
312: '\" :o footer trap location
313: '\" :q amount of footnote text
314: '\" :v width of stored footnote 0=narrow, 1=wide
315: '\" :x flag indicating footnote in progress
316: '\" W page width
317: '\" ;L prevailing line spacing
318: '\" ;f prevailing font
319: '\" ;i prevailing indent
320: '\" ;j prevailing adjust
321: '\" ;l prevailing line length
322: '\" ;o prevailing page offset ??????? bug with .po
323: '\" ;s prevailing point size
324: '\" ;u prevailing fill/no-fill mode
325: '\" ;v prevailing vertical spacing
326: . if \n(:x .tm "__FILE__":__LINE__: Footnotes can not be nested
327: . nr :x 1 \" set flag indicating footnote
328: . nr ;s \n(.s \" save prevailing point size
329: . nr ;f \n(.f \" save prevailing font
330: . nr ;u \n(.u \" save prevailing fill/no-fill mode
331: . nr ;j \n(.j \" save prevailing adjust
332: . nr ;v \n(.v \" save prevailing vertical spacing
333: . nr ;L \n(.L \" save prevailing line spacing
334: . nr ;l \n(.l \" save prevailing line length
335: . nr ;i \n(.i \" save prevailing indent
336: . ev 1 \" use footnote environment
337: . ps \n(;s \" restore point size
338: . vs \n(;sp+2p \" restore vertical spacing
339: . ft \n(;f \" restore font
340: . nf \" bring it back in no-fill
341: . if \n(;u .fi \" restore fill if necessary
342: . ad \n(;j \" restore page adjust
343: . vs \n(;vu \" restore vertical spacing
344: . ls \n(;L \" restore line spacing
345: . ll \n(;lu \" restore line length
346: . in \n(;iu \" restore indent
347: . ti \n(;iu \" turn off indentation
348: . hy 14 \" turn on hyphenation
349: . lt \n(;lu \" restore title length
350: |ifvalue wide on [
351: . if \n(:C \{\
352: . ll \n(:W \" go wide
353: . lt \n(:W \}
354: ]
355: 'DUMMY
356: . da :F \" collect in :F
357: . if !\n(:q \{\
358: . nr ;o \n(.o \" save prevailing page offset
359: . po 0 \" always from left margin
360: . ps 10 \" 10 point roman font
361: . vs 10p
362: . ft 1
363: . ie \n(.A=0 \l'72p'\" layout partial rule if new footnote
364: . el __________
365: . ft \" restore values
366: . vs
367: . ps
368: . po \n(;ou\}
369: ] off [
370: . br \" get last partial line
371: . di \" end diversion
372: |ifvalue wide on [
373: . if \n(:C \{\
374: . ll \nW \" go narrow
375: . lt \nW \}
376: . nr :v 1 \" wide footnote
377: ]
378: 'DUMMY
379: |ifnotvalue wide on [
380: . if !\n(:C .nr :v 1 \" wide footnote if only one column
381: ]
382: 'DUMMY
383: . ev \" go back to previous environment
384: . nr :x 0 \" clear flag indicating footnote
385: . nr :q +\n(dnu \" add in amount of new footnotes
386: '\" Move up footer trap, but not above current position on page
387: . nr :o +\n(dnu
388: . if !\n(.pu-\n(nlu-.5p-\n(:ou .nr :o \n(.pu-\n(nlu-.5p
389: '\" or below :m!
390: . if !\n(:ou-\n(:mu .nr :o \n(:mu
391: . ch )f -\n(:ou \" move footer trap
392: . rr ;L ;f ;i ;j ;l ;s ;u ;v \" free storage
393: ])
394:
395: |attribute(size; stack, default;
396: $ [\&\s$]
397: [\&\s\nS])
398:
399: |attribute(font.size; stack, init;
400: $ [
401: . ps $
402: . vs \n(.sp+2p
403: ] [
404: . ps \nSp
405: . vs \nSp+2p
406: ])
407:
408: |attribute(font; stack, init;
409: roman [
410: |ifvalue fill off [\&\f1]
411: |ifvalue fill on [
412: . ft 1
413: ]
414: ] italics [
415: |ifvalue fill off [\&\f2]
416: |ifvalue fill on [
417: . ft 2
418: ]
419: ] bold [
420: |ifvalue fill off [\&\f3]
421: |ifvalue fill on [
422: . ft 3
423: ]
424: ] special [
425: |ifvalue fill off [\&\f4]
426: |ifvalue fill on [
427: . ft 4
428: ]
429: ] cw [
430: |ifvalue fill off [\&\f(CW]
431: |ifvalue fill on [
432: . ft CW
433: ]
434: ] [
435: |ifvalue fill off [\&\f\nF]
436: |ifvalue fill on [
437: . ft \nF
438: ]
439: ])
440:
441: |attribute(temporary.font; nostack;
442: roman [\f1]
443: roman $ [\f1$\fP]
444: italics [\f2]
445: italics $ [\f2$\fP]
446: bold [\f3]
447: bold $ [\f3$\fP]
448: special [\f4]
449: special $ [\f4$\fP]
450: cw [\f(CW]
451: cw $ [\f(CW$\fP]
452: [\fP]
453: )
454:
455: |attribute(font.family; stack, default times;
456: times [
457: . fp 1 R
458: . fp 2 I
459: . fp 3 B
460: . fp 4 BI
461: ] palatino [
462: . fp 1 PA
463: . fp 2 PI
464: . fp 3 PB
465: . fp 4 PX
466: ] bembo [
467: . fp 1 B1
468: . fp 2 B2
469: . fp 3 B3
470: . fp 4 B4
471: ] optima [
472: . fp 1 O1
473: . fp 2 O2
474: . fp 3 O3
475: . fp 4 O4
476: ] souvenir [
477: . fp 1 SV
478: . fp 2 SI
479: . fp 3 SB
480: . fp 4 SX
481: ] helvetica [
482: . fp 1 H
483: . fp 2 HI
484: . fp 3 HB
485: . fp 4 HX
486: ] cw [
487: . fp 1 CW
488: . fp 2 I
489: . fp 3 B
490: . fp 4 BI
491: ])
492:
493: |attribute(if; nostack;
494: $test [
495: . if $test \
496: ] begin $test [
497: . if $test \{\
498: ] end [\}\c
499: ] else $test [
500: . ie $test \
501: ] else begin $test [
502: . ie $test \{]
503: else [
504: . el \
505: ] else begin [
506: . el \{])
507:
508: |attribute(tab; nostack;
509: [\& ])
510:
511: |attribute(thick.line; nostack;
512: $ [
513: . ps 24
514: \l'$'
515: . ps
516: ] [
517: . ps 24
518: \l'\n(.lu'
519: . ps
520: ])
521:
522: |attribute(line; nostack;
523: $ [\l'$']
524: [\l'\n(.lu'])
525:
526: |attribute(box; nostack;
527: x [\s12\o'\(mu\(sq'\s0]
528: empty [\s12\(sq\s0]
529: [\(sq])
530:
531: |attribute(underline; stack, default off;
532: on [\kx]
533: off [\l'|\nxu\(ul'])
534:
535: |attribute(hyphenate; stack, init on;
536: on [
537: . hy 14
538: ] off [
539: . nh
540: ])
541:
542: |attribute(case; stack, init any;
543: upper [
544: '\" need to write this yet
545: ] lower [
546: '\" need to write this yet
547: ] capitalize [
548: '\" need to write this yet
549: ] any [
550: '\" need to write this yet
551: ])
552:
553: |attribute(tab.stops; nostack;
554: $* [
555: . ta $*
556: ] [
557: . ta .5i 1.0i 1.5i 2.0i 2.5i 3.0i 3.5i 4.0i 4.5i 5.0i 5.5i 6.0i 6.5i 7.0i 7.5i
558: ])
559:
560: |attribute(set; nostack;
561: $* $number [
562: |for i in $* {
563: . nr $i $number
564: }] string $* $string [
565: |for i in $* {
566: . ds $i $string
567: }])
568:
569: |attribute(store; nostack;
570: $* $$. [
571: |for i in $* {
572: . nr $i \n$$.
573: }] $* $number.register [
574: |for i in $* {
575: . nr $i \n($number.register
576: }] string $* $$. [
577: |for i in $* {
578: . ds $i \*$$.
579: }] string $* $string.register [
580: |for i in $* {
581: . ds $i \*($string.register
582: }] number.from.string $* $$. [
583: |for i in $* {
584: . nr $i \*$$.
585: }] number.from.string $* $string.register [
586: |for i in $* {
587: . nr $i \*($string.register
588: }] string.from.number $* $$. [
589: |for i in $* {
590: . ds $i \n$$.
591: }] string.from.number $* $number.register [
592: |for i in $* {
593: . ds $i \n($number.register
594: }])
595:
596: |attribute(clear; nostack;
597: $* [
598: |for i in $* {
599: . nr $i 0
600: }] string $* [
601: . rm $*
602: ])
603:
604: |attribute(add; nostack;
605: $result $operand $* [
606: . nr $result \n($operand
607: |for i in $* {
608: . nr $result +\n($i
609: }] $result $operand [
610: . nr $result \n($operand
611: ] string $string $text [
612: . as $string $text
613: ] string.from.number $string $number.register [
614: . as $string \n($number.register
615: ] string.from.string $string $string.register [
616: . as $string \*($string.register
617: ])
618:
619:
620: |attribute(incr; nostack;
621: $* [
622: |for i in $* {
623: . nr $i +1
624: }])
625:
626: |attribute(decr; nostack;
627: $* [
628: |for i in $* {
629: . nr $i -1
630: }])
631:
632: |attribute(protect; nostack;
633: $ [
634: . ne $
635: ] [
636: . ne 3
637: ])
638:
639: |attribute(warn.orphan; nostack;
640: $ [
641: '\" need to write this yet
642: ] [
643: '\" need to write this yet
644: ])
645:
646: |attribute(two.columns; nostack;
647: on [
648: '\" :C 0=one column, 1=first column, 2=second column
649: '\" :O page offset for other column
650: '\" :W page width for full page output
651: '\" :u position to return to for second column output
652: '\" O page offset
653: '\" W page width
654: . if \n(:C .tm "__FILE__":__LINE__: already in two column mode
655: . br \" force out last partial line
656: . nr :C 1 \" flag for two column mode, first column
657: . nr :W \nW \" save line length
658: . nr W \n(.lu*8u/17u \" new line length
659: . nr :O \n(.lu*9u/17u+\nOu\" page offset for other column
660: . ll \nWu \" set new line length
661: . lt \nWu \" set new title length
662: . mk :u \" save where second column starts
663: ] off [
664: . if !\n(:C .tm "__FILE__":__LINE__: already in full page mode
665: . br \" force out last partial line
666: . if \n(:C>1 .ne \n(.tu+1v\" spring footer trap for second column
667: . nr W \n(:Wu \" restore line length
668: . ll \nWu \" set new line length
669: . lt \nWu \" set new title length
670: . nr :C 0 \" flag for full page mode
671: ])
672:
673: |attribute(divert.string; nostack;
674: $string.name [
675: . ds $string.name ])
676:
677: |attribute(divert.number; nostack;
678: $number.name [
679: . nr $number.name ])
680:
681: |attribute(divert.output; stack, default off;
682: on $string.name [
683: . di $string.name \" start diverting into macro
684: ] off [
685: . br \" get last partial line
686: . di \" turn off diversions
687: ])
688:
689: |attribute(divert.input; stack, default off;
690: on $string.name [
691: . eo
692: . de $string.name
693: ] off [
694: ..
695: . ec
696: ])
697:
698: |attribute(remember; nostack;
699: $ [
700: . mk $
701: ])
702:
703: |attribute(return; nostack;
704: $$. [
705: . sp |\n$$.u
706: ] $ [
707: . sp |\n($u
708: ])
709:
710: |attribute(goto; nostack;
711: $ [
712: . sp |$
713: ])
714:
715: |attribute(string; nostack;
716: $$. [\*$$.]
717: $string.register [\*($string.register])
718:
719: |attribute(macro; nostack;
720: $ [
721: . $
722: ])
723:
724: |attribute(number; nostack;
725: $$. $format [
726: . af $$. $format
727: \n$$.]
728: $number.register $format [
729: . af $number.register $format
730: \n($number.register]
731: $$. [\n$$.]
732: $number.register [\n($number.register]
733: ++ $$. [\n+$$.]
734: ++ $number.register [\n+($number.register]
735: format $* $format [
736: |for i in $* {
737: . af $i $format
738: }])
739:
740: |attribute(reference; stack, default off;
741: on {
742: . [
743: } off {
744: . ]
745: } placement {
746: . [
747: $LIST$
748: })
749:
750: |attribute(table; stack, default off;
751: on [
752: . TS
753: ] off [
754: . TE
755: ])
756:
757: |attribute(picture; stack, default off;
758: on [
759: . PS
760: ] off [
761: . PE
762: ])
763:
764: |attribute(equation; stack, default off;
765: on [
766: . EQ
767: ] off [
768: . EN
769: ])
770:
771: |attribute(inline.equation; stack, default off;
772: on []
773: off [])
774:
775: |attribute(graph; stack, default off;
776: on $$. [
777: . G1 \*$$.
778: ] on $string.register [
779: . G1 \*($string.register
780: ] off [
781: . G2
782: ])
783:
784: |attribute(bargraph; stack, default off;
785: on [
786: . B1
787: ] off [
788: . B0
789: ])
790:
791: |attribute(citation; nostack;
792: save [
793: . CD "]
794: save end $$. [" "\*$$."
795: ] save end $string.register [" "\*($string.register"
796: ] savepage end [" "\nP"
797: ] remember [
798: . CU "]
799: remember end ["])
800:
801: |attribute(insert; nostack;
802: $file.name [
803: . so $file.name
804: ])
805:
806: |attribute(list.tags; stack, init none;
807: bullet [
808: . ds list_type bullet
809: ] dash [
810: . ds list_type dash
811: ] outline [
812: . ds list_type outline
813: ] number [
814: . ds list_type number
815: ] none [
816: . ds list_type none
817: ])
818:
819: |attribute(format.type; stack, init none;
820: model [
821: . ds format_type model
822: ] none [
823: . ds format_type none
824: ])
825:
826: |attribute(verbatim; stack, init off;
827: off []
828: on [])
829:
830: |attribute(file.information; nostack;
831: [
832: . lf __LINE__ __FILE__
833: ])
834:
835: |attribute(white.text; nostack;
836: $text [|ifvalue verbatim off []|ifvalue verbatim on [$text]])
837:
838: |attribute(nl.paragraph; nostack;
839: [|ifvalue verbatim on [
840: ]|ifvalue verbatim off []])
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.