home *** CD-ROM | disk | FTP | other *** search
/ Atari FTP / ATARI_FTP_0693.zip / ATARI_FTP_0693 / Tex / Tex29 / StTeXmac.zoo / macros / tugbot.sty < prev    next >
Text File  |  1988-10-16  |  32KB  |  953 lines

  1. %            *****      TUGBOT.STY    *****        18 Aug 85, bb
  2. %
  3. %    WARNING -- UNDER CONSTRUCTION
  4. %
  5. %    This file contains the TeX82 instructions for preparing a document
  6. %    in TUGboat format.  It is based on the TeX80 TUGboat format and on
  7. %    AMSPPT.STY (AMS-TeX82).  It is compatible with, but does not
  8. %    require (or load) AMS-TeX.  It assumes that PLAIN.TEX is preloaded.
  9. %
  10. %    This version differs in significant ways from the production version
  11. %    used at the AMS to generate the published TUGboat; particular
  12. %    features of the production version address idiosyncracies of the
  13. %    Alphatype CRS typesetter, used to prepare camera copy, which are not
  14. %    relevant to output prepared on, e.g., a laser printer.
  15. %
  16. %    Explicit registers:
  17. %        Counters:    0 = \pageno (PLAIN)
  18. %                1 = \xcol -- column on page (values 1 or 2)
  19. %                2 = \spoolno -- sequential segment count
  20. %        Files:        1 = page number xref definitions
  21.  
  22.  
  23. \catcode`\@=11        % used, as in PLAIN, in protected control sequences
  24.  
  25.  
  26. %      Stuff different from PLAIN, or reiterated for clarity
  27.  
  28. \def~{\penalty\@M \ } % tie -- this is PLAIN value; it is reset in AMS-TeX
  29.  
  30. \clubpenalty=10000
  31. \widowpenalty=10000
  32.  
  33. \normallineskiplimit=1pt
  34.  
  35. \newif\ifNoParIndent        \NoParIndentfalse
  36. \def \NoParIndent{\parindent=0pt \NoParIndenttrue}
  37.  
  38. \newdimen\normalparindent     \normalparindent=20pt        % plain = 20pt
  39. \def \NormalParIndent{\global\parindent=\normalparindent
  40.     \global\NoParIndentfalse}
  41. \NormalParIndent
  42.  
  43. %        set up auxiliary `page numbers'
  44. %        \pageno = \count0  as used in PLAIN
  45. \countdef\xcol=1    \xcol=1
  46. \countdef\spoolno=2    \spoolno=1
  47.  
  48. %    some things with the same names as in, or reiterated from, AMS-TeX
  49.  
  50. \def \BlackBoxes{\overfullrule=5pt }
  51. \def \NoBlackBoxes{\overfullrule=0pt }
  52. \def \document{}        % override an AMS-TeX convention
  53. \def \linebreak{\unskip\break}
  54. \def \newline{\hskip0pt plus\colwd \break}
  55. %\let\brk=\linebreak        % TeX80 version
  56. %\let\lbrk=\newline        % TeX80 version
  57. \output{\output@}
  58.  
  59. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  60. %                                          %
  61. %        *****     utility registers and definitions    *****          %
  62. %                                          %
  63. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  64.  
  65.  
  66. %    test registers for transient use; paired - internal/external
  67. \newbox\T@stBox         \newbox\TestBox
  68. \newcount\T@stCount        \newcount\TestCount
  69. \newdimen\T@stDimen        \newdimen\TestDimen
  70.  
  71.  
  72. %    \cs existence test, stolen from TeXbook exercise 7.7
  73. \def \ifundefined#1{\expandafter\ifx\csname#1\endcsname\relax }
  74.  
  75.  
  76. %    Smashes repeated from AMS-TeX; PLAIN implements only full \smash .
  77. \newif\iftop@        \newif\ifbot@
  78. \def\topsmash{\top@true\bot@false\smash@}
  79. \def\botsmash{\top@false\bot@true\smash@}
  80. \def\smash{\top@true\bot@true\smash@}
  81. \def\smash@{\relax\ifmmode\def\next{\mathpalette\mathsm@sh}%
  82.     \else\let\next\makesm@sh\fi \next }
  83. \def\finsm@sh{\iftop@\ht\z@\z@\fi\ifbot@\dp\z@\z@\fi\box\z@}
  84.  
  85.  
  86. %    Vertical `laps'; cf. \llap and \rlap
  87. \def\ulap#1{\vbox to \z@{\vss#1}}
  88. \def\dlap#1{\vbox to \z@{#1\vss}}
  89.  
  90. %    And a horizontal `lap' that takes up no space on either side.
  91. \def\zlap#1{\hbox to \z@{\hss#1\hss}}
  92.  
  93.  
  94. %    Avoid unwanted vertical glue when making up pages.
  95. \def \basezero{\baselineskip\z@ \lineskip\z@}
  96.  
  97.  
  98. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  99. %                                          %
  100. %            ***** fonts and friends    *****                  %
  101. %                                          %
  102. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  103.  
  104.  
  105. %    Struts give ascenders and descenders to assist in baseline alignment
  106. %    (e.g. of adjoining vertical boxes); useful only with text fonts.
  107. %
  108. %    \strut is defined in PLAIN .  The structure of \strutt is equivalent.
  109.  
  110. \newbox\struttbox
  111. \def\strutt{\relax\ifmmode\copy\struttbox\else\unhcopy\struttbox\fi}
  112.  
  113. %    Struts are given the following dimensions for use in TUGboat:
  114. %
  115. %        \strut = height/depth of parenthesis in current font
  116. %             (not the same as PLAIN)
  117. %        \strutt height + depth = \normalbaselineskip,
  118. %             height = same as \strut
  119. %             (equivalent to PLAIN \strut )
  120.  
  121.  
  122. %    The fonts below are sufficient for most ordinary TUGboat production.
  123. %    Additional titling fonts are defined elsewhere, and occasionally an
  124. %    extra font will be needed for a particular item (e.g. the device
  125. %    charts) and defined in that file.
  126.  
  127. %        fonts preloaded but not named in PLAIN
  128.  
  129. \font\ninerm=amr9
  130. \font\eightrm=amr8
  131. \font\sixrm=amr6
  132.  
  133. \font\ninei=ammi9 \skewchar\ninei='177
  134. \font\eighti=ammi8 \skewchar\eighti='177
  135. \font\sixi=ammi6 \skewchar\sixi='177
  136.  
  137. \font\ninesy=amsy9 \skewchar\ninesy='60
  138. \font\eightsy=amsy8 \skewchar\eightsy='60
  139. \font\sixsy=amsy6 \skewchar\sixsy='60
  140.  
  141. \font\ninebf=ambx9
  142. \font\eightbf=ambx8
  143. \font\sixbf=ambx6
  144.  
  145. \font\ninesl=amsl9
  146. \font\eightsl=amsl8
  147.  
  148. \font\nineit=amti9
  149. \font\eightit=amti8
  150. \font\sevenit=amti7
  151.  
  152. \font\ninett=amtt9
  153. \font\eighttt=amtt8
  154.  
  155. \font \tenupit=amu10 
  156.  
  157.  
  158. \def \mit{\fam\@ne}
  159. \def \cal{\fam\tw@}
  160. \def \sy{\cal}        % old name
  161.  
  162. %        fonts added at AMS
  163.  
  164. % \font\eightex=amex8
  165.  
  166. % \newfam\cyrfam    % uncomment if needed
  167.  
  168. % \font\tencyr=mcyr10
  169. % \font\ninemcyr=mcyr9
  170. % \font\eightcyr=mcyr8
  171. % \font\sixcyr=mcyr6
  172.  
  173. \font\tensmc=amcsc10
  174. %\font\ninesmc=amcsc9            % when available
  175. \let\ninesmc=\tensmc            % temporary expedient
  176. %\font\eightsmc=amcsc8
  177. \let\eightsmc=\tensmc            % temporary expedient
  178.  
  179. %\font \sixteenssb=amssbx16
  180. \font \sixteenssb=amssbx10 scaled \magstep3
  181. %\font \twelvessb=amssbx12
  182. \font \twelvessb=amssbx10 scaled \magstep1
  183. \font \tenssb=amssbx10
  184. %\font \eightssb=amssbx8
  185.  
  186. %\font \seventphon=tphon7         % used in macro index and device list
  187.  
  188. \def \titlefont{\def\smc{\eightssb}\sixteenssb }    % \twelvessb
  189.  
  190.  
  191. %    Planned additions and changes:
  192. %
  193. %    Dynamic loading of fonts, probably in groups according to size
  194. %    Removal of \rm, \bf, etc., from \*point expansions, replacement
  195. %        by generic \rm, \bf, etc. definitions
  196. %    Mechanism for switching neatly between serif and sans-serif
  197.  
  198.  
  199. %    Allow text to be a bit stretchier than the built-in setting;
  200. %    TeXbook, page 433, 355
  201.  
  202. \newdimen\normaltenptstretch    \normaltenptstretch=1.6667pt
  203. \newdimen\extratenptstretch    \extratenptstretch=4pt
  204. \def\NormalTenPointSpacing{\fontdimen3\tenrm=\normaltenptstretch
  205.         \fontdimen3\tenit=\normaltenptstretch}
  206. \def\StretchyTenPointSpacing{\fontdimen3\tenrm=\extratenptstretch
  207.         \fontdimen3\tenit=\extratenptstretch}
  208.  
  209. \def \AddToTenPoint{}        % permit external additions to font
  210.  
  211. \def \tenpoint{\normalbaselineskip=12pt     % \def\pointsize@AmS{t}
  212.     \abovedisplayskip=3pt plus 3pt minus 1pt
  213.     \belowdisplayskip=3pt plus 3pt minus 1pt
  214.     \abovedisplayshortskip=0pt plus 3pt
  215.     \belowdisplayshortskip=1pt plus 3pt minus 1pt
  216.     \def\rm{\fam\z@\tenrm}%
  217.     \textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm
  218.     \def\oldstyle{\fam\@ne\teni}%
  219.     \textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei
  220.     \textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy
  221.     \textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
  222.     \def\it{\fam\itfam\tenit}%
  223.     \textfont\itfam=\tenit
  224.     \def\sl{\fam\slfam\tensl}%
  225.     \textfont\slfam=\tensl
  226.     \def\bf{\fam\bffam\tenbf}%
  227.     \textfont\bffam=\tenbf \scriptfont\bffam=\eightbf
  228.         \scriptscriptfont\bffam=\sixbf
  229. %    \def\cyr{\fam\cyrfam\tencyr}%
  230. %    \textfont\cyrfam=\tencyr \scriptfont\cyrfam=\eightcyr
  231. %        \scriptscriptfont\cyrfam=\sixcyr
  232.     \def\smc{\tensmc}%
  233.     \def\tt{\tentt}%
  234.     \def\upright{\tenupit}%
  235.     \setbox\strutbox=\hbox{\vrule height7.5pt depth2.5pt width\z@}%
  236.     \setbox\struttbox=\hbox{\vrule height8.5pt depth3.5pt width\z@}%
  237.     \normalbaselines \AddToTenPoint \rm }
  238.  
  239. \tenpoint            % initialize -- default font
  240.  
  241.  
  242. \newdimen\normalnineptstretch    \normalnineptstretch=1.5pt
  243. \newdimen\extranineptstretch    \extranineptstretch=3.6pt
  244. \def\NormalNinePointSpacing{\fontdimen3\ninerm=\normalnineptstretch}
  245. \def\StretchyNinePointSpacing{\fontdimen3\ninerm=\extranineptstretch}
  246.  
  247. \def \AddToNinePoint{}
  248.  
  249. \def \ninepoint{\normalbaselineskip=11pt
  250.     \abovedisplayskip=2.5pt plus 2.5pt minus 1pt
  251.     \belowdisplayskip=2.5pt plus 2.5pt minus 1pt
  252.     \abovedisplayshortskip=0pt plus 2.5pt
  253.     \belowdisplayshortskip=1pt plus 2.5pt minus 1pt
  254.     \def\rm{\fam\z@\ninerm}%
  255.     \textfont0=\ninerm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm
  256.     \def\oldstyle{\fam\@ne\ninei}%
  257.     \textfont1=\ninei \scriptfont1=\seveni \scriptscriptfont1=\fivei
  258.     \textfont2=\ninesy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy
  259.     \def\it{\fam\itfam\nineit}%
  260.     \textfont\itfam=\nineit
  261.     \def\sl{\fam\slfam\ninesl}%
  262.     \textfont\slfam=\ninesl
  263.     \def\bf{\fam\bffam\ninebf}%
  264.     \textfont\bffam=\ninebf \scriptfont\bffam=\sevenbf
  265.         \scriptscriptfont\bffam=\sixbf
  266. %    \def\cyr{\fam\cyrfam\ninmcyr}%
  267. %    \textfont\cyrfam=\ninmcyr \scriptfont\cyrfam=\sixcyr
  268. %        \scriptscriptfont\cyrfam=\sixcyr
  269.     \def\smc{\ninesmc}%
  270.     \def\tt{\ninett}%
  271.     \setbox\strutbox=\hbox{\vrule height 6.75pt depth 2.25pt width\z@}%
  272.     \setbox\struttbox=\hbox{\vrule height 7.25pt depth 2.75pt width\z@}%
  273.     \normalbaselines \AddToNinePoint \rm }
  274.  
  275. %        this is equivalent to baselineskip = 10pt
  276. %    \setbox\struttbox=\hbox{\vrule height 7.75pt depth 3.25pt width\z@}%
  277.  
  278.  
  279. \newdimen\normaleightptstretch    \normaleightptstretch=1.333pt
  280. \newdimen\extraeightptstretch    \extraeightptstretch=3pt
  281. \def\NormalEightPointSpacing{\fontdimen3\eightrm=\normaleightptstretch}
  282. \def\StretchyEightPointSpacing{\fontdimen3\eightrm=\extraeightptstretch}
  283.  
  284. \def \AddToEightPoint{}
  285.  
  286. \def \eightpoint{\normalbaselineskip=10pt
  287.     \abovedisplayskip=2pt plus 2pt minus 1pt
  288.     \belowdisplayskip=2pt plus 2pt minus 1pt
  289.     \abovedisplayshortskip=0pt plus 2pt
  290.     \belowdisplayshortskip=1pt plus 2pt minus 1pt
  291.     \def\rm{\fam\z@\eightrm}%
  292.     \textfont0=\eightrm \scriptfont0=\sixrm \scriptscriptfont0=\fiverm
  293.     \def\oldstyle{\fam\@ne\eighti}%
  294.     \textfont1=\eighti \scriptfont1=\sixi \scriptscriptfont1=\fivei
  295.     \textfont2=\eightsy \scriptfont2=\sixsy \scriptscriptfont2=\fivesy
  296. %    \textfont3=\eightex \scriptfont3=\eightex \scriptscriptfont3=\eightex
  297.     \def\it{\fam\itfam\eightit}%
  298.     \textfont\itfam=\eightit
  299.     \def\sl{\fam\slfam\eightsl}%
  300.     \textfont\slfam=\eightsl
  301.     \def\bf{\fam\bffam\eightbf}%
  302.     \textfont\bffam=\eightbf \scriptfont\bffam=\sixbf
  303.         \scriptscriptfont\bffam=\sixbf
  304. %    \def\cyr{\fam\cyrfam\eightcyr}%
  305. %    \textfont\cyrfam=\eightcyr \scriptfont\cyrfam=\sixcyr
  306. %        \scriptscriptfont\cyrfam=\sixcyr
  307.     \def\smc{\eightsmc}%
  308.     \def\tt{\eighttt}%
  309.     \setbox\strutbox=\hbox{\vrule height 6pt depth 2pt width\z@}%
  310.     \setbox\struttbox=\hbox{\vrule height 7pt depth 3pt width\z@}%
  311.     \normalbaselines \AddToEightPoint \rm }
  312.  
  313. %        this is equivalent to baselineskip = 9pt
  314. %    \setbox\struttbox=\hbox{\vrule height 6.5pt depth 2.5pt width\z@}%
  315.  
  316. %    PLAIN's definition of \raggedright doesn't permit any stretch, and
  317. %    results in too many overfull boxes.  Change.
  318. \newdimen\raggedskip        \raggedskip=\z@
  319. \newdimen\raggedstretch        \raggedstretch=5em
  320. \newskip\raggedparfill        \raggedparfill=\z@ plus 1fil
  321.  
  322. \def \raggedspaces{\spaceskip=.3333em \xspaceskip=.5em }
  323. %    Some applications may have to add stretch, in order to avoid
  324. %    all overfull boxes.
  325.  
  326. \def \raggedright{\rightskip=\raggedskip plus\raggedstretch \raggedspaces
  327.         \parfillskip=\raggedparfill }
  328. \def \raggedleft{\leftskip=\raggedskip plus\raggedstretch \raggedspaces 
  329.         \parfillskip=\z@ }
  330. \def \raggedcenter{\leftskip=\raggedskip plus\raggedstretch
  331.         \rightskip=\leftskip \raggedspaces 
  332.         \parfillskip=\leftskip }
  333.  
  334. \def \normalspaces{\spaceskip=.3333em plus.1667em minus.1111em
  335.         \xspaceskip=.4444em plus.5em minus.037em }
  336.  
  337. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  338. %                                          %
  339. %            *****    abbreviations    *****                  %
  340. %                                          %
  341. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  342.  
  343.  
  344. \def \careof{\leavevmode\hbox{\raise.75ex\hbox{c}\kern-.15em
  345.         /\kern-.125em\smash{\lower.3ex\hbox{o}}}}
  346. \def \d@sh#1{\nobreak\thinspace#1\penalty0\thinspace}
  347. \def \dash{\d@sh{--}}
  348. \def \Dash{\d@sh{---}}
  349.  
  350. \def \TeX{\leavevmode\hbox{T\kern-.1667em\lower.424ex\hbox{E}\kern-.125emX}}
  351. \def \TUG{\TeX\ \UG}
  352. \def \UG{Users Group}
  353. \def \TUB{TUGboat}
  354. \def \SC{Steering Committee}
  355. \def \AMS{American Mathematical Society}
  356. \def \POBox{P.\thinspace O.~Box }
  357. \def \POBoxTUG{\POBox\unskip~9506, Providence, RI~02940}
  358. \def \AMSTeX{\leavevmode\hbox{$\cal A\kern-.2em\lower.376ex
  359.     \hbox{$\cal M$}\kern-.2em\cal S$-\TeX}}
  360. \def \JoT{{\sl The Joy of \TeX}}
  361. %    note -- \LaTeX definition is from LATEX.TEX 2.08 of 27 Mar 85,
  362. %        adapted for additional flexibility in TUGboat
  363. %\def\LaTeX{{\rm L\kern-.36em\raise.3ex\hbox{\sc a}\kern-.15em
  364. %    T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}
  365. \def \LaTeX{\leavevmode L\kern-.36em\raise.3ex\hbox{\smc a}\kern-.15em\TeX}
  366. %    note -- the `official' \MF uses \font\logo=manfnt, which is not
  367. %        in general distribution (to prevent unauthorized
  368. %        reproduction of the TeXbook)
  369. \let\logo=\tenssb    % replace by manfnt if that is available
  370. \def \MF{{\logo META}\-{\logo FONT}}
  371. \def \mf{{\smc Metafont}}
  372. \def \Pas{Pascal}
  373. \def \UNIX{{\smc unix}}
  374. \def \VAX{\leavevmode\hbox{V\kern-.12em A\kern-.1em X}}
  375. \def \WEB{{\tt WEB}}
  376.  
  377.  
  378. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  379. %                                          %
  380. %            *****  page dimensions    *****                  %
  381. %                                          %
  382. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  383.  
  384.  
  385. \newdimen\trimlgt    \trimlgt=11in
  386. \newdimen\headmargin    \headmargin=3.5pc
  387. \newdimen\pagelgt
  388. \newdimen\rheadlgt    \rheadlgt=2.5pc        % + headmargin = 6pc = 1in
  389. \newdimen\toplgt    \toplgt=0pt
  390. \newdimen\normalcollgt    \normalcollgt=54pc    % 52pc for 5#2
  391. \newdimen\collgt    \collgt=\normalcollgt
  392. \newdimen\Collgt
  393. \maxdepth=2pt
  394. \newdimen\botlgt    \botlgt=0pt
  395. \newdimen\rfootlgt    \rfootlgt=2pc
  396.  
  397. \newif\ifThisIsFirstPage    \ThisIsFirstPagefalse
  398.  
  399. \def \resetpagelgt{\pagelgt=\collgt \Collgt=\collgt
  400.     \advance\pagelgt by \rheadlgt
  401.     \ifThisIsFirstPage \advance\Collgt by-\toplgt
  402.             \advance\Collgt by-\botlgt \fi
  403.     \advance\pagelgt by \maxdepth
  404.     \global\advance\pagelgt by \rfootlgt
  405.     \global\vsize=\Collgt }
  406. \def \resetfpagelgt{\global\ThisIsFirstPagetrue
  407.     \resetpagelgt }            % exclude special first page material
  408.  
  409. \resetpagelgt
  410. \raggedbottom
  411.  
  412. \newdimen\colwd
  413. \newdimen\pagewd    \pagewd=39pc
  414. \newdimen\trimwd    \trimwd=\pagewd
  415.  
  416. \def \onecol{\colwd=\pagewd        \OneCol }
  417.  
  418. \newdimen\onenarrowcolwd    \onenarrowcolwd=30pc
  419. \def \onenarrow{\colwd=\onenarrowcolwd    \OneCol }
  420.  
  421. %    before 5#2, `narrow' was 34pc
  422. \newdimen\onemediumcolwd    \onemediumcolwd=34pc
  423. \def \onemedium{\colwd=\onemediumcolwd    \OneCol }
  424.  
  425. \newdimen\twocolcolwd        \twocolcolwd=18.75pc
  426. \def \twocol{\colwd=\twocolcolwd     \TwoCol }
  427.  
  428.  
  429. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  430. %                                          %
  431. %            *****       headers/footers    *****              %
  432. %                                          %
  433. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  434.  
  435.  
  436. \def \midrtitle{}        % to allow for ``advertisements'' notice
  437.  
  438. \def \rtitlex{\TUB, \volx }
  439. \def \rtitle{\hbox to \pagewd{\tenrm
  440.     \rlap{\hbox to \pagewd{\hfil\midrtitle\hfil}}%
  441.     \ifodd\pageno \rtitlex\hfil\number\pageno
  442.     \else \number\pageno\hfil\rtitlex \fi }}
  443.  
  444. \def \runhead{\vbox to \rheadlgt{\topskip=1pc \rtitle \vfil }}
  445. \def \runfoot{\vbox to \rfootlgt{\topskip=1.5pc
  446.     \ifnum\xcol=1 \hbox to \pagewd{\midrtitle\hfil\midrtitle}\fi
  447.     \vfil }}
  448.  
  449. \def \firsthead{}
  450. \newbox\firsth@@d    \newbox\firsth@ad
  451. \long\def \setfirsthead #1{\ThisIsFirstPagetrue
  452.     \ifdim \toplgt=\z@
  453.         \global\setbox\firsth@ad=\vbox{\hsize=\pagewd #1}%
  454. %            assume that \firsth@ad ends with glue, hence no \dp
  455.         \global\toplgt=\ht\firsth@ad \resetpagelgt
  456.     \else \global\setbox\firsth@ad=\vbox to \toplgt{\hsize=\pagewd #1}%
  457.     \fi
  458.     \global\setbox\firsth@@d=\vbox to \toplgt{\vfil}%
  459.     \gdef\firsthead{\ifnum \xcol=2 \box\firsth@ad
  460.             \else \copy\firsth@@d \fi }}
  461.  
  462. \def \firstfoot{}
  463. \newbox\firstf@@t    \newbox\firstf@ot
  464. \long\def \setfirstfoot #1{\ThisIsFirstPagetrue
  465.     \ifdim \botlgt=\z@
  466.         \global\setbox\firstf@ot=\vbox{\hsize=\pagewd #1}%
  467.         \botlgt=\ht\firstf@ot
  468.         \global\advance\botlgt by \dp\firstf@ot \resetpagelgt
  469.     \else \global\setbox\firstf@ot=\vbox to \botlgt{\hsize=\pagewd #1}%
  470.     \fi
  471.     \global\setbox\firstf@@t=\vbox to \botlgt{\vfil}%
  472.     \gdef\firstfoot{\ifnum \xcol=2 \copy\firstf@ot
  473.             \else \copy\firstf@@t \fi }}
  474.  
  475.  
  476. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  477. %                                          %
  478. %            *****        output    *****                  %
  479. %                                          %
  480. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  481.  
  482.  
  483. %    In the absence of automatic column-balancing, provide a mechanism
  484. %    for manually shortening a specified page.
  485.  
  486. \newif\ifSh@rtPage        \Sh@rtPagefalse
  487. \newif\ifSh@rtPagePending    \Sh@rtPagePendingfalse
  488. \newcount\Sh@rtPageNo
  489. \newdimen\Sh@rtPageLgt
  490.  
  491. \def\@to{to}            \def\@by{by}
  492. %    #1 = to/by; #2 = \dimen; #3 = <dimen>; #4 = * of Shorten*Page
  493. \def\@toby#1#2#3#4{\def\1{#1}%
  494.     \ifx \1\@to \global #2=#3
  495.     \else \ifx \1\@by \T@stDimen=#3     % accommodate negative #3
  496.             #2=\normalcollgt \global\advance #2 by -#3
  497.         \else \errmessage{#1 is invalid syntax; \string\Shorten#4Page
  498.                 requires "to" or "by"}\fi
  499.     \fi }
  500.  
  501. \def \ShortenPage #1 #2 #3.{\global\Sh@rtPagePendingtrue
  502.         \global\Sh@rtPageNo=#1
  503.         \@toby{#2}{\Sh@rtPageLgt}{#3}{}}
  504. \def \ShortenThisPage #1 #2. {\global\Sh@rtPagetrue
  505.         \@toby{#1}{\vsize}{#2}{This}}
  506.  
  507. %    Two cases: 0 = last page was nonstandard; reset \vsize
  508. %           1 = do not reset \vsize: okay or length already reset
  509. \def \D@EndPage{\global\advancepageno
  510.     \T@stCount=1
  511.     \ifThisIsFirstPage \T@stCount=0 \global\ThisIsFirstPagefalse
  512.             \global\toplgt=\z@ \global\botlgt=\z@
  513.             \global\collgt=\normalcollgt \fi
  514.     \ifSh@rtPage \T@stCount=0 \global\Sh@rtPagefalse \fi
  515.     \ifSh@rtPagePending
  516.         \ifnum\pageno = \Sh@rtPageNo \T@stCount=1
  517.             \global\vsize=\Sh@rtPageLgt
  518.             \global\Sh@rtPagePendingfalse
  519.             \global\Sh@rtPagetrue \fi
  520.     \fi
  521.     \ifcase \T@stCount \resetpagelgt \fi }
  522.  
  523.  
  524. %    Distinuish between laser printer output (for proofing and other
  525. %    general use) and production, which uses a phototypesetter.
  526.  
  527. \newif\ifLaser            \Lasertrue
  528.  
  529.  
  530. %    Registration marks
  531.  
  532. \def \HorzR@gisterRule{\vrule height 0.2pt depth 0pt width 0.5in }
  533. \def \DownShortR@gisterRule{\vrule height 0.2pt depth 1pc width 0.2pt }
  534. \def \UpShortR@gisterRule{\vrule height 1pc depth 0pt width 0.2pt }
  535.  
  536.  
  537. %        ``T'' marks centered on top and bottom edges of paper
  538.  
  539. \def \ttopregister{\dlap{%
  540.     \hbox to \trimwd{\HorzR@gisterRule \hfil \HorzR@gisterRule
  541.             \HorzR@gisterRule \hfil \HorzR@gisterRule}%
  542.     \hbox to \trimwd{\hfil \DownShortR@gisterRule \hfil}}}
  543. \def \tbotregister{\ulap{%
  544.     \hbox to \trimwd{\hfil \UpShortR@gisterRule \hfil}%
  545.     \hbox to \trimwd{\HorzR@gisterRule \hfil \HorzR@gisterRule
  546.             \HorzR@gisterRule \hfil \HorzR@gisterRule}}}
  547.  
  548. \def \topregister{\ttopregister}
  549. \def \botregister{\tbotregister}
  550.  
  551.  
  552. %    All pages containing data are formatted by \midpage
  553.  
  554. \def \midpage#1{\vbox{%
  555.     \ifLaser \hrule height\z@ depth\z@ width\p@
  556.         \vskip-\rheadlgt
  557.     \else \vbox to \trimlgt \begingroup \basezero
  558.         \topregister
  559.         \vskip \headmargin
  560.     \fi
  561.     \vbox to \pagelgt{\basezero
  562.         \ifnum\xcol=2 \runhead
  563.         \else \vbox to \rheadlgt{}\fi
  564.         \ifThisIsFirstPage \firsthead \fi
  565.         \hbox to \pagewd{#1}%    % \vsize applied in \pagebody
  566.         \ifThisIsFirstPage \firstfoot \fi
  567.         \vfil        % if no depth, avoid underfull box
  568.         \runfoot }%
  569.     \ifLaser \else \vfill \botregister \endgroup \fi}%
  570.     \ifnum\xcol=2 \global\xcol=1 \D@EndPage
  571.     \else \global\xcol=2 \fi
  572.     \global\advance\spoolno by 1 }
  573.  
  574. %    The production version includes trim marks, which are required
  575. %    on photographic paper, but are unsuitable for laser printer output.
  576. %    The production version also generates 2 separate .dvi pages for each
  577. %    logical page; these are overlaid photographically, and allow the
  578. %    Alphatype to run more efficiently on 2-column pages.
  579. %    For laser printer output, each page is output as a unit.
  580.  
  581.  
  582. \def \newcol{\par\vfill\eject}
  583.  
  584. \newif\ifOneColFormat
  585. \newbox\SaveP@geBox
  586.  
  587. \def \OneCol{\hsize=\colwd
  588.     \gdef\newpage{\par\vfill\eject}%
  589.     \OneColFormattrue
  590.     \gdef\output@{%
  591.         \ifLaser \xcol=2 \shipout\midpage{\hfil\pagebody \hfil}%
  592.         \else \shipout\midpage{\hfil\pagebody \hfil}%
  593.             \shipout\vbox to \trimlgt{\basezero
  594.                 \topregister
  595.                 \vskip\headmargin
  596.                 \vbox to \pagelgt{\basezero
  597.                     \runhead
  598.                     \vfill }%
  599.                 \vfill
  600.                 \botregister }%
  601.             \D@EndPage
  602.             \global\xcol=1
  603.         \fi
  604.     \global\advance\spoolno by 1 }}
  605.  
  606. \def \TwoCol{\hsize=\colwd
  607.     \gdef\newpage{\par\vfill\eject
  608.             \ifnum\xcol=2 \null\vfill\eject \fi }%
  609.     \OneColFormatfalse
  610.     \gdef\output@{%    % use PLAIN's \pagebody instead of \box255
  611.         \ifnum\xcol=1
  612.             \ifLaser \global\setbox\SaveP@geBox=\vbox{\pagebody}%
  613.                 \global\xcol=2
  614.             \else \shipout\midpage{\pagebody \hfil}\fi
  615.         \else \shipout\midpage{\ifLaser \box\SaveP@geBox \fi
  616.                 \hfil\pagebody }\fi
  617.         \ifnum\outputpenalty>-\@MM \else \dosupereject \fi }}
  618.  
  619.  
  620. %    Dates and other items which identify the volume and issue
  621.  
  622. %    To use: \vol 5, 2.
  623. %        \issdate October 1984.
  624. %        \issueseqno=10
  625. %    For production, these are set in a separate file, TUGBOT.DATES,
  626. %    which is issue-specific.
  627.  
  628. \def \v@lx{\gdef\volx{Volume~\volno~(\volyr), No.~\issno}}
  629. \def \volyr{}
  630. \def \volno{}
  631. \def \vol #1,#2.{\gdef\volno{#1\unskip}%
  632.     \gdef\issno{\ignorespaces#2\unskip}%
  633.     \setbox\TestBox=\hbox{\volyr}%
  634.     \ifdim \wd\TestBox > .2em \v@lx \fi }
  635.  
  636. \def \issdate #1#2 #3.{\gdef\issdt{#1#2 #3}\gdef\volyr{#3}%
  637.     \gdef\bigissdt{#1{\smc\uppercase{#2}} #3}%
  638.     \setbox\TestBox=\hbox{\volno}%
  639.     \ifdim \wd\TestBox > .2em \v@lx \fi }
  640.  
  641.  
  642. %    TUGboat conventions include the issue number in the file name.
  643. %    Permit this to be incorporated into file names automatically.
  644. %    If issue number = 11, \Input filnam  will read tb11filnam.tex.
  645.  
  646. \newcount\issueseqno        \issueseqno=-1
  647.  
  648. \def \Input #1 {\ifnum\issueseqno<0 \def\infil@{#1}%
  649.         \else \def\infil@{tb\number\issueseqno#1}\fi
  650.         \input \infil@ }
  651.  
  652.  
  653. %    Write out (both to a file and to the log) the starting page number
  654. %    of an article, to be used for cross references and in contents.
  655. %    \pagexref  is used for articles fully processed in the TUGboat run.
  656. %    \PageXref  is used for "extra" pages, where an item is submitted
  657. %        as camera copy, and only running heads (at most) are run.
  658. \def \pagexref#1{\ifFirstPar \nobreak \fi  % don't clobber switch by accident
  659.     \write-1{\def\expandafter\noexpand\csname#1\endcsname{\number\pageno}}%
  660.     \write1{\def\expandafter\noexpand\csname#1\endcsname{\number\pageno}}%
  661.     \ifFirstPar \nobreak \fi }    % and don't allow page break
  662. \def \PageXref#1{%
  663.     \immediate\write-1{\def\expandafter
  664.             \noexpand\csname#1\endcsname{\number\pageno}}%
  665.     \immediate\write1{\def\expandafter
  666.             \noexpand\csname#1\endcsname{\number\pageno}}}
  667.  
  668.  
  669. %    Section titles and separators
  670.  
  671. \newskip\Tabskss
  672. \Tabskss=0pt plus 1000pt minus 1000pt
  673. \newskip\AboveTitleSkip  \AboveTitleSkip=12pt    % 10pt plus 2pt minus 2pt
  674. \newskip\BelowTitleSkip  \BelowTitleSkip=8pt    % plus 1pt minus 1pt
  675.  
  676. \setbox\T@stBox=\hbox{\titlefont O}
  677. \newdimen\stfontheight        \stfontheight=\ht\T@stBox
  678. \newdimen\strulethickness    \strulethickness=.6pt
  679. \def \sthrule{\hrule height\strulethickness depth 0pt }
  680. \def \stvrule{\vrule height 2\stfontheight depth\stfontheight
  681.             width\strulethickness }
  682. \def \sectitlebox #1<{\vbox{\sthrule
  683.     \hbox to \colwd{\stvrule\hfil #1\hfil\vrule width\strulethickness }%
  684.     \sthrule }}
  685.  
  686. \newif\ifSecTitle
  687. \SecTitlefalse
  688. \def \sectitle #1<{\par \SecTitletrue
  689.     \penalty-1000\vskip 5\baselineskip
  690.     \centerline{\sectitlebox \titlefont #1<}%
  691.     \nobreak \vskip\baselineskip }
  692.  
  693. %\def \secsep{\vskip\baselineskip    %  * * *  as for TUGboat pre 5#2
  694. %    \centerline{\hbox to 180pt{%
  695. %        \leaders\hbox to 15pt{\hfil\char'052\hfil}\hfill}}%
  696. %    \vskip2\baselineskip }
  697.  
  698. \def \secsep{\vskip 5\baselineskip}
  699.  
  700. \def \littlesep{\vskip 3pt plus 1pt minus 1pt
  701.     \centerline{\hbox to 90pt{\ignorespaces
  702.         \leaders\hbox to 10pt{\hfil .\hfil}\hfill} }%
  703.     \vskip 3pt plus 1pt minus 1pt}
  704.  
  705.  
  706. %    Titles, authors, subtitles, and first-paragraph formatting
  707.  
  708. \newif\ifFirstPar    \FirstParfalse
  709.  
  710. %        make the first paragraph after a title start flush left,
  711. %        then reset \parindent; but if all paragraphs should start
  712. %        flush left, then don't reset.
  713. \everypar{\ifNoParIndent
  714.     \else \ifFirstPar \NormalParIndent \FirstParfalse \fi
  715.     \fi }
  716.  
  717. %    For uppercasing title and author; from AMSPPT.STY, version 0
  718.  
  719. \def\uctext@#1{\uppercase@#1\gdef\uppercase@@{}$\m@th$}
  720. \def\uppercase@#1$#2${\gdef\uppercase@@{\uppercase@}\uppercase
  721.     {#1}${#2}$\uppercase@@}
  722.  
  723.  
  724. \newif\ifCtrTitle    \CtrTitlefalse
  725. \def \TitleUC{}            % ordinary titles uc/lc
  726. \def \titleframe #1#2#3{\ifSecTitle \SecTitlefalse
  727.     \else \vskip\AboveTitleSkip \fi
  728.     \ifCtrTitle \def\CTSkip{\unskip\hfil}\CtrTitlefalse
  729.     \else \def\CTSkip{}\fi
  730.     \vbox{#1\halign{\hbox to \hsize
  731.         {\bf\TitleUC{\CTSkip\ignorespaces##\unskip\hfil}}\strutt\cr
  732.             #2\crcr}}%
  733.     \let\oldcr=\cr\def\cr{}%
  734.     \setbox\T@stBox=\hbox{#3}%
  735.     \let\cr=\oldcr
  736.         \ifdim \wd\T@stBox < 5pt        % omit if author is null
  737.     \else \nobreak \vskip 4pt    % 4pt + \BelowTitleSkip = \baselineskip
  738.         \vbox{\halign{\hbox to \hsize
  739.             {\hskip\parindent\CTSkip\ignorespaces##\hfil}\cr
  740.                 #3\crcr}}\fi
  741.     \setbox\T@stBox=\hbox{}%
  742.     \nobreak \vskip\BelowTitleSkip
  743.     \global\parindent=0pt \global\FirstPartrue }
  744.  
  745. \def \title #1\\#2\endx{\titleframe{}{#1}{#2}}
  746. \def \Title #1\\#2\endx{\titleframe{\def\TitleUC{\uctext@}}{#1}{#2}}
  747.  
  748. \def \ctrtitle #1\\#2\endx{\CtrTitletrue\titleframe{}{#1}{#2}}
  749. \def \ctrTitle #1\\#2\endx{\CtrTitletrue
  750.     \titleframe{\def\TitleUC{\uctext@}}{#1}{#2}}
  751.  
  752. %    \subtitle and \subsubtitle are used in the announcements box
  753.  
  754. \def \subtitle #1\endx{{\CtrTitletrue        % \AboveTitleSkip=10pt
  755.     \titleframe{}{#1}{}}}
  756.  
  757. \def \subsubtitle #1\endx{{\CtrTitletrue
  758.     \ifFirstPar \AboveTitleSkip=0pt \fi    % \else \AboveTitleSkip=10pt
  759.     \titleframe{}{\sl#1}{}}}
  760.  
  761. %    \section  was first defined for Jacques Desarmenien's article in 5#2
  762. \def\section #1 #2\par{\ifFirstPar \nobreak
  763.     \else \penalty-200 \vskip 8pt \fi
  764.     \noindent{\bf\hbox to \normalparindent{#1\hfil}#2}\endgraf
  765.     \nobreak \vskip 4pt \parindent=0pt \FirstPartrue }
  766.  
  767.  
  768. %    Define address blocks and other structures that use \obeylines
  769. %    in the context  \tag ...<
  770. %    This requires that < be active, so that \obeylines is invoked
  771. %    at the outer level.  \tag{...} will not deliver the data with
  772. %    ^M (carriage return) intact, so is not a suitable format for
  773. %    any construction using \obeylines; the reference (if any) in
  774. %    The TeXbook has not been found, and this information has been
  775. %    determined empirically, referring to \obeylines constructions
  776. %    in PLAIN and MANMAC.TeX (The TeXbook macros).
  777.  
  778. {\catcode`\<=\active \obeylines
  779. \gdef\AddrFrame#1#2{\endgraf\def\Phone{\leavevmode\kern\parindent}#1%
  780.     \catcode`\<=\active %
  781. %        next line intentionally ends with <cr> %
  782.     \def<{
  783.         \egroup\catcode`\<=12 #2 }\bgroup \obeylines }%
  784. \gdef\LetterAddr{\AddrFrame{\smallskip}{}}%
  785. \gdef\TextAddr{\AddrFrame{}{}}%
  786. \gdef\Submitted{\nobreak\AddrFrame{\smallskip \parindent=2\normalparindent %
  787.         \def\Signed{\parfillskip=\normalparindent \qquad\hfil }}{}}%
  788. \gdef\Columnist{\AddrFrame{\FirstParfalse %
  789.         \def\NetAddr{\smallskip \indent\indent }%
  790.         \def\Phone{\NetAddr }}%
  791.     {\nobreak \vskip\BelowTitleSkip %
  792.         \global\parindent=0pt \global\FirstPartrue }\sl }%
  793. }
  794.  
  795.  
  796. %    Support verbatim listing of TeX source, as defined in TeXbook, p. 421;
  797. %    lifted from MANMAC.TEX, and modified slightly for narrower columns.
  798.  
  799. \chardef\other=12
  800. \def\ttverbatim{\begingroup
  801.   \catcode`\\=\other \catcode`\{=\other
  802.   \catcode`\}=\other \catcode`\$=\other \catcode`\&=\other
  803.   \catcode`\#=\other \catcode`\%=\other \catcode`\~=\other
  804.   \catcode`\_=\other \catcode`\^=\other
  805.   \obeyspaces \obeylines \tt}
  806.  
  807. \newdimen\ttrightskip
  808. \ttrightskip=5pc
  809.    
  810. \outer\def\begintt{$$\let\par=\endgraf \ttverbatim \parskip=\z@
  811.   \catcode`\|=0 \rightskip=-\ttrightskip \ttfinish}
  812. {\catcode`\|=0 |catcode`|\=\other % | is temporary escape character
  813.   |obeylines % end of line is active
  814.   |gdef|ttfinish#1^^M#2\endtt{#1|vbox{#2}|endgroup$$}}
  815.  
  816. \catcode`\|=\active
  817. {\obeylines \gdef|{\ttverbatim \spaceskip\ttglue \let^^M=\  \let|=\endgroup}}
  818.  
  819. \newskip\ttglue
  820. {\tenpoint\tt \global\ttglue=.5em plus .25em minus .15em}
  821. % this should be installed in each font
  822.  
  823. \chardef\bs='134        % for \tt mode
  824.  
  825.  
  826. %    Define a structure that will permit a list (using \obeylines)
  827. %    to be made into 2 columns, split by \vsplit, indented the
  828. %    normal \parindent
  829.  
  830. \def \NormalizeBlockHeight{\TestCount=1                % \@ne
  831.     \TestDimen=\dimen0 \advance\TestDimen by-\topskip
  832.     \CutOneLine }
  833. \def \CutOneLine{\advance\TestCount by 1 \advance\TestDimen by-\baselineskip
  834.     \ifdim\TestDimen < \baselineskip            % \@ne
  835.         \def\result{\TestDimen=\baselineskip
  836.             \multiply\TestDimen by \TestCount
  837.             \advance\TestDimen by \topskip
  838.             \global\dimen0=\TestDimen }%
  839.     \else \def\result{\CutOneLine }\fi \result }
  840.  
  841. \def \twosplit{{\topskip=\baselineskip \splittopskip=\topskip
  842.     \setbox0=\copy\TestBox
  843.     \dimen0=\ht\TestBox
  844.     \NormalizeBlockHeight
  845.     \divide\dimen0 by 2
  846.     \setbox\LeftHalf=\vsplit\TestBox to \dimen0
  847.     \ifdim\ht\TestBox > \ht\LeftHalf
  848.         \advance\dimen0 by \baselineskip
  849.         \setbox\TestBox=\copy0
  850.         \setbox\LeftHalf=\vsplit\TestBox to \dimen0
  851.     \fi
  852.     \line{\kern\parindent\valign{##\vfil\cr
  853.         \unvbox\LeftHalf\cr\noalign{\hfil}\unvbox\TestBox\cr}}}%
  854.     \global\setbox0=\null}
  855.  
  856. \newbox\LeftHalf
  857. \newdimen\HalfWd
  858. \HalfWd=\twocolcolwd
  859. \advance\HalfWd by-\normalparindent
  860. \divide\HalfWd by 2
  861.  
  862. {\obeylines
  863. \gdef\twouplist #1{\topskip=\baselineskip \splittopskip=\topskip %
  864.     \begingroup \parindent=0pt \obeylines
  865. %            next line ends with intentional <cr>
  866.     \def\endtwouplist{
  867.             \egroup %         % end of \vbox
  868.             \endgroup %        % end of \obeylines group
  869.             \twosplit }%
  870.     \global\setbox\TestBox=\vbox\bgroup\hsize=\HalfWd %
  871.         \indent\vrule height\topskip width 0pt #1}%
  872. }
  873.  
  874.  
  875. %    Tags for special formatting of editor's notes, meeting
  876. %    attendees lists, etc.
  877.  
  878. \def \Editor{\noindent To the Editor:\par}
  879. \def \EdN@te{{\tenupit Editor's note:\enspace }}
  880. \def \EdNote #1{\if #1[\unskip\hskip1em [\thinspace\EdN@te\ignorespaces
  881.     \else \ifFirstPar \else \medskip\noindent \fi
  882.         \EdN@te #1\fi }
  883.  
  884. \def \Attendee #1 {\par \noindent\hangindent 2\normalparindent
  885.     \hbox to .5\normalparindent{\hfil #1\thinspace}\ignorespaces}
  886.  
  887. \def \Dag{\raise .6ex\hbox{$\scriptstyle\dagger$}}
  888.  
  889.  
  890. %    Footnotes are mainly supported by PLAIN format, with these
  891. %    exceptions.
  892.  
  893. \skip\footins=24pt        % full blank line
  894. \def\footnoterule{\kern-8pt
  895.         \hrule width 5pc \kern 7.6pt } % the \hrule is .4pt high
  896.  
  897.  
  898. %    Draw a box around a whole page, e.g. announcements page;
  899. %    format must be \onenarrow or \onemedium, and start on a new page.
  900.  
  901. \def \bigbox{\hrule \hbox\bgroup \vrule\kern 1pc
  902.     \vbox\bgroup \vskip 1pc }
  903. \def \endbox{\endgraf \vskip 1pc \egroup \kern 1pc\vrule \egroup \hrule }
  904.  
  905.  
  906. %    Macros to produce extra running heads for stripping onto pages
  907. %    received as camera copy.  Format must be preset to \OneCol, and
  908. %    start on a new page.
  909.  
  910. %    Generate 5 (4 + normal running head) per page.
  911. %    Although \pageno is mostly self-adjusting, adjust the count
  912. %    explicitly to accommodate running heads on first and last pages.
  913.  
  914. \newcount\ExtraP@ges
  915.  
  916. \def \DrawT@pLines{\vskip\topskip
  917.     \ulap{\line{\raise 1ex\rlap{\leaders\hrule\hskip\pagewd}%
  918.             \leaders\hrule\hfill}}\medskip}
  919.  
  920. \def \r@nhead{\vbox to .23\vsize{\basezero \hsize=\pagewd \vfil
  921.     \topregister \vskip\headmargin \runhead \DrawT@pLines }\medskip
  922.     \advancepageno }
  923.  
  924. \def \nextrunner{\advance\TestCount by 1
  925.     \ifnum\TestCount = 1 \DrawT@pLines \fi
  926.     \ifnum\pageno > \ExtraP@ges \def\result{\newpage }%
  927.     \else \def\result{\r@nhead 
  928.         \ifnum\TestCount = 4 \TestCount=0 \eject \fi
  929.         \nextrunner }\fi
  930.     \result }
  931.  
  932. %    Since extra running heads are always started on a new page,
  933. %    there is always 1 `free' running head; if they require more
  934. %    than 1 page, the running head on the last page is also `free'.
  935. \def \ExtraRunheads #1, #2.{\ExtraP@ges=#1
  936.     \ifnum\ExtraP@ges > 5 \advance\ExtraP@ges by -2
  937.     \else \advance\ExtraP@ges by -2 \fi
  938.     \advance\ExtraP@ges by \pageno
  939.     \gdef\pageprefix{#2}%    % as in A-10 for appendices; not used just now
  940.     \TestCount=0 \nextrunner }
  941.  
  942.  
  943. \catcode`\@=12
  944. %        @ is prohibited in AMS-TeX, but should not be in TUGboat
  945.  
  946. %    some hyphenation exceptions:
  947. \hyphenation{man-u-script man-u-scripts}
  948.  
  949. \endinput
  950.  
  951. \tracingonline=1
  952. \showbox255
  953.