Annotation of researchv10no/cmd/monk/o.db/attrib.m, revision 1.1

1.1     ! root        1: |include(list.h)
        !             2: |include(macro.h)
        !             3: |include(style.h)
        !             4: 
        !             5: |attribute(page.offset; init 0;
        !             6:        $ [
        !             7: '\"    O current page offset
        !             8: '\"    On page offset for column n
        !             9: .              po $
        !            10: .              nr O \n(.o
        !            11: .              nr O0 \n(.o
        !            12: ])
        !            13: 
        !            14: |attribute(line.length; init 6i;
        !            15:        $ [
        !            16: '\"    W current page width
        !            17: '\"    Wn page width for column n
        !            18: .              ll $
        !            19: .              lt $
        !            20: .              nr W \n(.lu
        !            21: ])
        !            22: 
        !            23: |attribute(page.length; init 11i;
        !            24:        $ [
        !            25: .              pl $
        !            26: ])
        !            27: 
        !            28: |attribute(spacing; init off;
        !            29:        on [
        !            30: .              rs
        !            31: ]      off [
        !            32: .              ns
        !            33: ])
        !            34: 
        !            35: |attribute(new.page; nostack;
        !            36:        [
        !            37: .              bp
        !            38: ]      odd [
        !            39: '\"    ;P page number register TEMP
        !            40: .              bp
        !            41: .              af ;P \g+Q+-Q-page_counter              \" save format of page_counter
        !            42: .              af page_counter 1                       \" normal format for next line
        !            43: .              nr ;P \n page_counter                   \" must use different name for P
        !            44: .              af page_counter \g(;P                   \" restore format to P
        !            45: .              af ;P 1                                 \" normal format for control register
        !            46: .              if !\n(;P%2 \{\
        !            47: .                      rs
        !            48: .                      bp \}
        !            49: .              rr ;P                                   \" free storage
        !            50: ]      even [
        !            51: '\"    ;P page number register TEMP
        !            52: .              bp
        !            53: .              af ;P \g+Q+-Q-page_counter              \" save format of page_counter
        !            54: .              af page_counter 1                       \" normal format for next line
        !            55: .              nr ;P \n page_counter                   \" must use different name for P
        !            56: .              af page_counter \g(;P                   \" restore format to P
        !            57: .              af ;P 1                                 \" normal format for control register
        !            58: .              if \n(;P%2 \{\
        !            59: .                      rs
        !            60: .                      bp \}
        !            61: .              rr ;P                                   \" free storage
        !            62: ])
        !            63: 
        !            64: |attribute(line.spacing; stack, init 1;
        !            65:        $ [
        !            66: .              ls $
        !            67: ])
        !            68: 
        !            69: |attribute(blank.lines; nostack;
        !            70:        $ [
        !            71: .              sp $
        !            72: .              ti \n(.iu                               \" movement resets indentation
        !            73: ]      [
        !            74: .              sp 1
        !            75: .              ti \n(.iu                               \" movement resets indentation
        !            76: ])
        !            77: 
        !            78: |attribute(minimum.lines; nostack;
        !            79:        $ [
        !            80: '\"    minimum space mechanism
        !            81: '\"    :B amount of accumulated blank space
        !            82: '\"    :D amount of accumulated blank space in diversion
        !            83: '\"    :E position of last minimum space in diversion
        !            84: '\"    :N position of last minimum space
        !            85: '\"    }D name of last minimum space diversion
        !            86: '\"    ;4 amount to space TEMP
        !            87: .              br
        !            88: '\"    when in a diversion, use .d (rather than nl) for position
        !            89: '\"    careful--space might occur at the same
        !            90: '\"    position BUT in a different named diversion
        !            91: '\"    (hence, the use of the string }D)
        !            92: '\"    bug still might be possible, if the same named diversion
        !            93: '\"    is used, that a space might occur in the same vertical place.
        !            94: '\"    very unlikely for
        !            95: '\"            a) monk will remove :D and :E when not in a diversion
        !            96: '\"            b) tbl generates unique names
        !            97: .              ie !'\n(.z'' \{\
        !            98: .                      if !'\n(.z'\*(}D' .rr :D :E
        !            99: .                      nr ;4 $v
        !           100: .                      if !(\n(.d=\n(:D) .nr :E 0      \" different place for sure
        !           101: .                      nr ;4 -\n(:Eu                   \" remove previous accumulation, if any
        !           102: .                      if \n(;4 \{\
        !           103: .                              sp \n(;4u
        !           104: .                              nr :E +\n(;4u \}
        !           105: .                      rm ;4
        !           106: .                      ds }D \n(.z
        !           107: .                      nr :D \n(.d \}
        !           108: .              el \{\
        !           109: .                      rr :D :E                        \" remove the in-diversion registers
        !           110: .                      nr ;4 $v
        !           111: .                      if !(\n(nl=\n(:N) .nr :B 0      \" different place for sure
        !           112: .                      nr ;4 -\n(:Bu                   \" remove previous accumulation, if any
        !           113: .                      if \n(;4 \{\
        !           114: .                              sp \n(;4u               \" space and recompute accumulation
        !           115: .                              nr :B +\n(;4u \}
        !           116: .                      rm ;4
        !           117: .                      nr :N \n(nl \}
        !           118: .                      ti \n(.iu                       \" movement resets indentation
        !           119: ]      [
        !           120: '\"    minimum space mechanism
        !           121: '\"    :B amount of accumulated blank space
        !           122: '\"    :D amount of accumulated blank space in diversion
        !           123: '\"    :E position of last minimum space in diversion
        !           124: '\"    :N position of last minimum space
        !           125: '\"    }D name of last minimum space diversion
        !           126: '\"    ;4 amount to space TEMP
        !           127: .              br
        !           128: '\"    when in a diversion, use .d (rather than nl) for position
        !           129: '\"    careful--space might occur at the same
        !           130: '\"    position BUT in a different named diversion
        !           131: '\"    (hence, the use of the string }D)
        !           132: '\"    bug still might be possible, if the same named diversion
        !           133: '\"    is used, that a space might occur in the same vertical place.
        !           134: '\"    very unlikely for
        !           135: '\"            a) monk will remove :D and :E when not in a diversion
        !           136: '\"            b) tbl generates unique names
        !           137: .              ie !'\n(.z'' \{\
        !           138: .                      if !'\n(.z'\*(}D' .rr :D :E
        !           139: .                      nr ;4 1v
        !           140: .                      if !(\n(.d=\n(:D) .nr :E 0      \" different place for sure
        !           141: .                      nr ;4 -\n(:Eu                   \" remove previous accumulation, if any
        !           142: .                      if \n(;4 \{\
        !           143: .                              sp \n(;4u
        !           144: .                              nr :E +\n(;4u \}
        !           145: .                      rm ;4
        !           146: .                      ds }D \n(.z
        !           147: .                      nr :D \n(.d \}
        !           148: .              el \{\
        !           149: .                      rr :D :E                        \" remove the in-diversion registers
        !           150: .                      nr ;4 1v
        !           151: .                      if !(\n(nl=\n(:N) .nr :B 0      \" different place for sure
        !           152: .                      nr ;4 -\n(:Bu                   \" remove previous accumulation, if any
        !           153: .                      if \n(;4 \{\
        !           154: .                              sp \n(;4u               \" space and recompute accumulation
        !           155: .                              nr :B +\n(;4u \}
        !           156: .                      rm ;4
        !           157: .                      nr :N \n(nl \}
        !           158: .                      ti \n(.iu                       \" movement resets indentation
        !           159: ])
        !           160: 
        !           161: |attribute(horizontal.motion; nostack;
        !           162:        $ [\h'$']
        !           163:        number $$. [\h'\n$$.']
        !           164:        number $number.register [\h'\n($number.register'])
        !           165: 
        !           166: |attribute(vertical.motion; nostack;
        !           167:        $ [\v'$']
        !           168:        number $$. [\v'\n$$.']
        !           169:        number $number.register [\v'\n($number.register'])
        !           170: 
        !           171: |attribute(concatenate; nostack;
        !           172:        [\&\c
        !           173: ])
        !           174: 
        !           175: |attribute(new.line; nostack;
        !           176:        [
        !           177: .              br
        !           178: ])
        !           179: 
        !           180: |attribute(indent; stack, default 0;
        !           181:        $ [
        !           182: .              in $
        !           183: ])
        !           184: 
        !           185: |attribute(indent.line; nostack;
        !           186:        $ [
        !           187: .              ti $
        !           188: ]
        !           189:        number $$. [
        !           190: .              ti \n$$.u
        !           191: ]
        !           192:        number $number.register [
        !           193: .              ti \n($number.registeru
        !           194: ])
        !           195: 
        !           196: |attribute(fill; stack, init on;
        !           197:        on [
        !           198: '              fi
        !           199: ]      off [
        !           200: '              nf
        !           201: ])
        !           202: 
        !           203: |attribute(adjust; stack, init both;
        !           204:        right [
        !           205: .              ad r
        !           206: ]      left [
        !           207: .              ad l
        !           208: ]      both [
        !           209: .              ad b
        !           210: ]      on [
        !           211: .              ad
        !           212: ]      off [
        !           213: .              na
        !           214: ])
        !           215: 
        !           216: |attribute(title; nostack;
        !           217:        $left $center $right [
        !           218: .              tl \(ts$left\(ts$center\(ts$right\(ts
        !           219: ]      $$. [
        !           220: .              tl \*$$.
        !           221: ]      $$.. [
        !           222: .              tl \*($$..
        !           223: ]      $ [
        !           224: .              tl $
        !           225: ])
        !           226: 
        !           227: |attribute(center; stack, default off;
        !           228:        on [
        !           229: .              ce 9999
        !           230: ]      off [
        !           231: .              ce 0
        !           232: ])
        !           233: 
        !           234: |attribute(center.block; stack, default off;
        !           235:        on [
        !           236: '\"    :1 store for centered block text
        !           237: '\"    :Y width of a center block diversion
        !           238: .              nr :Y 0                                 \" initialize width of block
        !           239: .              br                                      \" output partial line before block
        !           240: .              di :1                                   \" begin diversion
        !           241: ]      off [
        !           242: '\"    :1 store for centered block text
        !           243: '\"    :Y width of a center block diversion
        !           244: '\"    ;L remembered line spacing TEMP
        !           245: '\"    ;i remembered indent TEMP
        !           246: '\"    ;q remembered fill/no-fill mode TEMP
        !           247: .              br                                      \" get last partial line
        !           248: .              di                                      \" end diversion of centered block
        !           249: .              nr ;q \n(.u                             \" save prevailing fill/no-fill mode
        !           250: .              nf                                      \" bring it back in no-fill
        !           251: .              nr ;L \n(.L                             \" save line spacing
        !           252: .              ls 1                                    \" output display in ls 1
        !           253: .              nr ;i \n(.i                             \" save prevailing indent
        !           254: .              if \n(dl>\n(:Y .nr :Y \n(dl
        !           255: .              if \n(:Y<\n(.l .in (\n(.lu-\n(:Yu)/2u   \"indent by half of white-space
        !           256: .              :1                                      \" text
        !           257: .              if \n(;q .fi                            \" restore fill if necessary
        !           258: .              ls \n(;L                                \" restore line spacing
        !           259: .              in \n(;iu                               \" restore prevailing indent
        !           260: .              rr ;L ;i ;q                             \" free storage
        !           261: .              rm :1
        !           262: ])
        !           263: 
        !           264: |attribute(text; nostack;
        !           265:        $ [$]
        !           266:        roman $ [\f1\&$\fP\&]
        !           267:        italics $ [\f2\&$\fP\&]
        !           268:        bold $ [\f3\&$\fP\&]
        !           269:        bolditalics $ [\f4\&$\fP\&]
        !           270:        cw $ [\f(CW\&$\fP\&])
        !           271: 
        !           272: |attribute(error; nostack;
        !           273:        number $* $$. [
        !           274: .              tm "__FILE__":__LINE__: $* \n$$.
        !           275: ]      number $* $number.register [
        !           276: .              tm "__FILE__":__LINE__: $* \n($number.register
        !           277: ]      string $* $$. [
        !           278: .              tm "__FILE__":__LINE__: $* \n$$.
        !           279: ]      string $* $string.register [
        !           280: .              tm "__FILE__":__LINE__: $* \n($string.register
        !           281: ]      $* [
        !           282: .              tm "__FILE__":__LINE__: $*
        !           283: ])
        !           284: 
        !           285: |attribute(here; stack, default off;
        !           286:        on [
        !           287: '\"    group mechanism
        !           288: '\"    :0 store for initally diverted text
        !           289: '\"    :y flag indicating group/float in progress
        !           290: .              if \n(:y .tm "__FILE__":__LINE__: Here's and/or Around's can not be nested
        !           291: .              nr :y 1                                 \" set flag indicating group
        !           292: .              br                                      \" output partial line before display
        !           293: .              di :0                                   \" collect in :0
        !           294: ]      off [
        !           295: '\"    Control page orientation of blocks.
        !           296: '\"    Blocks are output as soon after their definition as
        !           297: '\"    feasible.  The following rules are used:
        !           298: '\"         1. if the block will fit on the current page, output it there.
        !           299: '\"         2. if the block won't fit on any page, and we have used less than
        !           300: '\"            half of the current page, then output the block on the
        !           301: '\"            current page.
        !           302: '\"         3. skip to the next page.
        !           303: .              br                                      \" get last partial line
        !           304: .              di                                      \" end diversion
        !           305: '\"    The following if condition tests: (1) if the block is too large to
        !           306: '\"    fit on the current page and either (2) it will fit on an unused page
        !           307: '\"    or (3) we have already used more than half of the current page. (the
        !           308: '\"    three conditions are grouped in the form 1 & (2 : 3)). If this
        !           309: '\"    total condition is true, then a page is ejected and the block output
        !           310: '\"    on the next page.
        !           311: '\"    :0 store for initally diverted text
        !           312: '\"    :d prevent )h from outputting a floating group
        !           313: '\"    :m initial footer place and partial footnote diverter trap
        !           314: '\"    :o footer trap location
        !           315: '\"    :r position at end of page header macro
        !           316: '\"    :y flag indicating group/float in progress
        !           317: '\"    ;L remembered line spacing TEMP
        !           318: '\"    ;i remembered indent TEMP
        !           319: '\"    ;q remembered fill/no-fill mode TEMP
        !           320: .              nr :d 1                                 \" prevent )h from outputting a floating group
        !           321: .              if (\n(dn>=\n(.t)&((\n(dn<(\n(.p-\n(:r-\n(:m)):\
        !           322: (\n(nl>(\n(.p-\n(:r-\n(:o/2u+\n(:r)))\
        !           323: .                      ne \n(.tu+1v                    \" spring the trap
        !           324: .              nr ;q \n(.u                             \" save prevailing fill/no-fill mode
        !           325: .              nf                                      \" bring it back in no-fill
        !           326: .              nr ;L \n(.L                             \" save line spacing
        !           327: .              ls 1                                    \" output display in ls 1
        !           328: .              nr ;i \n(.i                             \" save prevailing indent
        !           329: .              in 0                                    \" indent back
        !           330: .              rs                                      \" restore spacing
        !           331: .              :0                                      \" text
        !           332: .              nr :d 0                                 \" allow )h to output a floating group
        !           333: .              if \n(;q .fi                            \" restore fill if necessary
        !           334: .              ls \n(;L                                \" restore line spacing
        !           335: .              in \n(;iu                               \" restore prevailing indent
        !           336: .              nr :y 0                                 \" reset flag indicating group
        !           337: .              rr ;L ;i ;q                             \" free storage
        !           338: .              rm :0
        !           339: ])
        !           340: 
        !           341: |attribute(around; stack, default off;
        !           342:        on [
        !           343: '\"    float mechanism
        !           344: '\"    :0 store for initally diverted text
        !           345: '\"    :y flag indicating group/float in progress
        !           346: '\"    Wn page width for column n
        !           347: '\"    ;L prevailing line spacing
        !           348: '\"    ;f prevailing font
        !           349: '\"    ;i prevailing indent
        !           350: '\"    ;j prevailing adjust
        !           351: '\"    ;l prevailing line length
        !           352: '\"    ;s prevailing point size
        !           353: '\"    ;u prevailing fill/no-fill mode
        !           354: '\"    ;v prevailing vertical spacing
        !           355: .              if \n(:y .tm "__FILE__":__LINE__: Here's and/or Around's can not be nested
        !           356: .              nr :y 1                                 \" set flag indicating group
        !           357: .              nr ;s \n(.s                             \" save prevailing point size
        !           358: .              nr ;f \n(.f                             \" save prevailing font
        !           359: .              nr ;u \n(.u                             \" save prevailing fill/no-fill mode
        !           360: .              nr ;j \n(.j                             \" save prevailing adjust
        !           361: .              nr ;v \n(.v                             \" save prevailing vertical spacing
        !           362: .              nr ;L \n(.L                             \" save prevailing line spacing
        !           363: .              nr ;l \n(.l                             \" save prevailing line length
        !           364: .              nr ;i \n(.i                             \" save prevailing indent
        !           365: .              ev 1                                    \" use footnote environment
        !           366: .              ps \n(;s                                \" restore point size
        !           367: .              vs \n(;sp+2p                            \" restore vertical spacing
        !           368: .              ft \n(;f                                \" restore font
        !           369: .              nf                                      \" bring it back in no-fill
        !           370: .              if \n(;u .fi                            \" restore fill if necessary
        !           371: .              ad \n(;j                                \" restore page adjust
        !           372: .              vs \n(;vu                               \" restore vertical spacing
        !           373: .              ls \n(;L                                \" restore line spacing
        !           374: .              ll \n(;lu                               \" restore line length
        !           375: .              in \n(;iu                               \" restore indent
        !           376: .              ti \n(;iu                               \" restore indentation
        !           377: .              hy 14                                   \" turn on hyphenation
        !           378: .              lt \n(;lu                               \" restore title length
        !           379: |ifvalue around_width full [
        !           380: .              if \n(column_counter \{\
        !           381: .                      ll \n(W0u                       \" go wide
        !           382: .                      lt \n(W0u \}
        !           383: ]
        !           384: .              di :0                                   \" collect in :0
        !           385: ]      off [
        !           386: '\"    Control page orientation of floats.
        !           387: '\"    Floats are output as soon after their definition as
        !           388: '\"    feasible.  The following rules are used:
        !           389: '\"         1. if the queue contains only this float and it will fit on the
        !           390: '\"            current page, output it there.
        !           391: '\"         2. if the queue contains only this float and it won't fit on any
        !           392: '\"            page, and we have used less than half of the current page,
        !           393: '\"            then output the float on the current page.
        !           394: '\"         3. let the top of page macro handle it.
        !           395: '\"    !{a-z} width of stored floating 0=narrow, 1=wide
        !           396: '\"    :0 store for initally diverted text
        !           397: '\"    :m initial footer place and partial footnote diverter trap
        !           398: '\"    :o footer trap location
        !           399: '\"    :r position at end of page header macro
        !           400: '\"    :w output counter for floating keeps
        !           401: '\"    :y flag indicating group/float in progress
        !           402: '\"    :z input counter for floating keeps
        !           403: '\"    ?{a-z} text of stored floating
        !           404: '\"    W current page width
        !           405: '\"    |{a-z} size of stored floating
        !           406: '\"    ;L prevailing line spacing
        !           407: '\"    ;f prevailing font
        !           408: '\"    ;i prevailing indent
        !           409: '\"    ;j prevailing adjust
        !           410: '\"    ;l prevailing line length
        !           411: '\"    ;s prevailing point size
        !           412: '\"    ;u prevailing fill/no-fill mode
        !           413: '\"    ;v prevailing vertical spacing
        !           414: '\"    ;w convert to alpha format
        !           415: .              br                                      \" get last partial line
        !           416: .              di                                      \" end diversion of around block
        !           417: |ifvalue around_width full [
        !           418: .              if \n(column_counter \{\
        !           419: .                      ll \nWu                         \" go narrow
        !           420: .                      lt \nWu \}
        !           421: ]
        !           422: .              ev                                      \" back to previous environment
        !           423: .              nr :z \n(:z%26+1                        \" get index of next output element
        !           424: .              if \n(:z-\n(:w=0 .tm "__FILE__":__LINE__: too many floating displays
        !           425: .              af ;w a                                 \" conversion register for display queue names
        !           426: .              nr ;w \n(:z                             \" form the next queue element name
        !           427: .              rn :0 ?\n(;w                            \" put the display into the queue
        !           428: .              nr !\n(;w 0                             \" narrow
        !           429: |ifvalue around_width full [
        !           430: .              nr !\n(;w 1                             \" wide around
        !           431: ]
        !           432: |ifnotvalue around_width full [
        !           433: .              if !\n(column_counter .nr !\n(;w 1      \" wide around if only one column
        !           434: ]
        !           435: .              nr |\n(;w \n(dn                         \" put the size of text
        !           436: '\"    The following if condition tests: (1) if there is only one float
        !           437: '\"    on the queue to output and (2) if wide displays and (3) we are on the
        !           438: '\"    first column and (4) if the float fits on the current page or
        !           439: '\"    (5) the float is too large to fit on any one page, and (6) we have used
        !           440: '\"    less than half of the current page. (the six conditions are grouped
        !           441: '\"    in the form (1 & (2 & 3) & (4 : (5 & 6))). If this total condition is true,
        !           442: '\"    then a float is output.
        !           443: .              if (((\n(:z-\n(:w=1):(\n(:z+26-\n(:w=1))&((\n(!\n(;w=1)&(\n(column_counter<2))&\
        !           444: ((\n(dn<\n(.t):((\n(dn>(\n(.p-\n(:r-\n(:m))&\
        !           445: (\n(nl<=(\n(.p-\n(:r-\n(:o/2u+\n(:r))))) .)z
        !           446: .              nr :y 0                                 \" reset flag indicating group
        !           447: .              rr ;L ;f ;i ;j ;l ;s ;u ;v ;w           \" free storage
        !           448: ])
        !           449: 
        !           450: |attribute(around_placement; nostack;
        !           451:        [
        !           452: .              )w
        !           453: ])
        !           454: 
        !           455: |attribute(footnote; stack, default off;
        !           456:        on [
        !           457: '\"    :F Footnote text
        !           458: '\"    :q amount of footnote text
        !           459: '\"    :x flag indicating footnote in progress
        !           460: '\"    Wn page width for column n
        !           461: '\"    ;L prevailing line spacing
        !           462: '\"    ;f prevailing font
        !           463: '\"    ;j prevailing adjust
        !           464: '\"    ;l prevailing line length
        !           465: '\"    ;o prevailing page offset ??????? bug with .po
        !           466: '\"    ;s prevailing point size
        !           467: '\"    ;u prevailing fill/no-fill mode
        !           468: '\"    ;v prevailing vertical spacing
        !           469: .              if \n(:x .tm "__FILE__":__LINE__: Footnotes can not be nested
        !           470: .              nr :x 1                                 \" set flag indicating footnote
        !           471: .              nr ;s \n(.s                             \" save prevailing point size
        !           472: .              nr ;f \n(.f                             \" save prevailing font
        !           473: .              nr ;u \n(.u                             \" save prevailing fill/no-fill mode
        !           474: .              nr ;j \n(.j                             \" save prevailing adjust
        !           475: .              nr ;v \n(.v                             \" save prevailing vertical spacing
        !           476: .              nr ;L \n(.L                             \" save prevailing line spacing
        !           477: .              nr ;l \n(.l                             \" save prevailing line length
        !           478: .              ev 1                                    \" use footnote environment
        !           479: .              ps \n(;s                                \" restore point size
        !           480: .              vs \n(;sp+2p                            \" restore vertical spacing
        !           481: .              ft \n(;f                                \" restore font
        !           482: .              nf                                      \" bring it back in no-fill
        !           483: .              if \n(;u .fi                            \" restore fill if necessary
        !           484: .              ad \n(;j                                \" restore page adjust
        !           485: .              vs \n(;vu                               \" restore vertical spacing
        !           486: .              ls \n(;L                                \" restore line spacing
        !           487: .              ll \n(;lu                               \" restore line length
        !           488: .              in 0                                    \" reset indent
        !           489: .              ti 0                                    \" reset indentation
        !           490: .              hy 14                                   \" turn on hyphenation
        !           491: .              lt \n(;lu                               \" restore title length
        !           492: |ifvalue footnote_width full [
        !           493: .              if \n(column_counter \{\
        !           494: .                      ll \n(W0u                       \" go wide
        !           495: .                      lt \n(W0u \}
        !           496: ]
        !           497: .              da :F                                   \" collect in :F
        !           498: .              ie !\n(:q \{\
        !           499: .                      nr ;o \n(.o                     \" save prevailing page offset
        !           500: .                      po 0                            \" always from left margin
        !           501: .                      ps 10                           \" 10 point roman font
        !           502: .                      vs 12p
        !           503: .                      ft 1
        !           504: .                      ie \n(.A=0 \l'72p'              \" layout partial rule if new footnote
        !           505: .                      el  __________
        !           506: .                      ft                              \" restore values
        !           507: .                      vs
        !           508: .                      ps
        !           509: .                      po \n(;ou \}
        !           510: .              el .sp 1                                \" leave a blank between them
        !           511: ]      off [
        !           512: '\"    :V vertical spacing
        !           513: '\"    :m initial footer place and partial footnote diverter trap
        !           514: '\"    :o footer trap location
        !           515: '\"    :q amount of footnote text
        !           516: '\"    :v width of stored footnote 0=narrow, 1=wide
        !           517: '\"    :x flag indicating footnote in progress
        !           518: '\"    W current page width
        !           519: '\"    ;L prevailing line spacing
        !           520: '\"    ;f prevailing font
        !           521: '\"    ;j prevailing adjust
        !           522: '\"    ;l prevailing line length
        !           523: '\"    ;o prevailing page offset ??????? bug with .po
        !           524: '\"    ;s prevailing point size
        !           525: '\"    ;u prevailing fill/no-fill mode
        !           526: '\"    ;v prevailing vertical spacing
        !           527: .              br                                      \" get last partial line
        !           528: .              da                                      \" end diversion
        !           529: |ifvalue footnote_width full [
        !           530: .              if \n(column_counter \{\
        !           531: .                      ll \nWu                         \" go narrow
        !           532: .                      lt \nWu \}
        !           533: .              nr :v 1                                 \" wide footnote
        !           534: ]
        !           535: |ifnotvalue footnote_width full [
        !           536: .              if !\n(column_counter .nr :v 1          \" wide footnote if only one column
        !           537: ]
        !           538: .              ev                                      \" go back to previous environment
        !           539: .              nr :x 0                                 \" clear flag indicating footnote
        !           540: .              if !\n(:o-\n(:m \{\
        !           541: .                      nr :o +\n(:Vu-1u                \" traps spring once we go past
        !           542: .                      nr dn +\n(:V-\n(.v \}           \" uncertainty correction
        !           543: .              nr :q +\n(dnu                           \" add in amount of new footnotes
        !           544: '\"    Move up footer trap, but not above current position on page
        !           545: .              nr :o +\n(dnu
        !           546: .              if !\n(.pu-\n(nlu-.5p-\n(:ou .nr :o \n(.pu-\n(nlu-.5p
        !           547: '\"    or below :m!
        !           548: .              if !\n(:ou-\n(:mu .nr :o \n(:mu
        !           549: '\"    or at all if in multi-column mode and the footnote is wide
        !           550: .              if \n(column_counter>1&\n(:v .nr :o \n(:mu
        !           551: .              ch )f -\n(:ou                           \" move footer trap
        !           552: .              rr ;L ;f ;j ;l ;o ;s ;u ;v              \" free storage
        !           553: ])
        !           554: 
        !           555: |attribute(size; stack, default 10;
        !           556:        $ [|ifvalue inline on [\s$\&]|ifvalue inline off [
        !           557: .              ps $
        !           558: ]])
        !           559: 
        !           560: |attribute(space; stack, init 12;
        !           561:        $ [
        !           562: .              vs $
        !           563: ])
        !           564: 
        !           565: |attribute(SPACE; nostack;
        !           566:        [
        !           567: .              vs \n(.sp+2p                            \" restore vertical spacing
        !           568: ])
        !           569: 
        !           570: |attribute(font; stack, default roman;
        !           571:        roman [|ifvalue inline on [\&\f1\&]|ifvalue inline off [
        !           572: .              ft 1
        !           573: ]]     italics [|ifvalue inline on [\&\f2\&]|ifvalue inline off [
        !           574: .              ft 2
        !           575: ]]     bold [|ifvalue inline on [\&\f3\&]|ifvalue inline off [
        !           576: .              ft 3
        !           577: ]]     bolditalics [|ifvalue inline on [\&\f4\&]|ifvalue inline off [
        !           578: .              ft 4
        !           579: ]]     cw [|ifvalue inline on [\&\f(CW\&]|ifvalue inline off [
        !           580: .              ft CW
        !           581: ]])
        !           582: 
        !           583: |attribute(font.family; stack, default times;
        !           584:        times [
        !           585: .              fp 1 R
        !           586: .              fp 2 I
        !           587: .              fp 3 B
        !           588: .              fp 4 BI
        !           589: ]      palatino [
        !           590: .              fp 1 PA
        !           591: .              fp 2 PI
        !           592: .              fp 3 PB
        !           593: .              fp 4 PX
        !           594: ]      bembo [
        !           595: .              fp 1 B1
        !           596: .              fp 2 B2
        !           597: .              fp 3 B3
        !           598: .              fp 4 B4
        !           599: ]      optima [
        !           600: .              fp 1 O1
        !           601: .              fp 2 O2
        !           602: .              fp 3 O3
        !           603: .              fp 4 O4
        !           604: ]      souvenir [
        !           605: .              fp 1 SV
        !           606: .              fp 2 SI
        !           607: .              fp 3 SB
        !           608: .              fp 4 SX
        !           609: ]      helvetica [
        !           610: .              fp 1 H
        !           611: .              fp 2 HI
        !           612: .              fp 3 HB
        !           613: .              fp 4 HX
        !           614: ]      cw [
        !           615: .              fp 1 CW
        !           616: .              fp 2 I
        !           617: .              fp 3 B
        !           618: .              fp 4 BI
        !           619: ]      gothic [
        !           620: .              fp 1 C
        !           621: .              fp 2 CX
        !           622: .              fp 3 TB
        !           623: .              fp 4 TX
        !           624: ]      condensed [
        !           625: .              fp 1 Hcond
        !           626: .              fp 2 HcondI
        !           627: .              fp 3 HcondB
        !           628: .              fp 4 HlightI
        !           629: ]      narrow [
        !           630: .              fp 1 Hr
        !           631: .              fp 2 Hi
        !           632: .              fp 3 Hb
        !           633: .              fp 4 Hx
        !           634: ])
        !           635: 
        !           636: |attribute(if; nostack;
        !           637:        $test [
        !           638: .              if $test \
        !           639: ]      begin $test [
        !           640: .              if $test \{\
        !           641: ]      end [\}\c
        !           642: ]      else $test [
        !           643: .              ie $test \
        !           644: ]      else begin $test [
        !           645: .              ie $test \{\
        !           646: ]      else [
        !           647: .              el \
        !           648: ]      else begin [
        !           649: .              el \{\
        !           650: ])
        !           651: 
        !           652: |attribute(tab; nostack;
        !           653:        [\&     ])
        !           654: 
        !           655: |attribute(leader; nostack;
        !           656:        [\&&])
        !           657: 
        !           658: |attribute(thick.line; nostack;
        !           659:        $ [
        !           660: .              ps 24
        !           661: \l'$'
        !           662: .              ps
        !           663: ]      [
        !           664: .              ps 24
        !           665: \l'\n(.lu'
        !           666: .              ps
        !           667: ])
        !           668: 
        !           669: |attribute(line; nostack;
        !           670:        $ [\l'$']
        !           671:        [\l'\n(.lu'])
        !           672: 
        !           673: |attribute(box; nostack;
        !           674:        x [\s12\o'\(mu\(sq'\s0]
        !           675:        empty [\s12\(sq\s0]
        !           676:        [\(sq])
        !           677: 
        !           678: |attribute(underline; stack, default off;
        !           679:        on [\kx]
        !           680:        off [\l'|\nxu\(ul'])
        !           681: 
        !           682: |attribute(hyphenate; stack, init on;
        !           683:        on [
        !           684: .              hy 14
        !           685: ]      off [
        !           686: .              nh
        !           687: ])
        !           688: 
        !           689: |attribute(case; stack, init any;
        !           690:        upper [
        !           691: '\" need to write this yet
        !           692: ]      lower [
        !           693: '\" need to write this yet
        !           694: ]      capitalize [
        !           695: '\" need to write this yet
        !           696: ]      any [
        !           697: '\" need to write this yet
        !           698: ])
        !           699: 
        !           700: |attribute(tab.stops; nostack;
        !           701:        $* [
        !           702: .              ta $*
        !           703: ]      [
        !           704: .              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
        !           705: ])
        !           706: 
        !           707: |attribute(set; nostack;
        !           708:        $* $number [
        !           709: |for i in $* {
        !           710: .              nr $i $number
        !           711: }]     string $* $string [
        !           712: |for i in $* {
        !           713: .              ds $i $string
        !           714: }])
        !           715: 
        !           716: |attribute(store; nostack;
        !           717:        $* $$. [
        !           718: |for i in $* {
        !           719: .              nr $i \n$$.
        !           720: }]     $* $number.register [
        !           721: |for i in $* {
        !           722: .              nr $i \n($number.register
        !           723: }]     string $* $$. [
        !           724: |for i in $* {
        !           725: .              ds $i \*$$.
        !           726: }]     string $* $string.register [
        !           727: |for i in $* {
        !           728: .              ds $i \*($string.register
        !           729: }]     number.from.string $* $$. [
        !           730: |for i in $* {
        !           731: .              nr $i \*$$.
        !           732: }]     number.from.string $* $string.register [
        !           733: |for i in $* {
        !           734: .              nr $i \*($string.register
        !           735: }]     string.from.number $* $$. [
        !           736: |for i in $* {
        !           737: .              ds $i \n$$.
        !           738: }]     string.from.number $* $number.register [
        !           739: |for i in $* {
        !           740: .              ds $i \n($number.register
        !           741: }]     width $* $$. [
        !           742: |for i in $* {
        !           743: .              nr $i \w'\*$$.'
        !           744: }]     width $* $number.register [
        !           745: |for i in $* {
        !           746: .              nr $i \w'\*($number.register'
        !           747: }]     indent $* [
        !           748: |for i in $* {
        !           749: .              nr $i \n(.i
        !           750: }]     linelength $* [
        !           751: |for i in $* {
        !           752: .              nr $i \n(.l
        !           753: }]     pagewidth $* [
        !           754: |for i in $* {
        !           755: .              nr $i \nWu
        !           756: }]     totrap $* [
        !           757: |for i in $* {
        !           758: .              nr $i \n(.t
        !           759: }]     pageoffset $* [
        !           760: |for i in $* {
        !           761: .              nr $i \n(.o
        !           762: }]     diversionheight $* [
        !           763: |for i in $* {
        !           764: .              nr $i \n(dn
        !           765: }])
        !           766: 
        !           767: |attribute(clear; nostack;
        !           768:        $* [
        !           769: |for i in $* {
        !           770: .              nr $i 0
        !           771: }]     string $* [
        !           772: .              rm $*
        !           773: ])
        !           774: 
        !           775: |attribute(rename; nostack;
        !           776:        $from $to [
        !           777: .              rn $from $to
        !           778: ])
        !           779: 
        !           780: |attribute(add; nostack;
        !           781:        $result $$. $* [
        !           782: .              nr $result \n$$.
        !           783: |for i in $* {
        !           784: .              nr $result +\n($i
        !           785: }]     $result $operand $* [
        !           786: .              nr $result \n($operand
        !           787: |for i in $* {
        !           788: .              nr $result +\n($i
        !           789: }]     $result $$. [
        !           790: .              nr $result +\n$$.
        !           791: ]      $result $operand [
        !           792: .              nr $result +\n($operand
        !           793: ]      constant $result $constant $* [
        !           794: .              nr $result $constant
        !           795: |for i in $* {
        !           796: .              nr $result +$i
        !           797: }]     constant $result $constant [
        !           798: .              nr $result +$constant
        !           799: ]      string $string $text [
        !           800: .              as $string $text
        !           801: ]      string.from.number $string $$. [
        !           802: .              as $string \n$$.
        !           803: ]      string.from.number $string $number.register [
        !           804: .              as $string \n($number.register
        !           805: ]      string.from.string $string $$. [
        !           806: .              as $string \*$$.
        !           807: ]      string.from.string $string $string.register [
        !           808: .              as $string \*($string.register
        !           809: ])
        !           810: 
        !           811: |attribute(sub; nostack;
        !           812:        $result $$. $* [
        !           813: .              nr $result \n$$.
        !           814: |for i in $* {
        !           815: .              nr $result -\n($i
        !           816: }]     $result $operand $* [
        !           817: .              nr $result \n($operand
        !           818: |for i in $* {
        !           819: .              nr $result -\n($i
        !           820: }]     $result $$. [
        !           821: .              nr $result -\n$$.
        !           822: ]      $result $operand [
        !           823: .              nr $result -\n($operand
        !           824: ]      constant $result $constant $* [
        !           825: .              nr $result $constant
        !           826: |for i in $* {
        !           827: .              nr $result -$i
        !           828: }]     constant $result $constant [
        !           829: .              nr $result -$constant
        !           830: ])
        !           831: 
        !           832: |attribute(incr; nostack;
        !           833:        $* [
        !           834: |for i in $* {
        !           835: .              nr $i +1
        !           836: }])
        !           837: 
        !           838: |attribute(decr; nostack;
        !           839:        $* [
        !           840: |for i in $* {
        !           841: .              nr $i -1
        !           842: }])
        !           843: 
        !           844: |attribute(protect; nostack;
        !           845:        $ [
        !           846: .              ne $
        !           847: ]      [
        !           848: .              ne 3
        !           849: ])
        !           850: 
        !           851: |attribute(warn.orphan; nostack;
        !           852:        $ [
        !           853: '\" need to write this yet
        !           854: ]      [
        !           855: '\" need to write this yet
        !           856: ])
        !           857: 
        !           858: |attribute(column; nostack;
        !           859:        $column $width $offset [
        !           860: '\"    :c number of columns
        !           861: '\"    On page offset for column n
        !           862: '\"    Wn page width for column n
        !           863: .              if \n(:c<$column .nr :c $column
        !           864: .              nr W$column $width
        !           865: .              nr O$column $offset
        !           866: ]      width $width [
        !           867: '\"    :c number of columns
        !           868: '\"    Wn page width for column n
        !           869: .              nr W\n(:c $width
        !           870: ]      offset $offset [
        !           871: '\"    :c number of columns
        !           872: '\"    On page offset for column n
        !           873: .              nr O\n(:c $offset
        !           874: ]      next [
        !           875: '\"    :c number of columns
        !           876: .              nr :c +1
        !           877: ]      clear   [
        !           878: '\"    :c number of columns
        !           879: .              rr :c
        !           880: ]      new [
        !           881: .              ie !\n(column_counter .tm "__FILE__":__LINE__: not in multi-column mode
        !           882: .              el \{\
        !           883: .                      br                              \" force out last partial line
        !           884: .                      ne \n(.tu+1v \}                 \" spring footer trap for this column
        !           885: ]      new $ [
        !           886: '\"    O current page offset
        !           887: '\"    On page offset for column n
        !           888: '\"    W current page width
        !           889: '\"    Wn page width for column n
        !           890: '\"    ;d delta width TEMP
        !           891: .              ie !\n(column_counter .tm "__FILE__":__LINE__: not in multi-column mode
        !           892: .              el \{\
        !           893: .                      br                              \" force out last partial line
        !           894: .                      ne \n(.tu+1v                    \" spring footer trap for this column
        !           895: .                      nr ;d \n(.lu-\n(W\n(column_counter+Q+-Q-u \" quotations shrink line length
        !           896: .                      nr column_counter $             \" set column to $
        !           897: .                      nr O \n(O$u                     \" restore new offset
        !           898: .                      po \nOu                         \" set new offset
        !           899: .                      nr W \n(W$u+\n(;du              \" restore new width
        !           900: .                      ll \nWu                         \" set new line length
        !           901: .                      lt \nWu                         \" set new title length
        !           902: .                      rr ;d \}                        \" free storage
        !           903: ]      old $ [
        !           904: '\"    O current page offset
        !           905: '\"    On page offset for column n
        !           906: '\"    Un position to return to for column n
        !           907: '\"    W current page width
        !           908: '\"    Wn page width for column n
        !           909: '\"    ;d delta width TEMP
        !           910: .              ie !\n(column_counter .tm "__FILE__":__LINE__: not in multi-column mode
        !           911: .              el \{\
        !           912: .                      br                              \" force out last partial line
        !           913: .                      if \n(nl>\n(U\n(column_counter \
        !           914: .                              mk U\n(column_counter   \" new vertical position
        !           915: .                      nr ;d \n(.lu-\n(W\n(column_counter+Q+-Q-u \" quotations shrink line length
        !           916: .                      nr column_counter $             \" set column to $
        !           917: .                      nr O \n(O$u                     \" restore new offset
        !           918: .                      po \nOu                         \" set new offset
        !           919: .                      nr W \n(W$u+\n(;du              \" restore new width
        !           920: .                      ll \nWu                         \" set new line length
        !           921: .                      lt \nWu                         \" set new title length
        !           922: .                      rs                              \" restore spacing
        !           923: .                      ie \n(U$ .sp |\n(U$u            \" restore vertical position
        !           924: .                      el .sp |\n(U0u                  \" default top if not set
        !           925: .                      ns                              \" turn off spacing
        !           926: .                      rr ;d \}                        \" free storage
        !           927: ]      on [
        !           928: '\"    O current page offset
        !           929: '\"    On page offset for column n
        !           930: '\"    Un position to return to for column n
        !           931: '\"    W current page width
        !           932: '\"    Wn page width for column n
        !           933: .              ie \n(column_counter .tm "__FILE__":__LINE__: already in multi-column mode
        !           934: .              el \{\
        !           935: .                      br                              \" force out last partial line
        !           936: .                      nr column_counter 1             \" flag for multi-column mode, first column
        !           937: .                      nr W \n(W1u                     \" restore first column width
        !           938: .                      ll \nWu                         \" set first column line length
        !           939: .                      lt \nWu                         \" set first column title length
        !           940: .                      nr O \n(O1u                     \" restore first column offset
        !           941: .                      po \nOu                         \" set first column offset
        !           942: .                      mk U0                           \" set where all columns start
        !           943: .                      ns                              \" avoid .sp in user text here
        !           944: .                      rr U1 U2 U3 U4 U5 U6 U7 U8 U9   \" zero column starts
        !           945: .                      rr ;d \}                        \" free storage
        !           946: ]      off [
        !           947: '\"    :c number of columns
        !           948: '\"    Un position to return to for column n
        !           949: '\"    W current page width
        !           950: '\"    Wn page width for column n
        !           951: '\"    ;d delta width TEMP
        !           952: .              ie !\n(column_counter .tm "__FILE__":__LINE__: already in full page mode
        !           953: .              el \{\
        !           954: .                      br                              \" force out last partial line
        !           955: .                      if \n(nl>\n(U\n(column_counter \
        !           956: .                              mk U\n(column_counter   \" new vertical position
        !           957: .                      nr ;d \n(.lu-\n(W\n(column_counter+Q+-Q-u \" quotations shrink line length
        !           958: .                      nr column_counter 0             \" set flag for full page mode
        !           959: .                      nr O \n(O0u                     \" restore new offset
        !           960: .                      po \nOu                         \" set new offset
        !           961: .                      nr W \n(W0u+\n(;du              \" restore line length
        !           962: .                      ll \nWu                         \" set new line length
        !           963: .                      lt \nWu                         \" set new title length
        !           964: .                      rs                              \" restore spacing
        !           965: .                      sp |\n(U0u                      \" restore vertical position
        !           966: .                      if \n(nl<\n(U1 \
        !           967: .                              sp |\n(U1u
        !           968: .                      if \n(nl<\n(U2 \
        !           969: .                              sp |\n(U2u
        !           970: .                      if \n(nl<\n(U3 \
        !           971: .                              sp |\n(U3u
        !           972: .                      if \n(nl<\n(U4 \
        !           973: .                              sp |\n(U4u
        !           974: .                      if \n(nl<\n(U5 \
        !           975: .                              sp |\n(U5u
        !           976: .                      if \n(nl<\n(U6 \
        !           977: .                              sp |\n(U6u
        !           978: .                      if \n(nl<\n(U7 \
        !           979: .                              sp |\n(U7u
        !           980: .                      if \n(nl<\n(U8 \
        !           981: .                              sp |\n(U8u
        !           982: .                      if \n(nl<\n(U9 \
        !           983: .                              sp |\n(U9u
        !           984: .                      ti \n(.iu                       \" movement resets indentation
        !           985: .                      rr U1 U2 U3 U4 U5 U6 U7 U8 U9   \" zero column starts
        !           986: .                      ns                              \" turn off spacing
        !           987: .                      rr ;d \}                        \" free storage
        !           988: ]      2 [
        !           989: '\"    :c number of columns
        !           990: '\"    O current page offset
        !           991: '\"    On page offset for column n
        !           992: '\"    Un position to return to for column n
        !           993: '\"    W current page width
        !           994: '\"    Wn page width for column n
        !           995: .              ie \n(column_counter .tm "__FILE__":__LINE__: already in multi-column mode
        !           996: .              el \{\
        !           997: .                      br                              \" force out last partial line
        !           998: .                      nr column_counter 1             \" flag for multi-column mode, first column
        !           999: .                      nr W0 \nW                       \" save width
        !          1000: .                      nr W \n(.lu*8u/17u              \" new width
        !          1001: .                      nr W1 \nW                       \" new width
        !          1002: .                      nr W2 \nW                       \" new width
        !          1003: .                      nr O0 \n(.ou                    \" page offset for other column
        !          1004: .                      nr O1 \n(.ou                    \" page offset for other column
        !          1005: .                      nr O2 \n(.lu*9u/17u+\n(.ou      \" page offset for other column
        !          1006: .                      ll \nWu                         \" set new line length
        !          1007: .                      lt \nWu                         \" set new title length
        !          1008: .                      nr :c 2                         \" two columns
        !          1009: .                      mk U0                           \" set where all columns start
        !          1010: .                      ns                              \" turn off spacing
        !          1011: .                      rr U1 U2 \}                     \" zero column starts
        !          1012: ])
        !          1013: 
        !          1014: |attribute(divert.string; stack, default off;
        !          1015:        $string.name [
        !          1016: .              ds $string.name ]
        !          1017:        off [
        !          1018: ])
        !          1019: 
        !          1020: |attribute(divert.number; stack, default off;
        !          1021:        $number.name [
        !          1022: .              nr $number.name ]
        !          1023:        off [
        !          1024: ])
        !          1025: 
        !          1026: |attribute(divert.output; stack, default off;
        !          1027:        on $string.name [
        !          1028: '\"    ;L prevailing line spacing
        !          1029: '\"    ;f prevailing font
        !          1030: '\"    ;j prevailing adjust
        !          1031: '\"    ;l prevailing line length
        !          1032: '\"    ;o prevailing page offset ??????? bug with .po
        !          1033: '\"    ;s prevailing point size
        !          1034: '\"    ;u prevailing fill/no-fill mode
        !          1035: '\"    ;v prevailing vertical spacing
        !          1036: .              nr ;s \n(.s                             \" save prevailing point size
        !          1037: .              nr ;f \n(.f                             \" save prevailing font
        !          1038: .              nr ;u \n(.u                             \" save prevailing fill/no-fill mode
        !          1039: .              nr ;j \n(.j                             \" save prevailing adjust
        !          1040: .              nr ;v \n(.v                             \" save prevailing vertical spacing
        !          1041: .              nr ;L \n(.L                             \" save prevailing line spacing
        !          1042: .              nr ;l \n(.l                             \" save prevailing line length
        !          1043: .              ev 1                                    \" use footnote environment
        !          1044: .              ps \n(;s                                \" restore point size
        !          1045: .              vs \n(;sp+2p                            \" restore vertical spacing
        !          1046: .              ft \n(;f                                \" restore font
        !          1047: .              nf                                      \" bring it back in no-fill
        !          1048: .              if \n(;u .fi                            \" restore fill if necessary
        !          1049: .              ad \n(;j                                \" restore page adjust
        !          1050: .              vs \n(;vu                               \" restore vertical spacing
        !          1051: .              ls \n(;L                                \" restore line spacing
        !          1052: .              ll \n(;lu                               \" restore line length
        !          1053: .              in 0                                    \" reset indent
        !          1054: .              ti 0                                    \" reset indentation
        !          1055: .              hy 14                                   \" turn on hyphenation
        !          1056: .              lt \n(;lu                               \" restore title length
        !          1057: .              di $string.name                         \" collect in $string.name
        !          1058: ]      off [
        !          1059: '\"    ;L prevailing line spacing
        !          1060: '\"    ;f prevailing font
        !          1061: '\"    ;j prevailing adjust
        !          1062: '\"    ;l prevailing line length
        !          1063: '\"    ;o prevailing page offset ??????? bug with .po
        !          1064: '\"    ;s prevailing point size
        !          1065: '\"    ;u prevailing fill/no-fill mode
        !          1066: '\"    ;v prevailing vertical spacing
        !          1067: .              br                                      \" get last partial line
        !          1068: .              di                                      \" end diversion
        !          1069: .              ev                                      \" go back to previous environment
        !          1070: .              rr ;L ;f ;j ;l ;o ;s ;u ;v              \" free storage
        !          1071: ])
        !          1072: 
        !          1073: |attribute(divert.input; stack, default off;
        !          1074:        on $string.name [
        !          1075: .              eo
        !          1076: .              de $string.name\(ts\(ts
        !          1077: ]      off [
        !          1078: .\(ts\(ts
        !          1079: .              ec
        !          1080: ])
        !          1081: 
        !          1082: |attribute(append.output; stack, default off;
        !          1083:        on $string.name [
        !          1084: '\"    ;L prevailing line spacing
        !          1085: '\"    ;f prevailing font
        !          1086: '\"    ;j prevailing adjust
        !          1087: '\"    ;l prevailing line length
        !          1088: '\"    ;o prevailing page offset ??????? bug with .po
        !          1089: '\"    ;s prevailing point size
        !          1090: '\"    ;u prevailing fill/no-fill mode
        !          1091: '\"    ;v prevailing vertical spacing
        !          1092: .              nr ;s \n(.s                             \" save prevailing point size
        !          1093: .              nr ;f \n(.f                             \" save prevailing font
        !          1094: .              nr ;u \n(.u                             \" save prevailing fill/no-fill mode
        !          1095: .              nr ;j \n(.j                             \" save prevailing adjust
        !          1096: .              nr ;v \n(.v                             \" save prevailing vertical spacing
        !          1097: .              nr ;L \n(.L                             \" save prevailing line spacing
        !          1098: .              nr ;l \n(.l                             \" save prevailing line length
        !          1099: .              ev 1                                    \" use footnote environment
        !          1100: .              ps \n(;s                                \" restore point size
        !          1101: .              vs \n(;sp+2p                            \" restore vertical spacing
        !          1102: .              ft \n(;f                                \" restore font
        !          1103: .              nf                                      \" bring it back in no-fill
        !          1104: .              if \n(;u .fi                            \" restore fill if necessary
        !          1105: .              ad \n(;j                                \" restore page adjust
        !          1106: .              vs \n(;vu                               \" restore vertical spacing
        !          1107: .              ls \n(;L                                \" restore line spacing
        !          1108: .              ll \n(;lu                               \" restore line length
        !          1109: .              in 0                                    \" reset indent
        !          1110: .              ti 0                                    \" reset indentation
        !          1111: .              hy 14                                   \" turn on hyphenation
        !          1112: .              lt \n(;lu                               \" restore title length
        !          1113: .              da $string.name                         \" collect in $string.name
        !          1114: ]      off [
        !          1115: '\"    ;L prevailing line spacing
        !          1116: '\"    ;f prevailing font
        !          1117: '\"    ;j prevailing adjust
        !          1118: '\"    ;l prevailing line length
        !          1119: '\"    ;o prevailing page offset ??????? bug with .po
        !          1120: '\"    ;s prevailing point size
        !          1121: '\"    ;u prevailing fill/no-fill mode
        !          1122: '\"    ;v prevailing vertical spacing
        !          1123: .              br                                      \" get last partial line
        !          1124: .              da                                      \" end diversion
        !          1125: .              ev                                      \" go back to previous environment
        !          1126: .              rr ;L ;f ;j ;l ;o ;s ;u ;v              \" free storage
        !          1127: ])
        !          1128: 
        !          1129: |attribute(append.input; stack, default off;
        !          1130:        on $string.name [
        !          1131: .              eo
        !          1132: .              am $string.name\(ts\(ts
        !          1133: ]      off [
        !          1134: .\(ts\(ts
        !          1135: .              ec
        !          1136: ])
        !          1137: 
        !          1138: |attribute(invoke; nostack;
        !          1139:        on $offset $what  [
        !          1140: .              wh 15i $what                            \" activate the trap
        !          1141: .              ch $what \n(nlu+$offset                 \" move it in place
        !          1142: ]      on number $$. $what  [
        !          1143: .              wh 15i $what                            \" activate the trap
        !          1144: .              ch $what \n(nlu+\n$$.u                  \" move it in place
        !          1145: ]      on number $number.register $what  [
        !          1146: .              wh 15i $what                            \" activate the trap
        !          1147: .              ch $what \(nlu+\n($number.registeru     \" move it in place
        !          1148: ]      at constant $constant $what [
        !          1149: .              wh 15i $what                            \" activate the trap
        !          1150: .              ch $what $constant                      \" move it in place
        !          1151: ]      at number $$. $what [
        !          1152: .              wh 15i $what                            \" activate the trap
        !          1153: .              ch $what \n$$.u                         \" move it in place
        !          1154: ]      at number $number.register $what [
        !          1155: .              wh 15i $what                            \" activate the trap
        !          1156: .              ch $what \n($number.registeru           \" move it in place
        !          1157: ]      end [
        !          1158: .              br                                      \" get last partial line
        !          1159: .              di                                      \" turn off diversions
        !          1160: ]      off $what [
        !          1161: .              ch $what                                \" remove the trap
        !          1162: ])
        !          1163: 
        !          1164: |attribute(remember; nostack;
        !          1165:        $ [
        !          1166: .              mk $
        !          1167: ])
        !          1168: 
        !          1169: |attribute(return; nostack;
        !          1170:        $$. [
        !          1171: .              sp |\n$$.u
        !          1172: .              ti \n(.iu                               \" movement resets indentation
        !          1173: ]      $ [
        !          1174: .              sp |\n($u
        !          1175: .              ti \n(.iu                               \" movement resets indentation
        !          1176: ])
        !          1177: 
        !          1178: |attribute(goto; nostack;
        !          1179:        $ [
        !          1180: .              sp |$
        !          1181: .              ti \n(.iu                               \" movement resets indentation
        !          1182: ])
        !          1183: 
        !          1184: |attribute(string; nostack;
        !          1185:        $$. [\*$$.]
        !          1186:        $string.register [\*($string.register]
        !          1187:        roman $$. [\f1\&\*$$.\fP\&]
        !          1188:        italics $$. [\f2\&\*$$.\fP\&]
        !          1189:        bold $$. [\f3\&\*$$.\fP\&]
        !          1190:        bolditalics $$. [\f4\&\*$$.\fP\&]
        !          1191:        cw $$. [\f(CW\&\*$$.\fP\&]
        !          1192:        roman $string.register [\f1\&\*($string.register\fP\&]
        !          1193:        italics $string.register [\f2\&\*($string.register\fP\&]
        !          1194:        bold $string.register [\f3\&\*($string.register\fP\&]
        !          1195:        bolditalics $string.register [\f4\&\*($string.register\fP\&]
        !          1196:        cw $string.register [\f(CW\&\*($string.register\fP\&])
        !          1197: 
        !          1198: |attribute(macro; nostack;
        !          1199:        $ [
        !          1200: .              $
        !          1201: ])
        !          1202: 
        !          1203: |attribute(number; nostack;
        !          1204:        $$. [\n$$.]
        !          1205:        $number.register [\n($number.register]
        !          1206:        ++ $$. [\n+$$.]
        !          1207:        ++ $number.register [\n+($number.register]
        !          1208:        format $* $format [
        !          1209: |for i in $* {
        !          1210: .              af $i $format
        !          1211: }]
        !          1212:        incr $* $incr [
        !          1213: |for i in $* {
        !          1214: .              nr $i +0 $incr
        !          1215: }]
        !          1216:        format.from.string $* $$. [
        !          1217: |for i in $* {
        !          1218: .              af $i \*$$.
        !          1219: }]
        !          1220:        incr $* $incr [
        !          1221: |for i in $* {
        !          1222: .              nr $i +0 $incr
        !          1223: }]
        !          1224:        format.from.string $* $format [
        !          1225: |for i in $* {
        !          1226: .              af $i \*($format
        !          1227: }]
        !          1228:        incr $* $incr [
        !          1229: |for i in $* {
        !          1230: .              nr $i +0 $incr
        !          1231: }])
        !          1232: 
        !          1233: |attribute(list.pre; stack, default;
        !          1234:        [
        !          1235: .              rm premark_string
        !          1236: ]
        !          1237:        $pre [
        !          1238: .              ds premark_string $pre
        !          1239: ])
        !          1240: 
        !          1241: |attribute(list.format; stack, default;
        !          1242:        [
        !          1243: .              rm format_string
        !          1244: ]
        !          1245:        $format [
        !          1246: .              ds format_string $format
        !          1247: ])
        !          1248: 
        !          1249: |attribute(list.post; stack, default;
        !          1250:        [
        !          1251: .              rm postmark_string
        !          1252: ]
        !          1253:        $post [
        !          1254: .              ds postmark_string $post
        !          1255: ])
        !          1256: 
        !          1257: |attribute(list.indent; stack, default;
        !          1258:        [
        !          1259: .              rm indent_string
        !          1260: ]
        !          1261:        $indent [
        !          1262: .              ds indent_string $indent
        !          1263: ])
        !          1264: 
        !          1265: |attribute(list; nostack;
        !          1266:        off [
        !          1267: '\"    ;i remembered indent TEMP
        !          1268: .              )C ;i indentsave_string \*(indentsave_string
        !          1269: .              in \n(;iu
        !          1270: .              )C list_counter listsave_string \*(listsave_string
        !          1271: .              rm ;i
        !          1272: ]      on [
        !          1273: .              ds indentsave_string \n(.i \*(indentsave_string
        !          1274: .              in +\w'\*(indent_string'u
        !          1275: .              af list_counter 0
        !          1276: .              ds listsave_string \n(list_counter \*(listsave_string
        !          1277: .              nr list_counter 0 1
        !          1278: ])
        !          1279: 
        !          1280: |attribute(file.information; nostack;
        !          1281:        [
        !          1282: .              lf __LINE__ __FILE__
        !          1283: ])
        !          1284: 
        !          1285: |attribute(reference.style; nostack;
        !          1286:        acm [|reference_style(acm)
        !          1287: ]      apa [|reference_style(apa)
        !          1288: ]      att [|reference_style(att)
        !          1289: ]      ieee [|reference_style(ieee)
        !          1290: ]      lsa [|reference_style(lsa)
        !          1291: ]      pami [|reference_style(pami)
        !          1292: ]      spectrum [|reference_style(spectrum)
        !          1293: ])
        !          1294: 
        !          1295: |attribute(reference.option; nostack;
        !          1296:        tm [|reference_style(same tm)
        !          1297: ]      rp [|reference_style(same rp)
        !          1298: ]      nroff [|reference_style(same nroff)
        !          1299: ]      troff [|reference_style(same troff)
        !          1300: ]      sort [|reference_style(same sort)
        !          1301: ]      sequence [|reference_style(same sequence)
        !          1302: ]      a [|reference_style(same a)
        !          1303: ]      d [|reference_style(same d)
        !          1304: ]      t [|reference_style(same t)
        !          1305: ]      ad [|reference_style(same ad)
        !          1306: ]      at [|reference_style(same at)
        !          1307: ]      da [|reference_style(same da)
        !          1308: ]      dt [|reference_style(same dt)
        !          1309: ]      ta [|reference_style(same ta)
        !          1310: ]      td [|reference_style(same td)
        !          1311: ]      adt [|reference_style(same adt)
        !          1312: ]      atd [|reference_style(same atd)
        !          1313: ]      dat [|reference_style(same dat)
        !          1314: ]      dta [|reference_style(same dta)
        !          1315: ]      tad [|reference_style(same tad)
        !          1316: ]      tda [|reference_style(same tda)
        !          1317: ])
        !          1318: 
        !          1319: |attribute(reference; stack, default off;
        !          1320:        database [|reference_database<]
        !          1321:        include [|reference_include<]
        !          1322:        list [|reference_list<]
        !          1323:        on [|reference<]
        !          1324:        off [>])
        !          1325: 
        !          1326: |attribute(reference.placement; nostack;
        !          1327:        [|reference_placement
        !          1328: ])
        !          1329: 
        !          1330: |attribute(table; stack, default off;
        !          1331:        on [
        !          1332: .              TS
        !          1333: ]      off [
        !          1334: .              TE
        !          1335: ])
        !          1336: 
        !          1337: |attribute(ipa; stack, default off;
        !          1338:        on [@ipa(]
        !          1339:        off [)])
        !          1340: 
        !          1341: |attribute(picture; stack, default off;
        !          1342:        on [
        !          1343: .              PS
        !          1344: ]      off [
        !          1345: .              PE
        !          1346: ])
        !          1347: 
        !          1348: |attribute(ped; stack, default off;
        !          1349:        on [
        !          1350: .              GS
        !          1351: ]      off[
        !          1352: .              GE
        !          1353: ])
        !          1354: 
        !          1355: |attribute(ideal; stack, default off;
        !          1356:        on [
        !          1357: .              IS
        !          1358: ]      off[
        !          1359: .              IE
        !          1360: ])
        !          1361: 
        !          1362: |attribute(equation; stack, default off;
        !          1363:        on [
        !          1364: '\"    :4 store for equations
        !          1365: .              br                                      \" output partial line before equation
        !          1366: .              di :4                                   \" begin diversion
        !          1367: .              EQ                                      \" begin equation
        !          1368: ]      off [
        !          1369: '\"    :4 store for equations
        !          1370: '\"    :D amount of accumulate blank lines in diversion
        !          1371: '\"    :E position of last minimum space in diversion
        !          1372: '\"    :Y width of a center block diversion
        !          1373: '\"    10 the equation as a string
        !          1374: .              EN                                      \" end equation
        !          1375: .              br                                      \" get last partial line
        !          1376: .              di                                      \" end diversion of equation
        !          1377: .              rm :4                                   \" throw the equation away
        !          1378: |ifvalue center.block on [
        !          1379: .              if \w@\*(10\*(equation_string@ \{\
        !          1380: .                      if \n(:Y<\w@\*(10@ .nr :Y \w@\*(10@ \" update width
        !          1381: \!\*(10\h'\\n(.lu-\w@\*(10\*(equation_string@u-\\n(.iu'\*(equation_string      \" output next expansion
        !          1382: .                      rr :D :E \}]                    \" pretend we've moved
        !          1383: |ifvalue center on [
        !          1384: .              if \w@\*(10\*(equation_string@ .tl \(ts\(ts\*(10\(ts\*(equation_string\(ts]
        !          1385: |ifnotvalue center.block on [ |ifnotvalue center on [
        !          1386: .              if \w@\*(10\*(equation_string@ \{\
        !          1387: .                      pc                              \" protect against use of % in eqn
        !          1388: .                      tl \(ts\h'\n(.iu'\*(10\(ts\(ts\*(equation_string\(ts
        !          1389: .                      pc % \}]]                       \" give % back to tl
        !          1390: .              rm 10                                   \" free storage
        !          1391: ])
        !          1392: 
        !          1393: |attribute(inline.equation; stack, default off;
        !          1394:        on []
        !          1395:        off [])
        !          1396: 
        !          1397: |attribute(graph; stack, default off;
        !          1398:        on [
        !          1399: .              G1
        !          1400: ]      off [
        !          1401: .              G2
        !          1402: ])
        !          1403: 
        !          1404: |attribute(bargraph; stack, default off;
        !          1405:        on [
        !          1406: .              B1
        !          1407: ]      off [
        !          1408: .              B0
        !          1409: ])
        !          1410: 
        !          1411: |attribute(computeroutput; stack, default off;
        !          1412:        on [
        !          1413: .              CW
        !          1414: ]      off [
        !          1415: .              CN
        !          1416: ])
        !          1417: 
        !          1418: |attribute(citation; nostack;
        !          1419:        save on [
        !          1420: .              CD "]
        !          1421:        save off string $$. [" "\*$$."
        !          1422: ]      save off string $string.register [" "\*($string.register"
        !          1423: ]      save off number $$. [" "\n$$."
        !          1424: ]      save off number $number.register [" "\n($number.register"
        !          1425: ]      save string $name $$. [\&\c
        !          1426: .              CD "$name" "\*$$."
        !          1427: ]      save string $name $string.register [\&\c
        !          1428: .              CD "$name" "\*($string.register"
        !          1429: ]      save number $name $$. [\&\c
        !          1430: .              CD "$name" "\n$$."
        !          1431: ]      save number $name $number.register [\&\c
        !          1432: .              CD "$name" "\n($number.register"
        !          1433: ]      remember on [\&\c
        !          1434: .              CU "]
        !          1435:        remember off ["]
        !          1436:        remember string $name [\&\c
        !          1437: .              CU "$name"])
        !          1438: 
        !          1439: |attribute(index; stack, default off;
        !          1440:        on [\&\c
        !          1441: .              tm ix: ]
        !          1442:        off [   \n page_counter
        !          1443: \&])
        !          1444: 
        !          1445: |attribute(contents; nostack;
        !          1446:        $category $level $sequence $text [
        !          1447: .              tm .TC  $category       $level  \*($sequence    \*($text        \n page_counter
        !          1448: ])
        !          1449: 
        !          1450: |attribute(white.text; nostack;
        !          1451:        $text [|ifvalue verbatim off []|ifvalue verbatim on [$text]])
        !          1452: 
        !          1453: |attribute(nl.paragraph; nostack;
        !          1454:        [|ifvalue verbatim on [
        !          1455: ]|ifvalue verbatim off []])
        !          1456: 
        !          1457: |attribute(format.type; stack, init none;
        !          1458:        model [
        !          1459: .              ds format_type model
        !          1460: ]      acm [
        !          1461: .              ds format_type acm
        !          1462: ]      none [
        !          1463: .              ds format_type none
        !          1464: ])
        !          1465: 
        !          1466: |attribute(list.type; stack, default none;
        !          1467:        fixed []
        !          1468:        calculated []
        !          1469:        none [])
        !          1470: 
        !          1471: |attribute(list.spacing; stack, default off;
        !          1472:        off []
        !          1473:        on [])
        !          1474: 
        !          1475: |attribute(verbatim; stack, default off;
        !          1476:        off []
        !          1477:        on [])
        !          1478: 
        !          1479: |attribute(draft; stack, default off;
        !          1480:        off []
        !          1481:        on [])
        !          1482: 
        !          1483: |attribute(sectioning; stack, default bysection;
        !          1484:        bysection []
        !          1485:        bychapter []
        !          1486:        byappendix [])
        !          1487: 
        !          1488: |attribute(globalparagraph.style; stack, default flushed;
        !          1489:        indented []
        !          1490:        numbered []
        !          1491:        flushed [])
        !          1492: 
        !          1493: |attribute(localparagraph.style; stack, default flushed;
        !          1494:        indented []
        !          1495:        numbered []
        !          1496:        flushed [])
        !          1497: 
        !          1498: |attribute(inline; stack, default on;
        !          1499:        off []
        !          1500:        on [])
        !          1501: 
        !          1502: |attribute(footnote_width; stack, default normal;
        !          1503:        narrow []
        !          1504:        full []
        !          1505:        normal[])
        !          1506: 
        !          1507: |attribute(around_width; stack, default normal;
        !          1508:        narrow []
        !          1509:        full []
        !          1510:        normal[])
        !          1511: 
        !          1512: |attribute(sawreference; stack, default off;
        !          1513:        off []
        !          1514:        on [])
        !          1515: 
        !          1516: |attribute(sawabstract; stack, default off;
        !          1517:        off []
        !          1518:        on [])
        !          1519: 
        !          1520: |attribute(sawkeywords; stack, default off;
        !          1521:        off []
        !          1522:        on [])
        !          1523: 
        !          1524: |attribute(sawoverflow; stack, default off;
        !          1525:        off []
        !          1526:        on [])
        !          1527: 
        !          1528: |attribute(sawtitlebox; stack, default off;
        !          1529:        off []
        !          1530:        on [])
        !          1531: 
        !          1532: |attribute(sawendnote; stack, default off;
        !          1533:        off []
        !          1534:        on [])

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.