% PS-LATEX VERSION 2.09 - RELEASE OF 19th September 1988 % derived directly from % LATEX VERSION 2.09 - RELEASE OF 18 December 1985 % Copyright (C) 1985 by Leslie Lamport \everyjob{\typeout{PS-LaTeX Version 2.09 - Released 19 September 1988}} \immediate\write10{PS-LaTeX Version 2.09 - Released 19 September 1988} % TABLE OF CONTENTS % COMMAND LIST ....................................... 2 % GENERAL CONVENTIONS .................................. 6 % COUNTERS, ETC. ....................................... 7 % USEFUL HACKS ......................................... 8 % ERROR HANDLING ....................................... 12 % \par AND \everypar ................................... 15 % SPACING / LINE AND PAGE BREAKING ..................... 17 % PROGRAM CONTROL STRUCTURE MACROS ..................... 21 % FILE HANDLING ........................................ 24 % ENVIRONMENT COUNTER MACROS ........................... 27 % PAGE NUMBERING ....................................... 30 % CROSS REFERENCING MACROS ............................ 31 % ENVIRONMENTS ......................................... 33 % MATH ENVIRONMENTS .................................... 36 % CENTER, FLUSHRIGHT, FLUSHLEFT, ETC. .................. 39 % VERBATIM ............................................. 40 % THE LIST ENVIRONMENT ................................. 41 % ITEMIZE AND ENUMERATE ................................ 49 % BOXES ................................................ 51 % THE TABBING ENVIRONMENT .............................. 57 % ARRAY AND TABULAR ENVIRONMENTS ....................... 63 % THE PICTURE ENVIRONMENT .............................. 72 % THEOREM ENVIRONMENTS ................................. 86 % LENGTHS .............................................. 88 % THE TITLE .............................................89 % SECTIONING ........................................... 90 % TABLE OF CONTENTS, ETC. .............................. 94 % INDEX COMMANDS ....................................... 97 % BIBLIOGRAPHY ......................................... 98 % FLOATS .............................................. 100 % FOOTNOTES ........................................... 106 % INITIAL DECLARATION COMMANDS ........................ 110 % OUTPUT .............................................. 113 % DEBUGGING AND TEST INITIALIZATIONS ................. 137 \catcode`\~=13 \def~{\penalty\@M \ } % **************************************** % * COMMAND LIST * % **************************************** % % DECLARATIONS: % PREAMBLE: \nofiles \documentstyle \includeonly % \makeindex \makeglossary % IN DOCUMENT : % FONT SELECTION: % SIZE: \normalsize \small \footnotesize \scriptsize \scriptscriptsize % \big \Big \BIG % STYLE: \bf \it \rm \sl \ss \tt \mit[math mode only] % STYLE: % PAGE: [all global] \pagestyle \thispagestyle \pagenumbering \head % MISC: \raggedright \thicklines \thinlines % PARAMETER: \setlength \settowidth \addtolength \setcounter \addtocounter % NEW: \newlength \newtheorem \newcommand % MISC: \savebox \sbox \obeycr \restorecr % % ENVIRONMENTS: % ? -> PAR: document % PAR -> PAR: list enumerate itemize description % center flushright flushleft % verbatim picture float % PAR -> BOX: tabular tabbing % PAR -> MATH: math displaymath equation % MATH -> MATH: array % ANY -> PAR: minipage % ANY -> BOX: stack % % TEXT-PRODUCING: % WITH TEXT ARGUMENT: % ANY -> BOX: \makebox \mbox \framebox \fbox \dashbox % \shortstack \footnotemark \cite[] \raisebox % ANY -> PAR: \parbox[inner] % PAR -> PAR: \chapter \section ... \footnote \footnotetext % \topnewpage \verb % MATH: \sqrt \underline \overline % PICTURE: \put \multiput % LIST: \item % WITHOUT TEXT ARGUMENT: % ANY MODE: % SYMBOLS: \$ \{ \} \_ \@ \& \# % ACCENTS: See TeXbook % OTHER: \rule \ref \pageref \today \usebox \typein \input \cite % MATH: \over % PAR MODE: \include \bibliography \tableofcontents \listoffigures ... % LIST: \item \arabic \roman \Roman \alph \Alph % PICTURE: \line \vector \circle \oval % ARRAY & TABULAR: \hline \vline % % SPACING & BREAKING: % ANY : \hfill \hspace % PAR : \newpage \newpage \vspace \noindent % PAR & INNER MATH % : \newpage \clearpage \cleardoublepage % : \pagebreak \nopagebreak \linebreak \nolinebreak \newline % MATH : \over \; \, \! % MULTILINE : \\ % TABBING : \pushtab \poptab \> \< \+ \- \kill ... % ARRAY & TABULAR % : \multicolumn \noalign % % NO DIRECT CHANGES TO DOCUMENT: % \index \glossary \typeout \label \tableentry \stop \protect % % PARAMETERS: % % \columnsep \skip\footin \intextsep % \columnseprule \oddsidemargin % \columnwidth \textfloatsep % \evensidemargin \footsep \textheight % \floatsep \headheight \textwidth % \footheight \headsep \topmargin % ALPHABETIZED LIST: % % ORDINARY COMMANDS: % % \Alph \include \parbox % \Roman \index \put % \\ \item \raisebox % \alph \label \ref % \appendix \line \roman % \arabic \linebreak \rule % \bibliography \listoffigures \section % \chapter \listoftables \shortstack % \circle \makebox \stop % \cite \mbox \subsection % \cite \multicolumn \subsubsection % \cleardoublepage \multiput \tableentry % \clearpage \tableofcontents % \dashbox \newline \today % \fbox \newpage \typein % \footnotemark \noindent \typeout % \footnotetext \nolinebreak \usebox % \framebox \nopagebreak \vector % \glossary \oval \vline % \hline \pagebreak \vspace % \hspace \pageref \protect % % % ENVIRONMENTS & DECLARATIONS: % % For each of these commands, the same command name prefixed by 'end' % is also reserved--e.g., \enddocument. % % \BIG \footnotesize \pagestyle % \Big \head \picture % \addtocounter \includeonly \raggedright % \addtolength \itemize \restorecr % \array \list \savebox % \big \makeglossary \sbox % \center \makeindex \scriptscriptsize % \description \math \scriptsize % \displaymath \minipage \setcounter % \document \newcommand \setlength % \documentstyle \newlength \settowidth % \enumerate \newtheorem \small % \equation \nofiles \shortstack\tabbing % \normalsize \tabular % \float \obeycr \thicklines % \flushleft \pagelayout \thinlines % \flushright \pagenumbering \thispagestyle % \verb, \verbatim % % PARAMETERS : % % \columnsep \footinsertskip \intextsep % \columnseprule \oddsidemargin % \columnwidth \textfloatsep % \evensidemargin \footsep \textheight % \floatsep \headheight \textwidth % \footheight \headsep \topmargin % % % TABBING COMMANDS: % % These commannds are defined only within a tabbing environment. % % \kill \> \- % \pushtab \< \= % \poptab \+ % **************************************** % * GENERAL CONVENTIONS * % **************************************** % % THE \LaTeX LOGO IS DEFINED HERE. % \def\LaTeX{{\rm L\kern-.36em\raise.3ex\hbox{\sc a}\kern-.15em T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}} % SAVED VERSIONS OF TeX PRIMITIVES: % % The TeX primitive \foo is saved as \@@foo . The following primitives % are handled in this way: \let\@@par=\par %\let\@@relax=\relax % This was needed at one time, but seems to be obsolete. \let\@@input=\input \let\@@end=\end % SAVED VERSIONS OF TeX PARAMETERS % % \normalbaselineskip and \normallineskip hold the % normal values of \baselineskip and \lineskip % Any font-changing commands that change the normal value of \lineskip % and \baselineskip should change their saved values. % The following definitions save token space. E.g., using \@height % instead of height saves 5 tokens at the cost in time of one macro % expansion. \def\@height{height} \def\@depth{depth} \def\@width{width} % The following implements the LaTeX \{ and \} commands. \def\{{\relax\ifmmode\lbrace\else$\lbrace$\fi} \def\}{\relax\ifmmode\rbrace\else$\rbrace$\fi} \message{counters,} % **************************************** % * COUNTERS, ETC. * % **************************************** % % THE FOLLOWING ARE FROM PLAIN: % \z@ : A zero dimen or number. It's more efficient to write % \parindent\z@ than \parindent 0pt. % \@ne : The number 1. % \m@ne : The number -1. % \tw@ : The number 2. % \sixt@@n : The number 16. % \@m : The number 1000. % \@xxxii : The number 32 % \@M : The number 10000. % \@Mi : The number 10001. % \@Mii : The number 10002. % \@Miii : The number 10003. % \@Miv : The number 10004. % \@MM : The number 20000. % % \@flushglue : Glue used for \right- & \leftskip to = 0pt plus 1fil \chardef\@xxxii=32 \mathchardef\@Mi=10001 \mathchardef\@Mii=10002 \mathchardef\@Miii=10003 \mathchardef\@Miv=10004 % Redefine PLAIN.TEX macros not to be \outer \def\newcount{\alloc@0\count\countdef\insc@unt} \def\newdimen{\alloc@1\dimen\dimendef\insc@unt} \def\newskip{\alloc@2\skip\skipdef\insc@unt} \def\newbox{\alloc@4\box\chardef\insc@unt} \def\newwrite{\alloc@7\write\chardef\sixt@@n} \newwrite\@unused \newcount\@tempcnta \newcount\@tempcntb \newif\if@tempswa\@tempswatrue \newdimen\@tempdima \newdimen\@tempdimb \newbox\@tempboxa \newskip\@flushglue \@flushglue = 0pt plus 1fil \newskip\@tempskipa \newskip\@tempskipb \newtoks\@temptokena \message{hacks,} % **************************************** % * USEFUL HACKS * % **************************************** % % \@namedef{NAME} : Expands to \def\NAME , except name can contain any % characters. % \@nameuse{NAME} : Expands to \NAME . % % \@ifnextchar X{YES}{NO} % : Expands to YES if next character is an 'X', % and to NO otherwise. (Uses temps a-c.) % NOTE: GOBBLES ANY SPACE FOLLOWING IT. % % \@ifstar{YES}{NO} : Gobbles following spaces and then tests if next the % character is a '*'. If it is, then it gobbles the % '*' and expands to YES, otherwise it expands to NO. % % \@dblarg{CMD}{ARG} : \@dblarg{CMD}{ARG} expands to CMD[ARG]{ARG}. Use % \@dblarg\CS when \CS takes arguments [ARG1]{ARG2}, % where default is ARG1 = ARG2. % % \@ifundefined{NAME}{YES}{NO} % : If \NAME is undefined then it executes YES, % otherwise it executes NO. More precisely, % true if \NAME either undefined or = \relax. % \@ifdefinable \NAME {YES} % : Executes YES if the user is allowed to define \NAME, % otherwise it gives an error. The user can define \NAME % if \@ifundefined{NAME} is true, 'NAME' /= 'relax' % and the first three letters of 'NAME' are not % 'end'. % \newcommand{\FOO}[i]{TEXT} % : User command to define \FOO to be a macro with % i arguments (i = 0 if missing) having the definition % TEXT. Produces an error if \FOO already defined. % % \renewcommand{\FOO}[i]{TEXT} : Same as \newcommand, except it % checks if \FOO already defined. % % \newenvironment{FOO}[i]{DEF1}{DEF2} % equivalent to % \newcommand{\FOO}[i]{DEF1} \def{\endFOO}{DEF2} % % \renewenvironment : obvious companion to \newenvironment % % \@cons : See description of \output routine. % % \@car T1 T2 ... Tn\@nil == T1 (unexpanded) % % \@cdr T1 T2 ... Tn\@nil == T2 ... Tn (unexpanded) % % \typeout{message} : produces a warning message on the terminal % % \@warning{message}: prints 'LaTeX Warning: message.' % % \typein{message} : Types message, asks the user to type in a command, then % executes it % % \typein[\CS]{MSG} : Same as above, except defines \CS to be the input % instead of executing it. \def\typein{\let\@typein\relax\@ifnextchar[{\@xtypein}{\@xtypein[\@typein]}} \def\@xtypein[#1]#2{\typeout{#2}\read0 to#1\ifx #1\@defpar \def#1{}\else \@iden{\expandafter\@strip\expandafter #1#1\@gobble\@gobble} \@gobble\fi\@typein} \def\@strip#1#2 \@gobble{\def #1{#2}} \def\@defpar{\par} \def\@iden#1{#1} \def\typeout#1{{\let\protect\string\immediate\write\@unused{#1}}} \def\@warning#1{\typeout{LaTeX Warning: #1.}} \def\@namedef#1{\expandafter\def\csname #1\endcsname} \def\@nameuse#1{\csname #1\endcsname} \def\@cons#1#2{\begingroup\let\@elt\relax\xdef#1{#1\@elt #2}\endgroup} \def\@car#1#2\@nil{#1} \def\@cdr#1#2\@nil{#2} % \@carcube T1 ... Tn\@nil = T1 T2 T3 , n > 3 \def\@carcube#1#2#3#4\@nil{#1#2#3} \def\newcommand#1{\@ifnextchar [{\@argdef#1}{\@argdef#1[0]}} \def\renewcommand#1{\edef\@tempa{\expandafter\@cdr\string #1\@nil}\@ifundefined{\@tempa}{\@latexerr{\string#1\space undefined}\@ehc }{}\@ifnextchar [{\@reargdef#1}{\@reargdef#1[0]}} \def\newenvironment#1{\@ifnextchar [{\@newenv{#1}}{\@newenv{#1}[0]}} \def\@newenv#1[#2]#3{\expandafter\newcommand \csname #1\endcsname[#2]{#3}\expandafter\def\csname end#1\endcsname} \def\renewenvironment#1{\@ifnextchar [{\@renewenv{#1}}{\@renewenv{#1}[0]}} \def\@renewenv#1[#2]#3{\expandafter\renewcommand \csname #1\endcsname[#2]{#3}\expandafter\def\csname end#1\endcsname} \long\def\@argdef#1[#2]#3{\@ifdefinable #1{\@reargdef#1[#2]{#3}}} \long\def\@reargdef#1[#2]#3{\@tempcnta#2\relax\let#1\relax \edef\@tempa{\long\def#1}\@tempcntb \@ne \let\@tempb\relax\@whilenum\@tempcnta>0 \do{\edef\@tempa{\@tempa\@tempb\the\@tempcntb}\advance\@tempcntb \@ne \advance \@tempcnta \m@ne}\let\@tempb##\@tempa{#3}} \long\def\@ifdefinable #1#2{\edef\@tempa{\expandafter\@cdr\string #1\@nil} \@ifundefined{\@tempa}{\edef\@tempb{\expandafter\@carcube \@tempa xxxx\@nil}% \ifx \@tempb\@qend \@notdefinable\else \ifx \@tempa\@qrelax \@notdefinable\else #2\fi\fi}{\@notdefinable}} \long\def\@ifundefined#1#2#3{\expandafter\ifx\csname #1\endcsname\relax#2\else#3\fi} % The following define \@qend and \@qrelax to be the strings 'end' and % 'relax' with the characters \catcoded 12. \edef\@qend{\expandafter\@cdr\string\end\@nil} \edef\@qrelax{\expandafter\@cdr\string\relax\@nil} % \@ifnextchar X{YES}{NO} % BEGIN % \@tempe := X % uses \let % \@tempa := YES % \@tempb := NO % \futurelet\@tempc % \@ifnch % END % % \@ifnch == % BEGIN % if \@tempc = blank space % then \@tempd := def(\@xifnch) % else if \@tempc = \@tempe % then \@tempd := def(\@tempa) % else \@tempd := def(\@tempb) % fi % fi % \@tempd % END % % \@xifnch == % BEGIN % gobble blanks % \futurelet\@tempc % \@ifnch % END % \def\@ifnextchar#1#2#3{\let\@tempe #1\def\@tempa{#2}\def\@tempb{#3}\futurelet \@tempc\@ifnch} \def\@ifnch{\ifx \@tempc \@sptoken \let\@tempd\@xifnch \else \ifx \@tempc \@tempe\let\@tempd\@tempa\else\let\@tempd\@tempb\fi \fi \@tempd} % NOTE: the following hacking must precede the definition of \: % as math medium space. \def\:{\let\@sptoken= } \: % this makes \@sptoken a space token \def\:{\@xifnch} \expandafter\def\: {\futurelet\@tempc\@ifnch} \def\@ifstar#1#2{\@ifnextchar *{\def\@tempa*{#1}\@tempa}{#2}} \long\def\@dblarg#1{\@ifnextchar[{#1}{\@xdblarg{#1}}} \long\def\@xdblarg#1#2{#1[{#2}]{#2}} % The command \@sanitize changes the catcode of all special characters % except for braces to 'other'. It can be used for commands like % \index that want to write their arguments verbatim. Needless to % say, this command should only be executed within a group, or chaos % will ensue. \def\@sanitize{\@makeother\ \@makeother\\\@makeother\$\@makeother\&% \@makeother\#\@makeother\^\@makeother\^^K\@makeother\_\@makeother\^^A% \@makeother\%\@makeother\~} \message{errors,} % **************************************** % * ERROR HANDLING * % **************************************** % % \@latexerr{MSG}{HLP}: Types a LaTeX error message MSG and gives an error % halt with error help message HLP. % \newlinechar`\^^J \def\@latexerr#1#2{\begingroup \edef\@tempc{#2}\expandafter\errhelp\expandafter{\@tempc}% \typeout{LaTeX error. \space See LaTeX manual for explanation.^^J \space\@spaces\@spaces\@spaces Type \space H \space for immediate help.}\errmessage{#1}\endgroup} \def\@spaces{\space\space\space\space} %% error help message pieces. \def\@eha{Your command was ignored. ^^JType \space I \space to replace it with another command,^^Jor \space \space to continue without it.} \def\@ehb{You've lost some text. \space \@ehc} \def\@ehc{Try typing \space \space to proceed.^^JIf that doesn't work, type \space X \space to quit.} \def\@ehd{You're in trouble here. \space\@ehc} % Here are all the error message-generating commands of LaTeX. % % \@notdefinable : Error message generated in \@ifdefinable from calls % by \newcommand, \newlength, \newtheorem specifying an % already-defined command name. % % \@nolnerr : Generated by \newline and \\ when called in vertical mode. % % '\... undefined' : Generated in \renewcommand. % % \@nocnterr : Generated by \setcounter, \addtocounter or \newcounter % for undefined counter. % % \@ctrerr : Called when trying to print the value of a counter % numbered by letters that's greater than 26. % % 'Environment --- undefined' : Issued by \begin for undefined environment. % % \@badend : Called by \end that doesn't match its \begin. % % \@badmath : Called by \[, \], \( or \) when used in wrong mode. % % \@toodeep : Called by a list environment nested more than six levels % deep, or an enumerate or itemize nested more than four % levels. % % \@badpoptabs : Called by \endtabbing when not enough \poptabs have % occurred, or by \poptabs when too many have occurred. % % \@badtab : Called by \>, \+ , \- or \< when stepping to an undefined tab. % % 'tab overflow' : Occurs in \= when maximum number of tabs exceeded. % % '\< in mid line' : Occurs in \< when it appears in middle of line. % % \@preamerr : Occurs in array or tabular environment, or in \multicolumn % command, when error in argument detected. % % \@badlinearg : Occurs in \line and \vector command when a bad slope % argument is encountered. % % \@parmoderr : Occurs in a float environment or a \marginpar when % encountered in inner vertical mode. % % \@fltovf : Occurs in float environment or \marginpar when there % are no more free boxes for storing floats. % % \@latexbug : Occurs in output routine. This is bad news. % % 'Float(s) lost' : In output routine, caused by a float environment or % \marginpar occurring in inner vertical mode. % % \@nofonterror : Typeface not available. %%% OBSOLETE; DELETED. % % \@badcrerr : A \\ used where it shouldn't be in a centering or flushing % environment. % % \@noitemerr : \addvspace or \addpenalty was called when not in vmode. % Probably caused by a missing \item. % % \@notprerr : A command that can be used only in the preamble % appears after the \begin{document} command. \def\@notdefinable{\@latexerr{Command name '\@tempa' already used}\@eha} \def\@nolnerr{\@latexerr{There's no line here to end}\@eha} \def\@nocnterr{\@latexerr{No such counter}\@eha} \def\@ctrerr{\@latexerr{Counter too large}\@ehb} \def\@nodocument{\@latexerr{Missing \string\begin{document}}\@ehd} \def\@badend#1{\@latexerr{\string\begin{\@currenvir} ended by \string\end{#1}}\@eha} \def\@badmath{\@latexerr{Bad math environment delimiter}\@eha} \def\@toodeep{\@latexerr{Too deeply nested}\@ehd} \def\@badpoptabs{\@latexerr{\string\pushtabs \space and \string\poptabs \space don't match}\@ehd} \def\@badtab{\@latexerr{Undefined tab position}\@ehd} \def\@preamerr#1{\@latexerr{\ifcase #1 Illegal character\or Missing @-exp\or Missing p-arg\fi\space in array arg}\@ehd} \def\@badlinearg{\@latexerr{Bad \string\line\space or \string\vector \space argument}\@ehb} \def\@parmoderr{\@latexerr{Not in outer par mode}\@ehb} \def\@fltovf{\@latexerr{Too many unprocessed floats}\@ehb} \def\@latexbug{\@latexerr{This may be a LaTeX bug}{Call for help}} % \def\@nofonterror{\@latexerr{Typeface not available}\@eha} \def\@badcrerr {\@latexerr{Bad use of \string\\}\@ehc} \def\@noitemerr{\@latexerr{Something's wrong--perhaps a missing \string\item}\@ehc} \def\@notprerr {\@latexerr{Can be used only in preamble}\@eha} \message{par,} % **************************************** % * \par AND \everypar * % **************************************** % % There are two situations in which \par may be changed: % % - Long-term changes, in which the new value is to remain in effect % until the current environment is left. The environments that % change \par in this way are the following: % % * All list environments (itemize, quote, etc.) % * Environments that turn \par into a noop: % tabbing, array and tabular. % % - Temporary changes, in which \par is restored to its previous value the % next time it is executed. The following are all such uses. % * \@endparenv [used inside \endtrivlist] % * The mechanism for avoiding page breaks and getting the % spacing right after section heads. % % To permit the proper interaction of these two situations, long-term % changes are made by the following command: % \@setpar{VAL} : To set \par. It \def's \par and \@par to VAL. % Short-term changes are made by the usual \def\par commands. % The original values are restored after a short-term change % by the \@restorepar commands. % % NOTE: \@@par always is defined to be the original TeX \par. % % \everypar is changed only for the short term. Whenever \everypar % is set non-null, it should restore itself to null when executed. % The following commands change \everypar in this way: % * \item % * \@endparenv [used inside \endtrivlist] % * \minipage % % WARNING: Commands that make short-term changes to \par and \everypar % must take account of the possibility that the new commands and the % ones that do the restoration may be executed inside a group. In % particular, \everypar is executed inside a group whenever a new paragraph % begins with a left brace. The \everypar command that restores its % definition should be local to the current group (in case the command % is inside a minipage used inside someplace where \everypar has been % redefined). Thus, if \everypar is redefined to do an \everypar{} % it could take several executions of \everypar before % the restoration 'holds'. This usually causes no problem. However, to % prevent the extra executions from doing harm, use a global switch % to keep anything harmful in the new \everypar from being done twice. % % WARNING: Commands that change \everypar should remember that \everypar % might be supposed to set the following switches false: % @nobreak % @minipage % they should do the setting if necessary. \def\@par{\let\par=\@@par\par} \def\@setpar#1{\def\par{#1}\def\@par{#1}} \def\@restorepar{\def\par{\@par}} \message{spacing,} % ********************************************** % * SPACING / LINE AND PAGE BREAKING * % ********************************************** % % USER COMMANDS: % \nopagebreak[i] : i = 0,...,4. Default argument = 4. Puts a penalty % into the vertical list output as follows: % 0 : penalty = 0 % 1 : penalty = \@lowpenalty % 2 : penalty = \@medpenalty % 3 : penalty = \@highpenalty % 4 : penalty = 10000 % \pagebreak[i] : same as \nopagebreak except negatives of its penalty % \linebreak[i], \nolinebreak[i] : analogs of the above % \samepage : inhibits page breaking most places by setting the following % penalties to 10000 % \interlinepenalty % \postdisplaypenalty % \interdisplaylinepenalty % \@beginparpenalty % \@endparpenalty % \@itempenalty % \@secpenalty % \interfootnotelinepenalty % % \obeycr : defines == \\. % \restorecr : restores to its usual meaning. % % \\ : initially defined to be \newline % \\[LENGTH] : initially defined to be \vspace{LENGTH}\newline % Note: \\* adds a \vadjust{\penalty 10000} \def\nopagebreak{\@ifnextchar[{\@nopgbk}{\@nopgbk[4]}} \def\@nopgbk[#1]{\ifvmode \penalty \@getpen{#1}\else \@bsphack\vadjust{\penalty \@getpen{#1}}\@esphack\fi} \def\pagebreak{\@ifnextchar[{\@pgbk}{\@pgbk[4]}} \def\@pgbk[#1]{\ifvmode \penalty -\@getpen{#1}\else \@bsphack\vadjust{\penalty -\@getpen{#1}}\@esphack\fi} \def\nolinebreak{\@ifnextchar[{\@nolnbk}{\@nolnbk[4]}} \def\@nolnbk[#1]{\ifvmode \@nolnerr\else \@tempskipa\lastskip \unskip \penalty \@getpen{#1}\ifdim \@tempskipa >\z@ \hskip\@tempskipa\ignorespaces\fi\fi} \def\linebreak{\@ifnextchar[{\@lnbk}{\@lnbk[4]}} \def\@lnbk[#1]{\ifvmode \@nolnerr\else \unskip\penalty -\@getpen{#1}\fi} \def\samepage{\interlinepenalty\@M \postdisplaypenalty\@M \interdisplaylinepenalty\@M \@beginparpenalty\@M \@endparpenalty\@M \@itempenalty\@M \@secpenalty\@M \interfootnotelinepenalty\@M} \def\newline{\ifvmode \@nolnerr \else \unskip\hfil \penalty -\@M\relax\fi} \def\@normalcr{\@ifstar{\vadjust{\penalty\@M}\@xnewline}{\@xnewline}} \def\@xnewline{\@ifnextchar[{\@newline}{\newline}} \def\@newline[#1]{\ifhmode\unskip\fi\vspace{#1}\newline} \let\\=\@normalcr \def\@getpen#1{\ifcase #1 0 \or \@lowpenalty\or \@medpenalty \or \@highpenalty \else \@M \fi} % @nobreak : Switch used to avoid page breaks caused by \label after a section % heading, etc. It should be GLOBALLY set true after the \nobreak % and GLOBALLY set false by the next invocation of \everypar. % Commands that reset \everypar should globally set it false % if appropriate. % \newif\if@nobreak \@nobreakfalse % \@bsphack ... \@esphack % used by macros such as \index and \begin{@float} ... \end{@float} % that want to be invisible -- i.e., % not leave any extra space when used in the middle of text. Such % a macro should begin with \@bsphack and end with \@esphack % The macro in question should not create any text, nor change the % mode. % % \@bsphack == % BEGIN % \dimen\@savsk := \lastskip % if hmode then \@savsf := \spacefactor fi % END % % \@esphack == % BEGIN % if hmode % then \spacefactor := \@savsf % if \dimen\@savsk > 0pt then \ignorespaces % \global\@ignoretrue fi % fi % END % \newdimen\@savsk \newcount\@savsf \def\@bsphack{\@savsk\lastskip \ifhmode\@savsf\spacefactor\fi} \def\@esphack{\relax\ifhmode\spacefactor\@savsf {}\ifdim \@savsk >\z@ \global\@ignoretrue \ignorespaces \fi \fi} % VERTICAL SPACING: % % LaTeX supports the PLAIN TeX commands \smallskip, \medskip and \bigskip. % However, it redefines them using \vspace instead of \vskip. % % Extra vertical space is added by the command command \addvspace{SKIP}, % which adds a vertical skip of SKIP to the document. The sequence % \addvspace{S1} \addvspace{S2} % is equivalent to % \addvspace{maximum of S1, S2}. % \addvspace should be used only in vertical mode, and gives an error if it's % not. The \addvspace command does NOT add vertical space if % @minipage = F. The minipage environment uses this to inhibit % the addition of extra vertical space at the beginning. % % Penalties are put into the vertical list with the \addpenalty{PENALTY} % command. It works properly when \addpenalty and \addvspace commands % are mixed. % % The @nobreak switch is set true used when in vertical mode and no page % break should occur. (Right now, it is used only by the section heading % commands to inhibit page breaking after a heading.) % % % \addvspace{SKIP} == % BEGIN % if vmode % then if @minipage % else if \lastskip =0 % then \vskip SKIP % else if \lastskip < SKIP % then \vskip -\lastskip % \vskip SKIP % else if SKIP < 0 and \lastskip >= 0 % then \vskip -\lastskip % \vskip \lastskip + SKIP % fi fi fi fi % else 'missing \item' error. % fi % END \def\addvspace#1{\ifvmode \if@minipage\else \ifdim \lastskip =\z@ \vskip #1\relax \else \@tempskipb#1\relax\@xaddvskip \fi\fi \else\@noitemerr\fi} \def\@xaddvskip{\ifdim \lastskip <\@tempskipb\vskip-\lastskip\vskip \@tempskipb\relax \else \ifdim \@tempskipb<\z@ \ifdim \lastskip <\z@ \else \advance\@tempskipb\lastskip \vskip -\lastskip \vskip \@tempskipb \fi\fi\fi} \def\addpenalty#1{\ifvmode \if@minipage\else\if@nobreak\else \ifdim\lastskip=\z@ \penalty#1\relax \else \@tempskipb\lastskip \vskip -\lastskip \penalty#1\vskip\@tempskipb \fi\fi\fi \else\@noitemerr\fi} \def\vspace{\@ifstar{\@vspacer}{\@vspace}} \def\@vspace#1{\ifvmode \dimen@\prevdepth \expandafter\vskip #1\vskip \z@\prevdepth\dimen@ \else \@bsphack\vadjust{\dimen@\prevdepth \expandafter\vskip #1\vskip \z@\prevdepth\dimen@}\@esphack\fi} \def\@vspacer#1{\ifvmode \dimen@\prevdepth \hrule height\z@ \nobreak \expandafter\vskip #1\vskip \z@ \prevdepth\dimen@ \else \@bsphack\vadjust{\dimen@\prevdepth \hrule height\z@ \nobreak \expandafter\vskip #1\vskip \z@ \prevdepth\dimen@}\@esphack\fi} \def\smallskip{\vspace\smallskipamount} \def\medskip{\vspace\medskipamount} \def\bigskip{\vspace\bigskipamount} % See list environment for explanation of the following macros. \def\endtrivlist{\if@newlist\@noitemerr\fi \if@inlabel\indent\fi \ifhmode\unskip \par\fi \if@noparlist \else \ifdim\lastskip >\z@ \@tempskipa\lastskip \vskip -\lastskip \advance\@tempskipa\parskip \advance\@tempskipa -\@outerparskip \vskip\@tempskipa \fi\@endparenv\fi} \def\@endparenv{\addpenalty\@endparpenalty \addvspace\@topsepadd \endgroup\def\par{\@restorepar\everypar{}\par}\everypar {\hskip -\parindent \everypar{}}\begingroup} % HORIZONTAL SPACE % % \, : used in paragraph mode produces a \thinspace. It has the ordinary % definition in math mode. Useful for quotes inside quotes, as in % ``\,`Foo', he said.'' % % \@ : placed before a '.', makes it a sentence-ending period. Does the % right thing for other punctuation marks as well. Does this by % setting spacefactor to 1000. \def\,{\protect\pcomma} \def\pcomma{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi} \def\@{\spacefactor\@m} \def\hspace{\protect\phspace} \def\phspace{\@ifstar{\@hspacer}{\@hspace}} \def\@hspace#1{\leavevmode\expandafter\hskip #1\relax} \def\@hspacer#1{\leavevmode\vrule width\z@\nobreak\expandafter\hskip #1\hskip \z@} %% extra \hskip 0pt added 12/17/85 to guard %% against a following \unskip % define \fill to = 0pt plus 1fill \newskip\fill \fill = 0pt plus 1fill % \stretch{N} == 0pt plus N fill \def\stretch#1{\z@ plus #1fill\relax} {\catcode`\^^M=13 \gdef\obeycr{\catcode`\^^M=13 \def^^M{\\}\@gobblecr}% \gdef\restorecr{\catcode`\^^M=5 }} %} BRACE MATCHING \message{control,} % ********************************************** % * PROGRAM CONTROL STRUCTURE MACROS * % ********************************************** % % \@whilenum TEST \do {BODY} % \@whiledim TEST \do {BODY} : These implement the loop % while TEST do BODY od % where TEST is a TeX \ifnum or \ifdim test, respectively. % They are optimized for the normal case of TEST initially false. % % \@whilesw SWITCH \fi {BODY} : Implements the loop % while SWITCH do BODY od % where SWITCH is a command defined by \newswitch. % Optimized for normal case of SWITCH initially false. % % \@for NAME := LIST \do {BODY} : Assumes that LIST expands to A1,A2, ... ,An . % Executes BODY n times, with NAME = Ai on the i-th iteration. % Optimized for the normal case of n = 1. Works for n=0. % % \@tfor NAME := LIST \do {BODY} % if, before expansion, LIST = T1 ... Tn where each Ti is a % token or {...}, then executes BODY n times, with NAME = Ti % on the i-th iteration. Works for n=0. % % NOTES: 1. These macros use no \@temp sequences. % 2. These macros do not work if the body contains anything that looks % syntactically to TeX like an improperly balanced \if \else \fi. % % \@whilenum TEST \do {BODY} == % BEGIN % if TEST % then BODY % \@iwhilenum{TEST \relax BODY} % END % % \@iwhilenum {TEST BODY} == % BEGIN % if TEST % then BODY % \@nextwhile = def(\@iwhilenum) % else \@nextwhile = def(\@whilenoop) % fi % \@nextwhile {TEST BODY} % END % % \@whilesw SWITCH \fi {BODY} == % BEGIN % if SWITCH % then BODY % \@iwhilesw {SWITCH BODY}\fi % fi % END % % \@iwhilesw {SWITCH BODY} \fi == % BEGIN % if SWITCH % then BODY % \@nextwhile = def(\@iwhilesw) % else \@nextwhile = def(\@whileswnoop) % fi % \@nextwhile {SWITCH BODY} \fi % END \def\@whilenoop#1{} \def\@whilenum#1\do #2{\ifnum #1\relax #2\relax\@iwhilenum{#1\relax #2\relax}\fi} \def\@iwhilenum#1{\ifnum #1\let\@nextwhile=\@iwhilenum \else\let\@nextwhile=\@whilenoop\fi\@nextwhile{#1}} \def\@whiledim#1\do #2{\ifdim #1\relax#2\@iwhiledim{#1\relax#2}\fi} \def\@iwhiledim#1{\ifdim #1\let\@nextwhile=\@iwhiledim \else\let\@nextwhile=\@whilenoop\fi\@nextwhile{#1}} \def\@whileswnoop#1\fi{} \def\@whilesw#1\fi#2{#1#2\@iwhilesw{#1#2}\fi\fi} \def\@iwhilesw#1\fi{#1\let\@nextwhile=\@iwhilesw \else\let\@nextwhile=\@whileswnoop\fi\@nextwhile{#1}\fi} % \@for NAME := LIST \do {BODY} == % BEGIN \@forloop expand(LIST),\@nil,\@nil \@@ NAME {BODY} END % % \@forloop CAR, CARCDR, CDRCDR \@@ NAME {BODY} == % BEGIN % NAME = CAR % if def(NAME) = def(\@nnil) % else BODY; % NAME = CARCDR % if def(NAME) = def(\@nnil) % else BODY % \@iforloop CDRCDR \@@ NAME \do {BODY} % fi % fi % END % % \@iforloop CAR, CDR \@@ NAME {BODY} = % NAME = CAR % if def(NAME) = def(\@nnil) % then \@nextwhile = def(\@fornoop) % else BODY ; % \@nextwhile = def(\@iforloop) % fi % \@nextwhile name cdr {body} % % \@tfor NAME := LIST \do {BODY} % = \@tforloop LIST \@nil \@@ NAME {BODY} % % \@tforloop car cdr \@@ name {body} = % name = car % if def(name) = def(\@nnil) % then \@nextwhile == \@fornoop % else body ; % \@nextwhile == \@forloop % fi % \@nextwhile name cdr {body} % \def\@nnil{\@nil} \def\@empty{} \def\@fornoop#1\@@#2#3{} \def\@for#1:=#2\do#3{\edef\@fortmp{#2}\ifx\@fortmp\@empty \else \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}\fi} \def\@forloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else #5\def#4{#2}\ifx #4\@nnil \else#5\@iforloop #3\@@#4{#5}\fi\fi} \def\@iforloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil \let\@nextwhile=\@fornoop \else #4\relax\let\@nextwhile=\@iforloop\fi\@nextwhile#2\@@#3{#4}} \def\@tfor#1:=#2\do#3{\xdef\@fortmp{#2}\ifx\@fortmp\@empty \else \@tforloop#2\@nil\@nil\@@#1{#3}\fi} \def\@tforloop#1#2\@@#3#4{\def#3{#1}\ifx #3\@nnil \let\@nextwhile=\@fornoop \else #4\relax\let\@nextwhile=\@tforloop\fi\@nextwhile#2\@@#3{#4}} \message{files,} % **************************************** % * FILE HANDLING * % **************************************** % % THE FOLLOWING USER COMMANDS ARE DEFINED IN THIS PART: % \document : Reads in the .AUX files and \catcode's @ to 12. % \nofiles : Suppresses all file output by setting \@filesw false. % \includeonly{NAME1, ... ,NAMEn} % : Causes only parts NAME1, ... ,NAMEn to be read by % their \include commands. Works by setting \@partsw true % and setting \@partlist to NAME1, ... ,NAMEn. % \include{NAME} : Does an \input NAME unless \partsw is true and % NAME is not in \@partlist. If \@filesw is true, then % it directs .AUX output to NAME.AUX, including a % checkpoint at the end. % \input{NAME} : The same as TeX's \input, except it allows optional % braces around the file name. % % VARIABLES, SWITCHES AND INTERNAL COMMANDS: % \@mainaux : Output file number for main .AUX file. % \@partaux : Output file number for current part's .AUX file. % \@auxout : Either \@mainout or \@partout, depending on which .AUX % file output goes to. % \@input{foo} : If file foo exists, then \input's it, otherwise types % a warning message. % @filesw : Switch -- set false if no .AUX, .TOC, .IDX etc files are % to be % @partsw : Set true by a \includeonly command. % \@partlist : Set to the argument of the \includeonly command. % % \cp@FOO : The checkpoint for \included file FOO.TEX, written % by \@writeckpt at the end of file FOO.AUX % % \document == % BEGIN % \endgroup % cancels \begingroup generated by \begin command % \@colht := \@colroom := \vsize := \textheight % \columnwidth := \textwidth % \@clubpenalty := \clubpenalty % \@clubpenalty saves value. % IF @twocolumn = T % THEN \columnwidth := (\columnwidth - \columnsep)/2 % @firstcolumn := T % FI % \hsize := \linewidth := \columnwidth % \begingroup % \@floatplacement \@dblfloatplacement % \@input{\jobname.aux} % \endgroup % IF \@filesw = T % THEN open file \@mainaux for writing % write ``\relax''on file \@mainaux % FI % \do{COMMAND} == BEGIN \let COMMAND = \@notprerr END % \@preamblecmds % \do == \noexpand % \@normalsize % \everypar{} % END % % \includeonly{FILELIST} == % BEGIN % \@partsw := T % \@partlist := FILELIST % END % % \include{FILE} == % BEGIN % \clearpage % if \@filesw = T % then \immediate\write\@mainaux{\string\@input{FILE.AUX}} % fi % if \@partsw = T % then \@tempswa := F % \@tempb == FILE % for \@tempa := \@partlist % do if eval(\@tempa) = eval(\@tempb) % then \@tempswa := T fi % od % fi % % if \@tempswa = T % then \@auxout := \@partaux % if \@filesw = T % then \immediate\openout\@partaux{FILE.AUX} % \immediate\write\@partaux{\relax} % fi % \@input{FILE.TEX} % \clearpage % \@writeckpt{FILE} % if @filesw then \closeout \@partaux fi % \@auxout := \@mainaux % else \cp@FILE % fi % END % % \@writeckpt{FILE} == % BEGIN % if \@filesw = T % \immediate\write on file \@partaux: % \gdef\cp@FILE{ %% } % for \@tempa := \cl@@ckpt % do \immediate\write on file \@partaux: % \global\string\setcounter % {eval(\@tempa)}{eval(\c@eval(\@tempa))} % od %% { % \immediate\write on file \@partaux: } % fi % END % % INITIALIZATION % \@tempswa := T \newif\if@filesw \@fileswtrue \newif\if@partsw \@partswfalse \newwrite\@mainaux \newwrite\@partaux \newcount\@clubpenalty \def\document{\endgroup \@colht\textheight \@colroom\textheight \vsize\textheight \columnwidth\textwidth \@clubpenalty\clubpenalty \if@twocolumn \advance\columnwidth -\columnsep \divide\columnwidth\tw@ \hsize\columnwidth \@firstcolumntrue \fi \hsize\columnwidth \linewidth\hsize \begingroup\@floatplacement\@dblfloatplacement \makeatletter\let\@writefile\@gobbletwo \@input{\jobname.aux}\endgroup \if@filesw \immediate\openout\@mainaux=\jobname.aux \immediate\write\@mainaux{\relax}\fi \def\do##1{\let ##1\@notprerr} \@preamblecmds \let\do\noexpand \@normalsize\everypar{}} \def\@gobbletwo#1#2{} \def\nofiles{\@fileswfalse \typeout {No auxiliary output files.}\typeout{}} \def\@input#1{\openin1 #1 \ifeof1 \typeout {No file #1.}\else\closein1 \relax\@@input #1 \fi} \let\@auxout=\@mainaux \def\includeonly#1{\@partswtrue\edef\@partlist{#1}} \def\include#1{\clearpage \if@filesw \immediate\write\@mainaux{\string\@input{#1.aux}}\fi \@tempswatrue\if@partsw \@tempswafalse\def\@tempb{#1}\@for \@tempa:=\@partlist\do{\ifx\@tempa\@tempb\@tempswatrue\fi}\fi \if@tempswa \if@filesw \let\@auxout=\@partaux \immediate\openout\@partaux #1.aux \immediate\write\@partaux{\relax}\fi\@input{#1.tex}\clearpage \@writeckpt{#1}\if@filesw \immediate\closeout\@partaux \fi \let\@auxout=\@mainaux\else\@nameuse{cp@#1}\fi} \def\@writeckpt#1{\if@filesw \immediate\write\@partaux{\string\global\string\@namedef{cp@#1}\@charlb}% {\let\@elt\@wckptelt \cl@@ckpt}\immediate\write\@partaux{\@charrb}\fi} \def\@wckptelt#1{\immediate\write\@partaux {\string\setcounter{#1}{\the\@nameuse{c@#1}}}} \def\input{\@ifnextchar \bgroup{\@iinput}{\@@input }} \def\@iinput#1{\@@input #1 } % The following defines \@charlb and \@charrb to be { and }, respectively % with \catcode 11. {\catcode`[=1 \catcode`]=2 \catcode`{=11 \catcode`}=11 \gdef\@charlb[{] \gdef\@charrb[}] ]% }brace matching \message{env. counters,} % **************************************** % * ENVIRONMENT COUNTER MACROS * % **************************************** % % An environment foo has an associated counter defined by the % following control sequences: % \c@foo : Contains the counter's numerical value. It is defined by % \newcount\foocounter. % \thefoo : Macro that expands to the printed value of \foocounter. % For example, if sections are numbered within chapters, % and section headings look like % Section II-3. The Nature of Counters % then \thesection might be defined by: % \def\thesection{\@Roman{\c@chapter}-\@arabic{\c@section}} % % \p@foo : Macro that expands to a printed 'reference prefix' of % counter foo. Any \ref to a value created by counter % foo will produce the expansion of \p@foo\thefoo when the % the \label command is executed. % % NOTE: \thefoo and \p@foo MUST BE DEFINED IN SUCH A WAY THAT % \edef\bar{\thefoo} OR \edef\bar{\p@foo} % DEFINES \bar SO THAT IT WILL EVALUATE TO THE COUNTER VALUE AT THE TIME % OF THE \edef, EVEN AFTER \foocounter AND ANY OTHER COUNTERS HAVE BEEN % CHANGED. THIS WILL HAPPEN IF YOU USE THE STANDARD COMMANDS \@arabic, % \@Roman, ETC. % % \cl@foo : List of counters to be reset when foo stepped. Has format % \@elt{countera}\@elt{counterb}\@elt{counterc}. % % The following commands are used to define and modify counters. % \setcounter{FOO}{VAL} : Globally sets \foocounter equal to VAL. % \addtocounter{FOO}{VAL}: Globally increments \foocounter by VAL. % \newcounter{NEWCTR}[OLDCTR] : Defines NEWCTR to be a counter, which is % reset when counter OLDCTR is stepped. If % NEWCTR already defined produces 'c@NEWCTR % already defined' error. % \value{CTR} : produces the value of counter CTR, for use with % a \setcounter or \addtocounter command. % \stepcounter{FOO} : Globally increments counter \c@FOO % and resets all subsidiary counters. % \refstepcounter{FOO} : Same a \stepcounter, but it also defines % \@currentreference so that a subsequent % \label{bar} command causes \ref{bar} to % generate the current value of counter foo. % \@definecounter{FOO} : Initializes counter FOO (with empty reset list), % defines \p@FOO and \theFOO to be null. % Also adds FOO to \cl@@ckpt -- the reset % list of a dummy counter @ckpt used for % taking checkpoints. % \@addtoreset{FOO}{BAR} : Adds counter FOO to the list of counters % \cl@BAR to be reset when counter bar is stepped. % % NUMBERING MACROS: % \arabic{COUNTER} : Representation of COUNTER as arabic numerals. % \roman{COUNTER} : Representation of COUNTER as lower-case % Roman numerals. % \Roman{COUNTER} : Representation of COUNTER as upper-case % Roman numerals. % \alph{COUNTER} : Representation of COUNTER as a lower-case % letter: 1 = a, 2 = b, etc. % \Alph{COUNTER} : Representation of COUNTER as an upper-case % letter: 1 = A, 2 = B, etc. % \fnsymbol{COUNTER} : Representation of COUNTER as a footnote % symbol: 1 = *, 2 = \dagger, etc. Can be % used only in math mode. % % THE ABOVE ARE IMPLEMENTED IN TERMS OF THE FOLLOWING: % \@arabic\FOOcounter : Representation of \FOOcounter as arabic numerals. % \@roman\FOOcounter : Representation of \FOOcounter as lower-case % Roman numerals. % \@Roman\FOOcounter : Representation of \FOOcounter as upper-case % Roman numerals. % \@alph\FOOcounter : Representation of \FOOcounter as a lower-case % letter: 1 = a, 2 = b, etc. % \@Alph\FOOcounter : Representation of \FOOcounter as an upper-case % letter: 1 = A, 2 = B, etc. % \@fnsymbol\FOOcounter : Representation of \FOOcounter as a footnote % symbol. Can be used only in math mode. \def\setcounter#1#2{\@ifundefined{c@#1}{\@nocnterr}% {\global\csname c@#1\endcsname#2\relax}} \def\addtocounter#1#2{\@ifundefined{c@#1}{\@nocnterr}% {\global\advance\csname c@#1\endcsname #2\relax}} \def\newcounter#1{\expandafter\@ifdefinable \csname c@#1\endcsname {\@definecounter{#1}}\@ifnextchar[{\@newctr{#1}}{}} \def\value#1{\csname c@#1\endcsname} \def\@newctr#1[#2]{\@ifundefined{c@#2}{\@nocnterr}{\@addtoreset{#1}{#2}}} \def\stepcounter#1{\global\expandafter\advance\csname c@#1\endcsname \@ne {\let\@elt\@stpelt \csname cl@#1\endcsname}} \def\@stpelt#1{\global\csname c@#1\endcsname \z@} \def\cl@@ckpt{\@elt{page}} \def\@definecounter#1{\expandafter\newcount\csname c@#1\endcsname \setcounter{#1}0 \expandafter\gdef\csname cl@#1\endcsname{}\@addtoreset {#1}{@ckpt}\expandafter\gdef\csname p@#1\endcsname{}\expandafter \gdef\csname the#1\endcsname{\arabic{#1}}} \def\@addtoreset#1#2{\expandafter\@cons\csname cl@#2\endcsname {{#1}}} % Numbering commands for definitions of \theCOUNTER and \list arguments. % \fnsymbol produces the standard footnoting symbols: asterisk, dagger, etc. % They can be used only in math mode. \def\arabic#1{\@arabic{\@nameuse{c@#1}}} \def\roman#1{\@roman{\@nameuse{c@#1}}} \def\Roman#1{\@Roman{\@nameuse{c@#1}}} \def\alph#1{\@alph{\@nameuse{c@#1}}} \def\Alph#1{\@Alph{\@nameuse{c@#1}}} \def\fnsymbol#1{\@fnsymbol{\@nameuse{c@#1}}} \def\@arabic#1{\ifnum #1>0 \number #1\fi} \def\@roman#1{\romannumeral #1} \def\@Roman#1{\expandafter\uppercase\expandafter{\romannumeral #1}} \def\@alph#1{\ifcase#1\or a\or b\or c\or d\else\@ialph{#1}\fi} \def\@ialph#1{\ifcase#1\or \or \or \or \or e\or f\or g\or h\or i\or j\or k\or l\or m\or n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z\else\@ctrerr\fi} \def\@Alph#1{\ifcase#1\or A\or B\or C\or D\else\@Ialph{#1}\fi} \def\@Ialph#1{\ifcase#1\or \or \or \or \or E\or F\or G\or H\or I\or J\or K\or L\or M\or N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else\@ctrerr\fi} \def\@fnsymbol#1{\ifcase#1\or *\or \dagger\or \ddagger\or \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger \or \ddagger\ddagger \else\@ctrerr\fi\relax} \message{page nos.,} % **************************************** % * PAGE NUMBERING * % **************************************** % % Page numbers are produced by a page counter, used just like any other % counter. The only difference is that \c@page contains the number of % the next page to be output (the one currently being produced), rather % than one minus it. Thus, it is normally initialized to 1 rather than % 0. \c@page is defined to be \count0, rather than a count assigned by % \newcount. % % The user sets the pagenumber style with the \pagenumbering{FOO} % command, which sets the page counter to 1 and defines \thepage to be % \FOO. For example, \pagenumbering{roman} causes pages to be numbered % i, ii, etc. \countdef\c@page=0 \c@page=1 \def\cl@page{} \def\pagenumbering#1{\global\c@page \@ne \gdef\thepage{\csname @#1\endcsname \c@page}} \message{x-ref,} % **************************************** % * CROSS REFERENCING MACROS * % **************************************** % % The user writes \label{foo} to define the following cross-references: % \ref{foo} : value of most recently incremented referencable counter. % in the current environment. (Chapter, section, theorem % and enumeration counters counters are referencable, % footnote counters are not.) % \pageref{foo} : page number at which \label{foo} command appeared. % where foo can be any string of characters not containing '\', '{' or '}'. % % Note: The scope of the \label command is delimited by environments, so % \begin{theorem} \label{foo} ... \end{theorem} \label{bar} % defines \ref{foo} to be the theorem number and \ref{bar} to be % the current section number. % % Note: \label does the right thing in terms of spacing -- i.e., % leaving a space on both sides of it is equivalent to leaving % a space on either side. % % This is implemented as follows. A referencable counter CNT is % incremented by the command \refstepcounter{CNT} , which sets % \@currentlabel == {CNT}{eval(\p@cnt\theCNT)}. The command % \label{FOO} then writes the following on file \@auxout : % \newlabel{FOO}{{eval(\@currentlabel)}{eval(\thepage)}} % % \ref{FOO} == % BEGIN % if \r@foo undefined % then ?? % Warning: 'reference foo on page ... undefined' % else \@car \eval(\r@FOO)\@nil % fi % END % % \pageref{foo} = % BEGIN % if \r@foo undefined % then ?? % Warning: 'reference foo on page ... undefined' % else \@cdr \eval(\r@FOO)\@nil % fi % END % \def\ref#1{\@ifundefined{r@#1}{{\bf ??}\@warning {Reference `#1' on page \thepage \space undefined}}{\edef\@tempa{\@nameuse{r@#1}}\expandafter \@car\@tempa \@nil\null}} \def\pageref#1{\@ifundefined{r@#1}{{\bf ??}\@warning {Reference `#1' on page \thepage \space undefined}}{\edef\@tempa{\@nameuse{r@#1}}\expandafter \@cdr\@tempa\@nil\null}} \def\label#1{\@bsphack\if@filesw {\let\thepage\relax \xdef\@gtempa{\write\@auxout{\string \newlabel{#1}{{\@currentlabel}{\thepage}}}}}\@gtempa \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack} \def\newlabel#1#2{\@ifundefined{r@#1}{}{\@warning{Label `#1' multiply defined}}\global\@namedef{r@#1}{#2}} \def\refstepcounter#1{\stepcounter {#1}\edef\@currentlabel{\csname p@#1\endcsname\csname the#1\endcsname}} \def\@currentlabel{} % For \label commands that come before any environment \message{environments,} % **************************************** % * ENVIRONMENTS * % **************************************** % % \begin{foo} and \end{foo} are used to delimit environment foo. % \begin{foo} starts a group and calls \foo if it is defined, otherwise % it does nothing. \end{foo} checks to see that it matches the % corresponding \begin and if so, it calls \endfoo and does an % \endgroup. Otherwise, \end{foo} does nothing. % % If \end{foo} needs to ignore blanks after it, then \endfoo should % globally set the @ignore switch true with \global\@ignoretrue. % % \@currenvir : the name of the current environment. Initialized to % 'document' to make \end{document} work right. % % \@preamblecmds : a list of commands that can be used only in the % preamble (before the \begin{document}), in the % form \do \CMDA \do \CMDB ... . These commands % are redefined to \@notprerr by \begin{document} % to save space. They include the following: % \document \documentstyle \@documentstyle % \@options \@preamblecmds \@optionlist % \@optionfiles \nofiles \includeonly \makeindex % \makeglossary % The document style can add any other commands to % this list by % \let\do = \noexpand % \edef\@preamblecmds{\@preamblecmds \do ...} % % NOTE: \@@end is defined to be the \end command of TeX82. % % \enddocument is the user's command for ending the manuscript file. % % \stop is a panic button -- to end TeX in the middle. % % \enddocument == % BEGIN % \@checkend{document} %% checks for unmatched \begin % \clearpage % \begingroup % if @filesw = true % then close file @mainaux % \global \@namedef {ARG1}{ARG2} == null % \newlabel{LABEL}{VAL} == % BEGIN % \@tempa == VAL % if def(\@tempa) = def(\r@LABEL) % else @tempswa := true fi % END % \bibcite{LABEL}{VAL} == null % BEGIN % \@tempa == VAL % if def(\@tempa) = def(\g@LABEL) % else @tempswa := true fi % END % @tempswa := false % make @ a letter % \input \jobname.AUX % if @tempswa = true % then LaTeX Warning: 'Label may have changed. % Rerun to get cross-references right.' % fi fi % \endgroup % finish up % END % % \@writefile{EXT}{ENTRY} == % if tf@EXT undefined % else \write\tf@EXT{ENTRY} % fi % \def\@currenvir{document} \def\@preamblecmds{\do\document \do\documentstyle \do\@documentstyle \do\@options \do\@preamblecmds \do\@optionlist \do\@optionfiles \do\nofiles \do\includeonly \do\makeindex \do\makeglossary} \newif\if@ignore \def\enddocument{\@checkend{document}\clearpage\begingroup \if@filesw \immediate\closeout\@mainaux \def\global\@namedef##1##2{}\def\newlabel{\@testdef r}% \def\bibcite{\@testdef b}\@tempswafalse \makeatletter\input \jobname.aux \if@tempswa \@warning{Label(s) may have changed. Rerun to get cross-references right}\fi\fi\endgroup\deadcycles\z@\@@end} \def\@testdef #1#2#3{\def\@tempa{#3}\expandafter \ifx \csname #1@#2\endcsname \@tempa \else \@tempswatrue \fi} \def\@writefile#1#2{\@ifundefined{tf@#1}{}{\expandafter \immediate\write\csname tf@#1\endcsname{#2}}} \def\stop{\clearpage\deadcycles\z@\let\par\@@par\@@end} \everypar{\@nodocument} %% To get an error if text appears before the \nullfont %% \begin{document} % \begin{NAME} == % BEGIN % IF \NAME undefined THEN \@tempa == BEGIN report error END % ELSE \@tempa == \NAME % \@currenvir :=L NAME % FI % \begingroup % \NAME % END % \end{NAME} == % BEGIN % \endNAME % \endgroup % \@checkend{NAME} % IF @ignore = T % THEN @ignore :=G F % \ignorespaces % FI % END % \@checkend{NAME} == % BEGIN % IF \@currenvir = NAME % ELSE \@badend{NAME} % FI % \@currenvir :=L document % END \def\begin#1{\@ifundefined{#1}{\def\@tempa{\@latexerr{Environment #1 undefined}\@eha}}{\def\@currenvir{#1}\def\@tempa{\csname #1\endcsname}}\begingroup\@tempa} \def\end#1{\csname end#1\endcsname \endgroup \@checkend{#1}\if@ignore \global\@ignorefalse \ignorespaces\fi} \def\@checkend#1{\def\@tempa{#1}\ifx \@tempa\@currenvir \else\@badend{#1}\fi \def\@currenvir{document}} \message{math,} % ********************************************** % * MATH ENVIRONMENTS * % ********************************************** % % \( == BEGIN if math mode % then error: '\( in math mode' % else $ % fi % END % % \) == BEGIN if math mode % then if inner mode % then $ % else error ``\[ closed with \)'' % else error 'unmatched \)' % fi % END % % \[ == BEGIN if math mode % then error: '\[ in math mode' % else $$ % fi % END % % \] == BEGIN if math mode % then if inner mode % then error '\( closed with \]' % else $$ % else error 'unmatched \]' % fi % END % % \equation == BEGIN \refstepcounter{equation} $$ END % % \endequation == BEGIN \eqno (\theequation) $$\ignorespaces END % % NOTE: The document style must define \theequation etc., and do % the appropriate \@addtoreset. It should also redefine \@eqnnum % if another format for the equation number is desired other than the % standard (...), or to move the equation numbers to the flushleft. % (See comment on the \def of \@eqnnum.) % % \stackrel{TOP}{BOT} == PLAIN TeX's \buildrel {TOP} \over {BOT} % % \frac{TOP}{BOT} == {TOP \over BOT} % % \sqrt[N]{EXP} produces an Nth root of EXP formula. % % \: == \> (medium space) \def\({\relax\ifmmode\@badmath\else$%%$BRACE MATCH HACK \fi} \def\){\relax\ifmmode\ifinner$\else\@badmath%%$ BRACE MATCH HACK \fi\else \@badmath\fi} \def\[{\relax\ifmmode\@badmath\else \ifvmode \nointerlineskip \makebox[.6\linewidth]\fi$$%%$$ BRACE MATCH HACK \fi} \def\]{\relax\ifmmode\ifinner\@badmath\else$$\fi%%$$ BRACE MATCH HACK \else \@badmath \fi\ignorespaces} \let\math=\( \let\endmath=\) \def\displaymath{\[} \def\enddisplaymath{\]\global\@ignoretrue} \@definecounter{equation} \def\equation{$$ % $$ BRACE MATCHING HACK \refstepcounter{equation}} \def\endequation{\eqno \@eqnnum % $$ BRACE MATCHING HACK $$\global\@ignoretrue} % \@eqnnum: Produces the equation number for equation and % eqnarray environments. The following definition is for % flushright numbers; for flushleft numbers, see leqno.doc. % The {\rm ... } puts the equation number in roman type even if % an eqnarray environment appears in an italic environment. % \def\@eqnnum{{\rm (\theequation)}} \def\stackrel#1#2{\mathrel{\mathop{#2}\limits^{#1}}} \def\frac#1#2{{#1\over #2}} \let\@@sqrt=\sqrt \def\sqrt{\@ifnextchar[{\@sqrt}{\@@sqrt}} \def\@sqrt[#1]{\root #1\of} \let\:=\> % Here's the eqnarray environment: % Default is for left-hand side of equations to be flushleft. % To make them flushright, \let\@eqnsel = \hfil \newcount\@eqcnt \newcount\@eqpen \newif\if@eqnsw\@eqnswtrue \@centering = 0pt plus 1000pt % Changed 11/4/85 to produce warning message % if line extends into margin. Doesn't warn % about formula overprinting equation number. \def\eqnarray{\stepcounter{equation}\let\@currentlabel=\theequation \global\@eqnswtrue \global\@eqcnt\z@\tabskip\@centering\let\\=\@eqncr $$\halign to \displaywidth\bgroup\@eqnsel\hskip\@centering $\displaystyle\tabskip\z@{##}$&\global\@eqcnt\@ne \hskip 2\arraycolsep \hfil${##}$\hfil &\global\@eqcnt\tw@ \hskip 2\arraycolsep $\displaystyle\tabskip\z@{##}$\hfil \tabskip\@centering&\llap{##}\tabskip\z@\cr} \def\endeqnarray{\@@eqncr\egroup \global\advance\c@equation\m@ne$$\global\@ignoretrue} \let\@eqnsel=\relax \def\nonumber{\global\@eqnswfalse} \def\@eqncr{{\ifnum0=`}\fi\@ifstar{\global\@eqpen\@M \@yeqncr}{\global\@eqpen\interdisplaylinepenalty \@yeqncr}} \def\@yeqncr{\@ifnextchar [{\@xeqncr}{\@xeqncr[\z@]}} \def\@xeqncr[#1]{\ifnum0=`{\fi}\@@eqncr \noalign{\penalty\@eqpen\vskip\jot\vskip #1\relax}} \def\@@eqncr{\let\@tempa\relax \ifcase\@eqcnt \def\@tempa{& & &}\or \def\@tempa{& &} \else \def\@tempa{&}\fi \@tempa \if@eqnsw\@eqnnum\stepcounter{equation}\fi \global\@eqnswtrue\global\@eqcnt\z@\cr} % Here's the eqnarray* environment: \let\@seqncr=\@eqncr \@namedef{eqnarray*}{\def\@eqncr{\nonumber\@seqncr}\eqnarray} \@namedef{endeqnarray*}{\nonumber\endeqnarray} % \lefteqn{FORMULA} typesets FORMULA in display math style % flushleft in a box of width zero. % \def\lefteqn#1{\hbox to \z@{$\displaystyle #1$\hss}} \message{center,} % ************************************************ % * CENTER, FLUSHRIGHT, FLUSHLEFT, ETC. * % ************************************************ % % % \center, \flushright and \flushleft set % \rightskip = 0pt or \@flushglue (as appropriate) % \leftskip = 0pt or \@flushglue (as appropriate) % \parindent = 0pt % \parfillskip = 0pt. (except \flushleft) % \\ == \par \vskip -\parskip % \\[LENGTH] == \\ \vskip LENGTH % \\* == \par \penalty 10000 \vskip -\parskip % \\*[LEN] == \\* \vskip LENGTH % % They invoke the trivlist environment to handle vertical spacing before % and after them. % % \centering, \raggedright and \raggedleft are the declaration analogs % of the above. % % \raggedright has a more universal effect, however. It sets % \@rightskip := flushglue. Every environment, like the list environments, % that set \rightskip to its 'normal' value set it to \@rightskip \def\@centercr{\ifhmode \unskip\else \@badcrerr\fi \par\@ifstar{\penalty \@M\@xcentercr}{\@xcentercr}} \def\@xcentercr{\addvspace{-\parskip}\@ifnextchar [{\@icentercr}{\ignorespaces}} \def\@icentercr[#1]{\vskip #1\ignorespaces} \def\center{\trivlist \centering\item[]} \def\centering{\let\\=\@centercr\rightskip\@flushglue\leftskip\@flushglue \parindent\z@\parfillskip\z@} \let\endcenter=\endtrivlist \newskip\@rightskip \@rightskip \z@ \def\flushleft{\trivlist \raggedright\item[]} \def\raggedright{\let\\=\@centercr\@rightskip\@flushglue \rightskip\@rightskip \leftskip\z@ \parindent\z@} \let\endflushleft=\endtrivlist \def\flushright{\trivlist \raggedleft\item[]} \def\raggedleft{\let\\=\@centercr\rightskip\z@\leftskip\@flushglue \parindent\z@\parfillskip\z@} \let\endflushright=\endtrivlist \message{verbatim,} % **************************************** % * VERBATIM * % **************************************** % % The verbatim environment uses the fixed-width \tt font, turns blanks into % spaces, starts a new line for each carrige return (or sequence of % consecutive carriage returns), and interprets EVERY character literally. % I.e., all special characters \, {, $, etc. are \catcode'd to 'other'. % % The command \verb produces in-line verbatim text, where the argument % is delimited by any pair of characters. E.g., \verb #...# takes % '...' as its argument, and sets it verbatim in \tt font. % % The *-variants of these commands is the same, except that spaces % print as the TeXbook's space character instead of as blank spaces. {\catcode`\^^M=13 \gdef\@gobblecr{\@ifnextchar {\@gobble}{\ignorespaces}}} {\catcode`\ =\active\gdef\@vobeyspaces{\catcode`\ \active \let \@xobeysp}} \def\@xobeysp{\leavevmode{} } \begingroup \catcode `|=0 \catcode `[= 1 \catcode`]=2 \catcode `\{=12 \catcode `\}=12 \catcode`\\=12 |gdef|@xverbatim#1\end{verbatim}[#1|end[verbatim]] |gdef|@sxverbatim#1\end{verbatim*}[#1|end[verbatim*]] |endgroup \def\@sverbatim{\obeyspaces\@verbatim} \def\@gobble#1{} \def\@verbatim{\trivlist \item[]\if@minipage\else\vskip\parskip\fi \leftskip\@totalleftmargin\rightskip\z@ \parindent\z@\parfillskip\@flushglue\parskip\z@ \@tempswafalse \def\par{\if@tempswa\hbox{}\fi\@tempswatrue\@@par} \obeylines \tt \let\do\@makeother \dospecials} \def\verbatim{\@verbatim \frenchspacing\@vobeyspaces \@xverbatim} \let\endverbatim=\endtrivlist \@namedef{verbatim*}{\@verbatim\@sxverbatim} \expandafter\let\csname endverbatim*\endcsname =\endtrivlist \def\@makeother#1{\catcode`#112\relax} \def\verb{\begingroup \tt \let\do\@makeother \dospecials \@ifstar{\@sverb}{\@verb}} \def\@sverb#1{\def\@tempa ##1#1{##1\endgroup}\@tempa} \def\@verb{\obeyspaces \frenchspacing \@sverb} \message{list,} % **************************************** % * THE LIST ENVIRONMENT * % **************************************** % % The generic commands for creating an indented environment -- enumerate, % itemize, quote, etc -- are % \list{LABEL}{COMMANDS} ... \endlist % which can be invoked by the user as the list environment. The LABEL % argument specifies item labeling. COMMANDS contains commands for % changing the horizontal and vertical spacing parameters. % % Each item of the environment is begun by the command \item[ITEMLABEL] % which produces an item labeled by ITEMLABEL. If the argument is % missing, then the LABEL argument of the \list command is used as the % item label. % % The label is formed by putting \makelabel{ITEMLABEL} in an hbox whose % width is either its natural width or else \labelwidth, whichever is % larger. The \list command defines \makelabel to have the default % definition % \makelabel{ARG} == BEGIN \hfil ARG END % which, for a label of width less than \labelwidth, puts the label % flushright, \labelsep to the left of the item's text. However, % \makelabel can be \let to another command by the \list's COMMANDS % argument. % % A \usecounter{foo} command in the second argument causes the counter % foo to be initialized to zero, and stepped by every \item command % without an argument. (\label commands within the list refer to this % counter.) % % When you leave a list environment, returning either to an enclosing % list or normal text mode, LaTeX begins a new paragraph if and only if % you leave a blank line after the \end command. This is accomplished % by the \@endparenv command. % % Blank lines are ignored every other reasonable place--i.e.: % - Between the \begin{list} and the first \item, % - Between the \item and the text of that item. % - Between the end of the last item and the \end{list}. % % For an environment like quotation, in which items are not labeled, % the entire environment is a single item. It is defined by % letting \quotation == \list{}{...}\item[]. (Note the [], there in % case the first character in the environment is a '['.) The spacing % parameters provide a great deal of flexability in designing the % format, including the ability to let the indentation of the first % paragraph be different from that of the subsequent ones. % % The trivlist environment is equivalent to a list environment % whose second argument sets the following parameter values: % \leftmargin = 0 : causes no indentation of left margin % \labelwidth = 0 : see below for precise effect this has. % \itemindent = 0 : with a null label, makes first paragraph % have no indentation. Succeeding paragraphs have \parindent % indentation. To give first paragraph same indentation, set % \itemindent = \parindent before the \item[]. % Every \item in a trivlist environment must have an argument---in many % cases, this will be the null argument (\item[]). The trivlist % environment is mainly used for paragraphing environments, like % verbatim, in which there is no margin change. It provides the same % vertical spacing as the list environment, and works reasonably well % when it occurs immediately after an \item command in an enclosing list. % % The following variables are used inside a list environment: % \@totalleftmargin : The distance that the prevailing left margin is % indented from the outermost left margin, % \linewidth : The width of the current line. Must be % initialized to \hsize. % \@listdepth : A count for holding current list nesting depth. % \makelabel : A macro with a single argument, used to generate % the label from the argument (given or implied) of the % \item command. Initialized to \@mklab by the \list % command. This command must produce some stretch--i.e., % an \hfil. % @inlabel : A switch that is false except between the time an % \item is encountered and the time that TeX actually % enters horizontal mode. Should be tested by % commands that can be messed up by the list % environment's use of \everypar. % \box\@labels : When @inlabel = true, it holds the labels % to be put out by \everypar. % @noparitem : A switch set by \list when @inlabel = true. % Handles the case of a \list being the first thing % in an item. % @noparlist : A switch set true for a list that begins an % item. No \topsep space is added before or after % such a list. % @newlist : Set true by \list, set false by the first \item's % text (by \everypar). % @noitemarg : Set true when executing an \item with no explicit % argument. Used to save space. To save time, % make two separate \@item commands. % @nmbrlist : Set true by \usecounter command, causes list to % be numbered. % \@listctr : \def'ed by \usecounter to name of counter. % @noskipsec : A switch set true by a sectioning command when it is % creating an in-text heading with \everypar. % % Throughout a list environment, \hsize is the width of the current % line, measured from the outermost left margin to the outermost right % margin. Environments like tabbing should use \linewidth instead of % \hsize. % % Here are the parameters of a list that can be set by commands in % the \list's COMMANDS argument. These parameters are all TeX % skips or dimensions (defined by \newskip or \newdimen), so the usual % TeX or LaTeX commands can be used to set them. The commands will % be executed in vmode if and only if the \list was preceded by a % \par (or something like an \end{list}), so the spacing parameters % can be set according to whether the list is inside a paragraph % or is its own paragraph. % % VERTICAL SPACING (skips): % % \topsep : Space between first item and preceding paragraph. % \partopsep : Extra space added to \topsep when environment starts % a new paragraph (is called in vmode). % \itemsep : Space between successive items. % \parsep : Space between paragraphs within an item -- the \parskip % for this environment. % % PENALTIES % \@beginparpenalty : put at the beginning of a list % \@endparpenalty : put at end of list % \@itempenalty : put between items. % % HORIZONTAL SPACING (dimens) % \leftmargin : space between left margin of enclosing environment % (or of page if top level list) and left margin of % this list. Must be nonnegative. % \rightmargin : analogous. % \listparindent : extra indentation at beginning of every paragraph % of a list except the one started by the \item % command. May be negative! Usually, labeled lists % have \listparindent equal to zero. % \itemindent : extra indentation added right BEFORE an item label. % \labelwidth : nominal width of box that contains the label. % If the natural width of the label < = \labelwidth, % then the label is flushed right inside a box % of width \labelwidth (with an \hfil). Otherwise, % a box of the natural width is employed, which causes % an indentation of the text on that line. % \labelsep : space between end of label box and text of % first item. % % DEFAULT VALUES: % Defaults for the list environment are set as follows. % First, \rightmargin, \listparindent and \itemindent are set % to 0pt. Then, one of the commands \@listi, \@listii, ... , \@listvi % is called, depending upon the current level of the list. % The \@list... commands should be defined by the document % style. A convention that the document style should follow is % to set \leftmargin to \leftmargini, ... , \leftmarginvi for % the appropriate level. Items that aren't changed may be left % alone, but everything that could possibly be changed must be % reset. % % \list{LABEL}{COMMANDS} == % BEGIN % if \@listdepth > 5 % then LaTeX error: 'Too deeply nested' % else \@listdepth :=G \@listdepth + 1 % fi % \rightmargin := 0pt % \listparindent := 0pt % \itemindent := 0pt % \eval(@list \romannumeral\the\@listdepth) %% Set default values: % \@itemlabel :=L LABEL % \makelabel == \@mklab % @nmbrlist :=L false % COMMANDS % % \@trivlist % commands common to \list and \trivlist % % \parskip :=L \parsep % \parindent :=L \listparindent % \linewidth :=L \linewidth - \rightmargin -\leftmargin % \@totalleftmargin :=L \@totalleftmargin + \leftmargin % \parshape 1 \@totalleftmargin \linewidth % \ignorespaces % gobble space up to \item % END % % \endlist == BEGIN \@listdepth :=G \@listdepth -1 % \endtrivlist % END % % \@trivlist == % BEGIN % if @newlist = T then \@noitemerr fi %% This command removed for some % %% forgotten reason. % \@topsepadd :=L \topsep % if @noskipsec then leave vertical mode fi %% Added 11 Jun 85 % if vertical mode % then \@topsepadd :=L \@topsepadd + \partopsep % else \unskip \par % remove glue from end of last line % fi % if @inlabel = true % then @noparitem :=L true % @noparlist :=L true % else @noparlist :=L false % \@topsep :=L \@topsepadd % fi % \@topsep :=L \@topsep + \parskip %% Change 4 Sep 85 % \leftskip :=L 0pt % Restore paragraphing parameters % \rightskip :=L \@rightskip % \parfillskip :=L 0pt + 1fil % % NOTE: \@setpar called on every \list in case \par has been temporarily % munged before the \list command. % \@setpar{if @newlist = false then {\@@par} fi} % \@newlist :=G T % \@outerparskip :=L \parskip % END % % \trivlist == % BEGIN % \parsep := \parskip % \@trivlist % \labelwidth := 0 % \leftmargin := 0 % \itemindent := \parindent % \makelabel{LABEL} == LABEL % END % % \endtrivlist == % BEGIN % if @inlabel = T then \indent fi % if horizontal mode then \unskip \par fi % if @noparlist = true % else if \lastskip > 0 % then \@tempskipa := \lastskip % \vskip - \lastskip % \vskip \@tempskipa -\@outerparskip + \parskip % fi % \@endparenv % fi % END % % \@endparenv == % BEGIN % \addpenalty{@endparpenalty} % \addvspace{\@topsepadd} % \endgroup %% ends the \begin command's \begingroup % \par == BEGIN % \@restorepar % \everypar{} % \par % END % \everypar == BEGIN \hskip - \parindent \everypar{} END % \begingroup %% to match the \end commands \endgroup % END % % \item == BEGIN if next char = [ % then \@item % else @noitemarg := true % \@item[@itemlabel] % END % % \@item[LAB] == % BEGIN % if @noparitem = true % then @noparitem := false % NOTE: then clause % % hardly every taken, % \box\@labels :=G \hbox{\hskip -\leftmargin % so made a macro % \box\@labels % \@donoparitem % \hskip \leftmargin } % if @minipage = false then % \@tempskipa := \lastskip % \vskip -\lastskip % \vskip \@tempskipa + \@outerparskip - \parskip % fi % else if @inlabel = true % then \indent \par % previous item empty. % fi % if hmode then 2 \unskip's % To remove any space at end of prev. % \par % paragraph that could cause a blank % fi % line. % if @newlist = T % then if @nobreak = T % Kludge if list follows \section % then \addvspace{\@outerparskip - \parskip} % else \addpenalty{\@beginparpenalty} % \addvspace{\@topsep} % \addvspace{-\parskip} %% added 4 Sep 85 % fi % else \addpenalty{\@itempenalty} % \addvspace{\itemsep} % fi % @inlabel :=G true % fi % % \everypar{ @minipage :=G F % @newlist :=G F % if @inlabel = true % then @inlabel :=G false % \hskip -\parindent % \box\@labels % \penalty 0 %% 3 Oct 85 -- allow line break here % \box\@labels :=G null % fi % \everypar{} } % @nobreak :=G false % if @noitemarg = true % then @noitemarg := false % if @nmbrlist % then \refstepcounter{\@listctr} % fi fi % \@tempboxa :=L \hbox{\makelabel{LAB}} % \box\@labels :=G \@labels \hskip \itemindent % \hskip - (\labelwidth + \labelsep) % if \wd \@tempboxa > \labelwidth % then \box\@tempboxa % else \hbox to \labelwidth {\makelabel{LAB}} % fi % \hskip\labelsep % \ignorespaces %gobble space up to text % END % % \usecounter{CTR} == BEGIN @nmbrlist :=L true % \@listctr == CTR % \setcounter{CTR}{0} % END % % DEFINE \dimen's and \count \newskip\topsep \newskip\partopsep \newskip\itemsep \newskip\parsep \newskip\@topsep \newskip\@topsepadd \newskip\@outerparskip \newdimen\leftmargin \newdimen\rightmargin \newdimen\listparindent \newdimen\itemindent \newdimen\labelwidth \newdimen\labelsep \newdimen\linewidth \newdimen\@totalleftmargin \@totalleftmargin=\z@ \newdimen\leftmargini \newdimen\leftmarginii \newdimen\leftmarginiii \newdimen\leftmarginiv \newdimen\leftmarginv \newdimen\leftmarginvi \newcount\@listdepth \@listdepth=0 \newcount\@itempenalty \newcount\@beginparpenalty \newcount\@endparpenalty \newbox\@labels \newif\if@inlabel \@inlabelfalse \newif\if@newlist \@newlistfalse \newif\if@noparitem \@noparitemfalse \newif\if@noparlist \@noparlistfalse \newif\if@noitemarg \@noitemargfalse \newif\if@nmbrlist \@nmbrlistfalse \def\list#1#2{\ifnum \@listdepth >5\relax \@toodeep \else \global\advance\@listdepth\@ne \fi \rightmargin \z@ \listparindent\z@ \itemindent\z@ \csname @list\romannumeral\the\@listdepth\endcsname \def\@itemlabel{#1}\let\makelabel\@mklab \@nmbrlistfalse #2\relax \@trivlist \parskip\parsep \parindent\listparindent \advance\linewidth -\rightmargin \advance\linewidth -\leftmargin \advance\@totalleftmargin \leftmargin \parshape \@ne \@totalleftmargin \linewidth \ignorespaces} \def\@trivlist{\@topsepadd\topsep \if@noskipsec \leavevmode \fi \ifvmode \advance\@topsepadd\partopsep \else \unskip\par\fi \if@inlabel \@noparitemtrue \@noparlisttrue \else \@noparlistfalse \@topsep\@topsepadd \fi \advance\@topsep \parskip \leftskip\z@\rightskip\@rightskip \parfillskip\@flushglue \@setpar{\if@newlist\else{\@@par}\fi}% \global\@newlisttrue \@outerparskip\parskip} \def\trivlist{\parsep\parskip \@trivlist \labelwidth\z@ \leftmargin\z@ \itemindent\z@ \def\makelabel##1{##1}} \def\endlist{\global\advance\@listdepth\m@ne \endtrivlist} % Definition of \endtrivlist moved earlier in file so other commands % can be \let = to it. \def\@mklab#1{\hfil #1} \def\item{\@ifnextchar [{\@item}{\@noitemargtrue \@item[\@itemlabel]}} \def\@donoparitem{\@noparitemfalse \global\setbox\@labels\hbox{\hskip -\leftmargin \unhbox\@labels \hskip \leftmargin}\if@minipage\else \@tempskipa\lastskip \vskip -\lastskip \advance\@tempskipa\@outerparskip \advance\@tempskipa -\parskip \vskip\@tempskipa\fi} \def\@item[#1]{\if@noparitem \@donoparitem \else \if@inlabel \indent \par \fi \ifhmode \unskip\unskip \par \fi \if@newlist \if@nobreak \@nbitem \else \addpenalty\@beginparpenalty \addvspace\@topsep \addvspace{-\parskip}\fi \else \addpenalty\@itempenalty \addvspace\itemsep \fi \global\@inlabeltrue \fi \everypar{\global\@minipagefalse\global\@newlistfalse \if@inlabel\global\@inlabelfalse \hskip -\parindent \box\@labels \penalty\z@ \fi \everypar{}}\global\@nobreakfalse \if@noitemarg \@noitemargfalse \if@nmbrlist \refstepcounter{\@listctr}\fi \fi \setbox\@tempboxa\hbox{\makelabel{#1}}% \global\setbox\@labels \hbox{\unhbox\@labels \hskip \itemindent \hskip -\labelwidth \hskip -\labelsep \ifdim \wd\@tempboxa >\labelwidth \box\@tempboxa \else \hbox to\labelwidth {\makelabel{#1}}\fi \hskip \labelsep}\ignorespaces} \def\@nbitem{\@tempskipa\@outerparskip \advance\@tempskipa -\parskip \addvspace{\@tempskipa}} \def\usecounter#1{\@nmbrlisttrue\def\@listctr{#1}\setcounter{#1}\z@} \message{itemize,} % **************************************** % * ITEMIZE AND ENUMERATE * % **************************************** % % Enumeration is done with four counters: enumi, enumii, enumiii % and enumiv, where enumN controls the numbering of the Nth level % enumeration. The label is generated by the commands % \labelenumi ... \labelenumiv, which should be defined by the % document style. Note that \p@enumN\theenumN defines the output % of a \ref command. A typical definition might be: % \def\theenumii{\alph{enumii}} % \def\p@enumii{\theenumi\theenumii} % \def\labelenumii{(\theenumii)} % which will print the labels as '(a)', '(b)', ... and print a \ref as % '3a'. % % The item numbers are moved to the right of the label box, so they are % always a distance of \labelsep from the item. % % \@enumdepth holds the current enumeration nesting depth. % % Itemization is controlled by four commands: \labelitemi, \labelitemii, % \labelitemiii, and \labelitemiv. To cause the second-level list to be % bulleted, you just define \labelitemii to be $\bullet$. \@itemspacing % and \@itemdepth are the analogs of \@enumspacing and \@enumdepth. % % \enumerate == % BEGIN % if \@enumdepth > 3 % then errormessage: ``Too deeply nested''. % else \@enumdepth :=L \@enumdepth + 1 % \@enumctr :=L eval(enum@\romannumeral\the\@enumdepth) % \list{\label(\@enumctr)} % {\usecounter{\@enumctr} % \makelabel{LABEL} == \hss \llap{LABEL}} % fi % END % % \endenumerate == \endlist % \newcount\@enumdepth \@enumdepth = 0 \@definecounter{enumi} \@definecounter{enumii} \@definecounter{enumiii} \@definecounter{enumiv} \def\enumerate{\ifnum \@enumdepth >3 \@toodeep\else \advance\@enumdepth \@ne \edef\@enumctr{enum\romannumeral\the\@enumdepth}\list {\csname label\@enumctr\endcsname}{\usecounter {\@enumctr}\def\makelabel##1{\hss\llap{##1}}}\fi} \let\endenumerate =\endlist % \itemize == % BEGIN % if \@itemdepth > 3 % then errormessage: 'Too deeply nested'. % else \@itemdepth :=L \@itemdepth + 1 % \@itemitem == eval(labelitem\romannumeral\the\@itemdepth) % \list{\@nameuse{\@itemitem}} % {\makelabel{LABEL} == \hss \llap{LABEL}} % fi % END % % \enditemize == \endlist % \newcount\@itemdepth \@itemdepth = 0 \def\itemize{\ifnum \@itemdepth >3 \@toodeep\else \advance\@itemdepth \@ne \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}% \list{\csname\@itemitem\endcsname}{\def\makelabel##1{\hss\llap{##1}}}\fi} \let\enditemize =\endlist \message{boxes,} % ********************************************* % * BOXES * % ********************************************* % % USER COMMANDS: % % \makebox [WID][POS]{OBJ} % : puts OBJ in an \hbox of width WID, positioned by POS. % POS = l -> flushleft, POS = r -> flushright. % Default is centered. % If WID is missing, then POS is also missing and OBJ % is put in an \hbox of its natural width. % % \mbox{OBJ} == \makebox{OBJ}, and is more efficient. % % \makebox (X,Y)[POS]{OBJ} % : puts OBJ in an \hbox of width X * \unitlength % and height Y * \unitlength. POS arguments are % l or r for flushleft, flushright and t or b % for top, bottom -- or combinations like tr or rb. % Default for horizontal and vertical are centered. % % \newsavebox{\CMD} : If \CMD is undefined, then defines it % to be a TeX box register. % % \savebox {\CMD} ... : \CMD is defined to be a TeX box register, % and the '...' are any \makebox arguments. It is % like \makebox, except it doesn't produce text but % saves the value in \box \CMD. % \sbox N{OBJ} is an efficient abbreviation for % \savebox N{OBJ}. % % \framebox ... : like \makebox, except it puts a 'frame' around % the box. The frame is made of lines of thickness % \framerule, separated by space \framesep from the % text -- except for \framebox(X,Y) ... , where the % thickness of the lines is as for the picture environment, % and there is no separation added. % \fbox{OBJ} is an efficient abbreviation for \framebox{OBJ} % % \parbox[POS]{WIDTH}{TEXT} : Makes a box with \hsize TEXT, positioned % by POS as follows: % c : \vcenter (placed in $...$ if not in math mode) % b : \vbox % t : \vtop % default value is c. % Sets \hsize := WIDTH and calls \@parboxrestore, which does % the following: % Restores the original definitions of: % \par % \\ % \- \' \` \= % Resets the following parameters: % \parindent = 0pt % \linewidth = \hsize % \@totalleftmargin = 0pt % \leftskip = 0pt % \rightskip = 0pt % \@rightskip = 0pt % \parfillskip = 0pt plus 1fil % \lineskip = \normallineskip % \baselineskip = \normalbaselineskip % Calls \sloppy % % Note: \@arrayparboxrestore same as \@parboxrestore % but it doesn't restore \\. % % \minipage : Similar to parbox, except it also % makes this look like a page by setting % \textwidth == \columnwidth == box width % changes footnotes by redefining: % \@mpfn == mpfootnote % \thempfn == \thempfootnote % \@footnotetext == \@mpfootnotetext % resets the following list environment parameters % \@listdepth == \@mplistdepth % where \@mplistdepth is initialized to zero, % and executes \@minipagerestore to allow the document % style to reset any other parameters it desires. % It sets @minipage := T, and resets \everypar to set % it false. This switch \addvspace from putting space % at the top of a minipage. % % \rule [RAISED]{WIDTH}{HEIGHT} : Makes a WIDTH X HEIGHT rule, raised % RAISED. % % \underline {TEXT} : Makes an underlined hbox with TEXT in it. % % \raisebox{DISTANCE}[HEIGHT][DEPTH]{BOX} : Raises BOX up by DISTANCE % length (down if DISTANCE negative). Makes TeX think that % the new box extends HEIGHT above the line and DEPTH below, for % a total vertical length of HEIGHT+DEPTH. Default values of % HEIGHT & DEPTH = actual height and depth of box in new position. % % \makebox == % BEGIN % if next char = ( % then \@makepicbox % else if next char = [ % then \@makebox % else \mbox fi % fi % END % % \@makebox[LEN] == % BEGIN % leave vertical mode % if next char '[' then \@imakebox[LEN] % else \@imakebox[LEN][x] fi % END % % \@imakebox[LEN][POS]{OBJ} == % BEGIN % \hbox to LEN % { \mb@l :=L \mb@r :=L \hss % \let\mb@POS = \relax % \mb@l OBJ \mb@r } % END % % \@makepicbox(X,Y) == % BEGIN % leave vertical mode % if next char = [ then \@imakepicbox(X,Y) % else \@imakepicbox(X,Y)[] fi % END % % \@imakepicbox(X,Y)[POS]{OBJ} == % BEGIN % \vbox to Y * \unitlength % { \mb@l :=L \mb@r :=L \hss % \mb@t :=L \mb@b :=L \hss % tfor \@tempa := POS % one iteration for each token in POS % do \mb@eval(\@tempa) :=L null od % \mb@t % \hbox to X * \unitlength % {\mb@l OBJ \mb@r } % \mb@b} % END % \def\makebox{\@ifnextchar ({\@makepicbox}{\@ifnextchar [{\@makebox}{\mbox}}} \def\mbox#1{\leavevmode\hbox{#1}} \def\@makebox[#1]{\leavevmode\@ifnextchar [{\@imakebox[#1]}{\@imakebox[#1][x]}} \long\def\@imakebox[#1][#2]#3{\hbox to#1{\let\mb@l\hss \let\mb@r\hss \expandafter\let\csname mb@#2\endcsname\relax \mb@l #3\mb@r}} \def\@makepicbox(#1,#2){\leavevmode\@ifnextchar [{\@imakepicbox(#1,#2)}{\@imakepicbox(#1,#2)[]}} \long\def\@imakepicbox(#1,#2)[#3]#4{\vbox to#2\unitlength {\let\mb@b\vss \let\mb@l\hss\let\mb@r\hss \let\mb@t\vss \@tfor\@tempa :=#3\do{\expandafter\let \csname mb@\@tempa\endcsname\relax}% \mb@t\hbox to #1\unitlength{\mb@l #4\mb@r}\mb@b}} \def\newsavebox#1{\@ifdefinable#1{\newbox#1}} \def\savebox#1{\@ifnextchar ({\@savepicbox#1}{\@ifnextchar [{\@savebox#1}{\sbox#1}}} \def\sbox#1#2{\setbox#1\hbox{#2}} \def\@savebox#1[#2]{\@ifnextchar [{\@isavebox#1[#2]}{\@isavebox#1[#2][x]}} \long\def\@isavebox#1[#2][#3]#4{\setbox#1 \hbox{\@imakebox[#2][#3]{#4}}} \def\@savepicbox#1(#2,#3){\@ifnextchar [{\@isavepicbox#1(#2,#3)}{\@isavepicbox#1(#2,#3)[]}} \long\def\@isavepicbox#1(#2,#3)[#4]#5{\setbox#1 \hbox{\@imakepicbox (#2,#3)[#4]{#5}}} \def\usebox#1{\leavevmode\copy #1\relax} %% The following definition of \frame was written by Pavel Curtis \long\def\frame#1{\leavevmode \hbox{\hskip-\@wholewidth \vbox{\vskip-\@wholewidth \hrule \@height\@wholewidth \hbox{\vrule \@width\@wholewidth #1\vrule \@width \@wholewidth} \hrule \@height \@wholewidth\vskip -\@halfwidth} \hskip-\@wholewidth}} \newdimen\fboxrule \newdimen\fboxsep \long\def\fbox#1{\leavevmode\setbox\@tempboxa\hbox{#1}\@tempdima\fboxrule \advance\@tempdima \fboxsep \advance\@tempdima \dp\@tempboxa \hbox{\lower \@tempdima\hbox {\vbox{\hrule \@height \fboxrule \hbox{\vrule \@width \fboxrule \hskip\fboxsep \vbox{\vskip\fboxsep \box\@tempboxa\vskip\fboxsep}\hskip \fboxsep\vrule \@width \fboxrule} \hrule \@height \fboxrule}}}} \def\framebox{\@ifnextchar ({\@framepicbox}{\@ifnextchar [{\@framebox}{\fbox}}} \def\@framebox[#1]{\@ifnextchar [{\@iframebox[#1]}{\@iframebox[#1][x]}} \long\def\@iframebox[#1][#2]#3{\leavevmode \savebox\@tempboxa[#1][#2]{\kern\fboxsep #3\kern\fboxsep}\@tempdima\fboxrule \advance\@tempdima \fboxsep \advance\@tempdima \dp\@tempboxa \hbox{\lower \@tempdima\hbox {\vbox{\hrule \@height \fboxrule \hbox{\vrule \@width \fboxrule \hskip-\fboxrule \vbox{\vskip\fboxsep \box\@tempboxa\vskip\fboxsep}\hskip -\fboxrule\vrule \@width \fboxrule} \hrule \@height \fboxrule}}}} \def\@framepicbox(#1,#2){\@ifnextchar [{\@iframepicbox(#1,#2)}{\@iframepicbox(#1,#2)[]}} \long\def\@iframepicbox(#1,#2)[#3]#4{\frame{\@imakepicbox(#1,#2)[#3]{#4}}} \def\parbox{\@ifnextchar [{\@iparbox}{\@iparbox[c]}} \long\def\@iparbox[#1]#2#3{\leavevmode \@pboxswfalse \if #1b\vbox \else \if #1t\vtop \else \ifmmode \vcenter \else \@pboxswtrue $\vcenter \fi \fi \fi{\hsize #2\@parboxrestore #3}\if@pboxsw $\fi} \let\@dischyph=\- \let\@acci=\' \let\@accii=\` \let\@acciii=\= \def\@arrayparboxrestore{\let\par\@@par \let\-\@dischyph \let\'\@acci \let\`\@accii \let\=\@acciii \parindent\z@ \everypar{}\linewidth\hsize \@totalleftmargin\z@ \leftskip\z@ \rightskip\z@ \@rightskip\z@ \parfillskip\@flushglue \lineskip\normallineskip \baselineskip\normalbaselineskip\sloppy} \def\@parboxrestore{\@arrayparboxrestore\let\\=\@normalcr} \newif\if@minipage \@minipagefalse \def\minipage{\@ifnextchar [{\@iminipage}{\@iminipage[c]}} \def\@iminipage[#1]#2{\leavevmode \@pboxswfalse \if #1b\vbox \else \if #1t\vtop \else \ifmmode \vcenter \else \@pboxswtrue $\vcenter \fi \fi \fi\bgroup \hsize #2\textwidth\hsize \columnwidth\hsize \@parboxrestore \def\@mpfn{mpfootnote}\def\thempfn{\thempfootnote}\c@mpfootnote\z@ \let\@footnotetext\@mpfootnotetext \let\@listdepth\@mplistdepth \@mplistdepth\z@ \@minipagerestore\@minipagetrue \everypar{\global\@minipagefalse\everypar{}}} \let\@minipagerestore=\relax \def\endminipage{\par\vskip-\lastskip \ifvoid\@mpfootins\else \vskip\skip\@mpfootins\footnoterule\unvbox\@mpfootins\fi \egroup\if@pboxsw $\fi} \newcount\@mplistdepth \newinsert\@mpfootins \long\def\@mpfootnotetext#1{\global\setbox\@mpfootins \vbox{\unvbox\@mpfootins \footnotesize \hsize\columnwidth \@parboxrestore \edef\@currentlabel{\csname p@mpfootnote\endcsname\@thefnmark}\@makefntext {\rule{\z@}{\footnotesep}\ignorespaces #1}}} \newif\if@pboxsw \def\rule{\@ifnextchar[{\@rule}{\@rule[\z@]}} \def\@rule[#1]#2#3{\@tempdima#3\advance\@tempdima #1\leavevmode\hbox{\vrule \@width#2 \@height\@tempdima \@depth-#1}} \let\@@underline\underline \def\underline#1{\relax\ifmmode \@@underline{#1}\else $\@@underline{\hbox{#1}}$\relax\fi} \def\raisebox#1{\@ifnextchar[{\@argrsbox{#1}}{\@rsbox{#1}}} \def\@argrsbox#1[#2]{% \@ifnextchar[{\@iirsbox{#1}[#2]}{\@irsbox{#1}[#2]}} \long\def\@rsbox#1#2{\leavevmode\hbox{\raise #1\hbox{#2}}} \long\def\@irsbox#1[#2]#3{\setbox\@tempboxa \hbox {\raise #1\hbox{#3}}\ht\@tempboxa#2\leavevmode\box\@tempboxa} \long\def\@iirsbox#1[#2][#3]#4{\setbox\@tempboxa \hbox {\raise #1\hbox{#4}}\ht\@tempboxa#2\dp\@tempboxa#3\leavevmode\box\@tempboxa} \message{tabbing,} % **************************************** % * THE TABBING ENVIRONMENT * % **************************************** % % \dimen(\@firsttab + i) = distance of tab stop i from left margin % 0 <= i <= 15 (?). % % \dimen\@firsttab is initialized to \@totalleftmargin, so it starts % at the prevailing left margin. % % \@maxtab = number of highest defined tab register % probably = \@firsttab + 12 % \@nxttabmar = tab stop number of next line's left margin % \@curtabmar = tab stop number of current line's left margin % \@curtab = number of the current tab. At start of line, % it equals \@curtabmar % \@hightab = largest tab number currently defined. % \@tabpush = depth of \pushtab's % % \box\@curline = contents of current line, excluding left margin skip, % and excluding contents of current field % \box\@curfield = contents of current field % % @rjfield = switch: T iff the last field of the line should be % right-justified at the right margin. % % \tabbingsep = distance left by the \' command between the current % position and the field that is ``left-shifted''. % % UTILITY MACROS % \@stopfield : closes the current field % \@addfield : adds the current field to the current line. % \@contfield : continues the current field % \@startfield : begins the next field % \@stopline : closes the current line and outputs it % \@startline : starts the next line % \@ifatmargin : an \if that is true iff the current line. % has width zero % % \@startline == % BEGIN % \@curtabmar :=G \@nxttabmar % \@curtab :=G \@curtabmar % \box\@curline :=G null % \@startfield % \strut % END % % \@stopline == % BEGIN % \unskip % \@stopfield % if @rjfield = T % then @rjfield :=G F % \@tempdima := \@totalleftmargin + \linewidth % \hbox to \@tempdima{\@itemfudge % \hskip \dimen\@curtabmar % \box\@curline % \hfil % \box\@curfield} % else \@addfield % \hbox {\@itemfudge % \hskip \dimen\@curtabmar % \box\@curline} % fi % END % % \@startfield == % BEGIN % \box\@curfield :=G \hbox { % END % % \@stopfield == % BEGIN % } % END % % \@contfield == % BEGIN % \box\@curfield :=G \hbox { \unhbox\@currfield %%} brace matching % END % \@addfield == % BEGIN % \box\@curline :=G \unbox\@curline * \unbox\@curfield % END % % \@ifatmargin == % BEGIN % if dim of box\@curline = 0pt then % END % % % \tabbing == % BEGIN % \lineskip :=L 0pt % \> == \@rtab % \< == \@ltab % \= == \@settab % \+ == \@tabplus % \- == \@tabminus % \` == \@tabrj % \' == \@tablab % \\ == BEGIN \@stopline \@startline END % \\[DIST] == BEGIN \@stopline \vskip DIST \@startline\ignorespaces END % \\* == BEGIN \@stopline \penalty 10000 \@startline END % \\*[DIST] == BEGIN \@stopline \penalty 10000 \vskip DIST % \@startline\ignorespaces END % \@hightab :=G \@nxttabmar :=G \@firsttab % \@tabpush :=G 0 % \dimen\@firsttab := \@totalleftmargin % @rjfield :=G F % \trivlist \item[] % if @minipage = F then \vskip \parskip fi % \box\@tabfbox = \rlap{\indent\the\everypar} % note: \the\everypar sets % \@itemfudge == BEGIN \box\@tabfbox END % @inlabel :=G F % \@startline % \ignorespaces % END % % \@endtabbing == % BEGIN % \@stopline % if \@tabpush > 0 then error message: ''unmatched \poptabs'' fi % \endtrivlist % END % % \@rtab == % BEGIN % \@stopfield % \@addfield % if \@curtab < \@hightab % then \@curtab :=G \@curtab + 1 % else error message ``Undefined Tab'' fi % \@tempdima := \dimen\@curtab - \dimen\@curtabmar % - width of box \@curline % \box\@curline :=G \hbox{\unhbox\@curline + \hskip\@tempdima} % \@startfield % END % % \@settab == % BEGIN % \@stopfield % \@addfield % if \@curtab < \@maxtab % then \@curtab :=G \@curtab+1 % else error message: ``Too many tabs'' fi % if \@curtab > \@hightab % then \@hightab :=L \@curtab fi % \dimen\@curtab :=L \dimen\@curtabmar + width of \box\@curline % \@startfield % END % % \@ltab == % BEGIN % \@ifatmargin % then if \@curtabmar > \@firsttab % then \@curtab :=G \@curtab - 1 % \@curtabmar :=G \@curtabmar - 1 % else error message ``Too many untabs'' fi % else error message ``Left tab in middle of line'' % fi % END % % \@tabplus == % BEGIN % if \@nxttabmar < \@hightab % then \@nxttabmar :=G \@nxttabmar+1 % else error message ``Undefined tab'' % fi % END % % \@tabminus == % BEGIN % if \@nxttabmar > \@firsttab % then \@nxttabmar :=G \@nxttabmar-1 % else error message ``Too many untabs'' % fi % END % % \@tabrj == % BEGIN \@stopfield % \@addfield % @rjfield :=G T % \@startfield % END % % \@tablab == % BEGIN \@stopfield % \box\@curline := \hbox{ \box\@curline % \hskip - width of \box\@curfield % \hskip -\tabbingsep % \box\@curfield % \hskip \tabbingsep } % \@startfield % END % % \pushtabs == % BEGIN % \@stopfield % \@tabpush :=G \@tabpush + 1 % \begingroup % \@contfield % END % % \poptabs == % BEGIN % \@stopfield % if \@tabpush > 0 % then \endgroup % \@tabpush :=G \@tabpush - 1 % else error message: ``Too many \poptabs'' % fi % \@contfield % END % % The accents \` , \' , and \= that have been redefined inside a tabbing % environment can be called by typing \a` , \a' , and \a=. % \expandafter \let \csname a`\endcsname = \` \expandafter \let \csname a'\endcsname = \' \expandafter \let \csname a=\endcsname = \= \def\a#1{\csname a#1\endcsname} \newif\if@rjfield \newcount\@firsttab \newcount\@maxtab \newdimen\@gtempa \@firsttab=\allocationnumber \newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa \newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa \newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa \newdimen\@getempa \@maxtab=\allocationnumber \dimen\@firsttab=0pt \newcount\@nxttabmar \newcount\@curtabmar \newcount\@curtab \newcount\@hightab \newcount\@tabpush \newbox\@curline \newbox\@curfield \newbox\@tabfbox \def\@startline{\global\@curtabmar\@nxttabmar\relax \global\@curtab\@curtabmar\setbox\@curline\hbox {}\@startfield\strut} \def\@stopline{\unskip\@stopfield\if@rjfield \global\@rjfieldfalse \@tempdima\@totalleftmargin \advance\@tempdima\linewidth \hbox to\@tempdima{\@itemfudge\hskip\dimen\@curtabmar \box\@curline\hfil\box\@curfield}\else\@addfield \hbox{\@itemfudge\hskip\dimen\@curtabmar\box\@curline}\fi} \def\@startfield{\global\setbox\@curfield\hbox\bgroup}%{ BRACE MATCH HACK \let\@stopfield=} \def\@contfield{\global\setbox\@curfield\hbox\bgroup\unhbox\@curfield} \def\@addfield{\global\setbox\@curline\hbox{\unhbox \@curline\unhbox\@curfield}} \def\@ifatmargin{\ifdim \wd\@curline =\z@} \def\@tabcr{\@stopline \@ifstar{\penalty \@M \@xtabcr}{\@xtabcr}} \def\@xtabcr{\@ifnextchar[{\@itabcr}{\@startline\ignorespaces}} \def\@itabcr[#1]{\vskip #1\@startline\ignorespaces} \def\kill{\@stopfield\@startline\ignorespaces} % REMOVE \outer FROM PLAIN'S DEF OF \+ \def\+{\tabalign} \def\tabbing{\lineskip \z@\let\>\@rtab\let\<\@ltab\let\=\@settab \let\+\@tabplus\let\-\@tabminus\let\`\@tabrj\let\'\@tablab \let\\=\@tabcr \global\@hightab\@firsttab \global\@nxttabmar\@firsttab \dimen\@firsttab\@totalleftmargin \global\@tabpush0 \global\@rjfieldfalse \trivlist \item[]\if@minipage\else\vskip\parskip\fi \setbox\@tabfbox\hbox{\rlap{\indent\hskip\@totalleftmargin \the\everypar}}\def\@itemfudge{\box\@tabfbox}\@startline\ignorespaces} \def\endtabbing{\@stopline\ifnum\@tabpush > 0 \@badpoptabs \fi\endtrivlist} \def\@rtab{\@stopfield\@addfield\ifnum \@curtab<\@hightab \global\advance\@curtab \@ne \else\@badtab\fi \@tempdima\dimen\@curtab \advance\@tempdima -\dimen\@curtabmar \advance\@tempdima -\wd\@curline \setbox\@curline\hbox{\unhbox\@curline\hskip\@tempdima} \@startfield\ignorespaces} \def\@settab{\@stopfield\@addfield\ifnum \@curtab < \@maxtab \global\advance\@curtab \@ne \else\@latexerr{Tab overflow}\@ehd\fi \ifnum\@curtab > \@hightab \@hightab\@curtab\fi \dimen\@curtab\dimen\@curtabmar \advance\dimen\@curtab \wd\@curline\@startfield\ignorespaces} \def\@ltab{\@ifatmargin\ifnum\@curtabmar > \@firsttab \global\advance\@curtab \m@ne \global\advance\@curtabmar \m@ne \else \@badtab\fi\else \@latexerr{\string\<\space in mid line}\@ehd\fi\ignorespaces} \def\@tabplus {\ifnum \@nxttabmar < \@hightab \global\advance\@nxttabmar \@ne \else \@badtab\fi\ignorespaces} \def\@tabminus{\ifnum\@nxttabmar > \@firsttab \global\advance\@nxttabmar \m@ne \else \@badtab\fi\ignorespaces} \def\@tabrj{\@stopfield\@addfield\global\@rjfieldtrue\@startfield\ignorespaces} \def\@tablab{\@stopfield\setbox\@curline\hbox{\box\@curline \hskip -\wd\@curfield \hskip -\tabbingsep \box\@curfield \hskip \tabbingsep}\@startfield\ignorespaces} \def\pushtabs{\@stopfield\@addfield\global\advance\@tabpush \@ne \begingroup \@contfield} \def\poptabs{\@stopfield\@addfield\ifnum\@tabpush > \z@ \endgroup \global\advance\@tabpush \m@ne \else \@badpoptabs\fi\@contfield} \newdimen\tabbingsep \message{array,} % **************************************** % * ARRAY AND TABULAR ENVIRONMENTS * % **************************************** % % ARRAY PARMETERS: % \arraycolsep : half the width separating columns in an array environment % \tabcolsep : half the width separating columns in a tabular environment % \arrayrulewidth : width of rules % \doublerulesep : space between adjacent rules in array or tabular % \arraystretch : line spacing in array and tabular environments is done by % placing a strut in every row of height and depth % \arraystretch times the height and depth of the strut % produced by an ordinary \strut commmand. % % PREAMBLE: % The PREAMBLE argument of an array or tabular environment can contain % the following: % l,r,c : indicate where entry is to be placed. % | : for vertical rule % @{EXP} : inserts the text EXP in every column. \arraycolsep or \tabcolsep % spacing is suppressed. % *{N}{PRE} : equivalent to writing N copies of PRE in the preamble. PRE % may contain *{N'}{EXP'} expressions. % p{LEN} : makes entry in parbox of width LEN. % % SPECIAL ARRAY COMMANDS: % \multicolumn{N}{FORMAT}{ITEM} : replaces the next N column items by % ITEM, formatted according to FORMAT. FORMAT should contain at most % one l,r or c. If it contains none, then ITEM is ignored. % % \vline : draws a vertical line the height of the current row. May % appear in an array element entry. % \hline : draws a horizontal line between rows. Must appear either % before the first entry (to appear above the first row) or right % after a \\ command. If followed by another \hline, then adds % a \vskip of \doublerulesep. % % \cline[i-j] : draws horizontal lines between rows covering columns % i through j, inclusive. Multiple commands may follow % one another to provide lines covering several disjoint % columns % \extracolsep{WIDTH} : for use inside an @ in the preamble. Causes a WIDTH % space to be added between columns for the rest of the % columns. This is in addition to the ordinary intercolumn % space. % % \array == % BEGIN % \@acol == \@arrayacol % \@classz == \@arrayclassz % \@classiv == \@arrayclassiv % \\ == \@arraycr % \@halignto == NULL % \@tabarray % END % % \endarray{NAME} == BEGIN \crcr }} END % % \tabular == % BEGIN % \@halignto == NULL % \@tabular % END % % \tabular*{WIDTH} == % BEGIN % \@halignto == to WIDTH % \@tabular % END % % \@tabular == % BEGIN % \leavevmode % \hbox { $ % \@acol == \@tabacol % \@classz == \@tabclassz % \@classiv == \@tabclassiv % \\ == \@tabularcr % \@tabarray % END % % \endtabular == BEGIN \crcr}} $} END % % \@tabarray == if next char = [ then \@array else \@array[c] fi % % \@array[POS]{PREAMBLE} == % BEGIN % define \@arstrutbox to make \@arstrut produce strut of height % and depth \arraystretch times the height and % depth of a normal strut. % \@mkpream{PREAMBLE} % \@preamble == \halign \@halignto {\tabskip=0pt\@arstrut % eval{\@preamble}\tabskip = 0pt\cr %% } % \@startpbox == \@@startpbox % \@endpbox == \@@endpbox % if POS = t then \vtop % else if POS = b then \vbox % else \vcenter % fi fi % { % \par ==L \relax % \@sharp == # % \protect == \relax % \lineskip :=L 0pt % \baselineskip :=L 0pt % \@preamble % END % % % \@arraycr == % BEGIN % $ %% Prevents extra space at end of row's last entry. % if next char = [ % then \@argarraycr % else $ \cr %% Needed to balance $ % END % % \@argarraycr[LENGTH] == % BEGIN % $ %% Needed to balance $ of \@arraycr % if LENGTH > 0 % then \@tempdima := depth of \@arstrutbox + LENGTH % \vrule height 0pt width 0pt depth \@tempdima % \cr % else \cr \noalign{\vskip LENGTH} % END % % \@tabularcr and \@argtabularcr same as \@arraycr and \@argarraycr % except without the extra $'s. \def\extracolsep#1{\tabskip #1\relax} \def\array{\let\@acol\@arrayacol \let\@classz\@arrayclassz \let\@classiv\@arrayclassiv \let\\\@arraycr\def\@halignto{}\@tabarray} \def\endarray{\crcr\egroup\egroup} \def\endtabular{\crcr\egroup\egroup $\egroup} \expandafter \let \csname endtabular*\endcsname = \endtabular \def\tabular{\def\@halignto{}\@tabular} \expandafter \def\csname tabular*\endcsname #1{\def\@halignto{to #1}\@tabular} \def\@tabular{\leavevmode \hbox \bgroup $\let\@acol\@tabacol \let\@classz\@tabclassz \let\@classiv\@tabclassiv \let\\\@tabularcr\@tabarray} \def\@tabarray{\@ifnextchar[{\@array}{\@array[c]}} \def\@array[#1]#2{\setbox\@arstrutbox=\hbox{\vrule height\arraystretch \ht\strutbox depth\arraystretch \dp\strutbox width\z@}\@mkpream{#2}\edef\@preamble{\halign \noexpand\@halignto \bgroup \tabskip\z@ \@arstrut \@preamble \tabskip\z@ \cr}% \let\@startpbox\@@startpbox \let\@endpbox\@@endpbox \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi \bgroup \let\par\relax \let\@sharp##\let\protect\relax \lineskip\z@\baselineskip\z@\@preamble} \def\@arraycr{${\ifnum0=`}\fi\@ifstar{\@xarraycr}{\@xarraycr}} \def\@xarraycr{\@ifnextchar[{\@argarraycr}{\ifnum0=`{\fi}${}\cr}} \def\@argarraycr[#1]{\ifnum0=`{\fi}${}\ifdim #1>\z@ \@xargarraycr{#1}\else \@yargarraycr{#1}\fi} \def\@tabularcr{{\ifnum0=`}\fi\@ifstar{\@xtabularcr}{\@xtabularcr}} \def\@xtabularcr{\@ifnextchar[{\@argtabularcr}{\ifnum0=`{\fi}\cr}} \def\@argtabularcr[#1]{\ifnum0=`{\fi}\ifdim #1>\z@ \unskip\@xargarraycr{#1}\else \@yargarraycr{#1}\fi} \def\@xargarraycr#1{\@tempdima #1\advance\@tempdima \dp \@arstrutbox \vrule \@height\z@ \@depth\@tempdima \@width\z@ \cr} \def\@yargarraycr#1{\cr\noalign{\vskip #1}} % \multicolumn{NUMBER}{FORMAT}{ITEM} == % BEGIN % \multispan{NUMBER} % \begingroup % \@addamp == null % \@mkpream{FORMAT} % \@sharp == ITEM % \protect == \relax % \@startpbox == \@@startpbox % \@endpbox == \@@endpbox % \@arstrut % \@preamble % \endgroup % END \def\multicolumn#1#2#3{\multispan{#1}\begingroup \def\@addamp{}\@mkpream{#2}% \def\@sharp{#3}\let\protect\relax \let\@startpbox\@@startpbox\let\@endpbox\@@endpbox \@arstrut \@preamble\endgroup\ignorespaces} % Codes for classes and character numbers of array, tabular and % multicolumn arguments. % % Character Class Number % --------- ----- ------ % c 0 0 % l 0 1 % r 0 2 % % | 1 - % @ 2 - % p 3 - % {@-exp} 4 - % {p-arg} 5 - % % \@testpach \foo : expands \foo, which should be an array parameter token, % and sets \@chclass and \@chnum to its class and number. % Uses \@lastchclass to distinguish 4 and 5 % % Preamble error codes % 0: 'illegal character' % 1: 'Missing @-exp' % 2: 'Missing p-arg' % % \@addamp == % BEGIN if @firstamp = true then @firstamp := false % else & fi % END % % \@mkpream TOKENLIST == % BEGIN % @firstamp := T % \@lastchclass := 6 % \@preamble == null % \@sharp == \relax % \protect == BEGIN \noexpand\protect\noexpand END % \@startpbox == \relax % \@endpbox == \relax % \@expast{TOKENLIST} % for \@nextchar := expand(\@tempa) % do \@testpach{\@nextchar} % case of \@chclass % 0 -> \@classz % 1 -> \@classi % ... % 5 -> \@classv % end case % \@lastchclass := \@chclass % od % case of \@lastchclass % 0 -> \hskip \arraycolsep % lrc % 1 -> % | % 2 -> \@preamerr1 % 'Missing @-exp' % @ % 3 -> \@preamerr2 % 'Missing p-arg' % p % 4 -> % @-exp % 5 -> \hskip \arraycolsep % p-exp % end case % END % % \@arrayclassz == % BEGIN % \@preamble := \@preamble * % case of \@lastchclass % 0 -> \hskip \arraycolsep \@addamp \hskip \arraycolsep % 1 -> \@addamp \hskip \arraycolsep % 2 -> % impossible % 3 -> % impossible % 4 -> \@addamp % 5 -> \hskip \arraycolsep \@addamp \hskip \arraycolsep % 6 -> \@addamp \hskip \arraycolsep % end case % * case of \@chnum % 0 -> \hfil$\relax\@sharp$\hfil % 1 -> $\relax\@sharp$\hfil % 2 -> \hfil$\relax\@sharp$ % end case % END % % \@tabclassz == similar to \@arrayclassz % % \@classi == % BEGIN % \@preamble := \@preamble * % case of \@lastchclass % 0 -> \hskip \arraycolsep \@arrayrule % 1 -> \hskip \doublerulesep \@arrayrule % 2 -> % impossible % 3 -> % impossible % 4 -> \@arrayrule % 5 -> \hskip \arraycolsep \@arrayrule % 6 -> \@arrayrule % end case % END % % \@classii == % BEGIN % \@preamble := \@preamble * % case of \@lastchclass % 0 -> % 1 -> \hskip .5\arrayrulewidth % 2 -> % impossible % else -> % end case % END % % \@classiii == % BEGIN % \@preamble := \@preamble * % case of \@lastchclass % 0 -> \hskip \arraycolsep \@addamp \hskip \arraycolsep % 1 -> \@addamp \hskip \arraycolsep % 2 -> % impossible % 3 -> % impossible % 4 -> \@addamp % 5 -> \hskip \arraycolsep \@addamp \hskip \arraycolsep % 6 -> \@addamp \hskip \arraycolsep % end case % END % % \@arrayclassiv == BEGIN \@preamble := \@preamble * $ \@nextchar$ END % % \@tabclassiv == same as \@arrayclassv except without the $ ... $ % % \@classv == % BEGIN % \@preamble := \@preamble * \@startpbox{\@nextchar}\ignorespaces\@sharp % \@endpbox % END % % \@expast{S}: Sets \@tempa := S with all instances of *{N}{STRING} % replaced by N copies of STRING, where N > 0. An * % appearing inside braces is ignored, but *-expressions % inside STRING are expanded, so nested *-expressions are % handled properly. % % \@expast{S} == BEGIN \@xexpast S *0x\@@ END % % \@xexpast S1 *{N}{S2} S3 \@@ == % BEGIN % \@tempa := S1 % \@tempcnta := N % if \@tempcnta > 0 % then while \@tempcnta > 0 do \@tempa := \@tempa S2 % \@tempcnta := \@tempcnta - 1 od % \@tempb == \@xexpast % else \@tempb == \@xexnoop % fi % \expandafter \@tempb \@tempa S3 \@@ % END % \def\@xexnoop #1\@@{} \def\@expast#1{\@xexpast #1*0x\@@} \def\@xexpast#1*#2#3#4\@@{\edef\@tempa{#1}\@tempcnta#2\relax \ifnum\@tempcnta >0 \@whilenum\@tempcnta >0\do {\edef\@tempa{\@tempa#3}\advance\@tempcnta by \m@ne}\let\@tempb\@xexpast \else \let\@tempb\@xexnoop\fi \expandafter\@tempb \@tempa #4\@@} \newif\if@firstamp \def\@addamp{\if@firstamp \@firstampfalse \else \edef\@preamble{\@preamble &}\fi} \def\@arrayacol{\edef\@preamble{\@preamble \hskip \arraycolsep}} \def\@tabacol{\edef\@preamble{\@preamble \hskip \tabcolsep}} \def\@ampacol{\@addamp \@acol} \def\@acolampacol{\@acol\@addamp\@acol} \def\@mkpream#1{\@firstamptrue\@lastchclass6 \def\@preamble{}\def\protect{\noexpand\protect\noexpand}\let\@sharp\relax \let\@startpbox\relax\let\@endpbox\relax \@expast{#1}\expandafter\@tfor \expandafter \@nextchar \expandafter:\expandafter=\@tempa\do{\@testpach\@nextchar \ifcase \@chclass \@classz \or \@classi \or \@classii \or \@classiii \or \@classiv \or\@classv \fi\@lastchclass\@chclass}% \ifcase \@lastchclass \@acol \or \or \@preamerr \@ne\or \@preamerr \tw@\or \or \@acol \fi} \def\@arrayclassz{\ifcase \@lastchclass \@acolampacol \or \@ampacol \or \or \or \@addamp \or \@acolampacol \or \@firstampfalse \@acol \fi \edef\@preamble{\@preamble \ifcase \@chnum \hfil$\relax\@sharp$\hfil \or $\relax\@sharp$\hfil \or \hfil$\relax\@sharp$\fi}} \def\@tabclassz{\ifcase \@lastchclass \@acolampacol \or \@ampacol \or \or \or \@addamp \or \@acolampacol \or \@firstampfalse \@acol \fi \edef\@preamble{\@preamble \ifcase \@chnum \hfil\ignorespaces\@sharp\unskip\hfil \or \ignorespaces\@sharp\unskip\hfil \or \hfil\hskip\z@ \ignorespaces\@sharp\unskip\fi}} \def\@classi{\ifcase \@lastchclass \@acol \@arrayrule \or \@addtopreamble{\hskip \doublerulesep}\@arrayrule\or \or \or \@arrayrule \or \@acol \@arrayrule \or \@arrayrule \fi} \def\@classii{\ifcase \@lastchclass \or \@addtopreamble{\hskip .5\arrayrulewidth}\fi} \def\@classiii{\ifcase \@lastchclass \@acolampacol \or \@addamp\@acol \or \or \or \@addamp \or \@acolampacol \or \@ampacol \fi} \def\@tabclassiv{\@addtopreamble\@nextchar} \def\@arrayclassiv{\@addtopreamble{$ \@nextchar$}} \def\@classv{\@addtopreamble{\@startpbox{\@nextchar}\ignorespaces \@sharp\@endpbox}} \def\@addtopreamble#1{\edef\@preamble{\@preamble #1}} \newcount\@chclass \newcount\@lastchclass \newcount\@chnum \newdimen\arraycolsep \newdimen\tabcolsep \newdimen\arrayrulewidth \newdimen\doublerulesep \def\arraystretch{1} % Default value. \newbox\@arstrutbox \def\@arstrut{\relax\ifmmode\copy\@arstrutbox\else\unhcopy\@arstrutbox\fi} \def\@arrayrule{\@addtopreamble{\hskip -.5\arrayrulewidth \vrule \@width \arrayrulewidth\hskip -.5\arrayrulewidth}} \def\@testpach#1{\@chclass \ifnum \@lastchclass=\tw@ 4 \else \ifnum \@lastchclass=3 5 \else \z@ \if #1c\@chnum \z@ \else \if #1l\@chnum \@ne \else \if #1r\@chnum \tw@ \else \@chclass \if #1|\@ne \else \if #1@\tw@ \else \if #1p3 \else \z@ \@preamerr 0\fi \fi \fi \fi \fi \fi \fi \fi} \def\hline{\noalign{\ifnum0=`}\fi\hrule \@height \arrayrulewidth \futurelet \@tempa\@xhline} \def\@xhline{\ifx\@tempa\hline\vskip \doublerulesep\fi \ifnum0=`{\fi}} \def\vline{\vrule \@width \arrayrulewidth} \newcount\@cla \newcount\@clb \def\cline#1{\@cline[#1]} \def\@cline[#1-#2]{\noalign{\global\@cla#1\relax \global\advance\@cla\m@ne \ifnum\@cla>0\global\let\@gtempa\@clinea\else \global\let\@gtempa\@clineb\fi \global\@clb#2\relax \global\advance\@clb-\@cla}\@gtempa \noalign{\vskip-\arrayrulewidth}} \def\@clinea{\multispan\@cla&\multispan\@clb \unskip\leaders\hrule \@height \arrayrulewidth \hfill \cr} \def\@clineb{\multispan\@clb \unskip\leaders\hrule \@height \arrayrulewidth \hfill \cr} % \@startpbox{WIDTH} TEXT \egroup == \parbox{WIDTH}{TEXT} % \@endpbox == \par \vskip \dp\@arstrutbox \egroup\hfil % \def\@startpbox#1{\vtop\bgroup \hsize #1\@arrayparboxrestore} \def\@endpbox{\par\vskip\dp\@arstrutbox\egroup\hfil} \let\@@startpbox=\@startpbox \let\@@endpbox=\@endpbox \message{picture,} % **************************************** % * THE PICTURE ENVIRONMENT * % **************************************** % % \unitlength = value of dimension argument % \@wholewidth = current line width % \@halfwidth = half of current line width % \@linefnt = font for drawing lines % \@circlefnt = font for drawing circles % % \linethickness{DIM} : Sets the width of horizontal and vertical lines % in a picture to DIM. Does not change width of slanted lines % or circles. Width of all lines reset by \thinlines and % \thicklines % % \picture(XSIZE,YSIZE)(XORG,YORG) % BEGIN % \@picht :=L YSIZE * \unitlength % box \@picbox := % \hbox to XSIZE * \unitlength % {\hskip -XORG * \unitlength % \lower YORG * \unitlength % \hbox{ % END % % \endpicture == % BEGIN % } \hss } % heigth of \@picbox := \@picht % depth of \@picbox := 0 % leavevmode % \box\@picbox % END % % \put(X, Y){OBJ} == % BEGIN % \@killglue % \raise Y * \unitlength \hbox to 0pt { \hskip X * \unitlength % OBJ \hss } % \ignorespaces % END % % \multiput(X,Y)(DELX,DELY){N}{OBJ} == % BEGIN % \@killglue % \@multicnt := N % \@xdim := X * \unitlength % \@ydim := Y * \unitlength % while \@multicnt > 0 % do \raise \@ydim \hbox to 0pt { \hskip \@xdim % OBJ \hss } % \@multicnt := \@multicnt - 1 % \@xdim := \@xdim + DELX * \unitlength % \@ydim := \@ydim + DELY * \unitlength % od % \ignorespaces % END % % \shortstack[POS]{TEXT} : Makes a \vbox containing TEXT stacked as % a one-column array, positioned l, r or c as indicated by POS. \newdimen\@wholewidth \newdimen\@halfwidth \newdimen\unitlength \unitlength =1pt \newbox\@picbox \newdimen\@picht \def\picture(#1,#2){\@ifnextchar({\@picture(#1,#2)}{\@picture(#1,#2)(0,0)}} \def\@picture(#1,#2)(#3,#4){\@picht #2\unitlength \setbox\@picbox\hbox to #1\unitlength\bgroup \hskip -#3\unitlength \lower #4\unitlength \hbox\bgroup} \def\endpicture{\egroup\hss\egroup\ht\@picbox\@picht \dp\@picbox\z@\leavevmode\box\@picbox} \long\def\put(#1,#2)#3{\@killglue\raise#2\unitlength\hbox to \z@{\hskip #1\unitlength #3\hss}\ignorespaces} \long\def\multiput(#1,#2)(#3,#4)#5#6{\@killglue\@multicnt=#5\relax \@xdim=#1\unitlength \@ydim=#2\unitlength \@whilenum \@multicnt > 0\do {\raise\@ydim\hbox to \z@{\hskip \@xdim #6\hss}\advance\@multicnt \m@ne\advance\@xdim #3\unitlength\advance\@ydim #4\unitlength}\ignorespaces} \def\@killglue{\unskip\@whiledim \lastskip >\z@\do{\unskip}} \def\thinlines{\let\@linefnt\tenln \let\@circlefnt\tencirc \@wholewidth\fontdimen8\tenln \@halfwidth .5\@wholewidth} \def\thicklines{\let\@linefnt\tenlnw \let\@circlefnt\tencircw \@wholewidth\fontdimen8\tenlnw \@halfwidth .5\@wholewidth} \def\linethickness#1{\@wholewidth #1\relax \@halfwidth .5\@wholewidth} \def\shortstack{\@ifnextchar[{\@shortstack}{\@shortstack[c]}} \def\@shortstack[#1]{\leavevmode \vbox\bgroup\baselineskip-1pt\lineskip 3pt\let\mb@l\hss \let\mb@r\hss \expandafter\let\csname mb@#1\endcsname\relax \let\\\@stackcr\@ishortstack} \def\@ishortstack#1{\halign{\mb@l ##\unskip\mb@r\cr #1\crcr}\egroup} \def\@stackcr{\@ifstar{\@ixstackcr}{\@ixstackcr}} \def\@ixstackcr{\@ifnextchar[{\@istackcr}{\cr\ignorespaces}} \def\@istackcr[#1]{\cr\noalign{\vskip #1}\ignorespaces} % \line(X,Y){LEN} == % BEGIN % \@xarg := X % \@yarg := Y % \@linelen := LEN * \unitlength % if \@xarg = 0 % then \@vline % else if \@yarg = 0 % then \@hline % else \@sline % if % if % END % % \@sline == % BEGIN % if \@xarg < 0 % then @negarg := T % \@xarg := -\@xarg % \@yyarg := -\@yarg % else @negarg := F % \@yyarg := \@yarg % fi % \@tempcnta := |\@yyarg| % if \@tempcnta > 6 % then error: 'LATEX ERROR: Illegal \line or \vector argument.' % \@tempcnta := 0 % fi % \box\@linechar := \hbox{\@linefnt \@getlinechar(\@xarg,\@yyarg) } % if \@yarg > 0 then \@upordown = \raise % \@clnht := 0 % else \@upordown = \lower % \@clnht := height of \box\@linechar % fi % \@clnwd := width of \box\@linechar % if @negarg % then \hskip - width of \box\@linechar % \@tempa == \hskip - 2* width of box \@linechar % else \@tempa == \relax % fi % %% Put out integral number of line segments % while \@clnwd < \@linelen % do \@upordown \@clnht \copy\@linechar % \@tempa % \@clnht := \@clnht + ht of \box\@linechar % \@clnwd := \@clnwd + width of \box\@linechar % od % % %% Put out last segment % \@clnht := \@clnht - height of \box\@linechar % \@clnwd := \@clnwd - width of \box\@linechar % \@tempdima := \@linelen - \@clnwd % \@tempdimb := \@tempdima - width of \box\@linechar % if @negarg then \hskip -\@tempdimb % else \hskip \@tempdimb % fi % \@tempdima := 1000 * \@tempdima % \@tempcnta := \@tempdima / width of \box\@linechar % \@tempdima := (\@tempcnta * ht of \box\@linechar)/1000 % \@clnht := \@clnht + \@tempdima % if \@linelen < width of box\@linechar % then \hskip width of box\@linechar % else \hbox{\@upordown \@clnht \copy\@linechar} % fi % END % % \@hline == % BEGIN % if \@xarg < 0 then \hskip -\@linelen \fi % \vrule height \@halfwidth depth \@halfwidth width \@linelen % if \@xarg < 0 then \hskip -\@linelen \fi % END % % \@vline == if \@yarg < 0 \@downline else \@upline fi % % % \@getlinechar(X,Y) == % BEGIN % \@tempcnta := 8*X - 9 % if Y > 0 % then \@tempcnta := \@tempcnta + Y % else \@tempcnta := \@tempcnta - Y + 64 % fi % \char\@tempcnta % END % % \vector(X,Y){LEN} == % BEGIN % \@xarg := X % \@yarg := Y % \@linelen := LEN * \unitlength % if \@xarg = 0 % then \@vvector % else if \@yarg = 0 % then \@hvector % else \@svector % if % if % END % % \@hvector == % BEGIN % \@hline % {\@linefnt if \@xarg < 0 then \@getlarrow(1,0) % else \@getrarrow(1,0) % fi} % END % % \@vvector == if \@yarg < 0 \@downvector else \@upvector fi % % \@svector == % BEGIN % \@sline % \@tempcnta := |\@yarg| % if \@tempcnta < 5 % then \hskip - width of \box\@linechar % \@upordown \@clnht \hbox % {\@linefnt % if @negarg then \@getlarrow(\@xarg,\@yyarg) % else \@getrarrow(\@xarg,\@yyarg) % fi } % else error: 'LATEX ERROR: Illegal \line or \vector argument.' % fi % END % % \@getlarrow(X,Y) == % BEGIN % if Y = 0 % then \@tempcnta := '33 % else \@tempcnta := 16 * X - 9 % \@tempcntb := 2 * Y % if \@tempcntb > 0 % then \@tempcnta := \@tempcnta + \@tempcntb % else \@tempcnta := \@tempcnta - \@tempcntb + 64 % fi % fi % \char\@tempcnta % END % % \@getrarrow(X,Y) == % BEGIN % \@tempcntb := |Y| % case of \@tempcntb % 0 : \@tempcnta := '55 % 1 : if X < 3 % then \@tempcnta := 24*X - 6 % else if X = 3 % then \@tempcnta := 49 % else \@tempcnta := 58 fi % fi % 2 : if X < 3 % then \@tempcnta := 24*X - 3 % else \@tempcnta := 51 % X must = 3 % fi % 3 : \@tempcnta := 16*X - 2 % 4 : \@tempcnta := 16*X + 7 % endcase % if Y < 0 % then \@tempcnta := \@tempcnta + 64 % fi % \char\@tempcnta % END \newif\if@negarg \def\line(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax \@linelen=#3\unitlength \ifnum\@xarg =0 \@vline \else \ifnum\@yarg =0 \@hline \else \@sline\fi \fi} \def\@sline{\ifnum\@xarg< 0 \@negargtrue \@xarg -\@xarg \@yyarg -\@yarg \else \@negargfalse \@yyarg \@yarg \fi \ifnum \@yyarg >0 \@tempcnta\@yyarg \else \@tempcnta -\@yyarg \fi \ifnum\@tempcnta>6 \@badlinearg\@tempcnta0 \fi \setbox\@linechar\hbox{\@linefnt\@getlinechar(\@xarg,\@yyarg)}% \ifnum \@yarg >0 \let\@upordown\raise \@clnht\z@ \else\let\@upordown\lower \@clnht \ht\@linechar\fi \@clnwd=\wd\@linechar \if@negarg \hskip -\wd\@linechar \def\@tempa{\hskip -2\wd\@linechar}\else \let\@tempa\relax \fi \@whiledim \@clnwd <\@linelen \do {\@upordown\@clnht\copy\@linechar \@tempa \advance\@clnht \ht\@linechar \advance\@clnwd \wd\@linechar}% \advance\@clnht -\ht\@linechar \advance\@clnwd -\wd\@linechar \@tempdima\@linelen\advance\@tempdima -\@clnwd \@tempdimb\@tempdima\advance\@tempdimb -\wd\@linechar \if@negarg \hskip -\@tempdimb \else \hskip \@tempdimb \fi \multiply\@tempdima \@m \@tempcnta \@tempdima \@tempdima \wd\@linechar \divide\@tempcnta \@tempdima \@tempdima \ht\@linechar \multiply\@tempdima \@tempcnta \divide\@tempdima \@m \advance\@clnht \@tempdima \ifdim \@linelen <\wd\@linechar \hskip \wd\@linechar \else\@upordown\@clnht\copy\@linechar\fi} \def\@hline{\ifnum \@xarg <0 \hskip -\@linelen \fi \vrule \@height \@halfwidth \@depth \@halfwidth \@width \@linelen \ifnum \@xarg <0 \hskip -\@linelen \fi} \def\@getlinechar(#1,#2){\@tempcnta#1\relax\multiply\@tempcnta 8 \advance\@tempcnta -9 \ifnum #2>0 \advance\@tempcnta #2\relax\else \advance\@tempcnta -#2\relax\advance\@tempcnta 64 \fi \char\@tempcnta} \def\vector(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax \@linelen=#3\unitlength \ifnum\@xarg =0 \@vvector \else \ifnum\@yarg =0 \@hvector \else \@svector\fi \fi} \def\@hvector{\@hline\hbox to 0pt{\@linefnt \ifnum \@xarg <0 \@getlarrow(1,0)\hss\else \hss\@getrarrow(1,0)\fi}} \def\@vvector{\ifnum \@yarg <0 \@downvector \else \@upvector \fi} \def\@svector{\@sline \@tempcnta\@yarg \ifnum\@tempcnta <0 \@tempcnta=-\@tempcnta\fi \ifnum\@tempcnta <5 \hskip -\wd\@linechar \@upordown\@clnht \hbox{\@linefnt \if@negarg \@getlarrow(\@xarg,\@yyarg) \else \@getrarrow(\@xarg,\@yyarg) \fi}% \else\@badlinearg\fi} \def\@getlarrow(#1,#2){\ifnum #2 =\z@ \@tempcnta='33\else \@tempcnta=#1\relax\multiply\@tempcnta \sixt@@n \advance\@tempcnta -9 \@tempcntb=#2\relax\multiply\@tempcntb \tw@ \ifnum \@tempcntb >0 \advance\@tempcnta \@tempcntb\relax \else\advance\@tempcnta -\@tempcntb\advance\@tempcnta 64 \fi\fi\char\@tempcnta} \def\@getrarrow(#1,#2){\@tempcntb=#2\relax \ifnum\@tempcntb < 0 \@tempcntb=-\@tempcntb\relax\fi \ifcase \@tempcntb\relax \@tempcnta='55 \or \ifnum #1<3 \@tempcnta=#1\relax\multiply\@tempcnta 24 \advance\@tempcnta -6 \else \ifnum #1=3 \@tempcnta=49 \else\@tempcnta=58 \fi\fi\or \ifnum #1<3 \@tempcnta=#1\relax\multiply\@tempcnta 24 \advance\@tempcnta -3 \else \@tempcnta=51\fi\or \@tempcnta=#1\relax\multiply\@tempcnta \sixt@@n \advance\@tempcnta -\tw@ \else \@tempcnta=#1\relax\multiply\@tempcnta \sixt@@n \advance\@tempcnta 7 \fi\ifnum #2<0 \advance\@tempcnta 64 \fi \char\@tempcnta} \def\@vline{\ifnum \@yarg <0 \@downline \else \@upline\fi} \def\@upline{\hbox to \z@{\hskip -\@halfwidth \vrule \@width \@wholewidth \@height \@linelen \@depth \z@\hss}} \def\@downline{\hbox to \z@{\hskip -\@halfwidth \vrule \@width \@wholewidth \@height \z@ \@depth \@linelen \hss}} \def\@upvector{\@upline\setbox\@tempboxa\hbox{\@linefnt\char'66}\raise \@linelen \hbox to\z@{\lower \ht\@tempboxa\box\@tempboxa\hss}} \def\@downvector{\@downline\lower \@linelen \hbox to \z@{\@linefnt\char'77\hss}} % \dashbox{D}(X,Y) == % BEGIN % leave vertical mode % \hbox to 0pt { % \baselineskip := 0pt % \lineskip := 0pt % %% HORIZONTAL DASHES % \@dashdim := X * \unitlength % \@dashcnt := \@dashdim + 200 % to prevent roundoff error % \@dashdim := D * \unitlength % \@dashcnt := \@dashcnt / \@dashdim % if \@dashcnt is odd % then \@dashdim := 0pt % \@dashcnt := (\@dashcnt + 1) / 2 % else \@dashdim := \@dashdim / 2 % \@dashcnt := \@dashcnt / 2 - 1 % \box\@dashbox := \hbox{\vrule height \@halfwidth % depth \@halfwidth width \@dashdim} % \put(0,0){\copy\@dashbox} % \put(0,Y){\copy\@dashbox} % \put(X,0){\hskip -\@dashdim\copy\@dashbox} % \put(X,Y){\hskip -\@dashdim\box\@dashbox} % \@dashdim := 3 * \@dashdim % fi % \box\@dashbox := \hbox{\vrule height \@halfwidth % depth \@halfwidth width D * \unitlength % \hskip D * \unitlength} % \@tempcnta := 0 % \put(0,0){\hskip \@dashdim % while \@tempcnta < \@dascnt % do \copy\@dashbox % \@tempcnta := \@tempcnta + 1 % od % } % \@tempcnta := 0 % put(0,Y){\hskip \@dashdim % while \@tempcnta < \@dascnt % do \copy\@dashbox % \@tempcnta := \@tempcnta + 1 % od % } % % %% vertical dashes % \@dashdim := Y * \unitlength % \@dashcnt := \@dashdim + 200 % to prevent roundoff error % \@dashdim := D * \unitlength % \@dashcnt := \@dashcnt / \@dashdim % if \@dashcnt is odd % then \@dashdim := 0pt % \@dashcnt := (\@dashcnt + 1) / 2 % else \@dashdim := \@dashdim / 2 % \@dashcnt := \@dashcnt / 2 - 1 % \box\@dashbox := \hbox{\hskip -\@halfwidth % \vrule width \@wholewidth % height \@dashdim } % \put(0,0){\copy\@dashbox} % \put(X,0){\copy\@dashbox} % \put(0,Y){\lower\@dashdim\copy\@dashbox} % \put(X,Y){\lower\@dashdim\copy\@dashbox} % \@dashdim := 3 * \@dashdim % fi % \box\@dashbox := \hbox{\vrule width \@wholewidth % height D * \unitlength } % \@tempcnta := 0 % put(0,0){\hskip -\halfwidth % \vbox{while \@tempcnta < \@dashcnt % do \vskip D*\unitlength % \copy\@dashbox % \@tempcnta := \@tempcnta + 1 % od % \vskip \@dashdim % } } % \@tempcnta := 0 % put(X,0){\hskip -\halfwidth % \vbox{while \@tempcnta < \@dashcnt % do \vskip D*\unitlength % \copy\@dashbox % \@tempcnta := \@tempcnta + 1 % od % \vskip \@dashdim % } % } % } % END DASHES % % \@imakepicbox(X,Y) % END \def\dashbox#1(#2,#3){\leavevmode\hbox to \z@{\baselineskip \z@% \lineskip \z@% \@dashdim=#2\unitlength% \@dashcnt=\@dashdim \advance\@dashcnt 200 \@dashdim=#1\unitlength\divide\@dashcnt \@dashdim \ifodd\@dashcnt\@dashdim=\z@% \advance\@dashcnt \@ne \divide\@dashcnt \tw@ \else \divide\@dashdim \tw@ \divide\@dashcnt \tw@ \advance\@dashcnt \m@ne \setbox\@dashbox=\hbox{\vrule \@height \@halfwidth \@depth \@halfwidth \@width \@dashdim}\put(0,0){\copy\@dashbox}% \put(0,#3){\copy\@dashbox}% \put(#2,0){\hskip-\@dashdim\copy\@dashbox}% \put(#2,#3){\hskip-\@dashdim\box\@dashbox}% \multiply\@dashdim 3 \fi \setbox\@dashbox=\hbox{\vrule \@height \@halfwidth \@depth \@halfwidth \@width #1\unitlength\hskip #1\unitlength}\@tempcnta=0 \put(0,0){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt \do{\copy\@dashbox\advance\@tempcnta \@ne }}\@tempcnta=0 \put(0,#3){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt \do{\copy\@dashbox\advance\@tempcnta \@ne }}% \@dashdim=#3\unitlength% \@dashcnt=\@dashdim \advance\@dashcnt 200 \@dashdim=#1\unitlength\divide\@dashcnt \@dashdim \ifodd\@dashcnt \@dashdim=\z@% \advance\@dashcnt \@ne \divide\@dashcnt \tw@ \else \divide\@dashdim \tw@ \divide\@dashcnt \tw@ \advance\@dashcnt \m@ne \setbox\@dashbox\hbox{\hskip -\@halfwidth \vrule \@width \@wholewidth \@height \@dashdim}\put(0,0){\copy\@dashbox}% \put(#2,0){\copy\@dashbox}% \put(0,#3){\lower\@dashdim\copy\@dashbox}% \put(#2,#3){\lower\@dashdim\copy\@dashbox}% \multiply\@dashdim 3 \fi \setbox\@dashbox\hbox{\vrule \@width \@wholewidth \@height #1\unitlength}\@tempcnta0 \put(0,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta < \@dashcnt \do{\vskip #1\unitlength\copy\@dashbox\advance\@tempcnta \@ne }% \vskip\@dashdim}}\@tempcnta0 \put(#2,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta< \@dashcnt \relax\do{\vskip #1\unitlength\copy\@dashbox\advance\@tempcnta \@ne }% \vskip\@dashdim}}}\@makepicbox(#2,#3)} % CIRCLES AND OVALS % % USER COMMANDS: % % \circle{D} : Produces the circle with the diameter as close as % possible to D * \unitlength. \put(X,Y){\circle{D}} % puts the circle with its center at (X,Y). % % \oval(X,Y) : Makes an oval as round as possible that fits in the % rectangle of width X * \unitlength and height % Y * \unitlength. The reference point is the center. % % \oval(X,Y)[POS] : Save as \oval(X,Y) except it draws only the % half or quadrant of the oval indicated by POS. % E.G., \oval(X,Y)[t] draws just the top half % and \oval(X,Y)[br] draws just the bottom right % quadrant. In all cases, the reference point is % the same as the unqualified \oval(X,Y) command. % % \@ovvert {DELTA1} {DELTA2} : Makes a vbox containing either the left side % or the right side of the oval being constructed. The baseline % will coincide with the outside bottom edge of the oval; the left % side of the box will coincide with the left edge of the vertical % rule. The width of the box will be \@tempdima. % DELTA1 and DELTA2 are added to the character number in \@tempcnta % to get the characters for the top and bottom quarter circle pieces. % % \@ovhorz : Makes an hbox containing the straight rule for either the % top or the bottom of the oval being constructed. The baseline % will coincide with bottom edge of the rule; the left side of % the box will coincide with the left side of the oval. % The width of the box will be \@ovxx. % % \@getcirc {DIAM} : Sets \@tempcnta to the character number % of the top-right quarter circle with the largest % diameter less than or equal to DIAM. % Sets \@tempboxa to an hbox containing that character. % Sets \@tempdima to \wd \@tempboxa, which is the distance % from the circle's left outside edge to its right % inside edge. % (These characters are like those described in the % TeXbook, pp. 389-90.) % % \@getcirc {DIAM} == % BEGIN % \@tempcnta := integer coercion of DIAM % \@tempcnta := \@tempcnta / integer coercion of 4pt % if \@tempcnta > 10 % then \@tempcnta := 10 fi % if \@tempcnta > 0 % then \@tempcnta := \@tempcnta-1 % else LaTeX Warning: Oval too small. % fi % \@tempcnta := 4 * \@tempcnta % \@tempboxa := \hbox{\@circlefnt \char \@tempcnta} % \@tempdima := \wd \@tempboxa % END % % \@put{X}{Y}{OBJ} == % BEGIN % \raise Y \hbox to 0pt{\hskip X OBJ \hss} % END % % \@oval(X,Y)[POS] == % BEGIN % \begingroup % \boxmaxdepth := \maxdimen % @ovt := @ovb := @ovl := @ovr := true % for all E in POS % do @ovE := false od % \@ovxx := X * \unitlength % \@ovyy := Y * \unitlength % \@tempdimb := min(\@ovxx,\@ovyy) % \@getcirc{\@tempdimb} % \@ovro := \ht \@tempboxa % \@ovri := \dp \@tempboxa % \@ovdx := \@ovxx - \@tempdima % \@ovdx := \@ovdx/2 % \@ovdy := \@ovyy - \@tempdima % \@ovdy := \@ovyy/2 % \@circlefnt % \@tempboxa := % \hbox{ % if @ovr % then \@ovvert{3}{2} \kern -\@tempdima % fi % if @ovl % then \kern \@ovxx \@ovvert{0}{1} \kern -\@tempdima % \kern -\@ovxx % fi % if @ovt % then \@ovhorz \kern -\@ovxx % fi % if @ovb % then \raise \@ovyy \@ovhorz % fi % } % \@ovdx := \@ovdx + \@ovro % \@ovdy := \@ovdy + \@ovro % \ht\@tempboxa := \dp\@tempboxa := 0 % \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa} % \endgroup % END % % \@ovvert {DELTA1} {DELTA2} == % BEGIN % \vbox to \@ovyy { % if @ovb % then \@tempcntb := \@tempcnta + DELTA1 % \kern -\@ovro % \hbox { \char \@tempcntb } % \nointerlineskip % else \kern \@ovri \kern \@ovdy % fi % \leaders \vrule width \@wholewidth \vfil % \nointerlineskip % if @ovt % then \@tempcntb := \@tempcnta + DELTA2 % \hbox { \char \@tempcntb } % else \kern \@ovdy \kern \@ovro % fi % } % END % % \@ovhorz == % BEGIN % \hbox to \@ovxx{ % \kern \@ovro % if @ovr % then % else \kern \@ovdx % fi % \leaders \hrule height \@wholewidth \hfil % if @ovl % then % else \kern \@ovdx % fi % \kern \@ovri % } % END % % \circle{DIAM} == % BEGIN % \begingroup % \boxmaxdepth := maxdimen % \@tempdimb := DIAM *\unitlength % if \@tempdimb > 15.5pt % then \@getcirc{\@tempdimb} % \@ovro := \ht \@tempboxa % \@tempboxa := \hbox{ % \@circlefnt % \@tempcnta := \@tempcnta + 2 % \char \@tempcnta % \@tempcnta := \@tempcnta - 1 % \char \@tempcnta % \kern -2\@tempdima % \@tempcnta := \@tempcnta + 2 % \raise \@tempdima \hbox { \char \@tempcnta } % \raise \@tempdima \box\@tempboxa % } % \ht\@tempboxa := \dp\@tempboxa := 0 % \@put{-\@ovro}{-\@ovro}{\@tempboxa} % else % \@circ{\@tempdimb}{96} % fi % \endgroup % END % % \circle*{DIAM} == \@dot{DIAM} == \@circ{DIAM*\unitlength}{112} % % \@circ{DIAM}{CHAR} == % BEGIN % \@tempcnta := integer coercion of (DIAM + .5pt)/1pt. % if \@tempcnta > 15 then \@tempcnta := 15 fi % if \@tempcnta > 1 then \@tempcnta := \@tempcnta - 1 fi % \@tempcnta := \@tempcnta + CHAR % \@circlefnt % \char \@tempcnta % END % \newif\if@ovt \newif\if@ovb \newif\if@ovl \newif\if@ovr \newdimen\@ovxx \newdimen\@ovyy \newdimen\@ovdx \newdimen\@ovdy \newdimen\@ovro \newdimen\@ovri \def\@getcirc#1{\@tempdima #1\relax \@tempcnta\@tempdima \@tempdima 4pt\relax \divide\@tempcnta\@tempdima \ifnum \@tempcnta > 10\relax \@tempcnta 10\relax\fi \ifnum \@tempcnta >\z@ \advance\@tempcnta\m@ne \else \@warning{Oval too small}\fi \multiply\@tempcnta 4\relax \setbox \@tempboxa \hbox{\@circlefnt \char \@tempcnta}\@tempdima \wd \@tempboxa} \def\@put#1#2#3{\raise #2\hbox to \z@{\hskip #1#3\hss}} \def\oval(#1,#2){\@ifnextchar[{\@oval(#1,#2)}{\@oval(#1,#2)[]}} \def\@oval(#1,#2)[#3]{\begingroup\boxmaxdepth \maxdimen \@ovttrue \@ovbtrue \@ovltrue \@ovrtrue \@tfor\@tempa :=#3\do{\csname @ov\@tempa false\endcsname}\@ovxx #1\unitlength \@ovyy #2\unitlength \@tempdimb \ifdim \@ovyy >\@ovxx \@ovxx\else \@ovyy \fi \@getcirc \@tempdimb \@ovro \ht\@tempboxa \@ovri \dp\@tempboxa \@ovdx\@ovxx \advance\@ovdx -\@tempdima \divide\@ovdx \tw@ \@ovdy\@ovyy \advance\@ovdy -\@tempdima \divide\@ovdy \tw@ \@circlefnt \setbox\@tempboxa \hbox{\if@ovr \@ovvert32\kern -\@tempdima \fi \if@ovl \kern \@ovxx \@ovvert01\kern -\@tempdima \kern -\@ovxx \fi \if@ovt \@ovhorz \kern -\@ovxx \fi \if@ovb \raise \@ovyy \@ovhorz \fi}\advance\@ovdx\@ovro \advance\@ovdy\@ovro \ht\@tempboxa\z@ \dp\@tempboxa\z@ \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}% \endgroup} \def\@ovvert#1#2{\vbox to \@ovyy{% \if@ovb \@tempcntb \@tempcnta \advance \@tempcntb by #1\relax \kern -\@ovro \hbox{\char \@tempcntb}\nointerlineskip \else \kern \@ovri \kern \@ovdy \fi \leaders\vrule width \@wholewidth\vfil \nointerlineskip \if@ovt \@tempcntb \@tempcnta \advance \@tempcntb by #2\relax \hbox{\char \@tempcntb}% \else \kern \@ovdy \kern \@ovro \fi}} \def\@ovhorz{\hbox to \@ovxx{\kern \@ovro \if@ovr \else \kern \@ovdx \fi \leaders \hrule height \@wholewidth \hfil \if@ovl \else \kern \@ovdx \fi \kern \@ovri}} \def\circle{\@ifstar{\@dot}{\@circle}} \def\@circle#1{\begingroup \boxmaxdepth \maxdimen \@tempdimb #1\unitlength \ifdim \@tempdimb >15.5pt\relax \@getcirc\@tempdimb \@ovro\ht\@tempboxa \setbox\@tempboxa\hbox{\@circlefnt \advance\@tempcnta\tw@ \char \@tempcnta \advance\@tempcnta\m@ne \char \@tempcnta \kern -2\@tempdima \advance\@tempcnta\tw@ \raise \@tempdima \hbox{\char\@tempcnta}\raise \@tempdima \box\@tempboxa}\ht\@tempboxa\z@ \dp\@tempboxa\z@ \@put{-\@ovro}{-\@ovro}{\box\@tempboxa}% \else \@circ\@tempdimb{96}\fi\endgroup} \def\@dot#1{\@tempdimb #1\unitlength \@circ\@tempdimb{112}} \def\@circ#1#2{\@tempdima #1\relax \advance\@tempdima .5pt\relax \@tempcnta\@tempdima \@tempdima 1pt\relax \divide\@tempcnta\@tempdima \ifnum\@tempcnta > 15\relax \@tempcnta 15\relax \fi \ifnum \@tempcnta >\z@ \advance\@tempcnta\m@ne\fi \advance\@tempcnta #2\relax \@circlefnt \char\@tempcnta} %INITIALIZATION \thinlines \newcount\@xarg \newcount\@yarg \newcount\@yyarg \newcount\@multicnt \newdimen\@xdim \newdimen\@ydim \newbox\@linechar \newdimen\@linelen \newdimen\@clnwd \newdimen\@clnht \newdimen\@dashdim \newbox\@dashbox \newcount\@dashcnt \message{theorem,} % **************************************** % * THEOREM ENVIRONMENTS * % **************************************** % % The user creates his own theorem-like environments with the command % \newtheorem{NAME}{TEXT}[COUNTER] or % \newtheorem{NAME}[OLDNAME]{TEXT} % This defines the environment NAME to be just as one would expect a % theorem environment to be, except that it prints ``TEXT'' instead of % ``Theorem''. % % If OLDNAME is given, then environments NAME and OLDNAME use the same % counter, so using a NAME environment advances the number of the next % NAME environment, and vice-versa. % % If COUNTER is given, then environment NAME is numbered within COUNTER. % E.g., if COUNTER = subsection, then the first NAME in subsection 7.2 % is numbered TEXT 7.2.1. % % The way NAME environments are numbered can be changed by redefining % \theNAME. % % DOCUMENT STYLE PARAMETERS % % \@thmcounter{COUNTER} : A command such that % \edef\theCOUNTER{\@thmcounter{COUNTER}} % defines \theCOUNTER to produce a number for a theorem environment. % The default is: % BEGIN \noexpand\arabic{COUNTER} END % % \@thmcountersep : A separator placed between a theorem number and % the number of the counter within which it is numbered. % E.g., to make the third theorem of section 7.2 be numbered % 7.2-3, \@thmcountersep should be \def'ed to '-'. Its % default is '.'. % % \@begintheorem{NAME}{NUMBER} : A command that begins a theorem % environment for a 'theorem' named 'NAME NUMBER' -- % e.g., \@begintheorem{Lemma}{3.7} starts Lemma 3.7. % % \@opargbegintheorem{NAME}{NUMBER}{OPARG} : A command that begins a theorem % environment for a 'theorem' named 'NAME NUMBER' with optional % argument OPARG -- e.g., \@begintheorem{Lemma}{3.7}{Jones} % starts `Lemma 3.7 (Jones):'. % % \@endtheorem : A command that ends a theorem environment. % % \newtheorem{NAME}{TEXT}[COUNTER] == % BEGIN % if \NAME is definable % then \@definecounter{NAME} % if COUNTER present % then \@addtoreset{NAME}{COUNTER} fi % \theNAME == BEGIN \theCOUNTER \@thmcountersep % eval\@thmcounter{NAME} END % else \theNAME == BEGIN eval\@thmcounter{NAME} END % \NAME == \@thm{NAME}{TEXT} % \endNAME == \@endtheorem % else error % fi % END % % \newtheorem{NAME}[OLDNAME]{TEXT}== % BEGIN % if \NAME is definable % then \theNAME == \theOLDNAME % \NAME == \@thm{OLDNAME}{TEXT} % \endNAME == \@endtheorem % else error % fi % END % % \@thm{NAME}{TEXT} == % BEGIN % \refstepcounter{NAME} % if next char = [ % then \@ythm{NAME}{TEXT} % else \@xthm{NAME}{TEXT} % fi % END % % \@xthm{NAME}{TEXT} == % BEGIN % \@begintheorem{TEXT}{\theNAME} % \ignorespaces % END % % \@ythm{NAME}{TEXT}[OPARG] == % BEGIN % \@opargbegintheorem{TEXT}{\theNAME}{OPARG} % \ignorespaces % END % \def\newtheorem#1{\@ifnextchar[{\@othm{#1}}{\@nthm{#1}}} \def\@nthm#1#2{% \@ifnextchar[{\@xnthm{#1}{#2}}{\@ynthm{#1}{#2}}} \def\@xnthm#1#2[#3]{\expandafter\@ifdefinable\csname #1\endcsname {\@definecounter{#1}\@addtoreset{#1}{#3}% \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand \csname the#3\endcsname \@thmcountersep \@thmcounter{#1}}% \global\@namedef{#1}{\@thm{#1}{#2}}\global\@namedef{end#1}{\@endtheorem}}} \def\@ynthm#1#2{\expandafter\@ifdefinable\csname #1\endcsname {\@definecounter{#1}% \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% \global\@namedef{#1}{\@thm{#1}{#2}}\global\@namedef{end#1}{\@endtheorem}}} \def\@othm#1[#2]#3{\expandafter\@ifdefinable\csname #1\endcsname {\global\@namedef{the#1}{\@nameuse{the#2}}% \global\@namedef{#1}{\@thm{#2}{#3}}% \global\@namedef{end#1}{\@endtheorem}}} \def\@thm#1#2{\refstepcounter {#1}\@ifnextchar[{\@ythm{#1}{#2}}{\@xthm{#1}{#2}}} \def\@xthm#1#2{\@begintheorem{#2}{\csname the#1\endcsname}\ignorespaces} \def\@ythm#1#2[#3]{\@opargbegintheorem{#2}{\csname the#1\endcsname}{#3}\ignorespaces} %DEFAULT VALUES \def\@thmcounter#1{\noexpand\arabic{#1}} \def\@thmcountersep{.} \def\@makethmnumber#1#2{\bf #1 #2:} \def\@begintheorem#1#2{\it \trivlist \item[\hskip \labelsep{\bf #1\ #2}]} \def\@opargbegintheorem#1#2#3{\it \trivlist \item[\hskip \labelsep{\bf #1\ #2\ (#3)}]} \def\@endtheorem{\endtrivlist} \message{lengths,} % **************************************** % * LENGTHS * % **************************************** % % USER COMMANDS: % % \newlength{\NAME} == \newskip\NAME % \setlength{\NAME}{VALUE} == \NAME :=L VALUE % \addtolength{\NAME}{VALUE} == \NAME :=L \NAME + VALUE % \settowidth{\NAME}{TEXT} == \NAME :=L width of \hbox{TEXT} % \def\newlength#1{\@ifdefinable#1{\newskip#1}} \def\setlength#1#2{#1#2\relax} \def\addtolength#1#2{\advance#1 #2\relax} \def\settowidth#1#2{\setbox\@tempboxa\hbox{#2}#1\wd\@tempboxa} \message{title,} % ***************************************** % * THE TITLE * % ***************************************** % % The user defines the title, author, date by the declarations \title{NAME}, % \author{NAME} and \date{DATE}. Inside these, he can use the \thanks % command to make footnoted acknowledgements, notice of address, etc. % The \maketitle command produces the actual title. Note: multiple authors % are separated with the \and command. \def\title#1{\gdef\@title{#1}} \def\author#1{\gdef\@author{#1}} \def\date#1{\gdef\@date{#1}} \gdef\@date{\today} %Default is today's date \def\thanks#1{\footnotemark\begingroup \def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks \protect\footnotetext[\the\c@footnote]{#1}}\endgroup} \def\@thanks{} \def\and{%% % \begin{tabular} \end{tabular}\hskip 1em plus .17fil\begin{tabular}[t]{c}%% \end{tabular} } \message{sectioning,} % ***************************************** % * SECTIONING * % ***************************************** % % % \@startsection {NAME}{LEVEL}{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE} % optional * [ALTHEADING]{HEADING} % Generic command to start a section. % NAME : e.g., 'subsection' % LEVEL : a number, denoting depth of section -- e.g., chapter=1, % section = 2, etc. % INDENT : Indentation of heading from left margin % BEFORESKIP : Absolute value = skip to leave above the heading. % If negative, then paragraph indent of text following % heading is suppressed. % AFTERSKIP : if positive, then skip to leave below heading, else % negative of skip to leave to right of run-in heading. % STYLE : commands to set style % If '*' missing, then increments the counter. If it is present, then % there should be no [ALTHEADING] argument. % Uses the counter 'secnumdepth' whose value is the highest section % level that is to be numbered. % % \@startsection {NAME}{LEVEL}{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE} == % BEGIN % IF @noskipsec = T THEN \leavevmode FI % true if previous section % % had no body. % \par % \@tempskipa := BEFORESKIP % @afterindent := T % IF \@tempskipa < 0 THEN \@tempskipa := -\@tempskipa % @afterindent := F % FI % IF @nobreak = true % THEN \everypar == null % ELSE \addpenalty{\@secpenalty} % \addvspace{\@tempskipa} % FI % IF * next % THEN \@ssect{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE} % ELSE \@dblarg{\@sect % {NAME}{LEVEL}{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE}} % FI % END % % \@sect{NAME}{LEVEL}{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE}[ARG1]{ARG2} == % BEGIN % IF LEVEL > \c@secnumdepth % THEN \@svsec :=L null % ELSE \refstepcounter{NAME} % \@svsec :=L BEGIN \theNAME END % FI % IF AFTERSKIP > 0 % THEN \begingroup % STYLE % \@hangfrom{\hskip INDENT\@svsec} % {\interlinepenalty 10000 ARG2\par} % \endgroup % \NAMEmark{ARG1} % \addcontentsline{toc}{NAME} % { IF LEVEL > \c@secnumdepth % ELSE \protect\numberline{\theNAME} FI % ARG1 } % ELSE \@svsechd == BEGIN STYLE % \hskip INDENT\@svsec % ARG2 % \NAMEmark{ARG1} % \addcontentsline{toc}{NAME} % { IF LEVEL > \c@secnumdepth % ELSE \protect\numberline{\theNAME} FI % ARG1 } % END % FI % \@xsect{AFTERSKIP} % END % % \@xsect{AFTERSKIP} == % BEGIN % IF AFTERSKIP > 0 % THEN \par \nobreak % \vskip AFTERSKIP % \@afterheading % ELSE @nobreak :=G F % @noskipsec :=G T % \everypar{ IF @noskipsec = T % THEN @noskipsec :=G F % \clubpenalty :=G 10000 % \hskip -\parindent % \begingroup % \@svsechd % \endgroup % \unskip % \hskip -AFTERSKIP % ELSE \clubpenalty :=G \@clubpenalty % \everypar := NULL % FI % } % FI % % END % % \@ssect{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE}{ARG} == % BEGIN % IF AFTERSKIP > 0 % THEN \begingroup % STYLE % \@hangfrom{\hskip INDENT}{\interlinepenalty 10000 ARG\par} % \endgroup % ELSE \@svsechd == BEGIN STYLE % \hskip INDENT % ARG % END % FI % \@xsect{AFTERSKIP} % END % % \@afterheading == % BEGIN % @nobreak :=G true % \everypar := BEGIN IF @nobreak = T % THEN @nobreak :=G false % \clubpenalty :=G 10000 % IF @afterindent = F % THEN \hskip -\parindent % FI % ELSE \clubpenalty :=G \@clubpenalty % \everypar := NULL % FI % END % END % % \@secpenalty : The penalty (usually negative) put before a section % heading unless it immediately follows another one. % \newcount\@secpenalty \@secpenalty = -300 \newif\if@noskipsec \@noskipsecfalse \def\@startsection#1#2#3#4#5#6{\if@noskipsec \leavevmode \fi \par \@tempskipa #4\relax \@afterindenttrue \ifdim \@tempskipa <\z@ \@tempskipa -\@tempskipa \@afterindentfalse\fi \if@nobreak \everypar{}\else \addpenalty{\@secpenalty}\addvspace{\@tempskipa}\fi \@ifstar {\@ssect{#3}{#4}{#5}{#6}}{\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} \def\@sect#1#2#3#4#5#6[#7]#8{\ifnum #2>\c@secnumdepth \def\@svsec{}\else \refstepcounter{#1}\edef\@svsec{\csname the#1\endcsname\hskip 1em }\fi \@tempskipa #5\relax \ifdim \@tempskipa>\z@ \begingroup #6\relax \@hangfrom{\hskip #3\relax\@svsec}{\interlinepenalty \@M #8\par} \endgroup \csname #1mark\endcsname{#7}\addcontentsline {toc}{#1}{\ifnum #2>\c@secnumdepth \else \protect\numberline{\csname the#1\endcsname}\fi #7}\else \def\@svsechd{#6\hskip #3\@svsec #8\csname #1mark\endcsname {#7}\addcontentsline {toc}{#1}{\ifnum #2>\c@secnumdepth \else \protect\numberline{\csname the#1\endcsname}\fi #7}}\fi \@xsect{#5}} \def\@xsect#1{\@tempskipa #1\relax \ifdim \@tempskipa>\z@ \par \nobreak \vskip \@tempskipa \@afterheading \else \global\@nobreakfalse \global\@noskipsectrue \everypar{\if@noskipsec \global\@noskipsecfalse \clubpenalty\@M \hskip -\parindent \begingroup \@svsechd \endgroup \unskip \hskip -#1 \else \clubpenalty \@clubpenalty \everypar{}\fi}\fi\ignorespaces} \def\@ssect#1#2#3#4#5{\@tempskipa #3\relax \ifdim \@tempskipa>\z@ \begingroup #4\@hangfrom{\hskip #1}{\interlinepenalty \@M #5\par}\endgroup \else \def\@svsechd{#4\hskip #1\relax #5}\fi \@xsect{#3}} \newif\if@afterindent \@afterindenttrue \def\@afterheading{\global\@nobreaktrue \everypar{\if@nobreak \global\@nobreakfalse \clubpenalty \@M \if@afterindent \else \hskip -\parindent\fi \else \clubpenalty \@clubpenalty \everypar{}\fi}} % \@hangfrom{TEXT} : Puts TEXT in a box, and makes a hanging indentation % of the following material up to the first \par. Should be used % in vertical mode. % \def\@hangfrom#1{\setbox\@tempboxa=\hbox{#1} \hangindent 1\wd\@tempboxa\noindent\box\@tempboxa} \newcount\c@secnumdepth \newcount\c@tocdepth % \secdef{UNSTARCMDS}{STARCMDS} : % When defining a \chapter or \section command without using % \@startsection, you can use \secdef as follows: % \def\chapter { ... \secdef \CMDA \CMDB } % \def\CMDA [#1]#2{ ... } % Command to define \chapter[...]{...} % \def\CMDB #1{ ... } % Command to define \chapter*{...} \def\secdef#1#2{\@ifstar{#2}{\@dblarg{#1}}} % Initializations % \def\sectionmark#1{} \def\subsectionmark#1{} \def\subsubsectionmark#1{} \def\paragraphmark#1{} \def\subparagraphmark#1{} \message{contents,} % ***************************************** % * TABLE OF CONTENTS, ETC. * % ***************************************** % % CONVENTIONS: % \tf@foo = file number for output for table foo. The file is % opened only if @filesw = true. % % \contentsline{TYPE}{ENTRY}{PAGE} % Macro to produce a TYPE entry in a table of contents, etc. % It will appear in the .TOC or other file. For example, % The entry for subsection 1.4.3 in the table of contents might % be produced by: % \contentsline{subsection}{\makebox{30pt}[r]{1.4.3} Gnats and Gnus}{22} % The \protect command causes command sequences to be written % without expanding them. % % \l@TYPE{ENTRY}{PAGE} % Macro defined by document style for making an entry of % type TYPE in a table of contents, etc. E.g., the document % style should define \l@chapter, \l@section, etc. % % \addcontentsline{TABLE}{TYPE}{ENTRY} % User command for adding his own entry to a table of contents, etc. % It adds the entry % \contentsline{TYPE}{ENTRY}{page} % to the .TABLE file. % % \addtocontents{TABLE}{TEXT} : Adds TEXT to the .TABLE file, with no % page number. % % Note: When used in the ENTRY or TEXT of one of the above commands, % \protect causes the following control sequence to be written % on the file without being expanded. The sequence will be expanded % when the table of contents entry is processed. % % SURPRISE: \index and \label are no-ops inside an \addcontentsline % or \addtocontents command argument. This could cause a problem if % the user puts an \index or \label into one of the commands he writes, % or into the optional 'short version' argument of a \section or % \caption command. % % \addcontentsline{TABLE}{TYPE}{ENTRY} == % BEGIN % if @filesw = true % then \begingroup % \index == \label == \@gobble % \protect{ARG} == \string\string\string ARG \string\space\space % \@temptokena := \thepage % \@tempa == write \string\contentsline % {TYPE}{ENTRY}{\the\@temptokena} % \@tempa % IF vmode and @nobreak = true THEN \nobreak FI % \endgroup % fi % END % % \@starttoc{EXT} : Used to define \tableofcontents, \listoffigures, etc.-- % e.g., \@starttoc{lof} is used in \listoffigures. This command reads % the .EXT file and sets up to write the new .EXT file. % % \@starttoc{EXT} == % BEGIN % \begingroup % \makeatletter % read file \jobname.EXT % IF @filesw = true % THEN open \jobname.EXT as file \tf@EXT % FI % \endgroup % END \def\@starttoc#1{\begingroup \makeatletter \@input{\jobname.#1}\if@filesw \expandafter\newwrite\csname tf@#1\endcsname \expandafter\openout \csname tf@#1\endcsname \jobname.#1\relax \fi \endgroup} \let\protect=\relax \def\addcontentsline#1#2#3{\if@filesw \begingroup \let\label\@gobble \let\index\@gobble \def\protect##1{\string\string\string##1\string\space \space}\@temptokena{\thepage}% \edef\@tempa{\write \@auxout{\string\@writefile{#1}{\protect \contentsline{#2}{#3}{\the\@temptokena}}}}\@tempa \if@nobreak \ifvmode\nobreak\fi\fi\endgroup\fi} \long\def\addtocontents#1#2{\if@filesw \begingroup \let\label\@gobble \let\index\@gobble \def\protect##1{\string\string\string##1\string\space\space}% \edef\@tempa{\write \@auxout {\string\@writefile{#1}{#2}}}\@tempa \if@nobreak \ifvmode\nobreak\fi\fi\endgroup\fi} \def\contentsline#1{\csname l@#1\endcsname} % \@dottedtocline{LEVEL}{INDENT}{NUMWIDTH}{TITLE}{PAGE} : % Macro to produce a table of contents line with the following % parameters: % LEVEL : If LEVEL > \c@tocdepth, then no line produced. % INDENT : Total indentation from the left margin. % NUMWIDTH : Width of box for number if the TITLE has a % \numberline command. % TITLE : Contents of entry. % PAGE : Page number. % Uses the following parameters, which must be set by the document style. % They should be defined with \def's. % \@pnumwidth : Width of box in which page number is set. % \@tocrmarg : Right margin indentation for all but last line of % multiple-line entries. % \@dotsep : Separation between dots, in mu units. Should be \def'd to % a number like 2 or 1.7 % \def\@dottedtocline#1#2#3#4#5{\ifnum #1>\c@tocdepth \else \vskip \z@ plus .2pt {\hangindent #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip \parindent #2\relax\@afterindenttrue \interlinepenalty\@M \leavevmode \@tempdima #3\relax #4\leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern \@dotsep mu$}\hfill \hbox to\@pnumwidth{\hfil\rm #5}\par}\fi} % \numberline{NUMBER} : For use in a \contentsline command. % It puts NUMBER flushleft in a box of width \@tempdima and adds % \@tempdima to the hanging indentation. \def\numberline#1{\advance\hangindent\@tempdima \hbox to\@tempdima{#1\hfil}} \message{index,} % **************************************** % * INDEX COMMANDS * % **************************************** % % \makeindex == % BEGIN % if \@filesw = T % then open file \jobname.IDX as \@indexfile % \index == BEGIN \@bsphack % \begingroup % re-\catcode special characters to 'other' % \@wrindex % fi % END % % \@wrindex{ITEM} == % BEGIN % write of {\indexentry{ITEM}{page number}} % \endgroup % \@esphack % END % INITIALIZATION: % % \index == BEGIN \@bsphack % \begingroup % re-\catcode special characters (in case '%' there) % \@index % END % % \@index{ITEM} == BEGIN \endgroup \@esphack END % \def\makeindex{\if@filesw \newwrite\@indexfile \immediate\openout\@indexfile=\jobname.idx \def\index{\@bsphack\begingroup\@sanitize\@wrindex\@indexfile}\typeout {Writing index file \jobname.idx }\fi} \def\@wrindex#1#2{\let\thepage\relax \xdef\@gtempa{\write#1{\string \indexentry{#2}{\thepage}}}\endgroup\@gtempa \if@nobreak \ifvmode\nobreak\fi\fi\@esphack} \def\index{\@bsphack\begingroup\@sanitize\@index} \def\@index#1{\endgroup\@esphack} \def\makeglossary{\if@filesw \newwrite\@glossaryfile \immediate\openout\@glossaryfile=\jobname.glo \def\glossary{\@bsphack\begingroup\@sanitize\@wrindex\@glossaryfile}\typeout {Writing glossary file \jobname.glo }\fi} \def\glossary{\@bsphack\begingroup\@sanitize\@index} \message{bibliography,} % **************************************** % * BIBLIOGRAPHY * % **************************************** % % A bibliography is created by the bibliography environment, which % generates a title such as ``References'', and a list of entries. % The BIBTeX program will create a file containing such an environment, % which will be read in by the \bibliography command. With % BIBTeX, the following commands will be used. % % \bibliography{FILE1,FILE2, ... ,FILEn} : specifies % the bibdata files. Writes a \bibdata entry on the .aux file % and tries to read in mainfile.BBL. % % \bibliographystyle{STYLE} : Writes a \bibstyle entry on the .aux file. % % The thebibliography environment is a list environment. To save the % use of an extra counter, it should use enumiv as the item counter. % Instead of using \item, items in the bibliography are produced by the % following commands: % \bibitem{NAME} : Produces a numbered entry cited as NAME. % \bibitem[LABEL]{NAME} : Produces an entry labeled by LABEL and % cited by NAME. % The former is used for bibliographies with citations like [1], [2], etc.; % the latter is used for citations like [Knuth82]. % % The document style must define the thebibliography environment. This % environment has a single argument, which is the widest bibliography % label-- e.g., if the [Knuth67] is the widest entry, then thist argument % will be Knuth67. The \thebibliography command must begin a list % environment, which the \endthebibliography command ends. % % Entries are cited by the command \cite{NAME}. % % PARAMETERS % % \@cite : A macro such that \@cite{LABEL1,LABEL2}{NOTE} % produces the output for a \cite[NOTE]{FOO1,FOO2} command, % where entry FOOi is defined by \bibitem[LABELi]{FOOi}. % The switch @tempswa is true if the optional NOTE argument % is present. % The default definition is : % \@cite{LABELS}{NOTE} == % BEGIN [LABELS % IF @tempswa = T THEN , NOTE FI % ] % END % % \@biblabel : A macro to produce the label in the bibliography % entry. For \bibitem[LABEL]{NAME}, the label is % generated by \@biblabel{LABEL}. It has the default % definition \@biblabel{LABEL} -> [LABEL]. % CONVENTION % % \b@FOO : The name or number of the reference created by \cite{FOO} % E.g., if \cite{FOO} -> [17] , then \b@FOO -> 17. % % \def\bibitem{\@ifnextchar[{\@lbibitem}{\@bibitem}} \def\@lbibitem[#1]#2{\item[\@biblabel{#1}]\if@filesw { \def\protect##1{\string ##1\space}\immediate \write\@auxout{\string\bibcite{#2}{#1}}\fi\ignorespaces}} \def\@bibitem#1{\item\if@filesw \immediate\write\@auxout {\string\bibcite{#1}{\the\c@enumi}}\fi\ignorespaces} \def\bibcite#1#2{\global\@namedef{b@#1}{#2}} \let\citation\@gobble \def\cite{\@ifnextchar [{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}} \def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi \def\@citea{}\@cite{\@for\@citeb:=#2\do {\@citea\def\@citea{,}\@ifundefined {b@\@citeb}{{\bf ?}\@warning {Citation `\@citeb' on page \thepage \space undefined}}% \hbox{\csname b@\@citeb\endcsname}}}{#1}} \let\bibdata=\@gobble \let\bibstyle=\@gobble \def\bibliography#1{\if@filesw\immediate\write\@auxout{\string\bibdata{#1}}\fi \@input{\jobname.bbl}} \def\bibliographystyle#1{\if@filesw\immediate\write\@auxout {\string\bibstyle{#1}}\fi} % \nocite{CITATIONS} : puts information on .AUX file to cause % BibTeX to include the CITATIONS list in the bibliography, % but puts nothing in the text. (Added 14 Jun 85) \def\nocite#1{\@bsphack \if@filesw\immediate\write\@auxout{\string\citation{#1}}\fi \@esphack} %DEFAULT DEFINITIONS \def\@cite#1#2{[{#1\if@tempswa , #2\fi}]} \def\@biblabel#1{[#1]\hfill} \message{floats,} % **************************************** % * FLOATS * % **************************************** % % The different types of floats are identified by a TYPE name, which is % the name of the counter for that kind of float. For example, figures % are of type 'figure' and tables are of type 'table'. Each TYPE has % associated a positive TYPE NUMBER, which is a power of two. E.g., % figures might be have type number 1, tables type number 2, programs % type number 4, etc. % % The locations where a float can go are specified by a PLACEMENT % SPECIFIER, which is a list of the possible locations, each denoted % by a letter as follows: % h : here - at the current location in the text. % t : top - at the top of a text page. % b : bottom - at the bottom of a text page. % p : page - on a separate float page. % For example, 'pht' specifies that the float can appear in any of three % locations: page, here or top. % % Where floats may appear on a page, and how many may appear there % are specified by the following float placement parameters. The % numbers are named like counters so the user can set them with % the ordinary counter-setting commands. % % \c@topnumber : Number of floats allowed at the top of a column. % \topfraction : Fraction of column that can be devoted to floats. % \c@dbltopnumber, \dbltopfraction : Same as above, but for double-column % floats. % \c@bottomnumber, \bottomfraction : Same as above for bottom of page. % \c@totalnumber : Number of floats allowed in a single column, % including in-text floats. % \textfraction : Minimum fraction of column that must contain text. % \floatpagefraction : Minimum fraction of page that must be taken % up by float page. % \dblfloatpagefraction : Same as above, for double-column floats. % % The document style must define the following. % % \fps@TYPE : The default placement specifier for floats of type TYPE. % % \ftype@TYPE : The type number for floats of type TYPE. % % \ext@TYPE : The file extension indicating the file on which the % contents list for float type TYPE is stored. For example, % \ext@figure = 'lof'. % % \fnum@TYPE : A macro to generate the figure number for a caption. % For example, \fnum@TYPE == Figure \thefigure. % % \@makecaption{NUM}{TEXT} : A macro to make a caption, with NUM the value % produced by \fnum@... and TEXT the text of the caption. % It can assume it's in a \parbox of the appropriate width. % % \@float{TYPE}[PLACEMENT] : This macro begins a float environment for a % single-column float of type TYPE with PLACEMENT as the placement % specifier. The default value of PLACEMENT is defined by \fps@TYPE. % The environment is ended by \end@float. % E.g., \figure == \@float{figure}, \endfigure == \end@float. % % \caption == % BEGIN % \refstepcounter{\@captype} % \@dblarg{\@caption{\@captype}} % END % % \@caption{TYPE}[STEXT]{TEXT} == % BEGIN % \addcontentsline{\ext@TYPE}{TYPE}{\numberline{\theTYPE}{STEXT}} % \par % \begingroup % \@parboxrestore % \normalsize % \@makecaption{\fnum@TYPE}{TEXT} % \par % \endgroup % END % % \@float{TYPE}[PLACEMENT] == % BEGIN % if hmode then \@bsphack % \@floatpenalty := -10002 % else \@floatpenalty := -10003 % fi % \@captype ==L TYPE % if inner % then LaTeX Error: 'Not in outer paragraph mode.' % \@floatpenalty := 0 % else if \@freelist nonempty % then \@currbox :=L head of \@freelist % \@freelist :=G tail of \@freelist % \count\@currbox :=G 32*\ftype@TYPE + 16 + % bits determined by PLACEMENT % else \@floatpenalty := 0 % LaTeX Error: 'Too many unprocessed floats' % fi % fi % \@currbox :=G \vbox{ % \boxmaxdepth :=L 0pt %% to make a 0 depth box % \hsize = \columnwidth % \@parboxrestore % END % % \end@float == % BEGIN % } % if \@floatpenalty < 0 % then add \@currbox to \@currlist % if \ht\@currbox > \textheight % then \ht\@currbox :=G \textheight fi % if \@floatpenalty < -10002 % then \penalty -10004 % \vbox{} % \penalty \@floatpenalty % else \vadjust{\penalty -10004 % \vbox{} % \penalty \@floatpenalty} % \@esphack % fi fi % END % % \@dblfloat{TYPE}[PLACEMENT] : Macro to begin a float environment for a % double-column float of type TYPE with PLACEMENT as the placement % specifier. The default value of PLACEMENT is 'tp' % The environment is ended by \end@dblfloat. % E.g., \figure* == \@dblfloat{figure}, \endfigure* == \end@dblfloat. % % \@dblfloat{TYPE}[PLACEMENT] == % Identical to \@float{TYPE}[PLACEMENT] except \hsize and \linewidth % are set to \textwidth. % % \end@dblfloat == % BEGIN %%% { BRACE MATCHING % } % if \@floatpenalty < 0 % then \@dbldeferlist :=G \@dbldeferlist * \@currbox % fi % if \@floatpenalty = -10002 then \@esphack fi % END % \newcount\@floatpenalty \def\caption{\refstepcounter\@captype \@dblarg{\@caption\@captype}} \long\def\@caption#1[#2]#3{\addcontentsline{\csname ext@#1\endcsname}{#1}{\protect\numberline{\csname the#1\endcsname}{\ignorespaces #2}}\par \begingroup \@parboxrestore \normalsize \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par \endgroup} \def\@float#1{\@ifnextchar[{\@xfloat{#1}}{\edef\@tempa{\noexpand\@xfloat {#1}[\csname fps@#1\endcsname]}\@tempa}} \def\@xfloat#1[#2]{\ifhmode \@bsphack\@floatpenalty -\@Mii\else \@floatpenalty-\@Miii\fi\def\@captype{#1}\ifinner \@parmoderr\@floatpenalty\z@ \else\@next\@currbox\@freelist{\@tempcnta\csname ftype@#1\endcsname \multiply\@tempcnta\@xxxii\advance\@tempcnta\sixt@@n \@tfor \@tempa :=#2\do {\if\@tempa h\advance\@tempcnta \@ne\fi \if\@tempa t\advance\@tempcnta \tw@\fi \if\@tempa b\advance\@tempcnta 4\relax\fi \if\@tempa p\advance\@tempcnta 8\relax\fi }\global\count\@currbox\@tempcnta}\@fltovf\fi \global\setbox\@currbox\vbox\bgroup \boxmaxdepth\z@ \hsize\columnwidth \@parboxrestore} \def\end@float{\egroup \ifnum\@floatpenalty <\z@ \@cons\@currlist\@currbox \ifdim \ht\@currbox >\textheight \ht\@currbox\textheight \fi \ifnum\@floatpenalty < -\@Mii \penalty -\@Miv \vbox{}\penalty\@floatpenalty \else \vadjust{\penalty -\@Miv \vbox{}\penalty\@floatpenalty}\@esphack \fi\fi} \def\@dblfloat{\if@twocolumn\let\@tempa\@dbflt\else\let\@tempa\@float\fi \@tempa} \def\@dbflt#1{\@ifnextchar[{\@xdblfloat{#1}}{\@xdblfloat{#1}[tp]}} \def\@xdblfloat#1[#2]{\@xfloat{#1}[#2]\hsize\textwidth\linewidth\textwidth} \def\end@dblfloat{\if@twocolumn\egroup \ifnum\@floatpenalty <\z@ \@cons\@dbldeferlist\@currbox\fi \ifnum \@floatpenalty =-\@Mii \@esphack\fi\else\end@float\fi} \newcount\c@topnumber \newcount\c@dbltopnumber \newcount\c@bottomnumber \newcount\c@totalnumber \def\@floatplacement{\global\@topnum\c@topnumber \global\@toproom \topfraction\@colht \global\@botnum \c@bottomnumber \global\@botroom \bottomfraction\@colht \global\@colnum \c@totalnumber \@fpmin \floatpagefraction\@colht} \def\@dblfloatplacement{\global\@dbltopnum\c@dbltopnumber \global\@dbltoproom \dbltopfraction\@colht \@fpmin \dblfloatpagefraction\textheight \@fptop \@dblfptop \@fpsep \@dblfpsep \@fpbot \@dblfpbot} % MARGINAL NOTES: % % Marginal notes use the same mechanism as floats to communicate % with the \output routine. Marginal notes are distinguished from % floats by having a negative placement specification. The command % \marginpar [LTEXT]{RTEXT} generates a marginal note in a parbox, % using LTEXT if it's on the left and RTEXT if it's on the right. % (Default is RTEXT = LTEXT.) It uses the following parameters. % % \marginparwidth : Width of marginal notes. % \marginparsep : Distance between marginal note and text. % the page layout to determine how to move the marginal % note into the margin. E.g., \@leftmarginskip == % \hskip -\marginparwidth \hskip -\marginparsep . % \marginparpush : Minimum vertical separation between \marginpar's % % Marginal notes are normally put on the outside of the page % if @mparswitch = true, and on the right if @mparswitch = false. % The command \reversemarginpar reverses the side where they % are put. \normalmarginpar undoes \reversemarginpar. % These commands have no effect for two-column output. % % SURPRISE: if two marginal notes appear on the same line of % text, then the second one could appear on the next page, in % a funny position. % % % \marginpar [LTEXT]{RTEXT} == % BEGIN % if hmode then \@bsphack % \@floatpenalty := -10002 % else \@floatpenalty := -10003 % fi % if inner % then LaTeX Error: 'Not in outer paragraph mode.' % \@floatpenalty := 0 % else if \@freelist has two elements: % then get \@marbox, \@currbox from \@freelist % \count\@marbox :=G -1 % else \@floatpenalty := 0 % LaTeX Error: 'Too many unprocessed floats' % \@currbox, \@marbox := \@tempboxa %%use \def % fi % fi % if optional argument % then %% \@xmpar == % \@savemarbox\@marbox{LTEXT} % \@savemarbox\@currbox{RTEXT} % else %% \@ympar == % \@savemarbox\@marbox{RTEXT} % \box\@currbox :=G \box\@marbox % fi % %% \@xympar == % if \@floatpenalty < 0 then add \@marbox to \@currlist fi % { \end@float %%%% BRACE MATCHING} % END % % \@savemarbox\BOX{TEXT} == % BEGIN % \BOX :=G \vtop{ \hsize = \marginparwidth % \@parboxrestore % TEXT % } % END % % \reversemarginpar == BEGIN \@mparbottom :=G 0 % @reversemargin :=G true % END % % \normalmarginpar == BEGIN \@mparbottom :=G 0 % @reversemargin :=G false % END % \def\marginpar{\ifhmode \@bsphack\@floatpenalty -\@Mii\else \@floatpenalty-\@Miii\fi\ifinner \@parmoderr\@floatpenalty\z@ \else\@next\@currbox\@freelist{}{}\@next\@marbox\@freelist{\global \count\@marbox\m@ne}{\@floatpenalty\z@ \@fltovf\def\@currbox{\@tempboxa }\def\@marbox{\@tempboxa}}\fi \@ifnextchar [{\@xmpar}{\@ympar}} \long\def\@xmpar[#1]#2{\@savemarbox\@marbox{#1}\@savemarbox\@currbox {#2}\@xympar} \long\def\@ympar#1{\@savemarbox\@marbox{#1}\global\setbox\@currbox \copy\@marbox\@xympar} \long\def\@savemarbox#1#2{\global\setbox#1\vtop{\hsize\marginparwidth \@parboxrestore #2}} \def\@xympar{\ifnum\@floatpenalty <\z@\@cons\@currlist\@marbox\fi \bgroup\end@float\@esphack} \def\reversemarginpar{\global\@mparbottom\z@ \@reversemargintrue} \def\normalmarginpar{\global\@mparbottom\z@ \@reversemarginfalse} \message{footnotes,} % **************************************** % * FOOTNOTES * % **************************************** % % \footnote{NOTE} : User command to insert a footnote. % % \footnote[NUM]{NOTE} : User command to insert a footnote numbered % NUM, where NUM is a number -- 1, 2, % etc. For example, if footnotes are numbered % *, **, etc. within pages, then \footnote[2]{...} % produces footnote '**'. This command does not % step the footnote counter. % % \footnotemark[NUM] : Command to produce just the footnote mark in % the text, but no footnote. With no argument, % it steps the footnote counter before generating % the mark. % % \footnotetext[NUM]{TEXT} : Command to produce the footnote but no % mark. \footnote is equivalent to % \footnotemark \footnotetext . % % As in PLAIN, footnotes use \insert\footins, and the following parameters: % % \footnotesize : Size-changing command for footnotes. % % \footnotesep : The height of a strut placed at the beginning of % every footnote. % \skip\footins : Space between main text and footnotes. The rule % separating footnotes from text occurs in this space. % This space lies above the strut of height \footnotesep % which is at the beginning of the first footnote. % \footnoterule : Macro to draw the rule separating footnotes from text. % It should take zero vertical space--i.e., it should to % a negative skip to compensate for any positive space % it occupies. (See PLAIN.TEX.) % % \interfootnotelinepenalty : Interline penalty for footnotes. % % \thefootnote : In usual LaTeX style, produces the footnote number. % If footnotes are to be numbered within pages, then the % document style file must include an \@addtoreset command % to cause the footnote counter to be reset when the page % counter is stepped. This is not a good idea, though, % because the counter will not always be reset in time % to ensure that the first footnote on a page is footnote % number one. % % \@thefnmark : Holds the current footnote's mark--e.g., \dag or '1' or 'a'. % % \@mpfnnumber : A macro that generates the numbers for \footnote % and \footnotemark commands. It == \thefootnote % outside a minipage environment, but can be changed % inside to generate numbers for \footnote's. % % \@makefnmark : A macro to generate the footnote marker from \@thefnmark % The default definition is \hbox{$^\@thefnmark$}. % % \@makefntext{NOTE} : % Must produce the actual footnote, using \@thefnmark as the mark % of the footnote and NOTE as the text. It is called when effectively % inside a \parbox, with \hsize = \columnwidth. For example, it might % be as simple as % $^{\@thefnmark}$ NOTE % % In a minipage environment, \footnote and \footnotetext are redefined % so that % (a) they use the counter mpfootnote % (b) the footnotes they produce go at the bottom of the minipage. % The switch is accomplished by letting \@mpfn == footnote or mpfootnote % and \thempfn == \thefootnote or \thempfootnote, and by redefining % \@footnotetext to be \@mpfootnotetext in the minipage. % % \footnote{NOTE} == % BEGIN % \stepcounter{\@mpfn} % \@thefnmark :=G eval (\thempfn) % \@footnotemark % \@footnotetext{NOTE} % END % % \footnote[NUM]{NOTE} == % BEGIN % begingroup % counter \@mpfn :=L NUM % \@thefnmark :=G eval (\thempfn) % endgroup % \@footnotemark % \@footnotetext{NOTE} % END % % \@footnotetext{NOTE} == % BEGIN % \insert into \footins % {\footnotesize % \interlinepenalty :=L \interfootnotelinepenalty % \splittopskip :=L \footnotesep % \splitmaxdepth :=L \dp\strutbox % \floatingpenalty :=L 20000 % \hsize :=L \columnwidth % \@parboxrestore % set \@currentlabel to make \label command work right % \@makefntext{\rule{0pt}{\footnotesep} NOTE} % } % END % % \footnotemark == % BEGIN \stepcounter{footnote} % \@thefnmark :=G eval(\thefootnote) % \@footnotemark % END % % \footnotemark[NUM] == % BEGIN % begingroup % footnote counter :=L NUM % \@thefnmark :=G eval(\thefootnote) % endgroup % \@footnotemark % END % % \@footnotemark == % BEGIN % \leavevmode % IF hmode THEN \@x@sf := \the\spacefactor FI % \@makefnmark % put number in main text % IF hmode THEN \spacefactor := \@x@sf FI % END % % \footnotetext == % BEGIN \@thefnmark :=G eval (\thempfn) % \@footnotetext % END % % \footnotetext[NUM] == % BEGIN begingroup counter \@mpfn :=L NUM % \@thefnmark :=G eval (\thempfn) % endgroup % \@footnotetext % END % \@definecounter{footnote} \def\thefootnote{\arabic{footnote}} \@definecounter{mpfootnote} \def\thempfootnote{\alph{mpfootnote}} % Default definition \def\@makefnmark{\hbox{$^{\@thefnmark}$}} \newdimen\footnotesep \def\footnote{\@ifnextchar[{\@xfootnote}{\stepcounter {\@mpfn}\xdef\@thefnmark{\thempfn}\@footnotemark\@footnotetext}} \def\@xfootnote[#1]{\begingroup \csname c@\@mpfn\endcsname #1\relax \xdef\@thefnmark{\thempfn}\endgroup \@footnotemark\@footnotetext} \long\def\@footnotetext#1{\insert\footins{\footnotesize \interlinepenalty\interfootnotelinepenalty \splittopskip\footnotesep \splitmaxdepth \dp\strutbox \floatingpenalty \@MM \hsize\columnwidth \@parboxrestore \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}\@makefntext {\rule{\z@}{\footnotesep}\ignorespaces #1\strut}}} \def\footnotemark{\@ifnextchar[{\@xfootnotemark }{\stepcounter{footnote}\xdef\@thefnmark{\thefootnote}\@footnotemark}} \def\@xfootnotemark[#1]{\begingroup \c@footnote #1\relax \xdef\@thefnmark{\thefootnote}\endgroup \@footnotemark} \def\@footnotemark{\leavevmode\ifhmode \edef\@x@sf{\the\spacefactor}\fi \@makefnmark \ifhmode\spacefactor\@x@sf\fi\relax} \def\footnotetext{\@ifnextchar [{\@xfootnotenext}{\xdef\@thefnmark{\thempfn}\@footnotetext}} \def\@xfootnotenext[#1]{\begingroup \csname c@\@mpfn\endcsname #1\relax \xdef\@thefnmark{\thempfn}\endgroup \@footnotetext} \def\@mpfn{footnote} \def\thempfn{\thefootnote} \message{initial,} % **************************************** % * INITIAL DECLARATION COMMANDS * % **************************************** % % DOCUMENT STYLE % -------------- % % The user starts his file with the command % \documentstyle [OPTION1, ... ,OPTIONk]{STYLE} % which saves the OPTION's and \input's the file STYLE.STY. When the % STYLE.STY file issues the command \@options, the following happens % for each i : % IF \ds@OPTIONi is defined % THEN execute \ds@OPTIONi % ELSE save OPTIONi on a list of unprocessed options. % FI % After STYLE.STY has been executed, the file OPTIONi.STY is read for % each OPTIONi on the list of unprocessed options. % % \documentstyle == % BEGIN % IF next char = [ % THEN \@documentstyle % ELSE \@documentstyle[] % FI % END % % \@documentstyle[OPTIONS]{STYLE} == % BEGIN % \makeatletter % \@optionlist := OPTIONS % \@optionfiles :=G null % \input STYLE.STY % \@elt == \input % \@optionfiles % \@elt == \relax % \makeatother % END % % \@options == % BEGIN % \@elt := \relax % FOR \@tempa := \@optionlist % DO IF \ds@[eval(\@tempa)] defined % THEN \ds@[eval(\@tempa)] % ELSE \@optionfiles :=G \@optionfiles * % \@elt eval(\@tempa) \relax % OD FI % END % % PAGE STYLE COMMANDS % ------------------- % \pagestyle{STYLE} : sets the page style of the current and succeeding % pages to STYLE % % \thispagestyle{STYLE} : sets the page style of the current page only % to STYLE % % To define a page style STYLE, you must define \ps@STYLE to set the page % style parameters. % % HOW A PAGE STYLE MAKES RUNNING HEADS AND FEET: % % The \ps@... command defines the macros \@oddhead, \@oddfoot, % \@evenhead, and \@evenfoot to define the running heads and feet. % (See output routine.) To make headings determined by the sectioning % commands, the page style defines the commands \chaptermark, % \sectionmark, etc., where \chaptermark{TEXT} is called by \chapter to % set a mark. The \...mark commands and the \...head macros are defined % with the help of the following macros. (All the \...mark commands % should be initialized to no-ops.) % % MARKING CONVENTIONS: % LaTeX extends TeX's \mark facility by producing two kinds of marks % a 'left' and a 'right' mark, using the following commands: % \markboth{LEFT}{RIGHT} : Adds both marks. % \markright{RIGHT} : Adds a 'right' mark. % \leftmark : Used in the output routine, gets the current 'left' mark. % Works like TeX's \botmark. % \rightmark : Used in the output routine, gets the current 'right' mark. % Works like TeX's \firstmark. % The marking commands work reasonably well for right marks 'numbered % within' left marks--e.g., the left mark is changed by a \chapter command and % the right mark is changed by a \section command. However, it does % produce somewhat anomalous results if two \bothmark's occur on the same page. % % Commands like \tableofcontents that should set the marks in some page styles % use a \@mkboth command, which is \let by the pagestyle command (\ps@...) % to \markboth for setting the heading or to \@gobbletwo to do nothing. \def\documentstyle{\@ifnextchar[{\@documentstyle}{\@documentstyle[]}} \def\@documentstyle[#1]#2{\makeatletter \def\@optionlist{#1}\gdef\@optionfiles{}\input #2.sty\relax \let\@elt\input \@optionfiles \let\@elt\relax \makeatother} \def\@options{\let\@elt\relax \@for\@tempa:=\@optionlist\do {\@ifundefined{ds@\@tempa}{\xdef\@optionfiles{\@optionfiles \@elt \@tempa.sty\relax}}{\csname ds@\@tempa\endcsname}}} \def\pagestyle#1{\@nameuse{ps@#1}} \def\thispagestyle#1{\global\@specialpagetrue\gdef\@specialstyle{#1}} % \head : An obsolete command that was used in the `myheadings' % page style. (Removed 14 Jun 85) % \def\head{\@ifnextchar[{\@xhead}{\@yhead}} % \def\@xhead[#1]#2{\if #1l \def\@lhead{#2}\else \def\@rhead{#2}\fi} % \def\@yhead#1{\def\@lhead{#1}\def\@rhead{#1}} % Initialization % \def\@lhead{} \def\@rhead{} % Default Initializations % \def\ps@empty{\let\@mkboth\@gobbletwo\def\@oddhead{}\def\@oddfoot{}% \def\@evenhead{}\def\@evenfoot{}} \def\ps@plain{\let\@mkboth\@gobbletwo \def\@oddhead{}\def\@oddfoot{\rm\hfil\thepage \hfil}\def\@evenhead{}\let\@evenfoot\@oddfoot} \def\@leftmark#1#2{#1} \def\@rightmark#1#2{#2} \def\markboth#1#2{\gdef\@themark{{#1}{#2}}{\let\protect\noexpand \mark{\@themark}}} \def\markright#1{{\let\protect\noexpand\expandafter\@markright\@themark {#1}\mark{\@themark}}} \def\@markright#1#2#3{\gdef\@themark{{#1}{#3}}} \def\leftmark{\expandafter\@leftmark\botmark} \def\rightmark{\expandafter\@rightmark\firstmark} % Initialization % \def\@themark{{}{}} % OTHER % ----- % % \raggedbottom : Typesets pages with no vertical stretch, so they have % their natural height instead of all being exactly the % same height. (Uses a space of .0001fil to avoid % interfering with the 1fil space of \newpage.) % % \flushbottom : Inverse of \raggedbottom - makes all pages the same % height. % % \sloppy : Resets TeX's parameters so it accepts worse line and page % breaks, and slightly more overfull boxes. % % \fussy : Resets TeX's parameters to their normal finnicky values. % \def\raggedbottom{\def\@textbottom{\vskip \z@ plus.0001fil}\let\@texttop\relax} \def\flushbottom{\let\@textbottom\relax \let\@texttop\relax} % Default definitions % \sloppy will never (well, hardly ever) produce overfull boxes, but may % produce underfull ones. (14 June 85) % A sloppypar environment is equivalent to {\par \sloppy ... \par}. \def\sloppy{\tolerance 10000 \hfuzz .5\p@ \vfuzz .5\p@} \def\sloppypar{\par\sloppy} \def\endsloppypar{\par} \def\fussy{\tolerance 200 \hfuzz .1\p@ \vfuzz .1\p@} % LaTeX default is no overfull box rule. Changed by document % style option \overfullrule 0pt \message{output,} % **************************************** % * OUTPUT * % **************************************** % % % PAGE LAYOUT PARAMETERS % % \topmargin : Extra space added to top of page. % @twoside : boolean. T if two-sided printing % \oddsidemargin : IF @twoside = T % THEN extra space added to left of odd-numbered % pages. % ELSE extra space added to left of all pages. % \evensidemargin : IF @twoside = T % THEN extra space added to left of even-numbered % pages. % \headheight : height of head % \headsep : separation between head and text % \footheight : height of foot % \footskip : distance separation between baseline of last % line of text and baseline of foot. % Note difference between \footSKIP and \headSEP. % \textheight : height of text on page, excluding head and foot % \textwidth : width of printing on page % \columnsep : IF @twocolumn = T % THEN width of space between columns % \columnseprule : IF @twocolumn = T % THEN width of rule between columns (0 if none). % \columnwidth : IF @twocolumn = T % THEN (\textwidth - \columnsep)/2 % ELSE \textwidth % It is set by the \@maketwocolumn and \@makeonecolumn % commands. % \@textbottom : Command executed at bottom of vbox holding text of page % (including figures). The \raggedbottom command % simply \let's this to \vfil. % % \@texttop : Command executed at top of vbox holding text of page % (including figures). Used by letter style; can also % be used to produce centered pages. Is \let to \relax % by \raggedbottom and \flushbottom. % % Page layout must also initialize \@colht and \@colroom to \textheight. % % PAGE STYLE PARAMETERS: % % \floatsep : Space left between floats. % \textfloatsep : Space between last top float or first bottom float % and the text. % \topfigrule : Command to place rule (or whatever) between floats % at top of page and text. Executed in inner vertical % mode right before the \textfloatsep skip separating % the floats from the text. Must occupy zero vertical % space. (See \footnoterule.) % \botfigrule : Same as \topfigrule, but put after the \textfloatsep % skip separating text from the floats at bottom of page. % \intextsep : Space left on top and bottom of an in-text float. % \@maxsep : The maximum of \floatsep, \textfloatsep and \intextsep % \dblfloatsep : Space between double-column floats. % \dbltextfloatsep : Space between top or bottom double-column floats % and text. % \dblfigrule : Similar to \topfigrule, but for double-column floats. % \@dblmaxsep : The maximum of \dblfloatsep and \dbltexfloatsep % \@fptop : Glue to go at top of float column -- must be 0pt + % stretch % \@fpsep : Glue to go between floats in a float column. % \@fpbot : Glue to go at bottom of float column -- must be 0pt + % stretch % \@dblfptop, \@dblfpsep, \@dblfpbot % : Analogous for double-column float page in two-column % format. % % FOOTNOTES: As in PLAIN, footnotes use \insert\footins. % % PAGE LAYOUT SWITCHES AND MACROS % % @twocolumn : Boolean. T if two columns per page. % % PAGE STYLE MACROS AND SWITCHES % % \@oddhead : IF @twoside = T % THEN macro to generate head of odd-numbered pages. % ELSE macro to generate head of all pages. % \@evenhead : IF @twoside = T % THEN macro to generate head of even-numbered pages. % \@oddfoot : IF @twoside = T % THEN macro to generate foot of odd-numbered pages. % ELSE macro to generate foot of all pages. % \@evenfoot : IF @twoside = T % THEN macro to generate foot of even-numbered pages. % @specialpage : boolean. T if current page is to have a special format. % \@specialstyle : If its value is foo then % IF @specialpage = T % THEN the command \ps@foo is executed to temporarily % reset the page style parameters before composing % the current page. This command should execute % only \def's and \edef's, making only local % definitions. % % % FLOAT PLACEMENT PARAMETERS % % The following parameters are set by the macro \@floatplacement, which is % defined by the \floatstyle command. When \@floatplacement is called, % \@colht is the height of the page or column being built. I.e.: % * For single-column page it equals \textheight. % * For double-column page it equals \textheight - height % of double-column floats on page. % Note that some are set globally and some locally: % \@topnum :=G Maximum number of floats allowed on the top of a column. % \@toproom :=G Maximum amount of top of column devoted to floats-- % excluding \textfloatsep separation below the floats and % \floatsep separation between them. For two-column % output, should be computed as a function of \@colht. % \@botnum, \@botroom % : Analogous to above. % \@colnum :=G Maximum number of floats allowed in a column, including % in-text floats. % \@textmin :=L Minimum amount of text (excluding footnotes) that must % appear on a text page. %% 27 Sep 85 : made local to % %% \@addtocurcol and \@addtonextcol % \@fpmin :=L Minimum height of floats in a float column. % % The macro \@dblfloatplacement sets the following parameters. This macro % is also defined by the \floatstyle command. % \@dbltopnum :=G Maximum number of double-column floats allowed at the % top of a two-column page. % \@dbltoproom :=G Maximum height of double-column floats allowed at % top of two-column page. % \@fpmin :=L Minimum height of floats in a float column. % It should also perform the following local assignments where necessary % -- i.e., where the new value differs from the old one: % \@fptop :=L \@dblfptop % \@fpsep :=L \@dblfpsep % \@fpbot :=L \@dblfpbot % % OUTPUT ROUTINE VARIABLES % % \@colht : The total height of the current column. In single column % style, it equals \textheight. In two-column style, it is % \textheight minus the height of the double-column floats % on the current page. MUST BE INITIALIZED TO \textheight. % % \@colroom : The height available in the current column for text and % footnotes. It equals \@colht minus the height of all % floats committed to the top and bottom of the current % column. % % \footins : Footnote insertion number. % % \@maxdepth : Saved value of TeX's \maxdepth. Must be set % when any routine sets \maxdepth. % % CALLING THE OUTPUT ROUTINE % -------------------------- % % The output routine is called either by TeX's normal page-breaking % mechanism, or by a macro putting a penalty < or = -10000 in the output % list. In the latter case, the penalty indicates why the output % routine was called, using the following code. % % penalty reason % ------- ------ % -10000 \pagebreak % \newpage % -10001 \clearpage (called with \penalty -10000 \vbox{} \penalty -10001 % -10002 float insertion, called from horizontal mode % -10003 float insertion, called from vertical mode. % -10004 float insertion. % % Note: A float or marginpar puts the following sequence in the output % list: (i) a penalty of -10004, % (ii) a null \vbox % (iii) a penalty of -10002 or -10003. % This solves two special problems: % 1. If the float comes right after a \newpage or \clearpage, % then the first penalty is ignored, but the second one % invokes the output routine. % 2. If there is a split footnote on the page, the second 'page' % puts out the rest of the footnote. % % THE OUTPUT ROUTINE % ------------------ % % FUNCTIONS USED IN THE OUTPUT ROUTINE: % % \@outputpage : Produces an output page with the contents of box % \@outputbox as the text part. Also sets % \@colht :=G \textheight. The page style is determined % as follows. % IF @thispagestyle = true % THEN use \thispagestyle style % ELSE use ordinary page style. % % \@tryfcolumn\FLIST : Tries to form a float column composed of floats from % \FLIST with with the following parameters: % \@colht : height of box % \@fpmin : minimum height of floats in the box % \@fpsep : interfloat space % \@fptop : glue at top of box % \@fpbot : glue at bottom of box. % If it succeeds, then it does the following: % * \@outputbox :=L the composed float box. % * @fcolmade :=L true % * \FLIST :=G \FLIST - floats put in box % * \@freelist :=G \@freelist + floats put in box % If it fails, then: % * @fcolmade :=L false % NOTE: BIT MUST BE A SINGLE TOKEN! % % \@makefcolumn \FLIST : Same as \@tryfcolumn except that it % fails to make a float column only if \FLIST is empty. % Otherwise, it makes a float column containing at least % the first box in \FLIST, disregarding \@fpmin. % % \@startcolumn : % Calls \@tryfcolumn\@deferlist{8}. If \@tryfcolumn returns with % @fcolmade = false, then: % * Globally sets \@toplist and \@botlist to floats % from \@deferlist to go at top and bottom of column, % deleting them from \@deferlist. It does % this using \@colht as the total height, the page % style parameters \@floatsep and \@textfloatsep, and % the float placement parameters \@topnum, \@toproom, % \@botnum, \@botroom, \@colnum and \textfraction. % * Globally sets \@colroom to \@colht minus the height % of the added floats. % % \@startdblcolumn : % Calls \@tryfcolumn\@dbldeferlist{8}. If \@tryfcolumn returns % with @fcolmade = false, then: % * Globally sets \@dbltoplist to floats from \@dbldeferlist % to go at top and bottom of column, deleting them from % \@dbldeferlist. It does this using \textheight as the % total height, and the parameters \@dblfloatsep, etc. % * Globally sets \@colht to \textheight minus the height % of the added floats. % % \@combinefloats : Combines the text from box % \@outputbox with the floats from \@toplist and \@botlist, % putting the new box in \@outputbox. It uses \floatsep and % \textfloatsep for the appropriate separations. It puts the % elements of \TOPLIST and \BOTLIST onto \@freelist, and makes % those lists null. % % \@makecol : Makes the contents of \box255 plus the accumulated % footnotes, plus the floats in \@toplist and \@botlist, % into a single column of height \@colht, which it puts % into box \@outputbox. It puts boxes in \@midlist back % onto \@freelist and restores \maxdepth. % % \@opcol : Outputs a column whose text is in box \@outputbox % If @twocolumn = false, then it calls \@outputpage, % sets \@colht :=G \textheight, and calls \@floatplacement. % % If @twocolumn = true, then: % If @firstcolumn = true, then it puts box \@outputbox % into \@leftcolumn and sets @firstcolumn :=G false. % % If @firstcolumn = false, then it puts out the current % two-column page, any possible two-column float pages, % and determines \@dbltoplist for the next page. % % \@opcol == % BEGIN % \@mparbottom :=G 0pt % if @twocolumn = true % then %% \@outputdblcol == % if @firstcolumn = true % then @firstcolumn :=G false % \@leftcolumn :=G \@outputbox % else @firstcolumn :=G true % \@outputbox := \vbox{ % \hbox to \textwidth{ % \hbox to\columnwidth{\box\@leftcolumn % \hss} % \hfil \vrule width \columnseprule \hfil % \hbox to\columnwidth{\box\@outputbox} % \hss} } % \@combinedblfloats % \@outputpage % \begingroup % \@dblfloatplacement % \@startdblcolumn % while @fcolmade = true % do \@outputpage % \@startdblcolumn od % \endgroup % fi % else % \@outputpage % \@colht :=G \textheight % fi % END % % \@makecol == % BEGIN % ifvoid \insert\footins % then \@outputbox := \box255 % else \@outputbox := \vbox {\unvbox255 % \vskip \skip\footins % \footnoterule % \unvbox\@footinsert % } % fi % \@freelist :=G \@freelist * \@midlist % \@midlist :=G empty % \@combinefloats % \@outputbox := \vbox to \@colht{\boxmaxdepth := \maxdepth % \@texttop % \unvbox\@outputbox % \@textbottom} % \maxdepth :=G \@maxdepth % END % % \@outputpage == % BEGIN % \begingroup %%% added 11 Jun 85 to keep special page % %%% declarations local to this output page % \catcode`\ := 10 %%make sure space is really a space % if @specialpage = T % then @specialpage :=G F % execute \@ps@[eval(\@specialstyle)] fi % if \@twoside = T % then if \count0 odd % \@thehead ==L \@oddhead % \@thefoot ==L \@oddfoot % \@themargin ==L \oddsidemargin % else \@oddhead ==L \@evenhead % \@oddfoot ==L \@evenfoot % \@themargin ==L \evensidemargin fi fi % \shipout\vbox % {\normalsize % set fonts size for head and foot % \baselineskip :=L \lineskip :=L 0pt % \vskip \topmargin % \moveright\@themargin\vbox % { \box\@tempboxa := \vbox to \headheight{\vfil % \hbox to \textwidth % {\@thehead}} % \dp\@tempboxa := 0pt % Don't skip space for descenders in % \box\@tempboxa % running head. % \vskip \headsep % \box\@outputbox % \baselineskip\footskip % \hbox to \textwidth{\@thefoot} % } % } % \@colht :=G \textheight % \endgroup %% added 11 Jun 85 % \stepcounter{page} % \firstmark ==L \botmark %% So marks work properly on float % %% pages. (14 Jun 85) % END % % \@startcolumn == % BEGIN % \@colroom :=G \@colht % if \@deferlist is empty % then @fcolmade := false % else \@tryfcolumn\@deferlist %% else clause == \@xstartcol % if @fcolmade = false % then \begingroup % \@tempb :=L \@deferlist % \@deferlist :=G empty % \@elt \BOX == BEGIN \@currbox == \BOX % use \gdef % \@addtonextcol % END == \@scolelt % \@tempb % \endgroup % fi fi % END % % \@startdblcolumn == % BEGIN % \@colht :=G \textheight % \@tryfcolumn\@dbldeferlist %% else clause == \@xstartcol % if @fcolmade = false % then \begingroup % \@tempb :=L \@dbldeferlist % \@dbldeferlist :=G empty % \@elt \BOX == BEGIN \@currbox == \BOX % use \gdef % \@addtodblcol % END == \@sdblcolelt % \@tempb % \endgroup % fi fi % END % % \output == % BEGIN % case of \outputpenalty % > -10001 -> \@makecol % \@opcol % \@floatplacement % \@startcolumn % while @fcolmade = true % do \@opcol % \@startcolumn % od % % %%% \@specialoutput == % % -10001 -> %% \@doclearpage == % if there are no footnote insertions % then unbox the \writes at the head of \box255 % and throw away the rest % \@deferlist :=G \@toplist * \@botlist % * \@deferlist % \@toplist :=G \@botlist :=G empty % \@colroom :=G \@colht % if \@currlist not empty % then LaTeX error: float(s) lost % \@currlist :=G empty % fi % \@makefcolumn\@deferlist % while @fcolmade = true % do \@opcol % \@makefcolumn\@deferlist % od % if @twocolumn % then % if @firstcolumn = true % then \@dbldeferlist :=G \@dbltoplist * % \@dbldeferlist % \@dbltoplist :=G empty % \@colht :=G \textheight % \begingroup % \@dblfloatplacement % \@makefcolumn\@dbldeferlist % while @fcolmade = true % do \@outputpage % \@makefcolumn\@dbldeferlist % od % \endgroup % else \vbox{} \clearpage % fi fi % else \box255 := \vbox{\box255\vfil} % \@makecol % \@opcol % \clearpage % fi % < -10001 -> % if \outputpenalty < -10003 % then if \outputpenalty <-20000 %% true only at end % then \deadcycles := 0 % fi % box \@holdpg :=G box255 % else throw away box 255 % \@pagedp :=L natural depth of box \@holdpg % \@pageht :=L natural ht of box \@holdpg % \unvbox box \@holdpg %% put text back % if there are footnote insertions % then advance \@pageht and \@pagedp and % reinsert footnotes fi % if \@currlist nonempty % then \@currbox :=L head of \@currlist % \@currlist :=G tail of \@currlist % if \count\@currbox > 0 % then \@addtocurcol %% this is a float % else \@addmarginpar %% this is a marginal note % fi % else THIS SHOULDN'T HAPPEN % fi % if \outputpenalty < 0 %% TO PERMIT PAGE BREAK % then \penalty 0 fi %% IF \@addtocurcol DIDN'T % %% INSERT A PENALTY % fi % end case % \vsize :=G if \outputpenalty > -10004 then \@colroom %%normal case % else \maxdimen %%processing float % fi % END % % \@combinefloats == % BEGIN % if \@toplist nonempty % then %%\@cfla == % \@elt\BOX == BEGIN \@tempbox := \vbox{\unvbox\@tempbox % \box\BOX % \vskip \floatsep} % END == \@comflelt % \@tempbox := null % \@toplist % \@outputbox := \vbox{\unvbox\@tempbox % \vskip - \floatsep % \topfigrule % \vskip \textfloatsep % \unvbox\@outputbox } % \@elt == \relax % \@freelist :=G \@freelist * \@toplist % \@toplist :=G null % fi % if \@botlist nonempty % then %%\@cflb == % \@elt == \@comflelt % \@tempbox := null % \@botlist % \@outputbox := \vbox{ \unvbox\@outputbox % \vskip \textfloatsep % \botfigrule % \unvbox\@tempbox % \vskip - \floatsep } % \@elt == \relax % \@freelist :=G \@freelist * \@botlist % \@botlist :=G null % fi % END % % \@combinedblfloats == % BEGIN % if \@dbltoplist nonempty % then \@elt == \@comdblflelt % \@tempbox := null % \@dbltoplist % \@outputbox := \vbox to \textheight % {\boxmaxdepth :=L \maxdepth % \unvbox\@tempbox % \vskip - \dblfloatsep % \dblfigrule % \vskip \dbltextfloatsep % \box\@outputbox } % \@elt == \relax % \@freelist :=G \@freelist * \@dbltoplist % \@dbltoplist :=G null % fi % END % % % USER COMMANDS THAT CALL OR AFFECT THE OUTPUT ROUTINE % ---------------------------------------------------- % % \newpage == BEGIN \par\vfil\penalty -10000 END % % \clearpage == BEGIN \newpage % \write -1{} % Part of hack to make sure no % \vbox{} % \write's get lost. % \penalty -10001 % END % % \cleardoublepage == BEGIN \clearpage % if @twoside = true and c@page is even % then \hbox{} \newpage fi % END % % \twocolumn == % BEGIN % \clearpage % \columnwidth :=G .5(\textwidth - \columnsep) % \hsize :=G \columnwidth % @twoside :=G true % @firstcolumn :=G true % \@dblfloatplacement % END % % \onecolumn == % BEGIN % \clearpage % \columnwidth :=G \textwidth % \hsize :=G \columnwidth % @twoside :=G false % \@floatplacement % END % % % \topnewpage{BOX} : starts a new page and puts BOX in a parbox of width % \textwidth across the top. Useful for full-width titles for % double-column pages. % SURPRISE: The stretch from \@dbltextfloatsep will be inserted % between the BOX and the top of the two columns. % % \topnewpage{BOX} == % BEGIN % \clearpage % Take \@currbox from \@freelist % \box\@currbox :=G \parbox{BOX \par % \vskip - \@dbltextfloatsep} % \count\@currbox :=G 2 % \@dbltopnum :=G 1 % \@dbltoproom :=G maxdimension % \@addtodblcol % \vsize :=G \@colht % \@colroom :=G \@colht % END % FLOAT-HANDLING MECHANISMS % ------------------------- % % The float environment obtains an insertion number B from the % \@freelist (see below for a description of list manipulation), puts % the float into box B and sets \count B to a FLOAT SPECIFIER. For % a normal (not double-column) float, it then causes a page break % in one of the following two ways: % - In outer hmode: \vadjust{\penalty -10002} % - In vmode : \penalty -10003. % For a double-column float, it puts B onto the \@dbldeferlist. % The float specifier has two components: % * A PLACEMENT SPECIFICATION, describing where the float may % be placed. % * A TYPE, which is a power of two--e.g., figures might be % type 1 floats, tables type 2 floats, programs type 4 floats, etc. % The float specifier is encoded as follows, where bit 0 is the least % significant bit. % % Bit Meaning % --- ------- % 0 1 iff the float may go where it appears in the text. % 1 1 iff the float may go on the top of a page. % 2 1 iff the float may go on the bottom of a page. % 3 1 iff the float may go on a float page. % 4 always 1 % 5 1 iff a type 1 float % 6 1 iff a type 2 float % etc. % % A negative float specifier is used to indicate a marginal note. % % MACROS AND DATA STRUCTURES FOR PROCESSING FLOATS % ------------------------------------------------ % % A FLOAT LIST consisting of the floats in boxes \boxa ... \boxN has the form: % \@elt \boxa ... \@elt \boxN % where \boxI is defined by % \newinsert\boxI % Normally, \@elt is \let to \relax. A test can be performed on the entire % float list by locally \def'ing \@elt appropriately and executing % the list. This is a lot more efficient than looping through the list. % % The following macros are used for manipulating float lists. % % \@next \CS \LIST {NONEMPTY}{EMPTY} == %% NOTE: ASSUME \@elt = \relax % BEGIN assume that \LIST == \@elt \B1 ... \@elt \Bn % if n = 0 % then EMPTY % else \CS :=L \B1 % \LIST :=G \@elt \B2 ... \@elt \Bn % NONEMPTY % fi % END % % % \@bitor\NUM\LIST : Globally sets switch @test to the disjunction for all I % of bit log2 \NUM of the float specifiers of all the floats in % \LIST. I.e., @test is set to true iff there is at least one % float in \LIST having bit log2 \NUM of its float specifier % equal to 1. % % Note: log2 [(\count I)/32] is the bit number corresponding to the % type of float I. To see if there is any float in \LIST having % the same type as float I, you run \@bitor with \NUM = [(\count I)/32] * 32. % % \@bitor\NUM\LIST == % BEGIN % @test :=G false % { \@elt \CTR == if \count\CTR / \NUM is odd % then @test := true fi % \LIST % } % END % % % \@cons\LIST\NUM : Globally sets \LIST := \LIST * \@elt \NUM % % \@cons\LIST\NUM == % BEGIN { \@elt == \relax % \LIST :=G \LIST \@elt \NUM % } % % BOX LISTS FOR FLOAT-PLACEMENT ALGORITHMS % % \@freelist : List of empty boxes for placing new floats. % \@toplist : List of floats to go at top of current column. % \@midlist : List of floats in middle of current column. % \@botlist : List of floats to go at bottom of current column. % \@deferlist : List of floats to go after current column. % \@dbltoplist : List of double-col. floats to go at top of current page. % \@dbldeferlist : List of double-column floats to go on subsequent pages. % % FLOAT-PLACEMENT ALGORITHMS % % \@tryfcolumn \FLIST == % BEGIN % @fcolmade :=G false % \@trylist :=G \FLIST % \@failedlist :=G empty % \begingroup % \@elt == \@xtryfc % \@trylist % \endgroup % if @fcolmade = true % then \@vtryfc \FLIST % fi % END % % \@vtryfc == % BEGIN % \@outputbox :=G \vbox{} % \@elt\BOX == BEGIN % \@outputbox :=L \vbox{ \unvbox \@outputbox % \vskip \@fpsep % \box\BOX } % END == \@wtryfc % \@flsucceed % \@outputbox :=G \vbox to \@colht{ \vskip \@fptop % \vskip -\@fpsep % \unvbox \@outputbox % \vskip \@fpbot } % \@elt == \relax % \@freelist :=G \@freelist * \@flsucceed % \FLIST :=G \@failedlist * \@flfail % END % % \@xtryfc \BOX == % BEGIN % remove first element from \@trylist % \@currtype := (\count\BOX / 32) * 32 % \@bitor \@currtype \@failedlist % @test := true if type on list % \@testfp \BOX % @test := true if no p-option % if ht of \BOX > \@colht % then @test :=G true % fi % if @test = true % then add \BOX to \@failedlist % else \@ytryfc \BOX % fi % END % % \@ytryfc == % BEGIN % \begingroup % \@flsucceed :=G \@elt\BOX % \@flfail :=G empty % \@tempdima := \ht\BOX % \@elt == \@ztryfc % \@trylist % if \@tempdima > \@fpmin % then @fcolmade :=G true % else add \BOX to \@failedlist % fi % \endgroup % if @fcolmade = true then \@elt == \@gobble fi % END % % \@ztryfc \BOX == % BEGIN % \@tempcnta := (\count\BOX / 32) * 32 % \@bitor \@tempcnta {\@failedlist \@flfail} % @test := true if on a list % \@testfp \BOX % @test := true if not p-option % \@tempdimb := \@tempdima + ht of \BOX + \@fpsep % if \@tempdimb > \@colht % then @test :=G true % fi % if @test = true % then add \BOX to \@flfail % else add \BOX to \@flsucceed % \@tempdima := \@tempdimb % fi % END % % \@testfp \BOX == BEGIN if bit 3 of \count\BOX = 0 % then @test :=G true fi % END % % \@makefcolumn \FLIST == % BEGIN % \begingroup % \@fpmin =:L 0 % \@testfp == \@gobble % \@tryfcolumn \FLIST % \endgroup % END % % \@addtobot : Tries to put insert \@currbox on \@botlist. Called only when: % * \ht BOX + \@maxsep < \@colroom % * type of \@currbox not on \@deferlist % * \@colnum > 0 % * @insert = false % If it succeeds, then: % * sets @insert true % * decrements \@botroom by \ht BOX % * decrements \@botnum and \@colnum by 1 % * decrements \@colroom by \ht BOX + either \floatsep % or \textfloatsep, as appropriate. % * sets \maxdepth to 0pt % % \@addtotoporbot : Tries to put insert \@currbox on \@toplist or \@botlist. % Called only under same conditions as \@addtobot. % If it succeeds, then: % * sets @insert true % * decrements either \@toproom or \@botroom by \ht BOX % * decrements \@colnum and either \@topnum or % \@botnum by 1 % * decrements \@colroom by \ht BOX + either \floatsep % or \textfloatsep, as appropriate. % % \@addtocurcol : Tries to add \@currbox to current column, setting @insert % true if it succeeds, false otherwise. It will add % \@currbox to top only if bit 0 of \count \@currbox is 0, and % to the bottom only if bit 0 = 0 or an earlier float of % the same type is put on the bottom. % If the float is put in the text, then \penalty 0 is put % right after the float, before the following \vskip, and % \outputpenalty :=L 0. % % \@addtonextcol : Tries to add \@currbox to the next column, setting @insert % true if it succeeds, false otherwise. % % \@addtodblcol : Tries to add \@currbox to the next double-column page, % adding it to \@dbltoplist if it succeeds and \@dbldeferlist % if it fails. % % \@addtobot == % BEGIN % if bit 2 of \count \@currbox = 1 % then if \@botnum > 0 % then if \@botroom > \ht \@currbox % then \@botnum :=G \botnum - 1 % \@colnum :=G \@colnum - 1 % \@tempdima :=L - \ht\@currbox - % if \@botlist empty % then \textfloatsep % else \floatsep % fi % \@botroom :=G \@botroom + \@tempdima % \@colroom :=G \@colroom + \@tempdima % add \@currbox to \@botlist % \maxdepth :=G 0pt % @insert :=L true % fi fi fi % END % % \@addtotoporbot == % BEGIN % if bit 1 of \count \@currbox = 1 % then if \@topnum > 0 % then if \@toproom > \ht \@currbox % then if \@currtype not on \@midlist or \@botlist % then \@topnum :=G \topnum - 1 % \@colnum :=G \@colnum - 1 % \@tempdima :=L - \ht\@currbox - % if \@toplist empty % then \textfloatsep % else \floatsep % fi % \@toproom :=G \@toproom + \@tempdima % \@colroom :=G \@colroom + \@tempdima % add \@currbox to \@toplist % @insert :=L true % fi fi fi fi % if @insert = false then \@addtobot fi % END % % \@addtocurcol == % BEGIN % @insert :=L false % \@textmin := \textfraction\@colht %% added 27 Sep 85 % if \@colroom > \ht \@currbox + max(\@pageht+\@pagedp, \@textmin) % + \@maxsep % then if \@colnum > 0 % then \@currtype := type of \@currbox % if \@currtype not on \@deferlist % then if \@currtype on \@botlist % then \@addtobot % else if bit0 of \count \@currbox = 1 % then decrement \@colnum % put \@currbox on \@midlist % add \@currbox + space % + a \penalty 0 to text % \outputpenalty :=L 0 % @insert := true % else \@addtotoporbot % fi fi fi fi fi % if @insert = false % then add \@currbox to \@deferlist % fi % END % % \@addtonextcol == % BEGIN % @insert :=L false % \@textmin := \textfraction\@colht %% added 27 Sep 85 % if \@colroom > \ht \@currbox + \@textmin + \@maxsep % then if \@colnum > 0 % \@currtype := type of \@currbox % then if \@currtype not on \@deferlist % then \@addtotoporbot % fi fi fi % if @insert = false % then add \@currbox to \@deferlist % fi % END % % \@addtodblcol == % BEGIN % @insert :=L false % if bit 1 of \count \@currbox = 1 % then if \@dbltopnum > 0 % then if \@dbltoproom > \ht \@currbox % then if type of \@currbox not on \@dbldeferlist % then \@dbltopnum :=G \@dbltopnum - 1 % \@tempdima := -\ht\@currbox - % if \@dbltoplist empty % then \dbltextfloatsep % else \dblfloatsep % fi % \@dbltoproom :=G \@dbltoproom+\@tempdima % \@colht :=G \@colht+\@tempdima % add \@currbox to \@dbltoplist % @insert :=L true % fi fi fi fi % if @insert = false then add \@currbox to \@dbldeferlist % END % % \@addmarginpar == % BEGIN % if \@currlist nonempty % then remove \@marbox from \@currlist %% NOTE: \@currbox = left box % add \@marbox and \@currbox to \@freelist % else LaTeX error: ? %% shouldn't happen % fi % \@tempcnta := 1 %% 1 = right, -1 = left % if @twocolumn = true % then if @firstcolumn = true % then \@tempcnta := -1 % fi % else if @mparswitch = true % then if count0 odd % else \@tempcnta := -1 % fi % fi % if @reversemargin = true % then \@tempcnta := -\@tempcnta % fi % fi % if \@tempcnta < 0 then \box\@marbox :=G \box\@currbox fi % \@tempdima :=L maximum(\@mparbottom - \@pageht + ht of \@marbox, 0) % if \@tempdima > 0 then LaTeX warning: 'marginpar moved' fi % \@mparbottom :=G \@pageht + \@tempdima + depth of \@marbox % + \marginparpush % \@tempdima :=L \@tempdima - ht of \@marbox % height of \@marbox :=G depth of \@marbox :=G 0 % \vskip -\@pagedp % \vskip \@tempdima % \nointerlineskip % \hbox{ if @tempcnta > 0 then \hskip \columnwidth % \hskip \marginparsep % else \hskip -\marginparsep % \hskip -\marginparwidth % fi % \box\@marbox % \hss % } % \vskip -\@tempdima % \nointerlineskip % \hbox{\vrule height 0 width 0 depth \@pagedp} % END \maxdeadcycles = 100 % floats and \marginpar's add a lot of dead cycles \let\@elt\relax \def\@next#1#2#3#4{\ifx#2\@empty #4\else \expandafter\@xnext #2\@@#1#2#3\fi} \def\@xnext \@elt #1#2\@@#3#4{\def#3{#1}\gdef#4{#2}} \newif\if@test \def\@bitor#1#2{\global\@testfalse {\let\@elt\@xbitor \@tempcnta #1\relax #2}} \def\@xbitor #1{\@tempcntb \count#1\divide\@tempcntb\@tempcnta \ifodd\@tempcntb \global\@testtrue\fi} % DEFINITION OF FLOAT BOXES: \newinsert\bx@A \newinsert\bx@B \newinsert\bx@C \newinsert\bx@D \newinsert\bx@E \newinsert\bx@F \newinsert\bx@G \newinsert\bx@H \newinsert\bx@I \newinsert\bx@J \newinsert\bx@K \newinsert\bx@L \newinsert\bx@M \newinsert\bx@N \newinsert\bx@O \newinsert\bx@P \newinsert\bx@Q \newinsert\bx@R \gdef\@freelist{\@elt\bx@A\@elt\bx@B\@elt\bx@C\@elt\bx@D\@elt\bx@E \@elt\bx@F\@elt\bx@G\@elt\bx@H\@elt\bx@I\@elt\bx@J \@elt\bx@K\@elt\bx@L\@elt\bx@M\@elt\bx@N \@elt\bx@O\@elt\bx@P\@elt\bx@Q\@elt\bx@R} \gdef\@toplist{} \gdef\@botlist{} \gdef\@midlist{} \gdef\@currlist{} \gdef\@deferlist{} \gdef\@dbltoplist{} \gdef\@dbldeferlist{} % PAGE LAYOUT PARAMETERS \newdimen\topmargin \newdimen\oddsidemargin \newdimen\evensidemargin \let\@themargin=\oddsidemargin \newdimen\headheight \newdimen\headsep \newdimen\footheight \newdimen\footskip \newdimen\textheight \newdimen\textwidth \newdimen\columnwidth \newdimen\columnsep \newdimen\columnseprule \newdimen\@maxdepth \@maxdepth = \maxdepth \newdimen\marginparwidth \newdimen\marginparsep \newdimen\marginparpush % PAGE STYLE PARAMETERS \newskip\floatsep \newskip\textfloatsep \newskip\intextsep \newdimen\@maxsep \newskip\dblfloatsep \newskip\dbltextfloatsep \newdimen\@dblmaxsep \newskip\@fptop \newskip\@fpsep \newskip\@fpbot \newskip\@dblfptop \newskip\@dblfpsep \newskip\@dblfpbot \let\topfigrule=\relax \let\botfigrule=\relax \let\dblfigrule=\relax % INTERNAL REGISTERS \newcount\@topnum \newdimen\@toproom \newcount\@dbltopnum \newdimen\@dbltoproom \newcount\@botnum \newdimen\@botroom \newcount\@colnum \newdimen\@textmin \newdimen\@fpmin \newdimen\@colht \newdimen\@colroom \newdimen\@pageht \newdimen\@pagedp \newdimen\@mparbottom \@mparbottom\z@ \newcount\@currtype \newbox\@outputbox \newbox\@leftcolumn \newbox\@holdpg \newif\if@insert \newif\if@fcolmade \newif\if@specialpage \@specialpagefalse \newif\if@twoside \@twosidefalse \newif\if@firstcolumn \@firstcolumntrue \newif\if@twocolumn \@twocolumnfalse \newif\if@reversemargin \@reversemarginfalse \newif\if@mparswitch \@mparswitchfalse \def\@thehead{\@oddhead} % initialization \def\@thefoot{\@oddfoot} \def\newpage{\par\vfil\penalty -\@M} \def\clearpage{\newpage \write\m@ne{}\vbox{}\penalty -\@Mi} \def\cleardoublepage{\clearpage\if@twoside \ifodd\c@page\else \hbox{}\newpage\if@twocolumn\hbox{}\newpage\fi\fi\fi} \def\twocolumn{\clearpage \global\columnwidth\textwidth \global\advance\columnwidth -\columnsep \global\divide\columnwidth\tw@ \global\hsize\columnwidth \global\linewidth\columnwidth \global\@twocolumntrue \global\@firstcolumntrue \@dblfloatplacement\@ifnextchar[{\@topnewpage}{}} \def\onecolumn{\clearpage\global\columnwidth\textwidth \global\hsize\columnwidth \global\linewidth\columnwidth \global\@twocolumnfalse \@floatplacement} \long\def\@topnewpage[#1]{\@next\@currbox\@freelist{}{} \global\setbox\@currbox\vbox{\hsize\textwidth \@parboxrestore #1\par\vskip -\dbltextfloatsep}\global\count\@currbox\tw@ \global\@dbltopnum\@ne \global\@dbltoproom\maxdimen\@addtodblcol \global\vsize\@colht \global\@colroom\@colht} \output{\ifnum\outputpenalty <-\@M\@specialoutput\else \@makecol\@opcol\@floatplacement\@startcolumn \@whilesw\if@fcolmade \fi{\@opcol\@startcolumn}\fi \global\vsize\ifnum\outputpenalty >-\@Miv \@colroom \else \maxdimen\fi} \def\@specialoutput{\ifnum\outputpenalty > -\@Mii \@doclearpage \else \ifnum \outputpenalty <-\@Miii \ifnum\outputpenalty<-\@MM \deadcycles\z@\fi \global\setbox\@holdpg\vbox{\unvbox\@cclv} \else \setbox\@tempboxa\box\@cclv \@pagedp\dp\@holdpg \@pageht\ht\@holdpg \unvbox\@holdpg \ifvoid\footins\else\advance\@pageht\ht\footins \advance\@pageht\skip\footins \advance\@pagedp\dp\footins \insert\footins{\unvbox\footins}\fi \@next\@currbox\@currlist{\ifnum\count\@currbox >\z@ \@addtocurcol\else\@addmarginpar\fi}\@latexbug \ifnum \outputpenalty <\z@ \penalty \z@ \fi \fi\fi} \def\@doclearpage{\ifvoid\footins \setbox\@tempboxa\vsplit\@cclv to\z@ \unvbox\@tempboxa \setbox\@tempboxa\box\@cclv \xdef\@deferlist{\@toplist\@botlist \@deferlist}\gdef\@toplist{}\gdef\@botlist{}\global\@colroom\@colht \ifx\@currlist \@empty\else\@latexerr{Float(s) lost}\@ehb\gdef\@currlist{}\fi \@makefcolumn\@deferlist \@whilesw\if@fcolmade \fi{\@opcol \@makefcolumn\@deferlist}\if@twocolumn \if@firstcolumn \xdef\@dbldeferlist{\@dbltoplist \@dbldeferlist}\gdef\@dbltoplist{}\global\@colht\textheight \begingroup \@dblfloatplacement \@makefcolumn\@dbldeferlist \@whilesw\if@fcolmade \fi{\@outputpage \@makefcolumn\@dbldeferlist}\endgroup \else \vbox{}\clearpage \fi\fi \else\setbox\@cclv\vbox{\box\@cclv\vfil}\@makecol\@opcol \clearpage \fi} \def\@opcol{\global\@mparbottom\z@\if@twocolumn\@outputdblcol\else \@outputpage \global\@colht\textheight \fi} \def\@outputdblcol{\if@firstcolumn \global\@firstcolumnfalse \global\setbox\@leftcolumn\box\@outputbox \else \global\@firstcolumntrue \setbox\@outputbox\vbox{\hbox to\textwidth{\hbox to\columnwidth {\box\@leftcolumn \hss}\hfil \vrule width\columnseprule\hfil \hbox to\columnwidth{\box\@outputbox \hss}}}\@combinedblfloats \@outputpage \begingroup \@dblfloatplacement \@startdblcolumn \@whilesw\if@fcolmade \fi{\@outputpage\@startdblcolumn}\endgroup \fi} \def\@makecol{\ifvoid\footins \setbox\@outputbox\box\@cclv \else\setbox\@outputbox \vbox{\unvbox\@cclv\vskip\skip\footins\footnoterule\unvbox\footins}\fi \xdef\@freelist{\@freelist\@midlist}\gdef\@midlist{}\@combinefloats \setbox\@outputbox\vbox to\@colht{\boxmaxdepth\maxdepth \@texttop\unvbox\@outputbox \@textbottom}\global\maxdepth\@maxdepth} \let\@texttop=\relax \let\@textbottom=\relax \def\@outputpage{\begingroup\catcode`\ =10 \if@specialpage \global\@specialpagefalse\@nameuse{ps@\@specialstyle}\fi \if@twoside \ifodd\count\z@ \let\@thehead\@oddhead \let\@thefoot\@oddfoot \let\@themargin\oddsidemargin \else \let\@thehead\@evenhead \let\@thefoot\@evenfoot \let\@themargin\evensidemargin \fi\fi \shipout \vbox{\normalsize \baselineskip\z@ \lineskip\z@ \vskip \topmargin \moveright\@themargin \vbox{\setbox\@tempboxa \vbox to\headheight{\vfil \hbox to\textwidth{\@thehead}} \dp\@tempboxa\z@ \box\@tempboxa \vskip \headsep \box\@outputbox \baselineskip\footskip \hbox to\textwidth{\@thefoot}}}\global\@colht\textheight \endgroup\stepcounter{page}\let\firstmark\botmark} \def\@combinefloats{\ifx\@toplist\@empty\else\@cfla\fi \ifx\@botlist\@empty\else\@cflb\fi} \def\@cfla{\let\@elt\@comflelt \setbox\@tempboxa\vbox{}\@toplist \setbox\@outputbox\vbox{\unvbox\@tempboxa\vskip-\floatsep \topfigrule\vskip\textfloatsep \unvbox\@outputbox}\let\@elt\relax \xdef\@freelist{\@freelist\@toplist}\gdef\@toplist{}} \def\@cflb{\let\@elt\@comflelt \setbox\@tempboxa\vbox{}\@botlist \setbox\@outputbox\vbox{\unvbox\@outputbox \vskip\textfloatsep \botfigrule\unvbox\@tempboxa \vskip-\floatsep}\let\@elt\relax \xdef\@freelist{\@freelist\@botlist}\gdef\@botlist{}} \def\@comflelt#1{\setbox\@tempboxa \vbox{\unvbox\@tempboxa\box #1\vskip\floatsep}} \def\@combinedblfloats{\ifx\@dbltoplist\@empty\else \let\@elt\@comdblflelt \setbox\@tempboxa\vbox{}\@dbltoplist \setbox\@outputbox\vbox to\textheight {\boxmaxdepth\maxdepth \unvbox\@tempboxa\vskip-\dblfloatsep \dblfigrule\vskip\dbltextfloatsep \box\@outputbox}\let\@elt\relax \xdef\@freelist{\@freelist\@dbltoplist}\gdef\@dbltoplist{}\fi} \def\@comdblflelt#1{\setbox\@tempboxa \vbox{\unvbox\@tempboxa\box #1\vskip\dblfloatsep}} \def\@startcolumn{\global\@colroom\@colht \ifx\@deferlist\@empty\global\@fcolmadefalse\else\@xstartcol\fi} \def\@xstartcol{\@tryfcolumn\@deferlist \if@fcolmade\else \begingroup\edef\@tempb{\@deferlist}\gdef\@deferlist{}\let\@elt\@scolelt \@tempb\endgroup\fi} \def\@scolelt#1{\def\@currbox{#1}\@addtonextcol} \def\@startdblcolumn{\global\@colht\textheight \@tryfcolumn\@dbldeferlist \if@fcolmade\else \begingroup \edef\@tempb{\@dbldeferlist}\gdef\@dbldeferlist{}\let\@elt\@sdblcolelt \@tempb\endgroup\fi} \def\@sdblcolelt#1{\def\@currbox{#1}\@addtodblcol} \def\@tryfcolumn #1{\global\@fcolmadefalse \xdef\@trylist{#1}\xdef\@failedlist {}\begingroup \let\@elt\@xtryfc \@trylist \endgroup \if@fcolmade \@vtryfc #1\fi} \def\@vtryfc #1{\global\setbox\@outputbox\vbox{}\let\@elt\@wtryfc \@flsucceed \global\setbox\@outputbox\vbox to\@colht{\vskip \@fptop \vskip -\@fpsep \unvbox \@outputbox \vskip \@fpbot}\let\@elt\relax \xdef #1{\@failedlist\@flfail}\xdef\@freelist{\@freelist\@flsucceed}} \def\@wtryfc #1{\global\setbox\@outputbox\vbox{\unvbox\@outputbox \vskip\@fpsep\box #1}} \def\@xtryfc #1{\@next\@tempa\@trylist{}{}\@currtype \count #1\divide\@currtype\@xxxii \multiply\@currtype\@xxxii \@bitor \@currtype \@failedlist \@testfp #1\ifdim \ht #1>\@colht \global\@testtrue\fi \if@test \@cons\@failedlist #1\else \@ytryfc #1\fi} \def\@ytryfc #1{\begingroup \gdef\@flsucceed{\@elt #1}\gdef\@flfail {}\@tempdima\ht #1\let\@elt\@ztryfc \@trylist \ifdim \@tempdima >\@fpmin \global\@fcolmadetrue \else \@cons\@failedlist #1\fi \endgroup \if@fcolmade \let\@elt\@gobble \fi} \def\@ztryfc #1{\@tempcnta\count #1\divide\@tempcnta\@xxxii \multiply\@tempcnta\@xxxii \@bitor \@tempcnta {\@failedlist \@flfail}\@testfp #1\@tempdimb\@tempdima \advance\@tempdimb\ht #1\advance \@tempdimb\@fpsep \ifdim \@tempdimb >\@colht \global\@testtrue\fi \if@test \@cons\@flfail #1\else \@cons\@flsucceed #1\@tempdima\@tempdimb \fi} \def\@testfp #1{\@tempcnta\count #1\divide\@tempcnta 8\relax \ifodd\@tempcnta \else \global\@testtrue\fi} \def\@makefcolumn #1{\begingroup \@fpmin\z@ \let\@testfp\@gobble \@tryfcolumn #1\endgroup} \def\@addtobot{\@tempcnta\count\@currbox\divide\@tempcnta4 \ifodd\@tempcnta \ifnum \@botnum >\z@ \ifdim \@botroom >\ht\@currbox \global\advance\@botnum\m@ne \global\advance\@colnum\m@ne \@tempdima -\ht\@currbox \advance\@tempdima -\ifx\@botlist\@empty \textfloatsep \else\floatsep\fi \global\advance\@botroom \@tempdima \global\advance\@colroom \@tempdima \@cons\@botlist\@currbox \global\maxdepth\z@ \@inserttrue\fi\fi\fi} \def\@addtotoporbot{\@tempcnta\count\@currbox \divide\@tempcnta\tw@ \ifodd\@tempcnta \ifnum \@topnum >\z@ \ifdim\@toproom >\ht\@currbox \@bitor\@currtype{\@midlist\@botlist}\if@test\else \global\advance\@topnum\m@ne \global\advance\@colnum\m@ne \@tempdima-\ht\@currbox \advance\@tempdima -\ifx\@toplist\@empty \textfloatsep \else\floatsep\fi \global\advance\@toproom \@tempdima \global\advance\@colroom \@tempdima \@cons\@toplist\@currbox \@inserttrue \fi\fi\fi\fi \if@insert\else\@addtobot \fi} \def\@addtonextcol{\@insertfalse \@textmin \textfraction\@colht \@tempdima\ht\@currbox \advance\@tempdima\@textmin\advance\@tempdima\@maxsep \ifdim\@colroom >\@tempdima \ifnum\@colnum >\z@ \@currtype\count\@currbox \divide\@currtype\@xxxii \multiply\@currtype\@xxxii \@bitor\@currtype\@deferlist \if@test\else \@addtotoporbot \fi\fi\fi \if@insert\else \@cons\@deferlist\@currbox\fi} \def\@addtodblcol{\@insertfalse \@tempcnta\count\@currbox \divide\@tempcnta\tw@ \ifodd\@tempcnta \ifnum\@dbltopnum >\z@ \ifdim\@dbltoproom >\ht\@currbox \@currtype\count\@currbox \divide\@currtype\@xxxii \multiply\@currtype\@xxxii \@bitor\@currtype\@dbldeferlist \if@test\else \global\advance\@dbltopnum\m@ne \@tempdima -\ht\@currbox \advance\@tempdima -\ifx\@dbltoplist\@empty \dbltextfloatsep\else\dblfloatsep\fi \global\advance\@dbltoproom \@tempdima \global\advance\@colht \@tempdima \@cons\@dbltoplist\@currbox \@inserttrue \fi\fi\fi\fi \if@insert\else \@cons\@dbldeferlist\@currbox \fi} \def\@addtocurcol{\@insertfalse \@textmin \textfraction\@colht \@tempdima\@pageht \advance\@tempdima\@pagedp \ifdim \@textmin > \@tempdima \@tempdima\@textmin \fi \advance\@tempdima\ht\@currbox \advance\@tempdima\@maxsep \ifdim\@colroom >\@tempdima \ifnum\@colnum >\z@ \@currtype\count\@currbox \divide\@currtype\@xxxii \multiply\@currtype\@xxxii \@bitor\@currtype\@deferlist \if@test\else \@bitor\@currtype\@botlist \if@test \@addtobot \else \ifodd\count\@currbox \global\advance\@colnum\m@ne \@cons\@midlist\@currbox \vskip\intextsep \box\@currbox \penalty\z@ \vskip\intextsep \ifnum\outputpenalty <-\@Mii \vskip -\parskip\fi \outputpenalty\z@ \@inserttrue \else \@addtotoporbot \fi\fi\fi\fi\fi \if@insert\else\@cons\@deferlist\@currbox\fi} \def\@addmarginpar{\@next\@marbox\@currlist{\@cons\@freelist\@marbox \@cons\@freelist\@currbox}\@latexbug\@tempcnta\@ne \if@twocolumn \if@firstcolumn \@tempcnta\m@ne \fi \else \if@mparswitch \ifodd\c@page \else\@tempcnta\m@ne \fi \fi \if@reversemargin \@tempcnta -\@tempcnta \fi \fi \ifnum\@tempcnta <\z@ \global\setbox\@marbox\box\@currbox \fi \@tempdima\@mparbottom \advance\@tempdima -\@pageht \advance\@tempdima\ht\@marbox \ifdim\@tempdima >\z@ \@warning{Marginpar on page \thepage\space moved}\else\@tempdima\z@ \fi \global\@mparbottom\@pageht \global\advance\@mparbottom\@tempdima \global\advance\@mparbottom\dp\@marbox \global\advance\@mparbottom\marginparpush \advance\@tempdima -\ht\@marbox \global\ht\@marbox\z@ \global\dp\@marbox\z@ \vskip -\@pagedp \vskip\@tempdima\nointerlineskip \hbox to\columnwidth {\ifnum \@tempcnta >\z@ \hskip\columnwidth \hskip\marginparsep \else \hskip -\marginparsep \hskip -\marginparwidth \fi \box\@marbox \hss} \vskip -\@tempdima \nointerlineskip \hbox{\vrule \@height\z@ \@width\z@ \@depth\@pagedp}} \message{debugging} % **************************************** % * DEBUGGING AND TEST INITIALIZATIONS * % **************************************** % % DEBUGGING \def\showoverfull{\tracingonline=1} \tracingstats1 % SHOWS HOW MUCH STUFF TeX HAS USED \def\showoutput{\tracingonline1\tracingoutput1 \showboxbreadth99999\showboxdepth99999\errorstopmode} \def\makeatletter{\catcode`\@=11\relax} \def\makeatother{\catcode`\@=12\relax} \newcount\@lowpenalty \newcount\@medpenalty \newcount\@highpenalty % LIST % ENUMERATION % ITEMIZE % ARRAY AND TABULAR % THE PICTURE ENVIRONMENT \unitlength = 1pt \fboxsep = 3pt \fboxrule = .4pt %% FOOTNOTES %\def\footnoterule{} % INITIALIZED BY PLAIN %\skip\footins{} % INITIALIZED BY PLAIN %\interfootnotelinepenalty % INITIALIZED BY PLAIN \@maxdepth = \maxdepth % \vsize initialized because a \clearpage with \vsize < \topskip % causes trouble. % \@colroom and \@colht also initialized because \vsize may be % set to them if a \clearpage is done before the \begin{document} \vsize = 1000pt \@colroom = \vsize \@colht = \vsize