% Copyright (c) 1985, 1986 Daniel C. Brotsky. All rights reserved. % Base macros for yTeX. See the file YTEX.MAC for details. % CONTENTS % ^L-page contents % ---------------------------------------------------------------------- % 1 %% Helpful TeX82 macros built on Plain-AlmostCM TeX % 2 %% handy hacks % 3 %% more handy hacks % 4 %% date and time % 5 %% combinators % 6 %% special chars % 7 %% spacing % 8 %% runners % 9 %% glosses % 10 %% inserts % 11 %% output % 12 %% page glue % 13 %% paragraphs % 14 %% textual displays % 15 %% tables % 16 %% titles % 17 %% special pages % 18 %% auxiliary files % 19 %% initialization \message{handy hacks,} % some more scratch registers \dimendef\dimen@ii=2 \skipdef\skip@i=1 \skipdef\skip@ii=2 \toksdef\toks@i=1 \toksdef\toks@ii=2 % quick names for character codes \chardef\@ctive=13 \chardef\@ther=12 \chardef\@scape=0 % define variations on \vbox and \hbox \let\vbottom=\vbox \let\vopen=\relax \let\hopen=\relax % turn interlineskip off and on \def\offinterlineskip {% \ifdim \lineskiplimit<\maxdimen \edef\oninterlineskip{\baselineskip=\the\baselineskip \lineskip=\the\lineskip \lineskiplimit=\the\lineskiplimit\relax}% \fi \baselineskip-1000\p@ \lineskip\z@ \lineskiplimit\maxdimen} \let\oninterlineskip=\relax \let\yesinterlineskip=\relax % write token lists to the terminal \def\toksmessage #{% \afterassignment\t@ksmessage \toks@=} \def\t@ksmessage {\message{\the\toks@}} % set/add to a token list or a macro \def\etoks #1{\let\et@ks=#1\afterassignment\eto@s\et@ks} \def\eto@s {\edef\next{\the\et@ks}\edef\next{\next}\et@ks=\expandafter{\next}} \def\addtotoks #1{% \let\addtot@ks=#1% \afterassignment\addt@toks \toks@} \def\addt@toks {% \edef\next{\the\addtot@ks\the\toks@}% \addtot@ks=\expandafter{\next}} \def\addtodef #1#2{% \toks@=\expandafter{#1#2}\edef#1{\the\toks@}} \def\pushtodef #1#2{% \toks@=\expandafter{#1}\toks@i={#2}\edef#1{\the\toks@i\the\toks@}} % strip the \ and letters from the front of a csname, leave result in \next {\catcode`\|=\@scape |catcode`\\=|@ther |gdef|stripn@me #1#2{% {|def|gobble \#1##1\{##1}% |global|edef|next{|expandafter|gobble|string#2\}}}} % get the arg of a paired delimiter pair (arg is \endXXX) % N.B. Use this only within a local group: it clobbers itself \def\get@rg #1{\def\get@rg ##1#1{\toks@={##1}#1}} % get confirmation \def\@yes{yes} \def\@no{no} \newif\ifyes \def\yesornop #1{% \immediate\write\sixt@@n{}% \loop \message{#1 (yes or no) }% {\catcode`\^^M=14\relax \global\read\m@ne to\next} \ifx\next\@yes \global\yestrue \else\ifx\next\@no \global\yesfalse \else\let\next\yesornop \fi\fi \ifx\next\yesornop \repeat} \def\askuser #1#2{% \immediate\write\sixt@@n{}% \message{#2}% {\catcode`\^^M=14\relax \global\read\m@ne to#1}} \def\askuserline #1#2{% \immediate\write\sixt@@n{}% \immediate\write\sixt@@n{#2}% {\catcode`\^^M=14\relax \global\read\m@ne to#1}} % \input manipulations \newwrite\tfil@ \def\maybeinput #1 {% \yesornop {Input file #1?}% \ifyes \input #1 \fi} \def\@input #1#2{% \openin\tfil@=#1 % \ifeof\tfil@ #2\else \closein\tfil@ \input #1 \fi} \def\@input@ #1#2{% \openin\tfil@=#1 % \ifeof\tfil@ \closein\tfil@\openin\tfil@=\ytexlibrary #1 % \ifeof\tfil@ #2\else \closein\tfil@ \input \ytexlibrary #1 \fi \else \closein\tfil@ \input #1 \fi} % set a skip parameter with explicit dimen, glue, and factor \def\setskip {\afterassignment\setski@\let\next=} \def\setski@ \dimen{\afterassignment\setsk@p\dimen@} \def\setsk@p \glue{\afterassignment\s@tskip\skip@} \def\s@tskip \factor{\dimen@i=\skip@\advance\skip@ by-\dimen@i \afterassignment\s@tsk@p\multiply\skip@ by} \def\s@tsk@p {\divide\skip@ by\@m\advance\skip@ by\dimen@ \next=\skip@} % skip the stretch amount of glue but not the dimen amount \def\vstretch {\afterassignment\vstr@tch\skip@=} \def\vstr@tch {\dimen@=\skip@ \advance\skip@ by-\dimen@ \vskip\skip@} % manipulate special chars \def\addspecial #1{\addtodef\dospecials{\do#1}} \def\specials@ther {% \relax\iffalse{\fi % gross hackery for tables \def\do##1{\catcode`##1=\@ther}\dospecials \iffalse}\fi\relax} % make active space and CR be the arg % get a token which is \ifx-equal to active space {\obeylines% \gdef\activelines #1{\catcode`\^^M=\@ctive \let^^M=#1\relax}% } % end of def group {\obeyspaces \gdef\activespaces#1{\obeyspaces\let =#1\relax\let\sp@ce= \relax}% } % end of def group \message{date and time,} \newcount\hour \newcount\minute \def\st@rttime {% \hour=\the\time \minute=\the\time \divide\hour by 60 \multiply\hour by 60% \advance\minute by -\hour \divide\hour by 60% \edef\daytime{\number\hour:\ifnum \minute<10 0\fi\number\minute}% \edef\monthname {\ifcase\month \or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December\fi}% \edef\monthshortname {\ifcase\month \or Jan\or Feb\or Mar\or Apr\or May\or Jun\or Jul\or Aug\or Sep\or Oct\or Nov\or Dec\fi}% {\def\gobble ##1##2##3##4{##3##4}% \global\edef\shortyear{\expandafter\gobble\number\year}}% \edef\date{\monthname~\number\day,~\number\year}% \edef\shortdate{\number\day~\monthshortname~\number\shortyear}% \edef\slashdate{\number\month/\number\day/\number\shortyear}} \message{combinators,} % spreads {\let\newdimen=\relax % allow next def \gdef\newspread #1\setup #2\endnew{% \stripn@me{}#1% \expandafter\newdimen\csname \next width\endcsname \toks@={\hbox to}\toks@i={\bgroup #2\spre@d}% \edef#1##{\the\toks@\expandafter\noexpand\csname \next width\endcsname \the\toks@i}} } % end of def group \def\spre@d #1{% \setbox\z@=\hbox{#1\Hss}% \futurelet\next\spr@ad} \def\spr@ad {% \ifcat \bgroup\noexpand\next \hbox to\z@{\hss\unhbox\z@\hss}\hfil \let\next=\spr@@d \else \hbox to\z@{\hss\unhbox\z@}% \let\next=\egroup \fi \next} \def\spr@@d #1{% \setbox\z@=\hbox{#1}% \futurelet\next\spr@ad} % text wrappers \long \def\newtextwrap #1\box #2\setup #3% \before #4\after #5% \begin #6\end #7\endnew{% \stripn@me{}#1% \toks@={#4\begingroup #3\relax #2}% \edef#1{% \the\toks@ \expandafter\noexpand\csname read@\next\endcsname}% \toks@={\bgroup #6}\toks@i={#7\egroup\endgroup #5}% \long \expandafter\edef\csname read@\next\endcsname ##1{% \the\toks@ ##1\the\toks@i}} \message{special chars,} % ` needs can be directed backquote \addspecial\` \let\agr@ve=\` \def\bqm@cro {\char"12\relax} \def\makebbqaccent {\let\`=\agr@ve} \def\makebbqquote {\let\`=\bqm@cro} {\catcode`\`=\@ctive\relax \gdef\makebqspecial {\catcode"60=\active\relax \let`=\bqm@cro} \gdef\makebqnormal {\catcode"60=\@ther \chardef`="60\relax} } % end of def group % & and # need to be `ordinary' characters for lisp \def\makeandother {\catcode`\&=\@ther} \def\makeandalign {\catcode`\&=4\relax} \def\makesharpother {\catcode`\#=\@ther} \def\makesharpparam {\catcode`\#=6\relax} % < and > can be angle brackets in text \addspecial\< \addspecial\> \let\@@lt=< \let\@@gt=> {\catcode`\<=\@ctive \catcode`\>=\@ctive \relax \gdef\makelgtbrackets{% \catcode`\<=\@ctive \catcode`\>=\@ctive\relax \def<{\ifmmode\@@lt\else$\m@th\langle$\fi}% \def>{\ifmmode\@@gt\else$\m@th\rangle$\fi}% \sl@shifylgt}} \def\sl@shifylgt {% \def\<{\ifmmode\@@lt\else$\m@th\@@lt$\fi}% \def\>{\ifmmode\@@gt\else$\m@th\@@gt$\fi}} \def\makelgtother {% \catcode`\<=\@ther\catcode`\>=\@ther \def\<{\relax \ifmmode \langle \else $\langle$\fi} \def\>{\relax \ifmmode \rangle \else $\rangle$\fi}} \message{spacing,} % vertical glue \def\vgluefil {\vglue \z@ plus1fil\relax} \def\vgluefill {\vglue \z@ plus1fill\relax} \def\Vss {\vskip \z@ plus1fill minus1fill\relax} \def\VSS {\vskip \z@ plus1filll minus1filll\relax} % horizontal glue \def\hfilll {\hskip \z@ plus1filll\relax} \def\hfilllneg {\hskip \z@ plus-1filll\relax} \def\Hss {\hskip \z@ plus1fill minus1fill\relax} \def\HSS {\hskip \z@ plus1filll minus1filll\relax} % glue amounts \newskip\fillskip \fillskip=\z@ plus1fill \newskip\filskip \filskip=\z@ plus1fil \newskip\zeroskip \zeroskip=\z@ \newskip\emskip \emskip=1em % page glue \def\filpage {\par\vfil\eject} \def\superfilpage {\par\vfil\supereject} % paragraph glue \def\linebreak {\ifhmode\nobreak\hskip\z@ plus1fil\break\fi} % require minimum vertical space \def\minskip {\afterassignment\m@nskip\skip@} \def\m@nskip {% \ifdim \lastskip<\skip@ \nobreak \vskip-\lastskip \vskip\skip@ \fi} \def\minbreak {\afterassignment\m@nbreak\count@} \def\m@nbreak {\afterassignment\m@nbre@k\skip@} \def\m@nbre@k {% \ifdim \lastskip<\skip@ \nobreak \vskip-\lastskip \penalty\count@ \vskip\skip@ \fi} \def\dobreak {\afterassignment\d@break\count@} \def\d@break {\afterassignment\d@bre@k\skip@} \def\d@bre@k {\penalty\count@ \vskip\skip@} \message{runners,} % control of runners \newif\ifheaders \newif\iffooters \let\res@theaders=\relax \let\res@tfooters=\relax \def\res@trunners {\res@theaders \res@tfooters} \def\noheaders {\global\headersfalse} \def\nofooters {\global\footersfalse} \def\norunners {\noheaders \nofooters} \def\yesheaders {\global\headerstrue} \def\yesfooters {\global\footerstrue} \def\yesrunners {\yesheaders \yesfooters} \def\offheaders {\noheaders \let\res@theaders=\noheaders} \def\offfooters {\nofooters \let\res@tfooters=\nofooters} \def\offrunners {\offheaders \offfooters} \def\onheaders {\yesheaders \let\res@theaders=\yesheaders} \def\onfooters {\yesfooters \let\res@tfooters=\yesfooters} \def\onrunners {\onheaders \onfooters} \res@trunners % preserve marks in a stable place \let\m@rk=\mark \let\firstm@rk=\firstmark \let\topm@rk=\topmark \let\botm@rk=\botmark % contents of headers and footers \newif\iftwosided \newtoks\rectoheader \newtoks\versoheader \newtoks\rectofooter \newtoks\versofooter \message{glosses,} % control of glosses \newif\iftopgloss \newif\ifbottomgloss \let\res@ttopgloss=\relax \let\res@tbottomgloss=\relax \def\res@tglosses {\res@ttopgloss \res@tbottomgloss} \def\notopgloss {\global\topglossfalse} \def\nobottomgloss {\global\bottomglossfalse} \def\noglosses {\notopgloss \nobottomgloss} \def\yestopgloss {\global\topglosstrue} \def\yesbottomgloss {\global\bottomglosstrue} \def\yesglosses {\yestopgloss \yesbottomgloss} \def\offtopgloss {\notopgloss \let\res@ttopgloss=\notopgloss} \def\offbottomgloss {\nobottomgloss \let\res@tbottomgloss=\nobottomgloss} \def\offglosses {\offtopgloss \offbottomgloss} \def\ontopgloss {\yestopgloss \let\res@ttopgloss=\yestopgloss} \def\onbottomgloss {\yesbottomgloss \let\res@tbottomgloss=\yesbottomgloss} \def\onglosses {\ontopgloss \onbottomgloss} \res@tglosses % contents of glosses \newtoks\topgloss \newtoks\bottomgloss \message{inserts,} % storage for the inserts \newinsert\topfloat \countdef\topmag=\topfloat \topmag=1000 \dimendef\topmax=\topfloat \topmax=\maxdimen \newtoks\topsep \topsep={} \newinsert\botfloat \countdef\botmag=\botfloat \botmag=1000 \dimendef\botmax=\botfloat \botmax=\maxdimen \newtoks\botsep \botsep={} % inserts which always float \long \def\newfloat #1\type #2\floatsetup #3\setup #4% \floatabove #5\floatbelow #6% \begin #7\end #8\endnew {% \stripn@me{}#1% \toks@={\insert#2\bgroup #3\relax #5\relax #4\relax #7}% \expandafter\edef\csname begin\next\endcsname {% \the\toks@}% \toks@={#8\relax #6\egroup}% \expandafter\edef\csname end\next\endcsname {% \the\toks@}% \long \edef#1##1{\expandafter\noexpand\csname begin\next\endcsname ##1\expandafter\noexpand\csname end\next\endcsname}} \long \def\newpagefloat #1\type #2\floatsetup #3\setup #4% \above #5\below #6% \begin #7\end #8\endnew {% \stripn@me{}#1% \toks@={#4\setbox\z@=\vbox\bgroup #7}% \expandafter\edef\csname begin\next\endcsname {% \begingroup \the\toks@}% \toks@={#8\egroup \insert#2{#3\relax \dimen@=\dp\z@ \vbox to\vsize{#5\unvbox\z@#6\kern-\dimen@}}}% \expandafter\edef\csname end\next\endcsname {% \the\toks@ \endgroup}% \long \edef#1##1{\expandafter\noexpand\csname begin\next\endcsname ##1\expandafter\noexpand\csname end\next\endcsname}} % inserts which sometimes float \long \def\newfitfloat #1\type {% \stripn@me{}#1% \edef#1##1{\expandafter\noexpand\csname begin\next\endcsname ##1\expandafter\noexpand\csname end\next\endcsname}% \newfitfl@at} \def\newfitfl@at #1\floatsetup #2\setup #3% \floatabove #4\floatbelow #5% \above #6\below #7% \begin #8\end #9\endnew {% \toks@={\setbox\z@=\vbox\bgroup #3\relax #8}% \expandafter\edef\csname begin\next\endcsname {% \the\toks@}% \toks@={#9\egroup \dimen@=\ht\z@ \advance\dimen@\dp\z@ \advance\dimen@\baselineskip \advance\dimen@\pagetotal \ifdim \dimen@>\pagegoal \insert#1{#2\relax #4\unvbox\z@#5}% \else #6\unvbox\z@#7\relax \fi}% \expandafter\edef\csname end\next\endcsname {% \the\toks@}} \message{output,} % output routine parameters \newif\iftrimpages \newdimen\topglossdrop \newdimen\bottomglossdrop \newdimen\footerdrop \newdimen\headerdrop % output routine \def\ytexoutput {% \iftrimpages \trimp@ge\fi \shipout\vbox to9truein{% center box on 8.5x11 page (DVI starts at 1,1) \vss \hbox to6.5truein{% \hss \vbox{% \offinterlineskip \iftopgloss \vbox to\z@{\vss\line{\the\topgloss}\vskip\topglossdrop}\fi \ifheaders\makeheadline\fi \pagebody \iffooters\makefootline\fi \ifbottomgloss \vbox to\z@{\vskip\bottomglossdrop\line{\the\bottomgloss}\vss}\fi }% end of contents \vbox \hss}% end of centering \hbox \vss}% end of centering \vbox \advancepageno \res@trunners \res@tglosses \ifnum\outputpenalty>-\@MM \else\dosupereject\fi} \def\makeheadline {% \vbox to\z@{% \vss \iftwosided \ifodd\pageno \line{\the\rectoheader}% \else \line{\the\versoheader}\fi \else \line{\the\rectoheader}\fi \vskip \headerdrop}} \def\makefootline {% \vbox to\z@{% \vskip \footerdrop \nointerlineskip \iftwosided \ifodd\pageno \line{\the\rectofooter}% \else \line{\the\versofooter}\fi \else \line{\the\rectofooter}\fi \vss}} \def\pagebody {% \vbox to\vsize{\boxmaxdepth\maxdimen \pagecontents}} \def\pagecontents {% \dimen@i=\ht\@cclv \advance\dimen@i\dp\@cclv \ifvoid\topfloat\else \dimen@=\ht\topfloat \advance\dimen@\dp\topfloat \unvbox\topfloat \ifdim \dimen@>\z@ \ifdim\dimen@i>\z@ \the\topsep\fi\fi \fi \dimen@ii=\dp\@cclv \unvbox\@cclv \ifvoid\botfloat\else \dimen@=\ht\botfloat \advance\dimen@\dp\botfloat \ifdim \dimen@>\z@ \ifdim\dimen@i>\z@ \the\botsep\fi\fi \unvbox\botfloat \fi \ifr@ggedbottom \kern-\dimen@ii \vfil \fi} \message{page glue,} \newif\ifts@ {\catcode`\0=12\relax \catcode`\.=12\relax \catcode`\p=12\relax \catcode`\t=12\relax \gdef\nullgl@e{0.0pt} } %end of catcode group \def\ifnullskip {% \edef\next{\the\lastskip}% \ifx\next\nullgl@e} \def\trimp@ge {% \setbox0=\vbox{\unvbox\@cclv \loop \ts@false \ifnum\lastpenalty=\z@ \else\unpenalty \ts@true \fi \ifnullskip \else\unskip \ts@true \fi \ifts@ \repeat} \setbox\@cclv=\box0} % hack to make \break, \allowbreak, and friends work \def\break {\penalty\z@\penalty-\@M} \def\allowbreak {\penalty-\@ne} \def\supereject {\par\penalty\z@\penalty-\@MM} \message{paragraphs,} % force no indent on next par \def\rem@veindent {\everypar={\setbox0=\lastbox\everypar={}}} % neutral paragraphing groups \def\beginpgroup {\begingroup \everypar={}} \def\endpgroup {\endgraf \endgroup} \def\bpgroup {\bgroup \everypar={}} \def\epgroup {\endgraf \egroup} \long \def\newpar #1\argtext #2\setup #3\vestindent #4\starter #5\endnew {% \def\next{#4}% \ifx\next\empty \def#1#2{#3\relax#5} \else \def#1#2{#3\relax \hangindent #4\hangafter \@ne #5}\fi} % turn indentation off and on \def\offindent {% \ifdim \parindent>\z@ \edef\onindent{\parindent=\the\parindent}\fi \parindent=\z@} \let\onindent=\relax \let\yesindent=\indent % create new element with associated skips and penalties {\let\newskip=\relax \let\newcount=\relax % allow next def \long \gdef\newelement #1\setup #2\above #3\below #4\begin #5\end #6\endnew{% \stripn@me{}#1% \expandafter\newskip\csname above\next skip\endcsname \expandafter\newskip\csname below\next skip\endcsname \expandafter\newcount\csname pre\next penalty\endcsname \expandafter\newcount\csname post\next penalty\endcsname \toks@={\endgraf #3\begingroup #2\relax #5}% \expandafter\edef \csname begin\next \endcsname {% \the\toks@}% \toks@={#6\endgroup #4}% \expandafter\edef \csname end\next \endcsname {% \the\toks@}% \long \edef#1##1{\expandafter\noexpand\csname begin\next\endcsname ##1\expandafter\noexpand\csname end\next\endcsname}} } % end of def group \message{textual displays,} % nofill \def\setupnofill {% \parskip=\z@ \def\par{\endgraf}% empty lines not preserved \obeylines \activespaces\ } % textual displays {\obeylines % defs using ^^M \long% \gdef\newtext #1\display #2\setup #3\begin #4\end #5\endnew{% \stripn@me{}#1% \toks@={$$#2\halign\bgroup ##\cr \noalign\bpgroup #3% \begingroup \obeylines}% \expandafter\edef\csname begin\next \endcsname {% \the\toks@ \expandafter\noexpand\csname re@d\next \endcsname}% \toks@={\endgroup #4}% \expandafter\edef\csname re@d\next \endcsname ##1^^M{% \the\toks@##1}% \toks@={#5\epgroup\egroup$$}% \expandafter\edef\csname end\next \endcsname {% \the\toks@}}% } % end of def group % verbatim material (mostly from TeXbook) \def\setupverbatim {% \specials@ther \setupnofill} \long \def\newverbatim #1\begincs #2\readcs #3\endcsname #4% \display #5\setup #6\begin #7\end #8\endnew{% \toks@={$$#5\halign\bgroup ##\hfil\cr \noalign\bpgroup \setupverbatim #6#3}% \edef#2{\the\toks@}% \makev@rbatim{#3}{#4}{#7}{#8}} {\obeylines \catcode`\|=\@scape \catcode`\\=\@ther % |long% |gdef|makev@rbatim#1#2#3#4{% |toks@={#3}|toks@i={#4|epgroup|egroup$$}% |edef#1##1^^M##2\#2{|the|toks@##1##2|the|toks@i}}} \message{tables,} % preamble specification analysis \newif\ifmoresp@c \def\esp@cl {\esp@cl} % null spec list marker \newtoks\sp@c \newtoks\sp@cl \newtoks\pre@mble \newtoks\pad@mble \newtoks\prep@rt \newtoks\padp@rt % table dimensions and tabskip glue \newtoks\tablespec \def\tablewidth {\afterassignment\t@blewidth\dimen@} \def\t@blewidth {% \ifdim\dimen@>\z@ \edef\next{to\the\dimen@}\else \ifdim\dimen@<\z@ \edef\next{expand\the\dimen@}\else \edef\next{}\fi\fi \tablespec=\expandafter{\next}} \newskip\pretabskip \newskip\intabskip \newskip\posttabskip \newtoks\tablestyle \newdimen\padheight % height of padding around lines \newdimen\hbarheight % height of horizontal lines \newdimen\dhbarheight % height of "double" horizontal lines \newdimen\vbarwidth % width of normal vertical bars \newdimen\dvbarwidth % width of "double" vertical bars \def\makepre@mblepart #1{% \padp@rt={\omit\vrule width\z@ height\padheight depth\z@ \relax#1}% \if l\noexpand\sp@@ \prep@rt={##\hfil\strut#1}\else \if L\noexpand\sp@@ \prep@rt={$\the\tablestyle ##$\hfil\strut#1}\else \if c\noexpand\sp@@ \prep@rt={\hfil##\hfil\strut#1}\else \if C\noexpand\sp@@ \prep@rt={\hfil$\the\tablestyle ##$\hfil\strut#1}\else \if r\noexpand\sp@@ \prep@rt={\hfil##\strut#1}\else \if R\noexpand\sp@@ \prep@rt={\hfil$\the\tablestyle ##$\strut#1}\else \if |\noexpand\sp@@ \prep@rt={\vrule width\vbarwidth###1}% \padp@rt={height\padheight#1}\else \if "\noexpand\sp@@ \prep@rt={\vrule width\dvbarwidth###1}% \padp@rt={height\padheight#1}\else \if &\noexpand\sp@@ \prep@rt={&}\padp@rt={&}\else \ifx \sp@@\tabskip \prep@rt=\expandafter{\the\sp@c}\padp@rt={}% \else \prep@rt=\expandafter{\the\sp@c#1}% \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} \def\makepre@mble {% \sp@cl=\expandafter{\the\sp@cl\esp@cl}% avoid {arg} at end of \sp@cl \pre@mble={\tabskip\intabskip}\pad@mble={}% \def\breaksp@c##1##2\@nd{\sp@c={##1}\sp@cl={##2}}% \def\firstsp@c{\futurelet\sp@@\f@rstspec}\def\f@rstspec##1\@nd{}% \loop \expandafter\breaksp@c\the\sp@cl\@nd \expandafter\firstsp@c\the\sp@c\@nd \edef\next{\the\sp@cl}% \ifx \next\esp@cl \moresp@cfalse \makepre@mblepart{}% \else \moresp@ctrue \makepre@mblepart&\fi \addtotoks\pre@mble\prep@rt \addtotoks\pad@mble\padp@rt \ifmoresp@c \repeat \pre@mble=\expandafter{\the\pre@mble\tabskip\posttabskip\cr}% \pad@mble=\expandafter{\the\pad@mble\cr}} \def\checkpre@mble {% \edef\next{\the\sp@cl}% \ifx\next\empty \errhelp={Just continue and I'll use left-justified columns.}% \errmessage{Empty table preamble.}% \sp@cl={&l}\fi} \long \def\newtable #1\leftdelim #2\rightdelim #3% \before #4\after #5% \begin #6\end #7\endnew{% create a table macro \stripn@me{}#1% \toks@={\begingroup}\toks@i={\checkpre@mble \setuph@lign #4\offinterlineskip \halign\the\tablespec \bgroup\span\the\pre@mble #6}% \expandafter\edef\csname begin\next \endcsname #2##1#3{% \the\toks@ \sp@cl={##1}\the\toks@i}% \toks@={#7\crcr\egroup#5\endgroup}% \expandafter\edef\csname end\next \endcsname {% \the\toks@}% \long \edef#1#2##1#3##2{% \expandafter\noexpand\csname begin\next\endcsname #2##1#3% ##2\expandafter\noexpand\csname end\next\endcsname}} \def\setuph@lign {% \makepre@mble \let\explicitcr=\relax \def\implicitcr{\let\par=\crcr\obeylines}% \let\\=\crcr \def\inline{\noalign{\hrule height\hbarheight}}% \def\dinline{\noalign{\hrule height\dhbarheight}}% \edef\topline{\noexpand\inline\the\pad@mble}% \edef\midline{\the\pad@mble\noexpand\inline\the\pad@mble}% \edef\botline{\the\pad@mble\noexpand\inline}% \edef\dtopline{\noexpand\dinline\the\pad@mble}% \edef\dmidline{\the\pad@mble\noexpand\dinline\the\pad@mble}% \edef\dbotline{\the\pad@mble\noexpand\dinline}% \def\padline {\noalign\bgroup\global\dimen@=\padheight \afterassignment\padlin@\global\padheight=}% \def\padlin@ {\global\edef\next{\the\pad@mble \noalign{\global\padheight=\the\dimen@}}\egroup \next}% \tabskip\pretabskip} \message{titles,} \def\ts@ttings {% \spaceskip=.3333em \xspaceskip=.5em \pretolerance=9999 \tolerance=9999 \hbadness=9999 \hyphenpenalty=10000 \exhyphenpenalty=10000 \def\linebreak{\ifhmode\break\fi}% \let\cr=\linebreak \let\crcr=\linebreak \def\\{\linebreak\ignorespaces}% \offindent} \def\titleleft #1#2{% \leftskip=\z@ \rightskip=\z@ plus.25\hsize \advance\leftskip by#1\advance\rightskip by#2% \parfillskip=\z@ plus1fil \ts@ttings} \def\titlecenter #1#2{% \leftskip=\z@ plus.125\hsize \rightskip=\leftskip \advance\leftskip by#1\advance\rightskip by#2% \parfillskip=\z@ \ts@ttings} \def\titleright #1#2{% \leftskip=\z@ plus.25\hsize \rightskip=\z@ \advance\leftskip by#1\advance\rightskip by#2% \parfillskip=\z@ \ts@ttings} \long \def\newtitle #1\box #2\shape #3% \font #4\setup #5\begin #6\end #7\endnew{% \stripn@me{}#1% \toks@={#2\bgroup #4\relax #3\relax #5\relax #6}% \expandafter\edef\csname begin\next\endcsname {% \the\toks@}% \toks@={#7\endgraf\egroup}% \expandafter\edef\csname end\next\endcsname {% \the\toks@}% \long \edef#1##1{\expandafter\noexpand\csname begin\next\endcsname ##1\expandafter\noexpand\csname end\next\endcsname}} \message{special pages,} % get to a recto page \def\rectoeject {\par \filpage \iftwosided \ifodd\pageno \else \ymessage{{Force recto}}\norunners\null\vfil\eject \fi\fi \norunners} \def\rectosupereject {\par \superfilpage \iftwosided \ifodd\pageno \else \ymessage{{Force recto}}\norunners\null\vfil\eject \fi\fi \norunners} % special pages \long \def\newpage #1\setup #2\glue #3\begin #4\end #5\endnew{% \stripn@me{}#1% \toks@={\rectoeject \beginpgroup #2\relax \hrule width\z@\relax #3 #4}% \expandafter\edef\csname begin\next \endcsname {% \the\toks@}% \toks@={#5\relax #3\endpgroup\eject}% \expandafter\edef\csname end\next \endcsname {% \the\toks@}% \long \edef#1##1{\expandafter\noexpand\csname begin\next\endcsname ##1\expandafter\noexpand\csname end\next\endcsname}} \long \def\newsuperpage #1\setup #2\glue #3\begin #4\end #5\endnew{% \stripn@me{}#1% \toks@={\rectosupereject \beginpgroup #2\relax \hrule width\z@\relax #3 #4}% \expandafter\edef\csname begin\next \endcsname {% \the\toks@}% \toks@={#5\relax #3\endpgroup\eject}% \expandafter\edef\csname end\next \endcsname {% \the\toks@}% \long \edef#1##1{\expandafter\noexpand\csname begin\next\endcsname ##1\expandafter\noexpand\csname end\next\endcsname}} \message {auxiliary files,} \newif\ifauxfiles \def\@uxfiles {} \def\add@uxfile #1{\addtodef\@uxfiles{\do@ux#1}} \def\map@uxfiles #1{\let\do@ux=#1\@uxfiles} \def\forgetauxfiles {\def\@uxfiles{}} \def\perjob {perjob} {\let\newwrite=\relax % allow next def \gdef\newaux #1\filename #2\extension #3\endnew{% \stripn@me{}#1% \edef#1{#3}% \expandafter\newwrite\csname \next @ut\endcsname \expandafter\let\csname write\next \endcsname=\bad@uxwrite \expandafter\edef\csname begin\next \endcsname{% \expandafter\noexpand\csname input\next \endcsname \expandafter\noexpand\csname open\next \endcsname}% \expandafter\edef\csname end\next \endcsname{% \expandafter\noexpand\csname close\next \endcsname}% \ifx #2\perjob \add@uxfile #1% \expandafter\def\csname input\next \endcsname{\input@ux#1\jobname}% \expandafter\def\csname open\next \endcsname{\open@ux#1\jobname}% \expandafter\def\csname close\next \endcsname{\close@ux#1}% \else \expandafter\def\csname input\next \endcsname{\input@ux#1{#2}}% \expandafter\def\csname open\next \endcsname{\open@ux#1{#2}}% \expandafter\def\csname close\next \endcsname{\close@ux#1}% \fi} } % end of def group \def\bad@uxwrite #1{% \ifauxfiles \errhelp={I will write to your log file instead.}% \errmessage{Writing on an unopened auxiliary file.}% \write\m@ne{#1}% \fi} \def\input@ux #1#2{% \ifauxfiles \@input{#2.#1}{\ywarning{{No file #2.#1}}}\fi} \def\open@ux #1#2{% \stripn@me{}#1% \ifauxfiles \immediate\expandafter\openout\csname \next @ut\endcsname=#2.#1 % \expandafter\edef\csname write\next \endcsname {% \write \expandafter\noexpand\csname \next @ut\endcsname}% \immediate\csname write\next \endcsname{\relax}% \else \expandafter\edef\csname write\next \endcsname {% \write\m@ne}% \fi} \def\close@ux #1{% \stripn@me{}#1% \ifauxfiles \immediate\expandafter\closeout\csname \next @ut\endcsname \fi \expandafter\let\csname write\next \endcsname=\bad@uxwrite} \def\input@uxfile #1{\input@ux#1\jobname} \def\input@uxfiles {\map@uxfiles\input@uxfile} \def\open@uxfile #1{\open@ux#1\jobname} \def\open@uxfiles {\map@uxfiles\open@uxfile} \def\close@uxfiles {\map@uxfiles\close@ux} \def\beginjob {\input@uxfiles \open@uxfiles} \def\endjob {\superfilpage \close@uxfiles \end} \message{initialization,} % page layout \trimpagesfalse \offheaders \offfooters \twosidedfalse \topglossfalse \bottomglossfalse \topglossdrop=2.5pc \bottomglossdrop=2.5pc \headerdrop=1.25pc \footerdrop=1.25pc % tables \tablewidth=0pt \intabskip=\emskip \pretabskip=\filskip \posttabskip=\filskip \padheight=2pt \tablestyle={\displaystyle} \hbarheight=.4pt \dhbarheight=1pt \vbarwidth=.4pt \dvbarwidth=1pt % auxiliary files \auxfilestrue % special chars \makebqnormal \makebbqaccent \makeandalign \makesharpparam \makelgtother