|
|
1.1 ! root 1: % UCI Dissertation Style for AmSTeX. ! 2: % Tim Morgan with many suggestions, bug fixes, etc, from Marshall Rose ! 3: % Based originally on Michael Spivak's AMSPPT.STY. ! 4: ! 5: % When edits are made to this file, the version number should be incremented. ! 6: \def\version{88} ! 7: ! 8: % Assumes the following hidden definitions from plain.tex: ! 9: % \z@ is defined from plain.tex as 0pt (and magically can ! 10: % be used as the integer constant 0 also). ! 11: % \p@ is the same, but 1pt ! 12: % \@ne is 1 ! 13: % \m@ne is -1 ! 14: % \tw@ is 2 ! 15: % \thr@@ is 3 ! 16: % \@m is 1000 ! 17: % \@M is 10000 ! 18: % And the following scratch register definitions: ! 19: % \dimen@ is \dimendef'd to be \dimen0 ! 20: % \skip@ is \skipdef'd to be \skip0 ! 21: % \count@ is \count255 ! 22: ! 23: \catcode`\@=11 % So we can use a special character ! 24: ! 25: ! 26: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! 27: % PARAMETERS DIFFERENT THAN IN PLAIN % ! 28: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! 29: ! 30: % These are words which TeX doesn't hyphenate perfectly. ! 31: % Unfortunately, the plural forms must be included also. ! 32: \hyphenation{com-put-er com-mun ap-pen-dix cart-wheel data-base Dijk-stra} ! 33: \hyphenation{in-fra-struc-ture man-u-script mi-cro-fiche para-mil-i-tary} ! 34: \hyphenation{post-am-ble pre-am-ble sub-scrib-er wave-guide sub-scrib-ers} ! 35: \hyphenation{com-put-ers cart-wheels data-bases in-fra-struc-tures} ! 36: \hyphenation{man-u-scripts mi-cro-fiches post-am-bles pre-am-bles} ! 37: ! 38: ! 39: \def\normal@topskip{0.48cm} ! 40: \topskip=\normal@topskip % For correct page positioning, do NOT ! 41: \hoffset=0.5in % change any of these values!!! ! 42: \voffset=0.07cm ! 43: \hsize=15.2cm ! 44: \vsize=22.2cm ! 45: ! 46: \normallineskiplimit=\p@ % Min. dist. btw. lines. ! 47: \parindent=1cm % Normal indentation. ! 48: \hfuzz=0.145pt % So we hear fewer complaints; this value is ok ! 49: \vfuzz=0.145pt % at 240 dpi. ! 50: ! 51: \pretolerance=200 % At 12pt, these margins are kind of narrow ! 52: \tolerance=300 % so we have to be more tolerant. ! 53: \clubpenalty=\@M % Never allow these. ! 54: \widowpenalty=\@M ! 55: \newlinechar=`\^^J % For writing output to tty. ! 56: \uchyph=\z@ % Don't take any chances. ! 57: \brokenpenalty=\@M % Never hyphenate last line on a page. ! 58: ! 59: ! 60: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! 61: % PARAMETERS DIFFERENT from AMSTEX % ! 62: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! 63: ! 64: \TagsOnRight % Set tags like a sane person does ! 65: ! 66: ! 67: %%%%%%%%%%%%%%%%%%%%%%%% ! 68: % EXTRA FONTS NEEDED % ! 69: %%%%%%%%%%%%%%%%%%%%%%%% ! 70: ! 71: \newif\ifolddigits ! 72: \olddigitsfalse % Allow use of amcscod10 for citations ! 73: \def\useolddigits{% ! 74: \olddigitstrue ! 75: \oktell{Using Old Digits}% ! 76: } ! 77: ! 78: \font\sixrm=amr6 \font\sixbf=ambx6 ! 79: \font\sixi=ammi6 \skewchar\sixi='177 ! 80: \font\sixsy=amsy6 \skewchar\sixsy='60 ! 81: ! 82: \font\eightrm=amr8 \font\eightsl=amsl8 \font\eightit=amti8 ! 83: \font\eightsy=amsy8 \skewchar\eightsy='60 ! 84: \skewchar\eightsy='60 \font\eightbf=ambx8 ! 85: \font\eightex=amex10 at 8pt ! 86: \font\eighti=ammi8 \skewchar\eighti='177 ! 87: ! 88: \font\ninerm=amr9 \font\nineit=amti9 ! 89: \font\ninei=ammi9 \skewchar\ninei='177 ! 90: \font\ninesy=amsy9 \skewchar\ninesy='60 ! 91: \font\ninesl=amsl9 \font\ninebf=ambx9 ! 92: ! 93: \font\twelvecsc=amcsc10 scaled \magstep1 ! 94: \font\tencsc=amcsc10 ! 95: \font\eightcsc=amcsc10 at 8pt ! 96: \font\elevencsc=amcsc10 scaled \magstephalf ! 97: \font\ninecsc=amcsc10 at 9pt ! 98: ! 99: \font\tencscod=amcscod10 ! 100: \font\eightcscod=amcscod10 at 8pt ! 101: ! 102: \font\eightsf=amss10 at 8pt ! 103: \font\tensf=amss10 ! 104: \font\twelvesf=amss10 at 12pt ! 105: ! 106: \font\twelvett=amtt10 scaled \magstep1 ! 107: \font\eighttt=amtt10 at 8pt % \tentt is predefined in plain.tex ! 108: ! 109: \font\twelvebti=cmbti at 12pt ! 110: \font\tenbti=cmbti ! 111: \font\eightbti=cmbti at 8pt ! 112: ! 113: \font\twelveex=amex10 scaled \magstep1 \font\twelverm=amr10 scaled \magstep1 ! 114: \font\twelvesl=amsl10 scaled \magstep1 \font\twelvebf=ambx10 scaled \magstep1 ! 115: \font\twelvei=ammi10 scaled \magstep1 \skewchar\twelvei='177 ! 116: \font\twelvesy=amsy10 scaled \magstep1 \skewchar\twelvesy='60 ! 117: \font\twelveit=amti10 scaled \magstep1 ! 118: ! 119: \font\twelvechap@font=amssbx10 at 14pt ! 120: \font\twelvesec@font=amss10 at 13pt ! 121: \font\twelvesubsec@font=amssi10 scaled \magstep1 ! 122: ! 123: \font\tenchap@font=amssbx10 scaled \magstep1 ! 124: \font\tensec@font=amssbx10 scaled \magstephalf ! 125: \font\tensubsec@font=amssi10 ! 126: ! 127: \font\eightchap@font=amssbx10 ! 128: \font\eightsec@font=amss10 at 9pt ! 129: \font\eightsubsec@font=amssqi8 ! 130: ! 131: % Font selection ! 132: \newcount\font@no ! 133: \def\curfont{\ifcase\font@no\rm\or\it\or\sl\or\bf\or\tt\or\csc\or\bti\or\sf ! 134: \else\errmessage{Internal font confusion}} ! 135: ! 136: %%%%%%%%%%%%%%%%%%%%% ! 137: % SPACING CONTROL % ! 138: %%%%%%%%%%%%%%%%%%%%% ! 139: ! 140: \newskip\normalabovedisplayskip ! 141: \newskip\normalbelowdisplayskip ! 142: \newskip\normalabovedisplayshortskip ! 143: \newskip\normalbelowdisplayshortskip ! 144: \newdimen\normalparskip \normalparskip=22.5pt ! 145: \newdimen\parstretch \parstretch=8pt ! 146: ! 147: \newif\ifsinglespacing % Tells if we are currently in single space mode ! 148: \newif\ifhalfspacing % Special version of singlespacing, a little bigger. ! 149: ! 150: % Actually tell TeX what spacing is wanted ! 151: \def\setbaselines{% ! 152: \baselineskip=\normalbaselineskip ! 153: \abovedisplayskip=\normalabovedisplayskip ! 154: \belowdisplayskip=\normalbelowdisplayskip ! 155: \abovedisplayshortskip=\normalabovedisplayshortskip ! 156: \belowdisplayshortskip=\normalbelowdisplayshortskip ! 157: % Compute \parskip for even paragraph spacing at all pt sizes ! 158: \dimen@=\normalparskip ! 159: \advance\dimen@ by -\normalbaselineskip ! 160: \parskip=\dimen@ plus\parstretch ! 161: } ! 162: ! 163: % Go from double to single spacing ! 164: \def\reducespacing{% ! 165: \normalbaselineskip=0.64\normalbaselineskip ! 166: \normalabovedisplayskip=0.64\normalabovedisplayskip ! 167: \normalbelowdisplayskip=0.64\normalbelowdisplayskip ! 168: \normalabovedisplayshortskip=0.64\normalabovedisplayshortskip ! 169: \normalbelowdisplayshortskip=0.64\normalbelowdisplayshortskip ! 170: } ! 171: ! 172: % Set halfspacing baseline etc starting from singlespacing mode ! 173: \def\sethalfspacing{% ! 174: \normalbaselineskip=1.28125\normalbaselineskip ! 175: \abovedisplayskip=1.28125\abovedisplayskip ! 176: \belowdisplayskip=1.28125\belowdisplayskip ! 177: \abovedisplayshortskip=1.28125\abovedisplayshortskip ! 178: \belowdisplayshortskip=1.28125\belowdisplayshortskip ! 179: } ! 180: ! 181: % Go to single spacing if we're not there already ! 182: \def\singlespace{% ! 183: \normalspacing \reducespacing ! 184: \halfspacingfalse \singlespacingtrue ! 185: \setbaselines ! 186: } ! 187: ! 188: % Go to 1-1/2 spacing. ! 189: \def\halfspace{% ! 190: \normalspacing \reducespacing \sethalfspacing ! 191: \singlespacingtrue \halfspacingtrue ! 192: \setbaselines ! 193: } ! 194: ! 195: % Go to normal, doublespacing mode ! 196: \def\doublespace{% ! 197: \normalspacing ! 198: \singlespacingfalse \halfspacingfalse ! 199: \setbaselines ! 200: } ! 201: ! 202: % Make sure we're doing the spacing we're supposed to be. ! 203: \def\setspacing{% ! 204: \normalspacing ! 205: \ifsinglespacing ! 206: \reducespacing ! 207: \ifhalfspacing \sethalfspacing \fi ! 208: \fi ! 209: \setbaselines ! 210: } ! 211: ! 212: ! 213: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! 214: % FOUR DIFFERENT POINT SIZES % ! 215: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! 216: ! 217: \def\twelvepoint{% ! 218: \def\big@@AmS{10.2\p@}% ! 219: \def\Big@@AmS{13.8\p@}% ! 220: \def\bigg@@AmS{17.4\p@}% ! 221: \def\Bigg@@AmS{21.0\p@}% ! 222: \let\smallertype=\tenpoint ! 223: \def\biggertype{\errmessage{No larger point size available}}% ! 224: \def\normalspacing{% ! 225: \normalbaselineskip=22.8pt ! 226: \normalabovedisplayskip=14.5pt plus 3pt minus 9pt ! 227: \normalbelowdisplayskip=14.5pt plus 3pt minus 9pt ! 228: \normalabovedisplayshortskip=\z@ plus 4pt ! 229: \normalbelowdisplayshortskip=9pt plus 4pt minus 5pt ! 230: }% ! 231: \def\rm{\font@no=0\fam\z@\twelverm}% ! 232: \def\it{\font@no=1\fam\itfam\twelveit}% ! 233: \def\sl{\font@no=2\fam\slfam\twelvesl}% ! 234: \def\bf{\font@no=3\fam\bffam\twelvebf}% ! 235: \def\tt{\font@no=4\fam\ttfam\twelvett \spaceskip.5em plus.25em ! 236: minus.15em }% ! 237: \def\csc{\font@no=5\twelvecsc}% ! 238: \def\bti{\font@no=6\twelvebti}% ! 239: \def\sf{\font@no=7\twelvesf}% ! 240: \let\sc=\csc ! 241: \ifolddigits ! 242: \let\cite@font=\tencscod ! 243: \else ! 244: \let\cite@font=\elevencsc ! 245: \fi ! 246: \textfont\z@=\twelverm \scriptfont\z@=\ninerm \scriptscriptfont\z@=\sixrm ! 247: \textfont\@ne=\twelvei \scriptfont\@ne=\ninei \scriptscriptfont\@ne=\sixi ! 248: \textfont\tw@=\twelvesy \scriptfont\tw@=\ninesy \scriptscriptfont\tw@=\sixsy ! 249: \textfont\thr@@=\twelveex \scriptfont\thr@@=\twelveex ! 250: \scriptscriptfont\thr@@=\twelveex ! 251: \textfont\itfam=\twelveit ! 252: \textfont\slfam=\twelvesl ! 253: \textfont\ttfam=\twelvett ! 254: \textfont\bffam=\twelvebf \scriptfont\bffam=\ninebf ! 255: \scriptscriptfont\bffam=\sixbf ! 256: \let\chap@font=\twelvechap@font ! 257: \let\sec@font=\twelvesec@font ! 258: \let\subsec@font=\twelvesubsec@font ! 259: \def\oldstyle{\fam1\twelvei}% ! 260: \setspacing ! 261: \curfont ! 262: \ifundefined{everypointsize}\else\everypointsize{twelve}{12}\fi ! 263: } ! 264: ! 265: \def\tenpoint{% ! 266: \def\big@@AmS{8.5\p@}% ! 267: \def\Big@@AmS{11.5\p@}% ! 268: \def\bigg@@AmS{14.5\p@}% ! 269: \def\Bigg@@AmS{17.5\p@}% ! 270: \let\smallertype=\eightnpoint ! 271: \let\biggertype=\twelvepoint ! 272: \def\normalspacing{% ! 273: \normalbaselineskip=18.9pt ! 274: \normalabovedisplayskip=12pt plus 3pt minus 9pt ! 275: \normalbelowdisplayskip=12pt plus 3pt minus 9pt ! 276: \normalabovedisplayshortskip=\z@ plus 3pt ! 277: \normalbelowdisplayshortskip=7pt plus 3pt minus 4pt ! 278: }% ! 279: \def\rm{\font@no=0\fam\z@\tenrm}% ! 280: \def\it{\font@no=1\fam\itfam\tenit}% ! 281: \def\sl{\font@no=2\fam\slfam\tensl}% ! 282: \def\bf{\font@no=3\fam\bffam\tenbf}% ! 283: \def\tt{\font@no=4\fam\ttfam\tentt \spaceskip.5em plus.25em ! 284: minus.15em }% ! 285: \def\csc{\font@no=5\tencsc} ! 286: \def\bti{\font@no=6\tenbti}% ! 287: \def\sf{\font@no=7\tensf}% ! 288: \let\sc=\csc ! 289: \ifolddigits ! 290: \let\cite@font=\eightcscod ! 291: \else ! 292: \let\cite@font=\ninecsc ! 293: \fi ! 294: \textfont\z@=\tenrm \scriptfont\z@=\sevenrm \scriptscriptfont\z@=\fiverm ! 295: \textfont\@ne=\teni \scriptfont\@ne=\seveni \scriptscriptfont\@ne=\fivei ! 296: \textfont\tw@=\tensy \scriptfont\tw@=\sevensy \scriptscriptfont\tw@=\fivesy ! 297: \textfont\thr@@=\tenex \scriptfont\thr@@=\tenex ! 298: \scriptscriptfont\thr@@=\tenex ! 299: \textfont\itfam=\tenit ! 300: \textfont\slfam=\tensl ! 301: \textfont\ttfam=\tentt ! 302: \textfont\bffam=\tenbf \scriptfont\bffam=\sevenbf ! 303: \scriptscriptfont\bffam=\fivebf ! 304: \let\chap@font=\tenchap@font ! 305: \let\sec@font=\tensec@font ! 306: \let\subsec@font=\tensubsec@font ! 307: \def\oldstyle{\fam1\teni}% ! 308: \setspacing ! 309: \curfont ! 310: \ifundefined{everypointsize}\else\everypointsize{ten}{10}\fi ! 311: } ! 312: ! 313: \def\eightpoint{% ! 314: \def\big@@AmS{6.8\p@}% ! 315: \def\Big@@AmS{9.2\p@}% ! 316: \def\bigg@@AmS{11.6\p@}% ! 317: \def\Bigg@@AmS{14.0\p@}% ! 318: \def\smallertype{\errmessage{No smaller point size available}}% ! 319: \let\biggertype=\tenpoint ! 320: \def\normalspacing{% ! 321: \normalbaselineskip=15pt ! 322: \normalabovedisplayskip=10pt plus 2.4pt minus 7.2pt ! 323: \normalbelowdisplayskip=10pt plus 2.4pt minus 7.2pt ! 324: \normalabovedisplayshortskip=\z@ plus 2.4pt ! 325: \normalbelowdisplayshortskip=55.6pt plus 2.4pt minus 3.2pt ! 326: }% ! 327: \def\rm{\font@no=0\fam\z@\eightrm}% ! 328: \def\it{\font@no=1\fam\itfam\eightit}% ! 329: \def\sl{\font@no=2\fam\slfam\eightsl}% ! 330: \def\bf{\font@no=3\fam\bffam\eightbf}% ! 331: \def\tt{\font@no=4\fam\ttfam\eighttt \spaceskip.5em plus.25em ! 332: minus.15em }% ! 333: \def\csc{\font@no=5\eightcsc}% ! 334: \def\bti{\font@no=6\eightbti}% ! 335: \def\sf{\font@no=7\eightsf}% ! 336: \let\sc=\csc ! 337: \def\cite@font{\errmessage{You may not do citations in 8 point}} ! 338: \textfont\z@=\eightrm \scriptfont\z@=\sixrm \scriptscriptfont\z@=\fiverm ! 339: \textfont\@ne=\eighti \scriptfont\@ne=\sixi \scriptscriptfont\@ne=\fivei ! 340: \textfont\tw@=\eightsy \scriptfont\tw@=\sixsy \scriptscriptfont\tw@=\fivesy ! 341: \textfont\thr@@=\eightex \scriptfont\thr@@=\eightex ! 342: \scriptscriptfont\thr@@=\eightex ! 343: \textfont\itfam=\eightit ! 344: \textfont\slfam=\eightsl ! 345: \textfont\ttfam=\eighttt ! 346: \textfont\bffam=\eightbf \scriptfont\bffam=\sixbf ! 347: \scriptscriptfont\bffam=\fivebf ! 348: \let\chap@font=\eightchap@font ! 349: \let\sec@font=\eightsec@font ! 350: \let\subsec@font=\eightsubsec@font ! 351: \def\oldstyle{\fam1\eighti}% ! 352: \setspacing ! 353: \curfont ! 354: \ifundefined{everypointsize}\else\everypointsize{eight}{10}\fi ! 355: } ! 356: ! 357: ! 358: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! 359: % TABLE of CONTENTS Macros % ! 360: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! 361: ! 362: % This set of macros allows you to build a table of contents for a document ! 363: % automatically in TeX. There are only three control sequences which you ! 364: % will need to use. The first is \inicont, which initializes the macros. ! 365: % This package works by writing the appropriate lines into a file called ! 366: % CONTENTS.tex in your account. This file is read by \printcontents or ! 367: % by \printcont in PRINT-PRELIM.TEX. ! 368: % ! 369: \newwrite\cont@file % Get a free channel to write to ! 370: \newif\ifcont@closed ! 371: \cont@closedtrue % Haven't opened contents file yet ! 372: \newwrite\fig@file ! 373: \newwrite\tab@file ! 374: \newif\iffig@closed ! 375: \fig@closedtrue % Or the list of figures file ! 376: \newif\iftab@closed ! 377: \tab@closedtrue % Or the tables file ! 378: ! 379: \def\contitle{CONTENTS} % Default name of contents file ! 380: \let\contfile=\contitle ! 381: \def\figtitle{FIGURES} % ditto for figures file ! 382: \let\figfile=\figtitle ! 383: \def\tabtitle{TABLES} % ditto for tables file ! 384: \let\tabfile=\tabtitle ! 385: ! 386: % ! 387: % This control sequence adds its argument to the table of contents. ! 388: % ! 389: \def\content#1{% ! 390: \ifcont@closed ! 391: \openout\cont@file=\contfile ! 392: \cont@closedfalse ! 393: \fi ! 394: \let\\=\space ! 395: \write\cont@file{\string\Z{#1}{\the\pageno}}% ! 396: } ! 397: ! 398: % ! 399: % This control sequence is the same as \content except that the first ! 400: % box written will have two leading spaces to indent it. ! 401: % ! 402: \def\subcontent#1{% ! 403: \ifcont@closed ! 404: \openout\cont@file=\contfile ! 405: \cont@closedfalse ! 406: \fi ! 407: \let\\=\space ! 408: \write\cont@file{\string\Z{\string\hskip \parindent{}#1}{\the\pageno}}% ! 409: } ! 410: ! 411: % And the same thing for sub-sections ! 412: \def\subsubcontent#1{% ! 413: \ifcont@closed ! 414: \openout\cont@file=\contfile ! 415: \cont@closedfalse ! 416: \fi ! 417: \let\\=\space ! 418: \write\cont@file{\string\Z{\string\hskip 2\parindent{}#1}{\the\pageno}}% ! 419: } ! 420: ! 421: % And the same thing for sub-sub-sections ! 422: \def\subsubsubcontent#1{% ! 423: \ifcont@closed ! 424: \openout\cont@file=\contfile ! 425: \cont@closedfalse ! 426: \fi ! 427: \let\\=\space ! 428: \write\cont@file{\string\Z{\string\hskip 3\parindent{}#1}{\the\pageno}}% ! 429: } ! 430: ! 431: % Simple table-of-contents printer for \articlestyle. ! 432: % For dissertations, use the one in print-prelim.tex. ! 433: % Use this macro as the last thing in your report, since it makes ! 434: % the page numbers be in romannumerals at the bottom of the page. ! 435: \def\printcontents{% ! 436: \closeout \cont@file ! 437: \vfill\supereject % Close output, end last page ! 438: \twelvepoint\rm % Make sure we're in normal mode ! 439: \pageno=\m@ne % Contents get roman numerals. ! 440: \plain@page@numbers % Put page #s at bottom only ! 441: \oktell{Table of Contents} ! 442: \null \vskip .8in minus\baselineskip ! 443: \centerline{\chap@font Contents} ! 444: \vskip \tw@\baselineskip ! 445: \rightline{Page} ! 446: \begingroup % Temporarily change \baselineskip to avoid ! 447: % underfull \vbox's during output errors. ! 448: \baselineskip=\@ne\baselineskip plus .05\baselineskip ! 449: \def\Z##1##2{\line{\ignorespaces##1\leaders ! 450: \hbox to.7em{.\hfil}\hfil\hbox to2em{\hss##2}}} ! 451: \catcode`@=11 ! 452: \let\\=\space ! 453: \input\contfile \relax ! 454: \endgroup % Also undoes the \catcode change ! 455: } ! 456: ! 457: ! 458: %%%%%%%%%%%%%%%%%%%%%%%% ! 459: % NUMBERED FOOTNOTES % ! 460: %%%%%%%%%%%%%%%%%%%%%%%% ! 461: ! 462: % First, modify \vfootnote from Plain to use smallertype and singlespace ! 463: \def\vfootnote#1{% ! 464: \insert\footins\bgroup\smallertype\singlespace ! 465: \interlinepenalty\interfootnotelinepenalty ! 466: \splittopskip\ht\strutbox % top baseline for broken footnotes ! 467: \splitmaxdepth\dp\strutbox \floatingpenalty\@MM ! 468: \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip ! 469: \textindent{#1}\footstrut\futurelet\next\fo@t ! 470: } ! 471: ! 472: % Allocate a counter for the numbered footnotes ! 473: \newcount\note@count \note@count=\@ne ! 474: ! 475: \def\nfootnote#1{% ! 476: \unskip\footnote{$^{\number\note@count}$}{#1}% ! 477: \global\advance\note@count by\@ne ! 478: } ! 479: ! 480: % Same except that trailing period or comma is ``tucked'' under ! 481: % the note mark. \ntucknote provides auto numbering. ! 482: \def\ntucknote#1#2{\nfootnote{#1}\llap{#2}} ! 483: \def\tucknote#1#2#3{\footnote{#1}{#2}\llap{#3}} ! 484: ! 485: ! 486: %%%%%%%%%%%%%%%%%%%% ! 487: % UTILITY MACROS % ! 488: %%%%%%%%%%%%%%%%%%%% ! 489: ! 490: % Insert a discretionary hyphen. For use in restricted ! 491: % horizontal mode, as in the bibliography. ! 492: \def\hyphenbreak{\discretionary{-}{}{-}} ! 493: ! 494: % Check if a macro name is currently undefined (from The TeXbook) ! 495: \def\ifundefined#1{\expandafter\ifx\csname#1\endcsname\relax} ! 496: ! 497: % Terminal input and output routines and auxilary stuff ! 498: \newwrite\undef@out@chan % Allocate a channel for the tty ! 499: \def\tell#1{{\let\\=\space\immediate\write\undef@out@chan{#1}}} ! 500: \def\ask#1{\read-16 to #1} % Read from tty w/o prompt ! 501: ! 502: % Sanitize a string before \write'ing it. ! 503: % Call with \unexpanded{op}{msg} ! 504: % Modified from version in The TeXbook, originally by Todd Allen ! 505: \long\def\unexpanded#1#2{% ! 506: \def\finwrite{#1}% ! 507: {\aftergroup\finwrite\aftergroup{\sanitize@uci#2\endsanity@uci}}% ! 508: } ! 509: \def\sanitize@uci{\futurelet\next@uci\sanswitch@uci} ! 510: \def\sanswitch@uci{\ifx\next@uci\endsanity@uci ! 511: \else\ifx\next@uci\\\aftergroup\space\let\next@uci=\eat@uci ! 512: \else\ifcat\noexpand\next@uci\space\aftergroup\space\let\next@uci=\eat@uci ! 513: \else\ifcat\noexpand\next@uci\bgroup\aftergroup{\let\next@uci=\eat@uci ! 514: \else\ifcat\noexpand\next@uci\egroup\aftergroup}\let\next@uci=\eat@uci ! 515: \else\let\next@uci=\copytoken@uci\fi\fi\fi\fi\fi \next@uci ! 516: } ! 517: \def\eat@uci{\afterassignment\sanitize@uci \let\next@uci= } ! 518: \long\def\copytoken@uci#1{% ! 519: \ifcat\noexpand#1\relax\aftergroup\noexpand ! 520: \else\ifcat\noexpand#1\noexpand~\aftergroup\noexpand ! 521: \fi ! 522: \fi ! 523: \aftergroup#1\sanitize@uci ! 524: } ! 525: \def\endsanity@uci\endsanity@uci{} ! 526: ! 527: % Now use the sanity stuff to make a sane tell command. This macro ! 528: % actually takes one argument, but since it's the last for \unexpanded, ! 529: % we avoid scanning it twice by not picking it up here. ! 530: \def\sanetell{\unexpanded{\immediate\write\undef@out@chan}} ! 531: ! 532: % Produce verbatim listings of various sorts ! 533: ! 534: \def\uncatcodespecials{\def\do##1{\catcode`##1=12 } \dospecials} ! 535: \def\setupverbatim{% ! 536: \par \tt \spaceskip=\z@ % Want fixed tt spacing now ! 537: \obeylines \uncatcodespecials \obeyspaces \verbatimdefs ! 538: } ! 539: ! 540: % This macro turns on verbatim mode until ?endverbatim is seen. ! 541: \def\verbatim{% ! 542: \begingroup \setupverbatim ! 543: \parskip=\z@ plus .05\baselineskip \parindent=\z@ ! 544: \catcode`\ =13 \catcode`\^^M=13 \catcode`\?=\z@ ! 545: \verbatimgobble ! 546: } ! 547: {\catcode`\^^M=13{\catcode`\ =13\gdef\verbatimdefs{\def^^M{\ \par}\let =\ }} ! 548: \gdef\verbatimgobble#1^^M{}% ! 549: } ! 550: ! 551: % This defines ?endverbatim to end the group which begins with \verbatim ! 552: \let\endverbatim=\endgroup ! 553: ! 554: % Input a file in verbatim mode. Sometimes useful for including ! 555: % real-life examples into a paper. ! 556: \def\verbfile#1{% ! 557: \begingroup\setupverbatim ! 558: \parskip=\z@ plus .05\baselineskip \parindent=\z@ ! 559: \input#1 \endgroup ! 560: } ! 561: ! 562: % This is the same as the above, but it adds line numbers to each ! 563: % line of the file printed. \lineno@uci has the obvious use. ! 564: \newcount\lineno@uci ! 565: \def\listing#1{% ! 566: \lineno@uci=\z@ ! 567: \begingroup\setupverbatim ! 568: \parskip=\z@ plus .05\baselineskip \parindent=20pt ! 569: \everypar{\advance\lineno@uci by\@ne \llap{\the\lineno@uci\ \ }}% ! 570: \input#1 ! 571: \endgroup ! 572: } ! 573: ! 574: % Draw a little qed symbol (black box) ! 575: \def\qed{\hbox{\hskip \p@ \vrule width4pt height 6pt depth 1.5pt \hskip\p@}} ! 576: ! 577: % Conditions -- from AmSppt ! 578: \newif\ifrunin@AmS ! 579: \runin@AmSfalse ! 580: \let\runin=\runin@AmStrue ! 581: \newdimen\cond@dimen ! 582: ! 583: % This is used in \conditions ! 584: \def\firstcon@AmS#1:{% ! 585: \ifrunin@AmS ! 586: {\rm\ignorespaces#1\unskip}\ignorespaces ! 587: \else ! 588: \par ! 589: \ifdim\lastskip<\smallskipamount ! 590: \removelastskip \penalty55 \smallskip ! 591: \fi ! 592: \\#1:% ! 593: \fi ! 594: } ! 595: ! 596: % Do one item of the conditions. This is really \\ in disguise. ! 597: \def\cond@item#1:{% ! 598: \par\noindent ! 599: \hbox to \cond@dimen{\hfil\rm\ignorespaces#1\unskip\quad}% ! 600: \hangafter1 ! 601: \hangindent\cond@dimen\ignorespaces ! 602: } ! 603: ! 604: % Do the main stuff for \conditions. ! 605: \def\conditions{% ! 606: \cond@dimen=\parindent ! 607: \advance\cond@dimen by 1em ! 608: \let\\=\cond@item ! 609: \firstcon@AmS ! 610: } ! 611: ! 612: % Exit special stuff for \conditions. ! 613: \def\endconditions{\par\smallbreak\runin@AmSfalse} ! 614: ! 615: % Turn back on the \+ construct of plain TeX. ! 616: \def\tabalign{\us@true\m@ketabbox} ! 617: \outer\def\+{\tabalign} ! 618: ! 619: % Fix AmSTeX's definition used in its definition of ~ (tie). ! 620: \def\s@AmS{\penalty\@M\ifx\tok@AmS\Space@AmS\else\ \fi} ! 621: ! 622: % And make \/ work the way it does in plain.tex ! 623: \let\/=\ic@AmS ! 624: ! 625: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! 626: % PAGE CONTROL and OBJECT MANIPULATION % ! 627: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! 628: ! 629: % This definition doesn't blow up if you're in vertical mode already ! 630: \def\pagebreak{\ifhmode\vadjust{\break}\else\break\relax} ! 631: ! 632: % This definition clears out all previous inserts etc to ! 633: % guarantee that the following stuff is at the top of a page. ! 634: \def\clearpage{\vfill\supereject} ! 635: ! 636: % This macro keeps the stuff in the argument on the same page, leaving ! 637: % blank space on this page if necessary ! 638: \def\keep{\par\setbox\z@=\vbox\bgroup} ! 639: \def\endkeep{% ! 640: \egroup ! 641: \dimen@=\ht\z@ ! 642: \advance\dimen@ by\dp\z@ ! 643: \vskip\z@ plus\dimen@ ! 644: \penalty\z@ ! 645: \vskip\z@ plus-\dimen@ ! 646: \vskip\parskip ! 647: \box\z@ ! 648: \goodbreak ! 649: } ! 650: ! 651: % List macros from the TeXbook ! 652: ! 653: \toksdef\ta=\z@ \toksdef\tb=\tw@ ! 654: \newif\ifresult@uci ! 655: ! 656: % usage: \newlist\list ! 657: \def\newlist#1{\let#1=\empty} ! 658: ! 659: % usage: \append{item}\to\list ! 660: \def\append#1\to#2{\ta={\\{#1}}\tb=\expandafter{#2}\edef#2{\the\tb\the\ta}} ! 661: \def\gappend#1\to#2{\ta={\\{#1}}\tb=\expandafter{#2}\xdef#2{\the\tb\the\ta}} ! 662: ! 663: % usage: \cardinality\list\to\counter ! 664: \def\cardinality#1\to#2{#2=\z@ \long\def\\##1{\advance#2 by\@ne }#1} ! 665: ! 666: % usage: \ifismember{item}\of\list ... \else ... \fi ! 667: \def\ifismember#1\of#2{% ! 668: \def\given@uci{#1}% ! 669: \result@ucifalse ! 670: \def\\##1{% ! 671: \def\next@uci{##1}% ! 672: \ifx\next@uci\given@uci \result@ucitrue\fi ! 673: }% ! 674: #2% ! 675: \ifresult@uci ! 676: } ! 677: ! 678: % usage: \ifwasmember{item}\of\list ... \else ... \fi ! 679: % side effect: removes {item} from \list if present ! 680: \def\ifwasmember#1\of#2{% ! 681: \newlist\ref@mtr ! 682: \def\given@uci{#1}% ! 683: \result@ucifalse ! 684: \def\\##1{% ! 685: \def\next@uci{##1}% ! 686: \ifx\next@uci\given@uci ! 687: \result@ucitrue ! 688: \else ! 689: \append ##1\to\ref@mtr ! 690: \fi ! 691: }% ! 692: #2% ! 693: \let#2=\ref@mtr ! 694: \ifresult@uci ! 695: } ! 696: ! 697: % Append #1 to list #2 if #1 is not already in #2 ! 698: \def\addtolist#1\to#2{% ! 699: \ifismember#1\of#2% ! 700: \else ! 701: \append #1\to #2% ! 702: \fi ! 703: } ! 704: \def\gaddtolist#1\to#2{% ! 705: \ifismember#1\of#2% ! 706: \else ! 707: \gappend#1\to#2% ! 708: \fi ! 709: } ! 710: ! 711: ! 712: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! 713: % STUFF for BIBLIOGRAPHY and APPENDICES % ! 714: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! 715: ! 716: % Bibliography Package: ! 717: % Original version by Michal Spivak ! 718: % Updated for JACM format and automated by Tim Morgan ! 719: % Final cleanup, and much-improved automation, by Marshall Rose ! 720: ! 721: ! 722: % Simple appendix entry builder ! 723: \def\appendix#1#2{% ! 724: \par ! 725: \clearpage ! 726: \ifoddpages ! 727: \ifodd\pageno \else \null\vfill\eject\fi ! 728: \fi ! 729: \pageno@foot ! 730: \begingroup ! 731: \setbox\z@=\hbox{#1}% ! 732: \ifdim\wd\z@>\z@ ! 733: \content{Appendix #1: #2}% ! 734: \oktell{Appendix #1: #2}% ! 735: \def\title{Appendix #1\\#2}% ! 736: \else ! 737: \content{Appendix: #2}% ! 738: \oktell{Appendix: #2}% ! 739: \def\title{Appendix\\#2}% ! 740: \fi ! 741: \let\\=\cr \tabskip=\z@ \chap@font ! 742: \halign to\hsize{\centerline{\ignorespaces##\unskip}\cr\title\cr}% ! 743: \endgroup ! 744: \nobreak ! 745: \vskip 1.0in minus 0.15in ! 746: } ! 747: ! 748: ! 749: % Citations: ! 750: % We keep a running list, \ref@set, which is ! 751: % all the things which were \cite'd throughout the paper, with ! 752: % only one entry for each different key. ! 753: % ! 754: % There are three versions of each of the citation ! 755: % commands: ! 756: % 1. The \def'd version is the normal one used throughout the paper. ! 757: % 2. Within a figure, table, etc,'s caption, because of the use of ! 758: % \def and \edef, a special version which just produces the ! 759: % citation without the \gaddtolist command is used. These ! 760: % definitions are predefined, and are \let to be \cite etc with ! 761: % \no@cites, all for speed. ! 762: ! 763: % Invisible citation. usage: \icite{key} ! 764: \def\icite#1{% ! 765: \gaddtolist#1\to\ref@set ! 766: } ! 767: ! 768: % Management of \key@table stuff. This table is formatted as ! 769: % \\{real-key}{printed-key}... ! 770: \newlist\key@table ! 771: %\def\key@add#1\and#2\to#3{% ! 772: % \ta={\\{#1}{#2}}\tb=\expandafter{#3}\xdef#3{\the\tb\the\ta}% ! 773: %} ! 774: ! 775: % Add a pair of items to the list. This is used at the beginning ! 776: % of the dissertation. ! 777: \def\printkey#1#2{% ! 778: \ta={\\{#1}{#2}}% ! 779: \tb=\expandafter{\key@table}% ! 780: \xdef\key@table{\the\tb\the\ta}% ! 781: } ! 782: ! 783: % Print a key, looking it up in the table. #1 is \whatever which ! 784: % expands to the key used by the user. ! 785: \newif\if@not@printed@ ! 786: \def\use@key#1{% ! 787: \@not@printed@true ! 788: \def\\##1##2{% ! 789: \if@not@printed@ ! 790: \def\temp@uci{##1}% ! 791: \ifx\temp@uci#1% ! 792: \@not@printed@false ! 793: \setbox\z@=\hbox{[##2]\enspace}% ! 794: \ifdim\wd\z@>\key@size \global\key@size=\wd\z@ \fi ! 795: ##2% ! 796: \fi ! 797: \fi ! 798: }% ! 799: \key@table ! 800: \if@not@printed@ ! 801: \setbox\z@=\hbox{\cite@font[\ignorespaces#1\unskip]\enspace}% ! 802: \ifdim\wd\z@>\key@size \global\key@size=\wd\z@ \fi ! 803: #1% ! 804: \fi ! 805: } ! 806: ! 807: % This macro moves forward until it hits \end, skipping spaces. ! 808: % Each time it hits a comma, or when it hits and \end, it ! 809: % adds whatever has been collected so far (in \@total) to ! 810: % \ref@set and to the output list. ! 811: \def\@icite#1{% ! 812: \if#1\end ! 813: \expandafter\gaddtolist\@total\to\ref@set ! 814: \use@key\@total ! 815: \let\@next=\relax % Exit loop after this time ! 816: \else ! 817: \if#1,% % We have a complete key now. ! 818: \expandafter\gaddtolist\@total\to\ref@set ! 819: \use@key\@total,\space ! 820: \global\let\@total=\empty ! 821: \else ! 822: \xdef\@total{\@total#1}% Add new char to total ! 823: \fi ! 824: \let\@next=\@icite % Continue looping until done ! 825: \fi ! 826: \@next ! 827: } ! 828: ! 829: % Initialize and call \@icite. Used in \cite, \citep, \citepp ! 830: \def\@@cite#1{\global\let\@total\empty\@icite#1\end} ! 831: ! 832: % usage: \cite{key [, key...]} ! 833: \def\cite#1{% ! 834: {\cite@font[\@@cite{#1}]}% ! 835: } ! 836: ! 837: % usage: \citep{key}{page} ! 838: \def\citep#1#2{% ! 839: {\cite@font[\@@cite{#1}, \hbox{\rm p \ignorespaces#2\unskip}]}% ! 840: } ! 841: ! 842: % usage: \citepp{key}{pages} ! 843: \def\citepp#1#2{% ! 844: {\cite@font[\@@cite{#1}, \hbox{\rm pp \ignorespaces#2\unskip}]}% ! 845: } ! 846: ! 847: % These three definitions are used in \no@cites, below. They ! 848: % don't handle extraneous spaces as well as the normal ! 849: % definition, but they should be sufficient for most people. ! 850: \def\i@cite#1{{\cite@font[\noexpand\noexpand\noexpand\@@cite{#1}]}} ! 851: ! 852: \def\i@citep#1#2{{\cite@font[\noexpand\noexpand\noexpand\@@cite{#1},\space ! 853: \hbox{\noexpand\noexpand\noexpand\rm p \ignorespaces#2\unskip}]}% ! 854: } ! 855: ! 856: \def\i@citepp#1#2{{\cite@font[\noexpand\noexpand\noexpand\@@cite{#1},\space ! 857: \hbox{\noexpand\noexpand\noexpand\rm pp \ignorespaces#2\unskip}]}% ! 858: } ! 859: ! 860: % Turn off adding citations to \ref@set. This is needed when ! 861: % using \cite etc inside a caption for tables, figures, etc. ! 862: % \no@cites is undone by exiting an enclosing group. ! 863: \def\no@cites{% ! 864: \let\citepp=\i@citepp ! 865: \let\citep=\i@citep ! 866: \let\cite=\i@cite ! 867: } ! 868: ! 869: % References Section ! 870: ! 871: \newdimen\key@size ! 872: \key@size=\z@ % Init. value so \key@size is made as small as possible ! 873: ! 874: % Annotation control ! 875: \newif\ifinclude@annos % Should annotations be printed? ! 876: \include@annosfalse % By default, no ! 877: \def\annotate{% % ``official'' command ! 878: \include@annostrue ! 879: \oktell{Annotating bibliography}% ! 880: } ! 881: ! 882: \newif\ifin@anno % True while doing an annotation ! 883: \in@annofalse ! 884: ! 885: \def\refi@AmS{F} % This starts as False ! 886: ! 887: % Begin an annotation -- must be in vertical mode. Just gather ! 888: % text into box0 for use by \endanno. We do a couple of consistency ! 889: % checks at the beginning. ! 890: \def\anno{% ! 891: \ifhmode ! 892: \message{You forgot the \noexpand\endref command!} ! 893: \message{I've inserted one for you.} ! 894: \endanno ! 895: \fi ! 896: \if F\refi@AmS ! 897: \errmessage{No \noexpand\ref command before first \noexpand\anno} ! 898: \fi ! 899: \let\\=\newline ! 900: \in@annotrue ! 901: \setbox\z@=\vbox\bgroup ! 902: } ! 903: ! 904: % End of an annotation. Decide if it should be typeset or skipped. ! 905: \def\endanno{% ! 906: \egroup % End the group for box0 ! 907: \in@annofalse % No longer doing an annotation ! 908: \if T\refed@uci % If previous reference was used, ! 909: \ifinclude@annos {% And if we're producing an annotated bib., ! 910: \vskip\parskip ! 911: \interlinepenalty=\z@ ! 912: \unvbox\z@ % Then include annotation as normal paragraph(s) ! 913: \par ! 914: }\fi ! 915: \fi ! 916: } ! 917: ! 918: \global\newlist\ref@set % list of all references cited ! 919: \global\newlist\ref@seen % list of all references defined ! 920: ! 921: \def\reftitle{References} % Default title for bibliography ! 922: ! 923: % usage: \references (begin the References section) ! 924: \def\references{% ! 925: \vfill\supereject % Begin new page, clear out everything ! 926: \ifoddpages % Make sure start on even page. ! 927: \ifodd\pageno \relax \else \null\vfill\eject \fi ! 928: \fi ! 929: \begingroup % Following changes are local to bib. ! 930: ! 931: \twelvepoint % Get good appearance ! 932: \singlespace ! 933: \no@cites % \cite's just produce [key] ! 934: \parskip=0.6\baselineskip plus 5pt minus 4pt ! 935: \tolerance=5000 % Must be extremely tolerant! ! 936: \pretolerance=300 ! 937: \interlinepenalty=400 % To discourage breaking a reference ! 938: % across page boundaries ! 939: \uchyph=\@ne % Needed to try hyphenating title words ! 940: \sfcode`.=\@m % Like \frenchspacing, but only for ! 941: % periods ! 942: ! 943: % Now we output the title and so forth. ! 944: \centerline{\csc \reftitle}% ! 945: \nobreak ! 946: \medskip ! 947: \content\reftitle % Tell user and TOC. ! 948: \oktell\reftitle ! 949: \pageno@foot % Put page # in special place ! 950: ! 951: % Special definitions within reference mode ! 952: \let\year=\yr ! 953: \let\month=\mon ! 954: } ! 955: ! 956: % usage: \endreferences (end the References section) ! 957: \def\endreferences{% ! 958: \par % Make sure last printed reference is finished up. ! 959: \cardinality\ref@set\to\count@ ! 960: \ifnum\count@>\z@ ! 961: \def\\##1{[##1] } ! 962: \ifnum\count@>1 ! 963: \message{Warning: \number\count@\space undefined citations: \ref@set} ! 964: \else ! 965: \message{Warning: One undefined citation: \ref@set} ! 966: \fi ! 967: \fi ! 968: \endgroup % End of \references group ! 969: } ! 970: ! 971: ! 972: % References Database ! 973: ! 974: ! 975: \newbox\bybox@AmS \newbox\bysamebox@AmS ! 976: \newbox\paperbox@AmS \newbox\paperinfobox@AmS ! 977: \newbox\jourbox@AmS \newbox\jourinfobox@AmS ! 978: \newbox\volbox@AmS \newbox\issuebox@AmS ! 979: \newbox\monbox@AmS \newbox\yrbox@AmS ! 980: \newbox\pagesbox@AmS \newbox\editorbox@AmS ! 981: \newbox\bookbox@AmS \newbox\bookinfobox@AmS ! 982: \newbox\publbox@AmS \newbox\publaddrbox@AmS ! 983: \newbox\finalinfobox@AmS\newbox\wastebox@uci ! 984: \newbox\talkbox@AmS \newbox\keybox@AmS ! 985: ! 986: % reset a \keyword to the ``not used'' condition ! 987: \def\refset@AmS#1{% ! 988: \expandafter\gdef\csname is\expandafter\eat@AmS ! 989: \string#1@AmS\endcsname{F}\expandafter ! 990: \setbox\csname\expandafter\eat@AmS\string#1box@AmS\endcsname=\null ! 991: } ! 992: ! 993: % reset \keyword's ! 994: \def\ref@AmS{% ! 995: \refset@AmS\key \refset@AmS\finalinfo ! 996: \refset@AmS\by \gdef\isbysame@AmS{F}% ! 997: \refset@AmS\paper \refset@AmS\paperinfo ! 998: \refset@AmS\jour \refset@AmS\jourinfo ! 999: \refset@AmS\vol \refset@AmS\issue ! 1000: \refset@AmS\mon \refset@AmS\yr ! 1001: \refset@AmS\pages \gdef\ispage@AmS{F}% ! 1002: \refset@AmS\book \refset@AmS\bookinfo ! 1003: \refset@AmS\publ \refset@AmS\publaddr ! 1004: \refset@AmS\editor \refset@AmS\talk ! 1005: \gdef\istoappear@AmS{F}% ! 1006: \gdef\isinbook@AmS{F}% ! 1007: \bgroup ! 1008: \ignorespaces ! 1009: } ! 1010: ! 1011: % usage: \ref{citation} \keywords arguments ... \endref. We make sure ! 1012: % we aren't still doing an \anno first. ! 1013: \def\ref#1{% ! 1014: \ifin@anno ! 1015: \message{You forgot an \noexpand\endanno command,} ! 1016: \message{but I forgive you this time.} ! 1017: \endanno ! 1018: \fi ! 1019: \def\refi@AmS{T}% ! 1020: \ifwasmember#1\of\ref@set ! 1021: \def\refed@uci{T}% ! 1022: \okmessage{[#1]}% ! 1023: \else ! 1024: \def\refed@uci{F}% ! 1025: \okmessage{(#1)}% ! 1026: \fi ! 1027: \ifismember#1\of\ref@seen ! 1028: \sanetell{multiply defined: [#1]}% ! 1029: \else ! 1030: \append#1\to\ref@seen ! 1031: \fi ! 1032: \def\refl@AmS{F}% ! 1033: \def\\{\egroup\endref@AmS\gdef\refi@AmS{F}\ref@AmS}% ! 1034: \ref@AmS ! 1035: \gdef\@total{#1}% ! 1036: \key \if T\refed@uci ! 1037: \use@key\@total ! 1038: \fi\egroup\setbox\wastebox@uci=\hbox\bgroup\ignorespaces ! 1039: } ! 1040: ! 1041: % End of a reference. ! 1042: % ! 1043: % Note that \endref@AmS is \let to be whichever \endref@xxx command ! 1044: % is being used; default is \endref@JACM for JACM format. ! 1045: % ! 1046: % If we printed the reference, \endref@AmS will ! 1047: % have set \bysamebox@AmS to be a box containing a box ! 1048: % containing a rule and a period. This is unboxed if a subsequent ! 1049: % reference which gets printed uses \bysame. Otherwise, we here ! 1050: % save the \by field (if given) so that if a subsequent reference ! 1051: % using \bysame gets used, we'll know who the author was, even though ! 1052: % the reference which gave the author(s) wasn't printed. ! 1053: \def\endref{% ! 1054: \egroup\gdef\refl@AmS{T}% ! 1055: \if T\refed@uci ! 1056: \endref@AmS ! 1057: \else ! 1058: \if T\isby@AmS ! 1059: \setbox\bysamebox@AmS=\box\bybox@AmS ! 1060: \fi ! 1061: \fi ! 1062: \par ! 1063: } ! 1064: ! 1065: % define a \keyword. #1=keyword, #2=font to use, or {} ! 1066: \def\refdef@AmS#1#2{% ! 1067: \def#1{% ! 1068: \egroup ! 1069: \expandafter\gdef ! 1070: \csname is\expandafter\eat@AmS\string#1@AmS\endcsname{T}% ! 1071: \expandafter\setbox ! 1072: \csname\expandafter\eat@AmS\string#1box@AmS\endcsname ! 1073: =\hbox\bgroup#2\ignorespaces ! 1074: }% ! 1075: } ! 1076: ! 1077: % define the keywords ! 1078: ! 1079: \refdef@AmS\by\by@font \refdef@AmS\paper{} ! 1080: \refdef@AmS\paperinfo{} \refdef@AmS\jour\book@font ! 1081: \refdef@AmS\vol\book@font \refdef@AmS\issue{} ! 1082: \refdef@AmS\mon{} \refdef@AmS\yr{} ! 1083: \refdef@AmS\pages{} \refdef@AmS\talk{} ! 1084: \refdef@AmS\book\book@font \refdef@AmS\bookinfo{} ! 1085: \refdef@AmS\publ{} \refdef@AmS\publaddr{} ! 1086: \refdef@AmS\finalinfo{} \refdef@AmS\editor{} ! 1087: \refdef@AmS\jourinfo{} \refdef@AmS\key\cite@font ! 1088: ! 1089: % These don't fit the normal pattern. ! 1090: \def\bysame{\egroup\gdef\isbysame@AmS{T}\bgroup} ! 1091: \def\page{\egroup\gdef\ispage@AmS{T}\setbox\pagesbox@AmS=\hbox\bgroup ! 1092: \ignorespaces} ! 1093: \def\toappear{\egroup\gdef\istoappear@AmS{T}\bgroup} ! 1094: \def\inbook{\egroup\gdef\isinbook@AmS{T}\setbox\bookbox@AmS=\hbox\bgroup ! 1095: \book@font\ignorespaces ! 1096: } ! 1097: ! 1098: % This is the font we normally print book and journal titles in, but we ! 1099: % use \twelveit for IEEE format. ! 1100: \let\book@font=\twelvesl ! 1101: ! 1102: % Similarly, this is the font to use for the author's name(s). ! 1103: % Optionally, the user can ask for the cite font instead (this is ! 1104: % not necessarily related to use of the IEEE format). ! 1105: \let\by@font=\twelverm ! 1106: ! 1107: % As an option, the user can have the author's name(s) in caps-small-caps. ! 1108: \def\AuthorsInCSC{% ! 1109: \let\by@font=\elevencsc ! 1110: \oktell{Authors in CSC mode}% ! 1111: } ! 1112: ! 1113: % Define some aliases for some of the above, for user convenience. ! 1114: \let\pp=\pages ! 1115: \let\pgs=\pages ! 1116: \let\pg=\page ! 1117: \let\p=\page ! 1118: \let\journal=\jour ! 1119: \let\volume=\vol ! 1120: \let\author=\by ! 1121: \let\authors=\by ! 1122: \let\editors=\editor ! 1123: \let\other=\talk ! 1124: \let\no=\issue ! 1125: ! 1126: % Helpers to \endref@AmS, which speed things up a lot, and/or ! 1127: % make the code more compact. ! 1128: \def\a@comma{, } % Used in next routine. Predefined for speed of \let. ! 1129: \def\setpunct@AmS{\let\prepunct@AmS=\a@comma} ! 1130: \def\ppunbox@AmS#1{\prepunct@AmS\unhbox#1\unskip} ! 1131: ! 1132: ! 1133: % Actually do some typesetting (finally). As mentioned above, ! 1134: % \endref@AmS is called to print a reference if we want it. It ! 1135: % is \let to be either \endref@JACM or \endref@IEEE (or possibly ! 1136: % some other format in the future) depending on the desired ! 1137: % format. ! 1138: % ! 1139: % For some reason, the ~'s don't see to tie things, so some ! 1140: % \hbox's were introduced. ! 1141: % ! 1142: % There is unfortunately a lot of common code between the ! 1143: % different formats. Here are some sections which were easy to ! 1144: % pull out: ! 1145: \def\endref@startup{% ! 1146: % Test to see if there is anything in the wastebox ! 1147: \setbox\wastebox@uci=\hbox{\unhbox\wastebox@uci\unskip}% ! 1148: \ifdim\wd\wastebox@uci>\z@ ! 1149: \errmessage{Keyword omitted after \noexpand\ref}% ! 1150: \fi ! 1151: \let\prepunct@AmS=\empty ! 1152: \vskip\parskip ! 1153: \noindent \hangafter=\@ne ! 1154: } ! 1155: ! 1156: % This is the text printed for the JACM format for papers ! 1157: % appearing in a book. ! 1158: \def\appearing@in{Appearing in } ! 1159: ! 1160: % Common code at the end of \endref@JACM and \endref@IEEE. ! 1161: % The argument is the date routine to use. ! 1162: \def\endref@finishup#1{% ! 1163: \if T\istalk@AmS ! 1164: \dimen@=\wd\talkbox@AmS ! 1165: \ifdim\dimen@>\z@ ! 1166: \ppunbox@AmS\talkbox@AmS\setpunct@AmS ! 1167: \fi ! 1168: \fi ! 1169: \if T\isbook@AmS ! 1170: \ppunbox@AmS\bookbox@AmS \setpunct@AmS ! 1171: \editor@ref ! 1172: \fi ! 1173: \if T\isinbook@AmS ! 1174: \prepunct@AmS\appearing@in\unhbox\bookbox@AmS\unskip \setpunct@AmS ! 1175: \editor@ref \gdef\isbook@AmS{T}% ! 1176: \fi ! 1177: \if T\isbookinfo@AmS ! 1178: \ppunbox@AmS\bookinfobox@AmS\setpunct@AmS ! 1179: \fi ! 1180: \if T\ispubl@AmS ! 1181: \ppunbox@AmS\publbox@AmS\setpunct@AmS ! 1182: \fi ! 1183: \if T\ispubladdr@AmS ! 1184: \ppunbox@AmS\publaddrbox@AmS\setpunct@AmS ! 1185: \fi ! 1186: \if T\isbook@AmS ! 1187: \if T\isvol@AmS ! 1188: \prepunct@AmS Vol.~\unhbox\volbox@AmS\unskip\setpunct@AmS ! 1189: \fi ! 1190: \if T\isyr@AmS ! 1191: \ppunbox@AmS\yrbox@AmS\setpunct@AmS ! 1192: \fi ! 1193: \if T\istoappear@AmS ! 1194: \ (to appear)\setpunct@AmS ! 1195: \fi ! 1196: \if T\ispages@AmS ! 1197: \prepunct@AmS pp.~\unhbox\pagesbox@AmS\unskip\setpunct@AmS ! 1198: \fi ! 1199: \if T\ispage@AmS ! 1200: \prepunct@AmS p.~\unhbox\pagesbox@AmS\unskip\setpunct@AmS ! 1201: \fi ! 1202: \fi ! 1203: \if T\istalk@AmS ! 1204: #1% This is the date routine to use. ! 1205: \fi ! 1206: \if T\isfinalinfo@AmS ! 1207: \period\unhbox\finalinfobox@AmS ! 1208: \else ! 1209: \if T\refl@AmS . ! 1210: \else ; ! 1211: \fi ! 1212: \fi ! 1213: } ! 1214: ! 1215: % Print editor (ed.) if appropriate. This occurs 6 times ! 1216: % between the two formats, making it worth being a separate ! 1217: % routine. ! 1218: \def\editor@ref{% ! 1219: \if T\iseditor@AmS ! 1220: \ppunbox@AmS\editorbox@AmS\ (ed.)\setpunct@AmS ! 1221: \fi ! 1222: } ! 1223: ! 1224: % This routine prints the date in the JACM format ! 1225: \def\date@JACM{% ! 1226: \if T\isyr@AmS ! 1227: \/\ (% ! 1228: \if T\ismon@AmS ! 1229: \unhbox\monbox@AmS\unskip, ! 1230: \fi ! 1231: \unhbox\yrbox@AmS\unskip)\setpunct@AmS ! 1232: \else ! 1233: \if T\ismon@AmS ! 1234: \ppunbox@AmS\monbox@AmS\setpunct@AmS ! 1235: \fi ! 1236: \fi ! 1237: } ! 1238: ! 1239: % This prints the date in the IEEE format. ! 1240: \def\date@IEEE{% ! 1241: \if T\isyr@AmS ! 1242: \prepunct@AmS ! 1243: \if T\ismon@AmS ! 1244: \unhbox\monbox@AmS\unskip\a@comma ! 1245: \fi ! 1246: \unhbox\yrbox@AmS\unskip\setpunct@AmS ! 1247: \else ! 1248: \if T\ismon@AmS ! 1249: \ppunbox@AmS\monbox@AmS\setpunct@AmS ! 1250: \fi ! 1251: \fi ! 1252: } ! 1253: ! 1254: ! 1255: % This version produces JACM format references. ! 1256: \def\endref@JACM{% ! 1257: \endref@startup ! 1258: \if T\refi@AmS ! 1259: % \if T\iskey@AmS % We know that there is a \key ! 1260: \hbox to \key@size{\cite@font [\unhbox\keybox@AmS\unskip]\hfil}% ! 1261: \hangindent=\key@size ! 1262: % \fi ! 1263: \if T\isby@AmS ! 1264: \unhcopy\bybox@AmS\unskip ! 1265: \def\prepunct@AmS{\hskip 7pt plus 5pt\relax}% ! 1266: \setbox\z@=\hbox{\unhbox\bybox@AmS\unskip}% ! 1267: \dimen@=\wd\z@ % We want \dimen0=max(\wd0, 2in) ! 1268: \ifdim\dimen@>2in \dimen@=2in \fi ! 1269: \setbox\bysamebox@AmS=\hbox{\hbox to\dimen@{\leaders\hrule\hfill.}}% ! 1270: \else ! 1271: \if T\isbysame@AmS ! 1272: \unhcopy\bysamebox@AmS\unskip ! 1273: \def\prepunct@AmS{\hskip 7pt plus 5pt\relax}% ! 1274: \fi ! 1275: \fi ! 1276: \fi ! 1277: \if T\ispaper@AmS ! 1278: \ppunbox@AmS\paperbox@AmS\def\prepunct@AmS{. }% ! 1279: \fi ! 1280: \if T\ispaperinfo@AmS ! 1281: \ppunbox@AmS\paperinfobox@AmS\def\prepunct@AmS{. }% ! 1282: \fi ! 1283: \if T\isjour@AmS ! 1284: \ppunbox@AmS\jourbox@AmS\setpunct@AmS ! 1285: \editor@ref ! 1286: \if T\isjourinfo@AmS ! 1287: \ppunbox@AmS\jourinfobox@AmS\setpunct@AmS ! 1288: \fi ! 1289: \if T\isvol@AmS ! 1290: \ \unhbox\volbox@AmS\unskip ! 1291: \fi ! 1292: \if T\isissue@AmS ! 1293: \ppunbox@AmS\issuebox@AmS\setpunct@AmS ! 1294: \fi ! 1295: \date@JACM ! 1296: \if T\istoappear@AmS ! 1297: \ (to appear)\setpunct@AmS ! 1298: \fi ! 1299: \if T\ispages@AmS ! 1300: \ppunbox@AmS\pagesbox@AmS\setpunct@AmS ! 1301: \fi ! 1302: \if T\ispage@AmS ! 1303: \prepunct@AmS p.~\unhbox\pagesbox@AmS\unskip\setpunct@AmS ! 1304: \fi ! 1305: \fi ! 1306: \endref@finishup\date@JACM ! 1307: } ! 1308: ! 1309: ! 1310: % This version produces IEEE format references. ! 1311: \def\endref@IEEE{% ! 1312: \endref@startup ! 1313: \if T\refi@AmS ! 1314: % \if T\iskey@AmS % We know that there is a \key ! 1315: \hbox to \key@size{\cite@font [\unhbox\keybox@AmS\unskip]\hfil}% ! 1316: \hangindent=\key@size ! 1317: % \fi ! 1318: \if T\isby@AmS \unhcopy\bybox@AmS\unskip\setpunct@AmS ! 1319: \setbox\z@=\hbox{\unhbox\bybox@AmS\unskip}% ! 1320: \dimen@=\wd\z@ % We want \dimen0=max(\wd0, 2in) ! 1321: \ifdim\dimen@>2in \dimen@=2in \fi ! 1322: \setbox\bysamebox@AmS=\hbox{\hbox to\dimen@{\leaders\hrule\hfill}}% ! 1323: \else ! 1324: \if T\isbysame@AmS ! 1325: \unhcopy\bysamebox@AmS\unskip\setpunct@AmS ! 1326: \fi ! 1327: \fi ! 1328: \fi ! 1329: \if T\ispaper@AmS ! 1330: \prepunct@AmS``\unhbox\paperbox@AmS\unskip,'' ! 1331: \let\prepunct@AmS=\empty ! 1332: \fi ! 1333: \if T\ispaperinfo@AmS ! 1334: \ppunbox@AmS\paperinfobox@AmS\def\prepunct@AmS{. }% ! 1335: \fi ! 1336: \if T\isjour@AmS ! 1337: \ppunbox@AmS\jourbox@AmS\setpunct@AmS ! 1338: \editor@ref ! 1339: \if T\isjourinfo@AmS ! 1340: \ppunbox@AmS\jourinfobox@AmS\setpunct@AmS ! 1341: \fi ! 1342: \if T\isvol@AmS ! 1343: \prepunct@AmS Vol.~\unhbox\volbox@AmS\unskip\setpunct@AmS ! 1344: \fi ! 1345: \if T\isissue@AmS ! 1346: \prepunct@AmS No.~\unhbox\issuebox@AmS\unskip\setpunct@AmS ! 1347: \fi ! 1348: \date@IEEE ! 1349: \if T\istoappear@AmS ! 1350: \ (to appear)\setpunct@AmS ! 1351: \fi ! 1352: \if T\ispages@AmS ! 1353: \prepunct@AmS pp.~\unhbox\pagesbox@AmS\unskip\setpunct@AmS ! 1354: \fi ! 1355: \if T\ispage@AmS ! 1356: \prepunct@AmS p.~\unhbox\pagesbox@AmS\unskip\setpunct@AmS ! 1357: \fi ! 1358: \fi ! 1359: \endref@finishup\date@IEEE ! 1360: } ! 1361: ! 1362: ! 1363: % By default, we use JACM format references ! 1364: \let\endref@AmS=\endref@JACM ! 1365: ! 1366: % But it's possible to get the other format ! 1367: \def\IEEE{% ! 1368: \let\endref@AmS=\endref@IEEE ! 1369: \refdef@AmS\vol{}% Vol not printed in slanted any more. ! 1370: \global\let\appearing@in=\empty % Don't say that in IEEE format. ! 1371: \let\volume=\vol ! 1372: \let\book@font=\twelveit % Book and journal titles in this font. ! 1373: \oktell{IEEE Bibliography Style}% ! 1374: } ! 1375: ! 1376: ! 1377: % References Dump ! 1378: ! 1379: \newwrite\dump@file ! 1380: ! 1381: \catcode`\{=12 \catcode`\}=12 \catcode`\%=12 \catcode`\[=1 \catcode`\]=2 ! 1382: \def\ref@open[{] ! 1383: \def\ref@close[}] ! 1384: \def\ref@comment[%] ! 1385: \catcode`\{=1 \catcode`\}=2 \catcode`\%=14 \catcode`\[=12 \catcode`\]=12 ! 1386: ! 1387: \def\refdump{% ! 1388: \vfill\supereject ! 1389: \begingroup ! 1390: \content\reftitle ! 1391: \tell{Dumping \reftitle\space to refdump.tex}% ! 1392: \immediate\openout\dump@file=refdump ! 1393: \immediate\write\dump@file{% ! 1394: \noexpand\catcode`\noexpand\@=11 ^^J% ! 1395: \noexpand\let\noexpand\content=\noexpand\eat@AmS^^J% ! 1396: \noexpand\pageno=\the\pageno^^J% ! 1397: \noexpand\def\noexpand\ref@set\ref@open\ref@comment ! 1398: }% ! 1399: \def\\##1{\immediate\write\dump@file{ \noexpand\\{##1}\ref@comment}}% ! 1400: \ref@set ! 1401: \immediate\write\dump@file{% ! 1402: \ref@close^^J% ! 1403: }% ! 1404: \immediate\closeout\dump@file ! 1405: \endgroup ! 1406: } ! 1407: ! 1408: ! 1409: %%%%%%%%%%%%%%%%%%%% ! 1410: % OUTPUT CONTROL % ! 1411: %%%%%%%%%%%%%%%%%%%% ! 1412: ! 1413: % Control for informational messages. Default is \verbose mode. ! 1414: \newif\iftell@all ! 1415: \let\verbose=\tell@alltrue ! 1416: \let\quiet=\tell@allfalse ! 1417: \verbose ! 1418: \def\oktell#1{\iftell@all\tell{#1}\fi} ! 1419: \def\okmessage#1{\iftell@all\message{#1}\fi} ! 1420: ! 1421: % Chapter macro parameters ! 1422: \newcount\chapterno ! 1423: \chapterno=\z@ % Number of current chapter ! 1424: \newif\ifnumber@chapters ! 1425: \number@chapterstrue % By default, number the chapters ! 1426: \def\nochapternumbers{% ! 1427: \number@chaptersfalse ! 1428: \oktell{No Chapter Numbers mode}% ! 1429: } ! 1430: ! 1431: ! 1432: %%%%%%%%%%%%%%%%%%%%%%%%%%% ! 1433: % OUTPUT CONTROL MACROS % ! 1434: %%%%%%%%%%%%%%%%%%%%%%%%%%% ! 1435: ! 1436: ! 1437: % Center, left justify, right justify -- avoid exceeding margins ! 1438: \def\centerline#1{\line{\hfill#1\hfill}} ! 1439: \def\leftline#1{\line{#1\hfill}} ! 1440: \def\rightline#1{\line{\hfill#1}} ! 1441: \def\threepart#1#2#3{\line{\hskip\leftskip\rlap{#1}\hfill#2\hfill ! 1442: \llap{#3}\hskip\rightskip}} ! 1443: ! 1444: % End of the main body of the document ! 1445: \let\enddiss=\bye ! 1446: ! 1447: % Summary Information ! 1448: \outer\def\showsummary{% ! 1449: \begingroup ! 1450: \def\note##1##2##3##4{% ! 1451: \count@=##1 ! 1452: \advance\count@ by##3 ! 1453: \ifcase\count@ ! 1454: \message{No ##2s##4}\or ! 1455: \message{1 ##2##4}\else ! 1456: \message{\the\count@\space ##2s##4}\fi ! 1457: }% ! 1458: \note\fignumber{figure}{-1}{,}% ! 1459: \note\tablenumber{table}{-1}{,}% ! 1460: \note\note@count{footnote}{-1}{,}% ! 1461: \cardinality\ref@set\to\count@ ! 1462: \note\count@{citation}{0}{.}% ! 1463: \endgroup ! 1464: } ! 1465: ! 1466: ! 1467: % Real version of ragged right margins ! 1468: \def\raggedright{% ! 1469: \rightskip=\z@ plus 2em ! 1470: \oktell{Raggedright mode}% ! 1471: } ! 1472: ! 1473: % Disallow hyphenation -- a very dangerous thing ! 1474: \def\nohyphens{% ! 1475: \hyphenpenalty=\@M\tolerance=500\pretolerance=\@M ! 1476: \oktell{Nohyphens mode}% ! 1477: } ! 1478: ! 1479: % Allow capitalized words to be hyphenated ! 1480: \def\hyphenall{% ! 1481: \uchyph=\@ne ! 1482: \oktell{Hyphenating all words}% ! 1483: } ! 1484: ! 1485: % Handle a long quotation in a standard way ! 1486: \def\bigquote#1\endbigquote{% ! 1487: \par ! 1488: \vskip \baselineskip \vskip -\parskip ! 1489: { \advance\rightskip by 30pt ! 1490: \advance\leftskip by 30pt ! 1491: \smallertype ! 1492: \singlespace ! 1493: \let\\=\newline ! 1494: \noindent\llap{``}\ignorespaces#1\unskip''\par ! 1495: }% End of singlespacing and special indentation ! 1496: \vskip \baselineskip \vskip -\parskip ! 1497: } ! 1498: ! 1499: % What to do at the beginning of a chapter ! 1500: \def\chapter#1\endchapter{ ! 1501: \chapter@base #1\endchapter ! 1502: \oktell{Chapter \number\chapterno: #1} ! 1503: \content{Chapter \number\chapterno: #1} ! 1504: } ! 1505: ! 1506: ! 1507: % This boolean controls whether chapters are made to start only on ! 1508: % odd pages. ! 1509: \newif\ifoddpages ! 1510: \oddpagesfalse ! 1511: \def\twosided{% This is the ``official'' command ! 1512: \oddpagestrue ! 1513: \oktell{Twosided mode}% ! 1514: } ! 1515: ! 1516: % The guts of the \chapter command. \chapter==\chapter@base when ! 1517: % in \articlestyle. ! 1518: \def\chapter@base#1\endchapter{ ! 1519: \par ! 1520: \clearpage % Clean up from prev chapter ! 1521: \ifoddpages % Make sure start on even page. ! 1522: \ifodd\pageno \relax \else \null\vfill\eject \fi ! 1523: \fi ! 1524: \pageno@foot % Page #ing special for chap pages ! 1525: \advance\chapterno by\@ne ! 1526: \ifnumber@chapters ! 1527: \centerline{\chap@font CHAPTER \number\chapterno}% Do heading ! 1528: \fi ! 1529: {\let\\=\cr \tabskip=\z@ \chap@font % Center the chapter title ! 1530: \halign to\hsize{\centerline{\ignorespaces##\unskip}\cr#1\cr} ! 1531: } ! 1532: \nobreak % Shouldn't happen anyway ! 1533: \vskip 1.0in minus 0.15in ! 1534: } ! 1535: ! 1536: % What to do at the beginning of a section ! 1537: \def\section#1{% ! 1538: \skip@=\lastskip % \par resets \lastskip, apparently ! 1539: \par ! 1540: % This junk trys to provide consistent spacing ! 1541: \dimen@=\baselineskip ! 1542: \ifdim\skip@<\dimen@ ! 1543: \ifdim\skip@=\z@ ! 1544: \penalty-\@m % Very good break ! 1545: \fi ! 1546: \vskip \dimen@ plus .5\baselineskip ! 1547: \fi ! 1548: \leftline{\sec@font#1} ! 1549: \subcontent{#1} ! 1550: \sanetell{ Section: #1} ! 1551: \nobreak ! 1552: \vskip \z@ plus .15\baselineskip ! 1553: \vskip -\parskip ! 1554: } ! 1555: ! 1556: % And for sub-sections ! 1557: \def\subsection#1{% ! 1558: \skip@=\lastskip ! 1559: \par ! 1560: \dimen@=.6\baselineskip ! 1561: \ifdim\skip@<\dimen@ ! 1562: \ifdim\skip@=\z@ ! 1563: \goodbreak ! 1564: \fi ! 1565: \vskip \dimen@ plus .3\baselineskip ! 1566: \fi ! 1567: \leftline{\subsec@font#1} ! 1568: \subsubcontent{#1} ! 1569: \sanetell{ \\Subsection: #1} ! 1570: \nobreak ! 1571: \vskip \z@ plus .1\baselineskip ! 1572: \vskip -\parskip ! 1573: } ! 1574: ! 1575: % And for sub-sub-sections ! 1576: \def\subsubsection#1{% ! 1577: \skip@=\lastskip ! 1578: \par ! 1579: \dimen@=.5\baselineskip ! 1580: \ifdim\skip@<\dimen@ ! 1581: \ifdim\skip@=\z@ ! 1582: \goodbreak ! 1583: \fi ! 1584: \vskip \dimen@ plus .3\baselineskip ! 1585: \fi ! 1586: \leftline{\bf#1} ! 1587: \subsubsubcontent{#1} ! 1588: \sanetell{ \\\\Subsubsection: #1} ! 1589: \nobreak ! 1590: \vskip -\parskip ! 1591: } ! 1592: ! 1593: % This is an alternate definition for plain TeX's \@ins, ! 1594: % omitting the \par. It is for use during \figure etc. Reason: ! 1595: % If you use \figure right after \section, it would otherwise ! 1596: % become a legal place for a page break. ! 1597: \def\@ins@uci{\begingroup\setbox\z@\vbox\bgroup} ! 1598: ! 1599: % This macro provides rudamentary support for figures. The ! 1600: % argument to \figure is the name of the file containing the tpic (or whatever) ! 1601: % output. The second argument is the caption for the picture. ! 1602: % As usual, TeX's delayed paging and midinserting causes expansion-timing ! 1603: % problems which have to be kludged around. ! 1604: \newif\iftopfigs \topfigsfalse ! 1605: \def\dotopfigs{% ! 1606: \topfigstrue ! 1607: \oktell{Topfigs mode}% ! 1608: } ! 1609: ! 1610: \newcount\fignumber \fignumber=\@ne ! 1611: % Usage: \figure{filename}{caption with \\'s} ! 1612: \def\figure#1#2{% ! 1613: \begingroup % Hide anything that crazy user does! ! 1614: \xdef\lastfigure{\the\fignumber}% Remember the current figure number ! 1615: \begingroup\no@cites ! 1616: \let\\=\space ! 1617: \xdef\this@insert{\write\noexpand\fig@file{\noexpand\noexpand ! 1618: \noexpand\listfig{\lastfigure}{#2}% ! 1619: {\noexpand\number\noexpand\pageno}% ! 1620: }% ! 1621: }% ! 1622: \endgroup ! 1623: \global\advance\fignumber by\@ne ! 1624: % Now do mid or top insert as appropriate ! 1625: \let\@ins=\@ins@uci ! 1626: \iftopfigs \topinsert \else \midinsert \fi ! 1627: \iffig@closed % Open output file if not already ! 1628: \openout\fig@file=\figfile ! 1629: \global\fig@closedfalse ! 1630: \fi ! 1631: \hrule ! 1632: \vskip .5\baselineskip ! 1633: {\smallertype\input #1\relax\centerline{\box\graph}}% ! 1634: \vskip .5\baselineskip plus .5\baselineskip ! 1635: \centerline{\bf Figure \lastfigure}% ! 1636: \this@insert ! 1637: \let\\=\cr \tabskip=\z@ ! 1638: \halign to\hsize{\centerline{\ignorespaces##\unskip}\cr#2\cr}% ! 1639: \vskip 2pt ! 1640: \hrule ! 1641: \endinsert ! 1642: \endgroup ! 1643: } ! 1644: ! 1645: ! 1646: % Similar thing for tables ! 1647: \newcount\tablenumber \tablenumber=\@ne ! 1648: % usage: \table{caption} ...text... \endtable ! 1649: \def\table#1{% ! 1650: \begingroup % Hide user zingers ! 1651: \xdef\lasttable{\the\tablenumber}% Remember the current figure number ! 1652: \begingroup\no@cites ! 1653: \let\\=\space ! 1654: \xdef\this@insert{\write\noexpand\tab@file{\noexpand\noexpand ! 1655: \noexpand\listfig{\lasttable}{#1}% ! 1656: {\noexpand\number\noexpand\pageno}% ! 1657: }% ! 1658: }% ! 1659: \endgroup ! 1660: \global\advance\tablenumber by\@ne ! 1661: \gdef\table@caption{#1}% ! 1662: \setbox\z@=\vbox\bgroup ! 1663: } ! 1664: ! 1665: % End of the table body specification. ! 1666: \def\endtable{% ! 1667: \egroup % End the definition of \box0. ! 1668: % Now do top or mid insert ! 1669: \let\@ins=\@ins@uci ! 1670: \iftopfigs \topinsert \else \midinsert \fi ! 1671: \iftab@closed % Open output file if necessary ! 1672: \openout\tab@file=\tabfile ! 1673: \global\tab@closedfalse ! 1674: \fi ! 1675: \hrule ! 1676: \vskip .5\baselineskip ! 1677: \box\z@ % Insert the material here. ! 1678: \vskip .5\baselineskip plus .5\baselineskip ! 1679: \centerline{\bf Table \lasttable}% ! 1680: \this@insert ! 1681: \let\\=\cr \tabskip=\z@ ! 1682: \halign to\hsize{\centerline{\ignorespaces##\unskip}\cr\table@caption ! 1683: \cr}% ! 1684: \vskip 2pt ! 1685: \hrule ! 1686: \endinsert ! 1687: \endgroup ! 1688: } ! 1689: ! 1690: % Allow user to specify arbitrary diagrams. The arguments are: ! 1691: % #1=name of the file containing the commands to form the diagram, ! 1692: % #2=caption for the figure, possibly containing \\'s. ! 1693: \def\diagram#1#2{% ! 1694: \begingroup ! 1695: \xdef\lastfigure{\the\fignumber}% ! 1696: \begingroup\no@cites ! 1697: \let\\=\space ! 1698: \xdef\this@insert{\write\noexpand\fig@file{\noexpand\noexpand ! 1699: \noexpand\listfig{\lastfigure}{#2}% ! 1700: {\noexpand\number\noexpand\pageno}% ! 1701: }% ! 1702: }% ! 1703: \endgroup ! 1704: \global\advance\fignumber by\@ne ! 1705: % Do mid or top insert as appropriate ! 1706: \let\@ins=\@ins@uci ! 1707: \iftopfigs \topinsert \else \midinsert \fi ! 1708: \iffig@closed % Open output file if necessary ! 1709: \openout\fig@file=\figfile ! 1710: \global\fig@closedfalse ! 1711: \fi ! 1712: \hrule ! 1713: \vskip .5\baselineskip ! 1714: {\smallertype\input #1\relax}% ! 1715: \vskip .5\baselineskip plus .5\baselineskip ! 1716: \centerline{\bf Figure \lastfigure}% ! 1717: \this@insert ! 1718: \let\\=\cr \tabskip=\z@ ! 1719: \halign to \hsize{\centerline{\ignorespaces##\unskip}\cr#2\cr}% ! 1720: \vskip 2pt ! 1721: \hrule ! 1722: \endinsert ! 1723: \endgroup ! 1724: } ! 1725: ! 1726: % Allow user to include verbatim examples from files. The arguments are: ! 1727: % #1=name of the file containing the text of the example, ! 1728: % #2=caption for the figure, possibly containing \\'s. ! 1729: \def\example#1#2{% ! 1730: \begingroup ! 1731: \xdef\lastfigure{\the\fignumber}% ! 1732: \begingroup\no@cites ! 1733: \let\\=\space ! 1734: \xdef\this@insert{\write\noexpand\fig@file{\noexpand\noexpand ! 1735: \noexpand\listfig{\lastfigure}{#2}% ! 1736: {\noexpand\number\noexpand\pageno}% ! 1737: }% ! 1738: }% ! 1739: \endgroup ! 1740: \global\advance\fignumber by\@ne ! 1741: % Do mid or top insert as appropriate ! 1742: \let\@ins=\@ins@uci ! 1743: \iftopfigs \topinsert \else \midinsert \fi ! 1744: \iffig@closed % Open output file if necessary ! 1745: \openout\fig@file=\figfile ! 1746: \global\fig@closedfalse ! 1747: \fi ! 1748: \hrule ! 1749: \vskip .5\baselineskip ! 1750: \vbox{\smallertype\singlespace\verbfile{#1}}% ! 1751: \vskip .5\baselineskip plus .5\baselineskip ! 1752: \centerline{\bf Figure \lastfigure}% ! 1753: \this@insert ! 1754: \let\\=\cr \tabskip=\z@ ! 1755: \halign to \hsize{\centerline{\ignorespaces##\unskip}\cr#2\cr}% ! 1756: \vskip 2pt ! 1757: \hrule ! 1758: \endinsert ! 1759: \endgroup ! 1760: } ! 1761: ! 1762: ! 1763: % Environment for report generation -- use only at the beginning! ! 1764: % Since sections are the biggest division, the table of contents ! 1765: % stuff is redefined, and chapter numbering is turned off so that ! 1766: % \chapter can be used for the first-page title. The title page ! 1767: % gets no page number (page # 0). The user can get to the ! 1768: % normal chapter font as \titlefont, and the section font as ! 1769: % \authorfont. ! 1770: \def\articlestyle{% ! 1771: \nochapternumbers ! 1772: \let\subsubsubcontent=\subsubcontent ! 1773: \let\subsubcontent=\subcontent ! 1774: \let\subcontent=\content ! 1775: \let\chapter=\chapter@base ! 1776: \pageno=\z@ ! 1777: \let\titlefont=\chap@font ! 1778: \let\authorfont=\sec@font ! 1779: \oktell{Articlestyle mode}% ! 1780: } ! 1781: ! 1782: ! 1783: %%%%%%%%%%%%%%%%%%%% ! 1784: % PAGE NUMBERING % ! 1785: %%%%%%%%%%%%%%%%%%%% ! 1786: ! 1787: % This macro produces a blank, numbered page of output ! 1788: \def\blankpage{\pageinsert \null\vfill \endinsert} ! 1789: ! 1790: % This defintion of \folio differs from Plain's in that (a) page ! 1791: % numbers are printed in 12pt, and (b) roman numeral ones are ! 1792: % printed in italics. It makes use of a trick, that ! 1793: % \romannumeral0 produces no output, which we need for title ! 1794: % pages and things, so we make their page numbers be 0. ! 1795: \def\folio{\ifnum\pageno>\z@ ! 1796: {\twelverm\number\pageno}\else ! 1797: {\twelveit\romannumeral-\pageno}\fi ! 1798: } ! 1799: ! 1800: % Permanent definitions of macros which get switched in and out ! 1801: % with \let's. Do not change any of these !!! ! 1802: \def\uci@headpage{\hfill\folio} ! 1803: \def\uci@footpage{\hfill\folio\hfill} ! 1804: \headline={\uci@headline} ! 1805: \footline={\uci@footline} ! 1806: ! 1807: % If this is used as the footline, it causes a page number to be ! 1808: % printed, but with the side-effect of making the headline blank ! 1809: % and the footline a page number again. This is used on pages ! 1810: % like the first of a chapter. ! 1811: \def\no@foot{% ! 1812: \uci@footpage ! 1813: \global\let\uci@footline=\hfil ! 1814: \global\let\uci@headline=\uci@headpage ! 1815: } ! 1816: ! 1817: % This macro causes the page number to be at the bottom of the current ! 1818: % page, and after it has been used there once, it moves to the ! 1819: % top right of each page. It also sets \dimen\topins=0pt so that ! 1820: % any material \topinsert'd on these pages will get carried over ! 1821: % to subsequent pages. ! 1822: \def\pageno@foot{% ! 1823: \dimen\topins=0pt ! 1824: \let\uci@headline=\hfil ! 1825: \let\uci@footline=\no@foot ! 1826: } ! 1827: ! 1828: % Executing this causes page numbers to be at the bottom only, as ! 1829: % with the plain TeX format. ! 1830: \def\plain@page@numbers{% ! 1831: \let\uci@headline=\hfil % Initial values similar to plain's ! 1832: \let\uci@footline=\uci@footpage ! 1833: } ! 1834: ! 1835: % Change plain's \makeheadline and \makefootline to position page ! 1836: % numbers as required. ! 1837: \def\makeheadline{% ! 1838: \vbox to\z@{\vskip-22.65\p@ ! 1839: \line{\vbox to8.5\p@{}\the\headline}\vss}\nointerlineskip ! 1840: } ! 1841: \def\makefootline{\baselineskip=1.6cm\line{\the\footline}} ! 1842: ! 1843: % Define an output routine which will restore \dimen\topins ! 1844: % after \chapter, \references, etc, title pages, which have ! 1845: % \dimen\topins=0pt ! 1846: \def\dissoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}% ! 1847: \advancepageno \global\dimen\topins=\vsize ! 1848: \ifnum\outputpenalty>-\@MM \else\dosupereject\fi ! 1849: } ! 1850: \let\output@AmS=\dissoutput ! 1851: \dimen\topins=\vsize % Don't insert more than will fit on one page ! 1852: ! 1853: % Output Routines: We adjust the \raggedbottom command of plain ! 1854: % TeX so that the extra space is no more than 1in, and so that ! 1855: % the space is put above footnotes instead of below. ! 1856: ! 1857: \def\raggedbottom{\topskip=\normal@topskip plus1in \r@ggedbottomtrue ! 1858: \oktell{Ragged bottom mode}} ! 1859: \def\normalbottom{\topskip=\normal@topskip\r@ggedbottomfalse ! 1860: \oktell{Normal bottom mode}} ! 1861: ! 1862: \def\pagecontents{% ! 1863: \ifvoid\topins\else\unvbox\topins\fi ! 1864: \dimen@=\dp\@cclv \unvbox\@cclv % open up \box255 ! 1865: \ifr@ggedbottom \kern-\dimen@ \vfil\fi ! 1866: \ifvoid\footins \else % footnote info is present ! 1867: \vskip\skip\footins ! 1868: \footnoterule ! 1869: \unvbox\footins ! 1870: \fi ! 1871: } ! 1872: ! 1873: ! 1874: %%%%%%%%%%%%%%%%%%%% ! 1875: % INITIALIZATION % ! 1876: %%%%%%%%%%%%%%%%%%%% ! 1877: ! 1878: \font@no=0 % Default font=\rm, ! 1879: \twelvepoint % point size, ! 1880: \doublespace % and spacing ! 1881: \plain@page@numbers % Page nos like plain's ! 1882: ! 1883: % Note that normally in AMSTeX, the @ character may not be used. ! 1884: % But in the dissertation style, @ may be used as a normal character, ! 1885: % As it can in plain TeX. ! 1886: \catcode`\@=12 ! 1887: ! 1888: % Eat any further \documentstyle commands ! 1889: \def\documentstyle#1{} ! 1890: ! 1891: % This prints out our welcome message, and it computes the time ! 1892: % and date string once per run, which saves time if they're used ! 1893: % more than once. Since \catcode`@=12 at the time this is ! 1894: % executed, it can't contain any @-type macros. ! 1895: \everyjob={% ! 1896: \begingroup ! 1897: \xdef\today{% ! 1898: \ifcase\month ! 1899: \the\month\or ! 1900: January\or ! 1901: February\or ! 1902: March\or ! 1903: April\or ! 1904: May\or ! 1905: June\or ! 1906: July\or ! 1907: August\or ! 1908: September\or ! 1909: October\or ! 1910: November\or ! 1911: December\else ! 1912: \the\month ! 1913: \fi\space\the\day, \the\year ! 1914: }% ! 1915: \count0=\time ! 1916: \count1=\count0 ! 1917: \divide\count0by60 ! 1918: \count2=\count0 ! 1919: \multiply\count0by60 ! 1920: \advance\count1by-\count0 ! 1921: \ifnum\count2>11 ! 1922: \ifnum\count2>12 \advance\count2by-12\fi ! 1923: \def\ampm{PM}% ! 1924: \else ! 1925: \ifnum\count2=0 \advance\count2by12\fi ! 1926: \def\ampm{AM}% ! 1927: \fi ! 1928: \xdef\daytime{% ! 1929: \ifnum\count2<10 0\fi \the\count2:% ! 1930: \ifnum\count1<10 0\fi \the\count1 ! 1931: \ampm ! 1932: }% ! 1933: \endgroup ! 1934: \tell{AmSTeX Dissertation Style, version \version}% ! 1935: } ! 1936: ! 1937: \edef\temp@uci{\the\everyjob} ! 1938: \temp@uci ! 1939:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.