1.ig 2Copyright (C) 1990, 1991 Free Software Foundation, Inc. 3 Written by James Clark (jjc@jclark.uucp) 4 5This file is part of groff. 6 7groff is free software; you can redistribute it and/or modify it under 8the terms of the GNU General Public License as published by the Free 9Software Foundation; either version 1, or (at your option) any later 10version. 11 12groff is distributed in the hope that it will be useful, but WITHOUT ANY 13WARRANTY; without even the implied warranty of MERCHANTABILITY or 14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15for more details. 16 17You should have received a copy of the GNU General Public License along 18with groff; see the file LICENSE. If not, write to the Free Software 19Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 20.. 21.if !\n(.g .ab These ms macros require groff. 22.if \n(.C \ 23. ab The groff ms macros do not work in compatibility mode. 24.\" Enable warnings. You can delete this if you want. 25.warn 26.\" See if already loaded. 27.if r GS .nx /dev/null 28.nr GS 1 29.de @error 30.tm \\n(.F:\\n(.c: macro error: \\$* 31.. 32.de @warning 33.tm \\n(.F:\\n(.c: macro warning: \\$* 34.. 35.de @fatal 36.ab \\n(.F:\\n(.c: fatal macro error: \\$* 37.. 38.de @not-implemented 39.@error sorry, \\$0 not implemented 40.als \\$0 @nop 41.. 42.als TM @not-implemented 43.als CT @not-implemented 44.de @nop 45.. 46.de @init 47.\" a non-empty environment 48.ev ne 49\c 50.ev 51.ev nf 52'nf 53.ev 54.. 55.ds REFERENCES References 56.ds ABSTRACT ABSTRACT 57.ds TOC Table of Contents 58.ds MONTH1 January 59.ds MONTH2 February 60.ds MONTH3 March 61.ds MONTH4 April 62.ds MONTH5 May 63.ds MONTH6 June 64.ds MONTH7 July 65.ds MONTH8 August 66.ds MONTH9 September 67.ds MONTH10 October 68.ds MONTH11 November 69.ds MONTH12 December 70.ds MO \\*[MONTH\n[mo]] 71.nr *year \n[yr]+1900 72.ds DY \n[dy] \*[MO] \n[*year] 73.de ND 74.if \\n[.$] .ds DY "\\$* 75.. 76.de DA 77.if \\n[.$] .ds DY "\\$* 78.ds CF \\*[DY] 79.. 80.\" indexing 81.de IX 82.tm \\$1\t\\$2\t\\$3\t\\$4 ... \\n[PN] 83.. 84.\" print an error message and then try to recover 85.de @error-recover 86.@error \\$@ (recovering) 87.nr *pop-count 0 88.while !'\\n(.z'' \{\ 89. \"@warning automatically terminating diversion \\n(.z 90. ie d @div-end!\\n(.z .@div-end!\\n(.z 91. el .*div-end-default 92. nr *pop-count +1 93. \" ensure that we don't loop forever 94. if \\n[*pop-count]>20 .@fatal recovery failed 95.\} 96.while !'\\n[.ev]'0' .ev 97.par@reset-env 98.par@reset 99.. 100.de *div-end-default 101.ds *last-div \\n(.z 102.br 103.di 104.ev nf 105.\\*[*last-div] 106.ev 107.. 108.\" **************************** 109.\" ******** module cov ******** 110.\" **************************** 111.\" Cover sheet and first page. 112.de cov*err-not-after-first-page 113.@error \\$0 is not allowed after the first page has started 114.. 115.de cov*err-not-before-tl 116.@error \\$0 is not allowed before TL 117.. 118.de cov*err-not-again 119.@error \\$0 is not allowed more than once 120.. 121.de cov*err-not-after-ab 122.@error \\$0 is not allowed after first AB, LP, PP, IP, SH or NH 123.. 124.als AU cov*err-not-before-tl 125.als AI cov*err-not-before-tl 126.als AB cov*err-not-before-tl 127.de cov*first-page-init 128.rm cov*first-page-init 129.par@init 130.als RP cov*err-not-after-first-page 131.@init 132.ie \\n[cov*rp-format] \{\ 133. pg@cs-top 134. als FS cov*FS 135. als FE cov*FE 136.\} 137.el \{\ 138. pg@top 139. als FS @FS 140. als FE @FE 141.\} 142.wh 0 pg@top 143.. 144.wh 0 cov*first-page-init 145.\" This handles the case where FS occurs before TL or LP. 146.de FS 147.br 148\\*[FS]\\ 149.. 150.nr cov*rp-format 0 151.nr cov*rp-no 0 152.\" released paper format 153.de RP 154.nr cov*rp-format 1 155.if \\n[.$] .if '\\$1'no' .nr cov*rp-no 1 156.pn 0 157.. 158.de TL 159.br 160.als TL cov*err-not-again 161.rn @AB AB 162.rn @AU AU 163.rn @AI AI 164.di cov*tl-div 165.par@reset 166.ft B 167.ps +2 168.vs +3p 169.ll (u;\\n[LL]*5/6) 170.nr cov*n-au 0 171.. 172.de @AU 173.par@reset 174.if !'\\n(.z'' \{\ 175. br 176. di 177.\} 178.nr cov*n-au +1 179.di cov*au-div!\\n[cov*n-au] 180.nf 181.ft I 182.ps \\n[PS] 183.. 184.de @AI 185.par@reset 186.if !'\\n(.z'' \{\ 187. br 188. di 189.\} 190.ie !\\n[cov*n-au] .@error AI before AU 191.el \{\ 192. di cov*ai-div!\\n[cov*n-au] 193. nf 194. ft R 195. ps \\n[PS] 196.\} 197.. 198.de LP 199.if !'\\n[.z]'' \{\ 200. br 201. di 202.\} 203.br 204.cov*ab-init 205.cov*print 206\\*[\\$0]\\ 207.. 208.als IP LP 209.als PP LP 210.als XP LP 211.als NH LP 212.als SH LP 213.als MC LP 214.als RT LP 215.de cov*ab-init 216.als cov*ab-init @nop 217.als LP @LP 218.als IP @IP 219.als PP @PP 220.als XP @XP 221.als RT @RT 222.als SH @SH 223.als NH @NH 224.als QP @QP 225.als RS @RS 226.als RE @RE 227.als QS @QS 228.als QE @QE 229.als MC @MC 230.als EQ @EQ 231.als EN @EN 232.als AB cov*err-not-after-ab 233.als AU par@AU 234.als AI par@AI 235.als TL par@TL 236.. 237.de @AB 238.if !'\\n(.z'' \{\ 239. br 240. di 241.\} 242.cov*ab-init 243.di cov*ab-div 244.par@ab-indent 245.par@reset 246.if !'\\$1'no' \{\ 247. ft I 248. ce 1 249\\*[ABSTRACT] 250. sp 251. ft R 252.\} 253.ns 254.@PP 255.. 256.de AE 257.ie '\\n(.z'cov*ab-div' \{\ 258. als AE cov*err-not-again 259. br 260. di 261.\" nr cov*ab-height \\n[dn] 262. par@reset-env 263. par@reset 264. cov*print 265.\} 266.el .@error AE without AB 267.. 268.de @div-end!cov*ab-div 269.AE 270.. 271.de cov*print 272.als cov*print @nop 273.ie d cov*tl-div \{\ 274. ie \\n[cov*rp-format] .cov*rp-print 275. el .cov*draft-print 276.\} 277.el \{\ 278. if \\n[cov*rp-format] \{\ 279. @warning RP format but no TL 280. bp 1 281. als FS @FS 282. als FE @FE 283. \} 284. br 285.\} 286.. 287.de cov*rp-print 288.nr cov*page-length \\n[.p] 289.pl 1000i 290.cov*tl-au-print 291.sp 3 292.if d cov*ab-div \{\ 293. nf 294. cov*ab-div 295.\} 296.sp 3 297.par@reset 298\\*[DY] 299.br 300.if \\n[cov*fn-height] \{\ 301. sp |(u;\\n[cov*page-length]-\\n[FM]\ 302-\\n[cov*fn-height]-\\n[fn@sep-dist]>?\\n[nl]) 303. fn@print-sep 304. ev nf 305. cov*fn-div 306. ev 307. ie \\n[cov*rp-no] .rm cov*fn-div 308. el \{\ 309. rn cov*fn-div fn@overflow-div 310. nr fn@have-overflow 1 311. \} 312.\} 313.als FS @FS 314.als FE @FE 315.\" If anything was printed below where the footer line is normally printed, 316.\" then that's an overflow. 317.if -\\n[FM]/2+1v+\\n[cov*page-length]<\\n[nl] .@error cover sheet overflow 318.pl \\n[cov*page-length]u 319.bp 1 320.if !\\n[cov*rp-no] .cov*tl-au-print 321.rs 322.sp 1 323.. 324.de cov*draft-print 325.cov*tl-au-print 326.if d cov*ab-div \{\ 327. nf 328. sp 2 329. cov*ab-div 330.\} 331.sp 1 332.. 333.de cov*tl-au-print 334.par@reset 335.nf 336.rs 337.sp 3 338.ce 9999 339.cov*tl-div 340.nr cov*i 1 341.nr cov*sp 1v 342.while \\n[cov*i]<=\\n[cov*n-au] \{\ 343. sp \\n[cov*sp]u 344. cov*au-div!\\n[cov*i] 345. ie d cov*ai-div!\\n[cov*i] \{\ 346. sp .5v 347. cov*ai-div!\\n[cov*i] 348. nr cov*sp 1v 349. \} 350. el .nr cov*sp .5v 351. nr cov*i +1 352.\} 353.ce 0 354.. 355.nr cov*fn-height 0 356.nr cov*in-fn 0 357.\" start of footnote on cover 358.de cov*FS 359.if \\n[cov*in-fn] \{\ 360. @error nested FS 361. FE 362.\} 363.nr cov*in-fn 1 364.ev fn 365.par@reset-env 366.da cov*fn-div 367.if !\\n[cov*fn-height] .ns 368.ie \\n[.$] .FP "\\$1" no 369.el .@LP 370.. 371.de @div-end!cov*fn-div 372.cov*FE 373.. 374.\" end of footnote on cover 375.de cov*FE 376.ie '\\n(.z'cov*fn-div' \{\ 377. br 378. ev 379. di 380. nr cov*in-fn 0 381. nr cov*fn-height +\\n[dn] 382.\} 383.el .@error FE without matching FS 384.. 385.\" *************************** 386.\" ******** module pg ******** 387.\" *************************** 388.\" Page-level formatting. 389.\" > 0 if we have a footnote on the current page 390.nr pg@fn-flag 0 391.nr pg@colw 0 392.nr pg@fn-colw 0 393.nr HM 1i 394.nr FM 1i 395.nr PO 1i 396.ds LF 397.ds CF 398.ds RF 399.ds LH 400.ds CH -\\n[PN]- 401.ds RH 402.ds pg*OH '\\*[LH]'\\*[CH]'\\*[RH]' 403.ds pg*EH '\\*[LH]'\\*[CH]'\\*[RH]' 404.ds pg*OF '\\*[LF]'\\*[CF]'\\*[RF]' 405.ds pg*EF '\\*[LF]'\\*[CF]'\\*[RF]' 406.de OH 407.ds pg*\\$0 "\\$* 408.. 409.als EH OH 410.als OF OH 411.als EF OH 412.de PT 413.ie \\n%=1 .if \\n[pg*P1] .tl \\*[pg*OH] 414.el \{\ 415. ie o .tl \\*[pg*OH] 416. el .tl \\*[pg*EH] 417.\} 418.. 419.de BT 420.ie o .tl \\*[pg*OF] 421.el .tl \\*[pg*EF] 422.. 423.nr pg*P1 0 424.de P1 425.nr pg*P1 1 426.. 427.wh -\n[FM]u pg@bottom 428.wh -\n[FM]u/2u pg*footer 429.nr MINGW 2n 430.nr pg@ncols 1 431.de @MC 432.if !'\\n(.z'' .error-recover MC while diversion open 433.br 434.ie \\n[pg@ncols]>1 .pg@super-eject 435.el \{\ 436. \" flush out any floating keeps 437. while \\n[kp@tail]>\\n[kp@head] \{\ 438. rs 439. bp 440. \} 441.\} 442.ie !\\n(.$ \{\ 443. nr pg@colw \\n[LL]*7/15 444. nr pg*gutw \\n[LL]-(2*\\n[pg@colw]) 445. nr pg@ncols 2 446.\} 447.el \{\ 448. nr pg@colw (n;\\$1)<?\\n[LL] 449. ie \\n[.$]<2 .nr pg*gutw \\n[MINGW] 450. el .nr pg*gutw (n;\\$2) 451. nr pg@ncols \\n[LL]-\\n[pg@colw]/(\\n[pg@colw]+\\n[pg*gutw])+1 452. ie \\n[pg@ncols]>1 \ 453. nr pg*gutw \\n[LL]-(\\n[pg@ncols]*\\n[pg@colw])/(\\n[pg@ncols]-1) 454. el .nr pg*gutw 0 455.\} 456.mk pg*col-top 457.ns 458.nr pg*col-num 0 459.nr pg@fn-colw \\n[pg@colw]*5/6 460.par@reset 461.. 462.de 2C 463.MC 464.. 465.de 1C 466.MC \\n[LL]u 467.. 468.\" top of page macro 469.de pg@top 470.ch pg*footer -\\n[FM]u/2u 471.nr PN \\n% 472.nr pg*col-num 0 473.nr pg@fn-bottom-margin 0 474.nr pg*saved-po \\n[PO] 475.po \\n[PO]u 476.ev h 477.par@reset 478.sp (u;\\n[HM]/2) 479.PT 480.sp |\\n[HM]u 481.if d HD .HD 482.mk pg@header-bottom 483.ev 484.mk pg*col-top 485.pg*start-col 486.. 487.de pg*start-col 488.ns 489.\" Handle footnote overflow before floating keeps, because the keep 490.\" might contain an embedded footnote. 491.fn@top-hook 492.kp@top-hook 493.tbl@top-hook 494.. 495.de pg@cs-top 496.sp \\n[HM]u 497.\" move pg@bottom and pg*footer out of the way 498.ch pg@bottom \\n[.p]u*2u 499.ch pg*footer \\n[.p]u*2u 500.ns 501.. 502.de pg@bottom 503.tbl@bottom-hook 504.if \\n[pg@fn-flag] .fn@bottom-hook 505.nr pg*col-num +1 506.ie \\n[pg*col-num]<\\n[pg@ncols] .pg*end-col 507.el .pg*end-page 508.. 509.de pg*end-col 510'sp |\\n[pg*col-top]u 511.po (u;\\n[pg*saved-po]+(\\n[pg@colw]+\\n[pg*gutw]*\\n[pg*col-num])) 512.\"po +(u;\\n[pg@colw]+\\n[pg*gutw]) 513.pg*start-col 514.. 515.de pg*end-page 516.po \\n[pg*saved-po]u 517.\" Make sure we don't exit if there are still floats or footnotes left-over. 518.ie \\n[kp@head]<\\n[kp@tail]:\\n[fn@have-overflow] \{\ 519. \" Switching environments ensures that we don't get an unnecessary 520. \" blank line at the top of the page. 521. ev ne 522' bp 523. ev 524.\} 525.el \{\ 526. if r pg*next-number \{\ 527. pn \\n[pg*next-number] 528. rr pg*next-number 529. if d pg*next-format \{\ 530. af PN \\*[pg*next-format] 531. rm pg*next-format 532. \} 533. \} 534' bp 535.\} 536.. 537.\" pg@begin number format 538.de pg@begin 539.ie \\n[.$]>0 \{\ 540. nr pg*next-number (;\\$1) 541. ie \\n[.$]>1 .ds pg*next-format \\$2 542. el .rm pg*next-format 543.\} 544.el .rr pg*next-number 545.pg@super-eject 546.. 547.\" print the footer line 548.de pg*footer 549.ev h 550.par@reset 551.BT 552.ev 553.. 554.\" flush out any keeps or footnotes 555.de pg@super-eject 556.br 557.if !'\\n(.z'' .@error-recover diversion open while ejecting page 558.\" Make sure we stay in the end macro while there is still footnote overflow 559.\" left, or floating keeps. 560.while \\n[kp@tail]>\\n[kp@head]:\\n[pg@fn-flag] \{\ 561. rs 562. bp 563.\} 564.bp 565.. 566.em pg@super-eject 567.\" *************************** 568.\" ******** module fn ******** 569.\" *************************** 570.\" Footnotes. 571.nr fn@sep-dist 8p 572.ev fn 573.\" Round it vertically 574.vs \n[fn@sep-dist]u 575.nr fn@sep-dist \n[.v] 576.ev 577.nr fn*text-num 0 1 578.nr fn*note-num 0 1 579.ds * \\*[par@sup-start]\En+[fn*text-num]\\*[par@sup-end] 580.nr fn*open 0 581.\" normal FS 582.de @FS 583.ie \\n[.$] .fn*do-FS "\\$1" no 584.el \{\ 585. ie \\n[fn*text-num]>\\n[fn*note-num] .fn*do-FS \\n+[fn*note-num] 586. el .fn*do-FS 587.\} 588.. 589.\" Second argument of `no' means don't embellish the first argument. 590.de fn*do-FS 591.if \\n[fn*open] .@error-recover nested FS 592.nr fn*open 1 593.if \\n[.u] \{\ 594. \" Ensure that the first line of the footnote is on the same page 595. \" as the reference. I think this is minimal. 596. ev fn 597. nr fn*need 1v 598. ev 599. ie \\n[pg@fn-flag] .nr fn*need +\\n[fn:PD] 600. el .nr fn*need +\\n[fn@sep-dist] 601. ne \\n[fn*need]u+\\n[.V]u>?0 602.\} 603.ev fn 604.par@reset-env 605.fn*start-div 606.par@reset 607.ie \\n[.$] .FP \\$@ 608.el .@LP 609.. 610.de @FE 611.ie !\\n[fn*open] .@error FE without FS 612.el \{\ 613. nr fn*open 0 614. br 615. ev 616. fn*end-div 617.\} 618.. 619.nr fn@have-overflow 0 620.\" called at the top of each column 621.de fn@top-hook 622.nr fn*max-width 0 623.nr fn*page-bottom-pos 0-\\n[FM]-\\n[pg@fn-bottom-margin] 624.ch pg@bottom \\n[fn*page-bottom-pos]u 625.if \\n[fn@have-overflow] \{\ 626. nr fn@have-overflow 0 627. fn*start-div 628. ev nf 629. fn@overflow-div 630. ev 631. fn*end-div 632.\} 633.. 634.\" This is called at the bottom of the column if pg@fn-flag is set. 635.de fn@bottom-hook 636.nr pg@fn-flag 0 637.nr fn@have-overflow 0 638.nr fn@bottom-pos \\n[.p]-\\n[FM]-\\n[pg@fn-bottom-margin]+\\n[.v] 639.ev fn 640.nr fn@bottom-pos -\\n[.v] 641.ev 642.ie \\n[nl]+\\n[fn@sep-dist]+\n[.V]>\\n[fn@bottom-pos] \{\ 643. rn fn@div fn@overflow-div 644. nr fn@have-overflow 1 645.\} 646.el \{\ 647. if \\n[pg@ncols]>1 \ 648. if \\n[fn*max-width]>\\n[pg@fn-colw] \ 649. nr pg@fn-bottom-margin \\n[.p]-\\n[FM]-\\n[nl]+1v 650. wh \\n[fn@bottom-pos]u fn*catch-overflow 651. fn@print-sep 652. ev nf 653. fn@div 654. rm fn@div 655. ev 656. if '\\n(.z'fn@overflow-div' \{\ 657. di 658. nr fn@have-overflow \\n[dn]>0 659. \} 660. ch fn*catch-overflow 661.\} 662.. 663.de fn*catch-overflow 664.di fn@overflow-div 665.. 666.nr fn*embed-count 0 667.de @div-end!fn@div 668.br 669.if '\\n[.ev]'fn' .ev 670.fn*end-div 671.nr fn*open 0 672.. 673.als @div-end!fn*embed-div @div-end!fn@div 674.de fn*start-div 675.ie '\\n(.z'' \{\ 676. da fn@div 677. if !\\n[pg@fn-flag] .ns 678.\} 679.el .di fn*embed-div 680.. 681.de fn*end-div 682.ie '\\n(.z'fn@div' \{\ 683. di 684. nr fn*page-bottom-pos -\\n[dn] 685. nr fn*max-width \\n[fn*max-width]>?\\n[dl] 686. if !\\n[pg@fn-flag] .nr fn*page-bottom-pos -\\n[fn@sep-dist] 687. nr pg@fn-flag 1 688. nr fn*page-bottom-pos \\n[nl]-\\n[.p]+\n[.V]>?\\n[fn*page-bottom-pos] 689. ch pg@bottom \\n[fn*page-bottom-pos]u 690.\} 691.el \{\ 692. ie '\\n(.z'fn*embed-div' \{\ 693. di 694. rn fn*embed-div fn*embed-div!\\n[fn*embed-count] 695\!. fn*embed-start \\n[fn*embed-count] 696. rs 697' sp (u;\\n[dn]+\\n[fn@sep-dist]+\\n[.V]) 698\!. fn*embed-end 699. nr fn*embed-count +1 700. \} 701. el \{\ 702. ev fn 703. @error-recover unclosed diversion within footnote 704. \} 705.\} 706.. 707.de fn*embed-start 708.ie '\\n(.z'' \{\ 709. fn*start-div 710. ev nf 711. fn*embed-div!\\$1 712. rm fn*embed-div!\\$1 713. ev 714. fn*end-div 715. di fn*null 716.\} 717.el \{\ 718\!. fn*embed-start \\$1 719. rs 720.\} 721.. 722.de fn*embed-end 723.ie '\\n(.z'fn*null' \{\ 724. di 725. rm fn*null 726.\} 727.el \!.fn*embed-end 728.. 729.\" It's important that fn@print-sep use up exactly fn@sep-dist vertical space. 730.de fn@print-sep 731.ev fn 732.in 0 733.vs \\n[fn@sep-dist]u 734\D'l 1i 0' 735.br 736.ev 737.. 738.\" *************************** 739.\" ******** module kp ******** 740.\" *************************** 741.\" Keeps. 742.de KS 743.br 744.di kp*div 745.. 746.de KF 747.if !'\\n(.z'' .@error-recover KF while open diversion 748.di kp*fdiv 749.ev k 750.par@reset-env 751.par@reset 752.. 753.de KE 754.ie '\\n(.z'kp*div' .kp*end 755.el \{\ 756. ie '\\n(.z'kp*fdiv' .kp*fend 757. el .@error KE without KS or KF 758.\} 759.. 760.de @div-end!kp*div 761.kp*end 762.. 763.de @div-end!kp*fdiv 764.kp*fend 765.. 766.de kp*need 767.ie '\\n(.z'' .ds@need \\$1 768.el \!.kp*need \\$1 769.. 770.\" end non-floating keep 771.de kp*end 772.br 773.di 774.kp*need \\n[dn] 775.ev nf 776.kp*div 777.ev 778.rm kp*div 779.. 780.\" Floating keeps. 781.nr kp@head 0 782.nr kp@tail 0 783.\" end floating keep 784.de kp*fend 785.br 786.ev 787.di 788.ie \\n[.t]-(\\n[.k]>0*1v)>\\n[dn] \{\ 789. br 790. ev nf 791. kp*fdiv 792. rm kp*fdiv 793. ev 794.\} 795.el \{\ 796. rn kp*fdiv kp*div!\\n[kp@tail] 797. nr kp*ht!\\n[kp@tail] 0\\n[dn] 798. nr kp@tail +1 799.\} 800.. 801.\" top of page processing for KF 802.nr kp*doing-top 0 803.de kp@top-hook 804.if !\\n[kp*doing-top] \{\ 805. nr kp*doing-top 1 806. kp*do-top 807. nr kp*doing-top 0 808.\} 809.. 810.de kp*do-top 811.\" If the first keep won't fit, only force it out if we haven't had a footnote 812.\" and we're at the top of the page. 813.nr kp*force \\n[pg@fn-flag]=0&(\\n[nl]<=\\n[pg@header-bottom]) 814.nr kp*fits 1 815.while \\n[kp@tail]>\\n[kp@head]&\\n[kp*fits] \{\ 816. ie \\n[.t]>\\n[kp*ht!\\n[kp@head]]:\\n[kp*force] \{\ 817. nr kp*force 0 818. \" It's important to advance kp@head before bringing 819. \" back the keep, so that if the last line of the 820. \" last keep springs the bottom of page trap, a new 821. \" page will not be started unnecessarily. 822. rn kp*div!\\n[kp@head] kp*temp 823. nr kp@head +1 824. ev nf 825. kp*temp 826. ev 827. rm kp*temp 828. \} 829. el .nr kp*fits 0 830.\} 831.. 832.\" *************************** 833.\" ******** module ds ******** 834.\" *************************** 835.\" Displays and non-floating keeps. 836.de DE 837.ds*end!\\n[\\n[.ev]:ds-type] 838.nr \\n[.ev]:ds-type 0 839.. 840.de ds@auto-end 841.if \\n[\\n[.ev]:ds-type] \{\ 842. @error automatically terminating display 843. DE 844.\} 845.. 846.de @div-end!ds*div 847.ie \\n[\\n[.ev]:ds-type] .DE 848.el .ds*end!2 849.. 850.de ds*end!0 851.@error DE without DS, ID, CD, LD or BD 852.. 853.de LD 854.br 855.nr \\n[.ev]:ds-type 1 856.par@reset 857.nf 858.sp \\n[DD]u 859.. 860.de ID 861.LD 862.ie \\n[.$] .in +(n;\\$1) 863.el .in +\\n[DI]u 864.. 865.de CD 866.LD 867.ce 9999 868.. 869.de RD 870.LD 871.rj 9999 872.. 873.de ds*common-end 874.par@reset 875.sp \\n[DD]u 876.. 877.als ds*end!1 ds*common-end 878.de BD 879.LD 880.nr \\n[.ev]:ds-type 2 881.di ds*div 882.. 883.de ds*end!2 884.br 885.ie '\\n(.z'ds*div' \{\ 886. di 887. nf 888. in (u;\\n[.l]-\\n[dl]/2) 889. ds*div 890. rm ds*div 891. ds*common-end 892.\} 893.el .@error-recover mismatched DE 894.. 895.de DS 896.br 897.di ds*div 898.ie '\\$1'B' \{\ 899. LD 900. nr \\n[.ev]:ds-type 4 901.\} 902.el \{\ 903. ie '\\$1'L' .LD 904. el \{\ 905. ie '\\$1'C' .CD 906. el \{\ 907. ie '\\$1'R' .RD 908. el \{\ 909. ie '\\$1'I' .ID \\$2 910. el .ID \\$1 911. \} 912. \} 913. \} 914. nr \\n[.ev]:ds-type 3 915.\} 916.. 917.de ds@need 918.if '\\n(.z'' \{\ 919. while \\n[.t]<=(\\$1)&(\\n[nl]>\\n[pg@header-bottom]) \{\ 920. rs 921' sp \\n[.t]u 922. \} 923.\} 924.. 925.de ds*end!3 926.br 927.ie '\\n(.z'ds*div' \{\ 928. di 929. ds@need \\n[dn] 930. ev nf 931. ds*div 932. ev 933. rm ds*div 934. ds*common-end 935.\} 936.el .@error-recover mismatched DE 937.. 938.de ds*end!4 939.ie '\\n(.z'ds*div' \{\ 940. br 941. di 942. nf 943. in (u;\\n[.l]-\\n[dl]/2) 944. ds@need \\n[dn] 945. ds*div 946. rm ds*div 947. ds*common-end 948.\} 949.el .@error-recover mismatched DE 950.. 951.\" **************************** 952.\" ******** module par ******** 953.\" **************************** 954.\" Paragraph-level formatting. 955.nr PS 10 956.nr LL 6i 957.de par*vs 958.\" If it's too big to be in points, treat it as units. 959.ie (p;\\$1)>=40p .vs (u;\\$1) 960.el .vs (p;\\$1) 961.. 962.de par@ab-indent 963.nr 0:li (u;\\n[LL]/12) 964.nr 0:ri \\n[0:li] 965.. 966.de par*env-init 967.aln \\n[.ev]:PS PS 968.aln \\n[.ev]:VS VS 969.aln \\n[.ev]:LL LL 970.aln \\n[.ev]:MCLL LL 971.aln \\n[.ev]:LT LT 972.aln \\n[.ev]:MCLT LT 973.aln \\n[.ev]:PI PI 974.aln \\n[.ev]:PD PD 975.par@reset-env 976.. 977.\" happens when the first page begins 978.de par@init 979.if !rLT .nr LT \\n[LL] 980.if !rFL .nr FL \\n[LL]*5/6 981.if !rVS .nr VS \\n[PS]+2 982.ps \\n[PS] 983.if !rDI .nr DI .5i 984.if !rQI .nr QI 5n 985.if !rPI .nr PI 5n 986.par*vs \\n[VS] 987.if !rPD .nr PD .3v 988.if !rDD .nr DD .5v 989.if !dFAM .ds FAM \\n[.fam] 990.nr par*adj \\n[.j] 991.par*env-init 992.ev h 993.par*env-init 994.ev 995.ev fn 996.par*env-init 997.ev 998.ev k 999.par*env-init 1000.ev 1001.aln 0:MCLL pg@colw 1002.aln 0:MCLT pg@colw 1003.aln k:MCLL pg@colw 1004.aln k:MCLT pg@colw 1005.if !rFPS .nr FPS \\n[PS]-2 1006.if !rFVS .nr FVS (p;\\n[FPS]+2) 1007.if !rFI .nr FI 2n 1008.if !rFPD .nr FPD \\n[PD]/2 1009.aln fn:PS FPS 1010.aln fn:VS FVS 1011.aln fn:LL FL 1012.aln fn:LT FL 1013.aln fn:PI FI 1014.aln fn:PD FPD 1015.aln fn:MCLL pg@fn-colw 1016.aln fn:MCLT pg@fn-colw 1017.. 1018.de par@reset-env 1019.nr \\n[.ev]:il 0 1020.nr \\n[.ev]:li 0 1021.nr \\n[.ev]:ri 0 1022.nr \\n[.ev]:ai \\n[\\n[.ev]:PI] 1023.nr \\n[.ev]:pli 0 1024.nr \\n[.ev]:pri 0 1025.nr \\n[.ev]:ds-type 0 1026.. 1027.\" par@reset 1028.de par@reset 1029.br 1030.ce 0 1031.rj 0 1032.ul 0 1033.fi 1034.ad \\n[par*adj] 1035.ie \\n[pg@ncols]>1 \{\ 1036. ll (u;\\n[\\n[.ev]:MCLL]-\\n[\\n[.ev]:ri]-\\n[\\n[.ev]:pri]) 1037. lt \\n[\\n[.ev]:MCLT]u 1038.\} 1039.el \{\ 1040. ll (u;\\n[\\n[.ev]:LL]-\\n[\\n[.ev]:ri]-\\n[\\n[.ev]:pri]) 1041. lt \\n[\\n[.ev]:LT]u 1042.\} 1043.in (u;\\n[\\n[.ev]:li]+\\n[\\n[.ev]:pli]) 1044.ft 1 1045.fam \\*[FAM] 1046.ps \\n[\\n[.ev]:PS] 1047.par*vs \\n[\\n[.ev]:VS] 1048.ls 1 1049.TA 1050.hy 14 1051.. 1052.als @RT par@reset 1053.\" This can be redefined by the user. 1054.de TA 1055.ta T 5n 1056.. 1057.de par*start 1058.ds@auto-end 1059.nr \\n[.ev]:pli \\$1 1060.nr \\n[.ev]:pri \\$2 1061.par@reset 1062.sp \\n[\\n[.ev]:PD]u 1063.ne 1v+\\n(.Vu 1064.. 1065.de par@finish 1066.nr \\n[.ev]:pli 0 1067.nr \\n[.ev]:pri 0 1068.par@reset 1069.. 1070.\" normal LP 1071.de @LP 1072.par*start 0 0 1073.nr \\n[.ev]:ai \\n[\\n[.ev]:PI] 1074.. 1075.de @PP 1076.par*start 0 0 1077.nr \\n[.ev]:ai \\n[\\n[.ev]:PI] 1078.ti +\\n[\\n[.ev]:ai]u 1079.. 1080.de @QP 1081.nr \\n[.ev]:ai \\n[\\n[.ev]:PI] 1082.par*start \\n[QI] \\n[QI] 1083.. 1084.de @XP 1085.par*start \\n[\\n[.ev]:PI] 0 1086.ti -\\n[\\n[.ev]:PI]u 1087.. 1088.de @IP 1089.if \\n[.$]>1 .nr \\n[.ev]:ai (n;\\$2) 1090.par*start \\n[\\n[.ev]:ai] 0 1091.if !'\\$1'' \{\ 1092. \" Divert the label so as to freeze any spaces. 1093. di par*label 1094. in 0 1095. nf 1096\&\\$1 1097. di 1098. in 1099. fi 1100. chop par*label 1101. ti -\\n[\\n[.ev]:ai]u 1102. ie \\n[dl]+1n<=\\n[\\n[.ev]:ai] \\*[par*label]\h'|\\n[\\n[.ev]:ai]u'\c 1103. el \{\ 1104\\*[par*label] 1105. br 1106. \} 1107. rm par*label 1108.\} 1109.. 1110.de @RS 1111.br 1112.nr \\n[.ev]:li!\\n[\\n[.ev]:il] \\n[\\n[.ev]:li] 1113.nr \\n[.ev]:ri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ri] 1114.nr \\n[.ev]:ai!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ai] 1115.nr \\n[.ev]:pli!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pli] 1116.nr \\n[.ev]:pri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pri] 1117.nr \\n[.ev]:il +1 1118.nr \\n[.ev]:li +\\n[\\n[.ev]:ai] 1119.nr \\n[.ev]:ai \\n[\\n[.ev]:PI] 1120.par@reset 1121.. 1122.de @RE 1123.br 1124.ie \\n[\\n[.ev]:il] \{\ 1125. nr \\n[.ev]:il -1 1126. nr \\n[.ev]:ai \\n[\\n[.ev]:ai!\\n[\\n[.ev]:il]] 1127. nr \\n[.ev]:li \\n[\\n[.ev]:li!\\n[\\n[.ev]:il]] 1128. nr \\n[.ev]:ri \\n[\\n[.ev]:ri!\\n[\\n[.ev]:il]] 1129. nr \\n[.ev]:pli \\n[\\n[.ev]:pli!\\n[\\n[.ev]:il]] 1130. nr \\n[.ev]:pri \\n[\\n[.ev]:pri!\\n[\\n[.ev]:il]] 1131.\} 1132.el .@error unbalanced \\$0 1133.par@reset 1134.. 1135.de @QS 1136.br 1137.nr \\n[.ev]:li!\\n[\\n[.ev]:il] \\n[\\n[.ev]:li] 1138.nr \\n[.ev]:ri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ri] 1139.nr \\n[.ev]:ai!\\n[\\n[.ev]:il] \\n[\\n[.ev]:ai] 1140.nr \\n[.ev]:pli!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pli] 1141.nr \\n[.ev]:pri!\\n[\\n[.ev]:il] \\n[\\n[.ev]:pri] 1142.nr \\n[.ev]:il +1 1143.nr \\n[.ev]:li +\\n[QI] 1144.nr \\n[.ev]:ri +\\n[QI] 1145.nr \\n[.ev]:ai \\n[\\n[.ev]:PI] 1146.par@reset 1147.. 1148.als @QE @RE 1149.\" start boxed text 1150.de B1 1151.br 1152.di par*box-div 1153.nr \\n[.ev]:li +1n 1154.nr \\n[.ev]:ri +1n 1155.par@reset 1156.. 1157.de @div-end!par*box-div 1158.B2 1159.. 1160.\" end boxed text 1161.\" Postpone the drawing of the box until we're in the top-level diversion, 1162.\" in case there's a footnote inside the box. 1163.de B2 1164.ie '\\n(.z'par*box-div' \{\ 1165. br 1166. di 1167. ds@need \\n[dn] 1168. par*box-mark-top 1169. ev nf 1170. par*box-div 1171. ev 1172. nr \\n[.ev]:ri -1n 1173. nr \\n[.ev]:li -1n 1174. par@finish 1175. par*box-draw \\n[.i]u \\n[.l]u 1176.\} 1177.el .@error B2 without B1 1178.. 1179.de par*box-mark-top 1180.ie '\\n[.z]'' .mk par*box-top 1181.el \!.par*box-mark-top 1182.. 1183.de par*box-draw 1184.ie '\\n[.z]'' \{\ 1185. nr par*box-in \\n[.i] 1186. nr par*box-ll \\n[.l] 1187. nr par*box-vpt \\n[.vpt] 1188. vpt 0 1189. in \\$1 1190. ll \\$2 1191\v'-1v+.25m'\ 1192\D'l (u;\\n[.l]-\\n[.i]) 0'\ 1193\D'l 0 |\\n[par*box-top]u'\ 1194\D'l -(u;\\n[.l]-\\n[.i]) 0'\ 1195\D'l 0 -|\\n[par*box-top]u' 1196. br 1197. sp -1 1198. in \\n[par*box-in]u 1199. ll \\n[par*box-ll]u 1200. vpt \\n[par*box-vpt] 1201.\} 1202.el \!.par*box-draw \\$1 \\$2 1203.. 1204.de @SH 1205.par@finish 1206.\" Keep together the heading and the first two lines of the next paragraph. 1207.ne 3v+\\n[\\n[.ev]:PD]u+\\n(.Vu 1208.sp 1 1209.ft B 1210.. 1211.\" TL, AU, and AI are aliased to these in cov*ab-init. 1212.de par@TL 1213.par@finish 1214.sp 1 1215.ft B 1216.ps +2 1217.vs +3p 1218.ce 9999 1219.. 1220.de par@AU 1221.par@finish 1222.sp 1 1223.ft I 1224.ce 9999 1225.. 1226.de par@AI 1227.par@finish 1228.sp .5 1229.ce 9999 1230.. 1231.\" In paragraph macros. 1232.de NL 1233.ps \\n[\\n[.ev]:PS] 1234.. 1235.de SM 1236.ps -2 1237.. 1238.de LG 1239.ps +2 1240.. 1241.de R 1242.ft R 1243.. 1244.de par*set-font 1245.ie \\n[.$] \{\ 1246. nr par*prev-font \\n[.f] 1247\&\\$3\f[\\*[par*font-name!\\$0]]\\$1\f[\\n[par*prev-font]]\\$2 1248.\} 1249.el .ft \\*[par*font-name!\\$0] 1250.. 1251.ds par*font-name!B B 1252.ds par*font-name!I I 1253.ds par*font-name!BI BI 1254.ds par*font-name!CW CR 1255.als B par*set-font 1256.als I par*set-font 1257.als BI par*set-font 1258.als CW par*set-font 1259.\" underline a word 1260.de UL 1261\Z'\\$1'\v'.25m'\D'l \w'\\$1'u 0'\v'-.25m'\\$2 1262.. 1263.\" box a word 1264.de BX 1265.nr par*bxw \w'\\$1'+.4m 1266\Z'\v'.25m'\D'l 0 -1m'\D'l \\n[par*bxw]u 0'\D'l 0 1m'\D'l -\\n[par*bxw]u 0''\ 1267\Z'\h'.2m'\\$1'\ 1268\h'\\n[par*bxw]u' 1269.. 1270.\" The first time UX is used, put a registered mark after it. 1271.ds par*ux-rg \(rg 1272.de UX 1273\s[\\n[.s]*8u/10u]UNIX\s0\\$1\\*[par*ux-rg] 1274.ds par*ux-rg 1275.. 1276.ds par@sup-start \v'-.9m\s'\En[.s]*7u/10u'+.7m' 1277.als { par@sup-start 1278.ds par@sup-end \v'-.7m\s0+.9m' 1279.als } par@sup-end 1280.\" footnote paragraphs 1281.\" FF is the footnote format 1282.nr FF 0 1283.\" This can be redefined. It gets a second argument of `no' if the first 1284.\" argument was supplied by the user, rather than automatically. 1285.de FP 1286.br 1287.if !d par*fp!\\n[FF] \{\ 1288. @error unknown footnote format `\\n[FF]' 1289. nr FF 0 1290.\} 1291.ie '\\$2'no' .par*fp!\\n[FF]-no "\\$1" 1292.el .par*fp!\\n[FF] "\\$1" 1293.. 1294.de par*fp!0 1295.@PP 1296\&\\*[par@sup-start]\\$1\\*[par@sup-end]\ \c 1297.. 1298.de par*fp!0-no 1299.@PP 1300\&\\$1\ \c 1301.. 1302.de par*fp!1 1303.@PP 1304\&\\$1.\ \c 1305.. 1306.de par*fp!1-no 1307.@PP 1308\&\\$1\ \c 1309.. 1310.de par*fp!2 1311.@LP 1312\&\\$1.\ \c 1313.. 1314.de par*fp!2-no 1315.@LP 1316\&\\$1\ \c 1317.. 1318.de par*fp!3 1319.@IP "\\$1." (u;\\n[\\n[.ev]:PI]*2) 1320.. 1321.de par*fp!3-no 1322.@IP "\\$1" (u;\\n[\\n[.ev]:PI]*2) 1323.. 1324.\" *************************** 1325.\" ******** module nh ******** 1326.\" *************************** 1327.\" Numbered headings. 1328.\" nh*hl is the level of the last heading 1329.nr nh*hl 0 1330.\" numbered heading 1331.de @NH 1332.ie '\\$1'S' \{\ 1333. shift 1334. nr nh*hl 0 1335. while \\n[.$] \{\ 1336. nr nh*hl +1 1337. nr H\\n[nh*hl] 0\\$1 1338. shift 1339. \} 1340. if !\\n[nh*hl] \{\ 1341. nr H1 1 1342. nr nh*hl 1 1343. @error missing arguments to .NH S 1344. \} 1345.\} 1346.el \{\ 1347. nr nh*ohl \\n[nh*hl] 1348. ie \\n[.$] \{\ 1349. nr nh*hl 0\\$1 1350. ie \\n[nh*hl]<=0 \{\ 1351. nr nh*ohl 0 1352. nr nh*hl 1 1353. \} 1354. el \{\ 1355. if \\n[nh*hl]-\\n[nh*ohl]>1 \ 1356. @warning .NH \\n[nh*ohl] followed by .NH \\n[nh*hl] 1357. \} 1358. \} 1359. el .nr nh*hl 1 1360. while \\n[nh*hl]>\\n[nh*ohl] \{\ 1361. nr nh*ohl +1 1362. nr H\\n[nh*ohl] 0 1363. \} 1364. nr H\\n[nh*hl] +1 1365.\} 1366.ds SN 1367.nr nh*i 0 1368.while \\n[nh*i]<\\n[nh*hl] \{\ 1369. nr nh*i +1 1370. as SN \\n[H\\n[nh*i]]. 1371.\} 1372.SH 1373\\*[SN] 1374.. 1375.\" **************************** 1376.\" ******** module toc ******** 1377.\" **************************** 1378.\" Table of contents generation. 1379.de XS 1380.da toc*div 1381.ev h 1382.par@reset 1383.fi 1384.ie \\n[.$] .XA "\\$1" 1385.el .XA 1386.. 1387.de @div-end!toc*div 1388.XE 1389.. 1390.de XA 1391.ie '\\n(.z'toc*div' \{\ 1392. if d toc*num .toc*end-entry 1393. ie \\n[.$] \{\ 1394. ie '\\$1'no' .ds toc*num 1395. el .ds toc*num "\\$1 1396. \} 1397. el .ds toc*num \\n[PN] 1398. in (n;0\\$2) 1399.\} 1400.el .@error XA without XS 1401.. 1402.de XE 1403.ie '\\n(.z'toc*div' \{\ 1404. if d toc*num .toc*end-entry 1405. ev 1406. di 1407.\} 1408.el .@error XS without XE 1409.. 1410.de toc*end-entry 1411\\a\\t\\*[toc*num] 1412.br 1413.rm toc*num 1414.. 1415.de PX 1416.1C 1417.if !'\\$1'no' \{\ 1418. ce 1 1419. ps \\n[PS]+2 1420. ft B 1421\\*[TOC] 1422. ft 1423. ps 1424.\} 1425.nf 1426.char \[toc*leader-char] .\h'1m' 1427.lc \[toc*leader-char] 1428.ta (u;\\n[.l]-\\n[.i]-\w'000') (u;\\n[.l]-\\n[.i])R 1429.sp 2 1430.toc*div 1431.par@reset 1432.. 1433.\" print the table of contents on page i 1434.de TC 1435.P1 1436.pg@begin 1 i 1437.PX \\$1 1438.. 1439.\" **************************** 1440.\" ******** module eqn ******** 1441.\" **************************** 1442.\" Eqn support. 1443.de EQ 1444.. 1445.de EN 1446.. 1447.de @EQ 1448.br 1449.ds eqn*num "\\$2 1450.ie '\\$1'L' .nr eqn*type 0 1451.el \{\ 1452. ie '\\$1'I' .nr eqn*type 1 1453. el \{\ 1454. nr eqn*type 2 1455. if !'\\$1'C' .ds eqn*num "\\$1 1456. \} 1457.\} 1458.di eqn*div 1459.in 0 1460.nf 1461.. 1462.de @div-end!eqn*div 1463.@EN 1464.. 1465.\" Note that geqn mark and lineup work correctly in centered equations. 1466.de @EN 1467.ie !'\\n(.z'eqn*div' .@error-recover mismatched EN 1468.el \{\ 1469. br 1470. di 1471. nr eqn*have-num 0 1472. if !'\\*[eqn*num]'' .nr eqn*have-num 1 1473. if \\n[dl]:\\n[eqn*have-num] \{\ 1474. sp \\n[DD]u 1475. par@reset 1476. ds eqn*tabs \\n[.tabs] 1477. nf 1478. ie \\n[dl] \{\ 1479. ds@need \\n[dn]u-1v+\n[.V]u 1480. chop eqn*div 1481. ie \\n[eqn*type]=0 \{\ 1482. ta (u;\\n[.l]-\\n[.i])R 1483\\*[eqn*div]\t\\*[eqn*num] 1484. \} 1485. el \{\ 1486. ie \\n[eqn*type]=1 .ta \\n[DI]u \ 1487(u;\\n[.l]-\\n[.i])R 1488. el .ta (u;\\n[.l]-\\n[.i]/2)C \ 1489(u;\\n[.l]-\\n[.i])R 1490\t\\*[eqn*div]\t\\*[eqn*num] 1491. \} 1492. \} 1493. el \{\ 1494. ta (u;\\n[.l]-\\n[.i])R 1495\t\\*[eqn*num] 1496. \} 1497. sp \\n[DD]u 1498. fi 1499. ta \\*[eqn*tabs] 1500. \} 1501.\} 1502.. 1503.\" **************************** 1504.\" ******** module tbl ******** 1505.\" **************************** 1506.\" Tbl support. 1507.nr tbl*have-header 0 1508.de TS 1509.\" The break is necessary in the case where the first page has not yet begun. 1510.br 1511.sp \\n[DD]u 1512.if '\\$1'H' .di tbl*header-div 1513.. 1514.de tbl@top-hook 1515.if \\n[tbl*have-header] \{\ 1516. ie \\n[.t]-\\n[tbl*header-ht]-1v .tbl*print-header 1517. el .sp \\n[.t]u 1518.\} 1519.. 1520.de tbl*print-header 1521.ev nf 1522.tbl*header-div 1523.ev 1524.mk #T 1525.. 1526.de TH 1527.ie '\\n[.z]'tbl*header-div' \{\ 1528. nr T. 0 1529. T# 1530. br 1531. di 1532. ie \\n[dn]+\\n[FM]+\\n[HM]+2v>=\\n[.p] \{\ 1533. @error ridiculously long table header 1534. ds@need \\n[dn] 1535. tbl*print-header 1536. \} 1537. el \{\ 1538. nr tbl*header-ht \\n[dn] 1539. ds@need \\n[dn]u+1v 1540. tbl*print-header 1541. nr tbl*have-header 1 1542. \} 1543.\} 1544.el .@error-recover .TH without .TS H 1545.. 1546.de @div-end!tbl*header-div 1547.TH 1548.TE 1549.. 1550.de TE 1551.ie '\\n(.z'tbl*header-div' .@error-recover .TS H but no .TH before .TE 1552.el \{\ 1553. nr tbl*have-header 0 1554. sp \\n[DD]u 1555.\} 1556.\" reset tabs 1557.TA 1558.. 1559.de tbl@bottom-hook 1560.if \\n[tbl*have-header] \{\ 1561. nr T. 1 1562. T# 1563.\} 1564.. 1565.de T& 1566.. 1567.\" **************************** 1568.\" ******** module pic ******** 1569.\" **************************** 1570.\" Pic support. 1571.\" PS height width 1572.de PS 1573.br 1574.sp \\n[DD]u 1575.ie \\n[.$]<2 .@error bad arguments to PS (not preprocessed with pic?) 1576.el \{\ 1577. ds@need (u;\\$1)+1v 1578. in +(u;\\n[.l]-\\n[.i]-\\$2/2) 1579.\} 1580.. 1581.de PE 1582.par@reset 1583.sp \\n[DD]u+.5m 1584.. 1585.\" **************************** 1586.\" ******** module ref ******** 1587.\" **************************** 1588.\" Refer support. 1589.de ]- 1590.rm [A [B [C [D [E [G [I [J [N [O [P [Q [R [S [T [V 1591.rm ref*string 1592.. 1593.\" Other 1594.ds ref*spec!0 Q A T S V N P I C D O 1595.\" Journal article 1596.ds ref*spec!1 Q A T J S V N P I C D O 1597.\" Book 1598.ds ref*spec!2 Q A T S V P I C D O 1599.\" Article within book 1600.ds ref*spec!3 Q A T B E S V P I C D O 1601.\" Tech report 1602.ds ref*spec!4 Q A T R G P I C D O 1603.\" ][ type 1604.de ][ 1605.ie d ref*spec!\\$1 .ref*build \\*[ref*spec!\\$1] 1606.el \{\ 1607. @error unknown reference type `\\$1' 1608. ref*build \\*[ref*spec!0] 1609.\} 1610.ref*print 1611.rm ref*string 1612.rm [F 1613.. 1614.\" start of reference number 1615.ds [. \\*[par@sup-start] 1616.\" end of reference number 1617.ds .] \\*[par@sup-end] 1618.\" period before reference 1619.ds <. . 1620.\" period after reference 1621.ds >. \" empty 1622.\" comma before reference 1623.ds <, , 1624.\" comma after reference 1625.ds >, \" empty 1626.\" start collected references 1627.de ]< 1628.als ref*print ref*end-print 1629.SH 1630\&\\*[REFERENCES] 1631.par@reset 1632.. 1633.\" end collected references 1634.de ]> 1635.par@finish 1636.als ref*print ref*normal-print 1637.. 1638.de ref*normal-print 1639.ie d [F .FS "\\*([.\\*([F\\*(.]" 1640.el .FS \& 1641\\*[ref*string] 1642.FE 1643.. 1644.de ref*end-print 1645.ie d [F .IP "\\*([F." 1646.el .XP 1647\\*[ref*string] 1648.. 1649.als ref*print ref*normal-print 1650.de ref*build 1651.rm ref*string ref*post-punct 1652.nr ref*suppress-period 1 1653.while \\n[.$] \{\ 1654. if d [\\$1 \{\ 1655. ie d ref*add-\\$1 .ref*add-\\$1 1656. el .ref*add-dflt \\$1 1657. \} 1658. shift 1659.\} 1660.\" now add a final period 1661.ie d ref*string \{\ 1662. if !\\n[ref*suppress-period] .as ref*string . 1663. if d ref*post-punct \{\ 1664. as ref*string "\\*[ref*post-punct] 1665. rm ref*post-punct 1666. \} 1667.\} 1668.el .ds ref*string 1669.. 1670.de ref*add-T 1671.ref*field T , "\\*Q" "" "\\*U" 1672.if r [T .nr ref*suppress-period \\n([T 1673.. 1674.de ref*add-P 1675.ie \\n([P>0 .ref*field P , "pp. " 1676.el .ref*field P , "p. " 1677.. 1678.de ref*add-J 1679.ref*field J , \fI "" \fP 1680.. 1681.de ref*add-D 1682.ref*field D "" ( ) 1683.. 1684.de ref*add-E 1685.ref*field E , "ed. " 1686.. 1687.de ref*add-G 1688.ref*field G "" ( ) 1689.. 1690.de ref*add-B 1691.ref*field B "" "in \fI" "" \fP 1692.. 1693.de ref*add-O 1694.ref*field O . 1695.ie r [O .nr ref*suppress-period \\n([O 1696.el .nr ref*suppress-period 1 1697.. 1698.de ref*add-A 1699.ref*field A , 1700.if r [A .nr ref*suppress-period \\n([A 1701.. 1702.de ref*add-dflt 1703.ref*field \\$1 , 1704.. 1705.\" First argument is the field letter. 1706.\" Second argument is the punctuation character to use to separate this field 1707.\" from the previous field. 1708.\" Third argument is a string with which to prefix this field. 1709.\" Fourth argument is a string with which to postfix this field. 1710.\" Fifth argument is a string to add after the punctuation character supplied 1711.\" by the next field. 1712.de ref*field 1713.if d ref*string \{\ 1714. ie d ref*post-punct \{\ 1715. as ref*string "\\$2\\*[ref*post-punct] \" 1716. rm ref*post-punct 1717. \} 1718. el .as ref*string "\\$2 \" 1719.\} 1720.as ref*string "\\$3\\*([\\$1\\$4 1721.if \\n[.$]>4 .ds ref*post-punct "\\$5 1722.nr ref*suppress-period 0 1723.. 1724.\" **************************** 1725.\" ******** module acc ******** 1726.\" **************************** 1727.\" Accents and special characters. 1728.ds Q \)``\) 1729.ds U \)''\) 1730.ds - \(em 1731.\" Characters 1732.if !c\(rg .char \(rg (R) 1733.if !c\(ah .char \(ah \v'-.55m'\s[\En[.s]/2u]v\s0\v'.55m' 1734.if !c\(ad .char \(ad \v'-.55m'\s[\En[.s]*7u/10u].\h'.05m'.\s0\v'.55m' 1735.if !c\(a- .char \(a- \v'-.55m'\D'l .25m 0'\v'.55m' 1736.if !c\(ao .char \(ao \v'-.55m'\s[\En[.s]*6u/10u]\D'c .25m'\s0\v'.55m' 1737.if !c\(ac .char \(ac \s[\En[.s]*8u/10u]\v'.05m',\v'-.05m'\s0 1738.if !c\(ho .char \(ho \s[\En[.s]/2u]\v'.4m'c\v'-.4m'\s0 1739.if !c\(-D .char \(-D \Z'\v'-.1m'-'D 1740.if !c\(Sd .char \(Sd \Z'\v'-.3m'\h'.2m'-'\(pd 1741.if !c\(TP .char \(TP I\h'-.25m'\v'-.33m'\s[\En[.s]*6u/10u]\v'.33m'D\ 1742\v'-.33m'\s0\v'.33m' 1743.if !c\(Tp .char \(Tp \zlp 1744.if !c\(ss .char \(ss \(*b 1745.if !c\(AE .char \(AE A\h'-.3m'E 1746.if !c\(ae .char \(ae a\h'-.19m'e 1747.if !c\(OE .char \(OE O\h'-.25m'E 1748.if !c\(oe .char \(oe o\h'-.14m'e 1749.if !c\(r? .char \(r? \Z'\h'.1m'\v'-.15m'\s[\En[.s]*7u/10u]i\s0\v'.15m''\ 1750\v'.15m'\s[\En[.s]*7u/10u]c\s0\v'-.15m' 1751.if !c\(r! .char \(r! \h'.1m'\Z'\v'-.4m'\s[\En[.s]*8u/10u].\s0\v'.4m''\ 1752\s[\En[.s]*8u/10u]\v'.4m'\(or\v'-.4m'\s0\h'.1m' 1753.\" The idea of this definition is for the top of the 3 to be at the x-height. 1754.\" A yogh really ought to have a little line going north-west from the top 1755.\" left of the 3. 1756.if !c\[yogh] .char \[yogh] \Z'\v'\w'x'*0-\En[rst]u'\s[\En[.s]*8u/10u]\ 1757\v'\w'3'*0+\En[rst]u'3\s0'\h'\w'\s[\En[.s]*8u/10u]3'u' 1758.\" Accents 1759.de acc*over-def 1760.ds \\$1 \Z'\v'(u;\w'x'*0+\En[rst]-\En[.cht])'\ 1761\h'(u;-\En[skw]+(-\En[.w]-\w'\\$2'/2)+\En[.csk])'\\$2' 1762.. 1763.de acc*under-def 1764.ds \\$1 \Z'\v'\En[.cdp]u'\h'(u;-\En[.w]-\w'\\$2'/2)'\\$2' 1765.. 1766.de acc*slash-def 1767.ds \\$1 \Z'\h'(u;-\En[.w]-\w'\\$2'/2)'\ 1768\v'(u;\En[.cdp]-\En[.cht]+\En[rst]+\En[rsb]/2)'\\$2' 1769.. 1770.de acc*prefix-def 1771.ds \\$1 \Z'\h'(u;\w'x'-\w'\\$2'/2)'\\$2' 1772.. 1773.acc*prefix-def ' \' 1774.acc*prefix-def ` \` 1775.acc*prefix-def ^ ^ 1776.acc*prefix-def , \(ac 1777.acc*prefix-def : \(ad 1778.acc*prefix-def ~ ~ 1779.\" improved accent marks 1780.de AM 1781.acc*over-def ' \' 1782.acc*over-def ` \` 1783.acc*over-def ^ ^ 1784.acc*over-def ~ ~ 1785.acc*over-def : \(ad 1786.acc*over-def v \(ah 1787.acc*over-def _ \(a- 1788.acc*over-def o \(ao 1789.acc*under-def , \(ac 1790.acc*under-def . \s[\En[.s]*8u/10u]\v'.2m'.\v'-.2m'\s0 1791.acc*under-def hook \(ho 1792.acc*slash-def / / 1793.char \[hooko] o\\\\*[hook] 1794.ds q \[hooko] 1795.ds 3 \[yogh] 1796.ds D- \(-D\" Icelandic uppercase eth 1797.ds d- \(Sd\" Icelandic lowercase eth 1798.ds Th \(TP\" Icelandic uppercase thorn 1799.ds th \(Tp\" Icelandic lowercase thorn 1800.ds 8 \(ss\" German double s 1801.ds Ae \(AE\" AE ligature 1802.ds ae \(ae\" ae ligature 1803.ds Oe \(OE\" OE ligature 1804.ds oe \(oe\" oe ligature 1805.ds ? \(r?\" upside down ? 1806.ds ! \(r!\" upside down ! 1807.. 1808.\" Make sure that no blank lines creep in at the end of this file. 1809