From b1c871653d37d9c6fd0f97b048dca051b5b1db27 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 12 Jan 2006 23:46:46 +0000 Subject: trunk/Master/texmf-dist/tex/plain git-svn-id: svn://tug.org/texlive/trunk@621 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/plain/newsletr/italic.tex | 38 + Master/texmf-dist/tex/plain/newsletr/lodriver.tex | 57 + Master/texmf-dist/tex/plain/newsletr/newsletr.tex | 1453 +++++++++++++++++++++ Master/texmf-dist/tex/plain/newsletr/quote.tex | 119 ++ 4 files changed, 1667 insertions(+) create mode 100644 Master/texmf-dist/tex/plain/newsletr/italic.tex create mode 100644 Master/texmf-dist/tex/plain/newsletr/lodriver.tex create mode 100644 Master/texmf-dist/tex/plain/newsletr/newsletr.tex create mode 100644 Master/texmf-dist/tex/plain/newsletr/quote.tex (limited to 'Master/texmf-dist/tex/plain/newsletr') diff --git a/Master/texmf-dist/tex/plain/newsletr/italic.tex b/Master/texmf-dist/tex/plain/newsletr/italic.tex new file mode 100644 index 00000000000..6af739150aa --- /dev/null +++ b/Master/texmf-dist/tex/plain/newsletr/italic.tex @@ -0,0 +1,38 @@ +% Save file as: ITALIC.TEX Source: FILESERV@SHSU.BITNET +% +% File: ITALIC.TEX +% +% Author: Hunter Goatley +% goathunter@WKUVX1.BITNET +% +% Date: August 21, 1991 +% +% Abstract: +% +% The macros \ital and \slant are defined to typeset tex in italic +% (\it) and slanted (\sl) fonts, automatically inserting the italic +% correction (\/) if necessary. The correction is not inserted if +% the token following the parameter is a period or a comma, as +% suggested on page 14 of _The TeXbook_. +% +% Based on the \predict macro presented in _TeX for the Impatient_, +% p. 233. +% +% These macros use \toks0 as a temporary. +% +% The \futurelet\it@next in \ital and \slant defines \it@next to be +% whatever the character following the parameter is. \d@slant checks +% to see if \it@next is a comma or period; if it is neither, the +% italic correction (\/) is included. +% +\catcode`\@=11 % Temporarily make @ a letter +\def\ital#1{\toks0={#1}\let\slf@nt=\it\futurelet\it@next\d@slant} +\def\slant#1{\toks0={#1}\let\slf@nt=\sl\futurelet\it@next\d@slant} +\def\d@slant{{\slf@nt\the\toks0}% + \ifx\it@next,% % If \it@next is not a comma + \else\ifx\it@next.% % ... and is not a period + \else\/% % ... insert the correction (\/) + \fi\fi% % ... + \let\it@next=\relax% % "Undefine" \it@next + } +\catcode`\@=12 % Reset @ as other diff --git a/Master/texmf-dist/tex/plain/newsletr/lodriver.tex b/Master/texmf-dist/tex/plain/newsletr/lodriver.tex new file mode 100644 index 00000000000..f1e1149be41 --- /dev/null +++ b/Master/texmf-dist/tex/plain/newsletr/lodriver.tex @@ -0,0 +1,57 @@ +% Save file as: LODRIVER.TEX Source: FILESERV@SHSU.BITNET +% +% File: LODRIVER.TEX +% +% Functional description: +% +% This file is the TeX control file for the Robert R. McCammon newsletter +% published by Hunter Goatley. +% +% It depends on the file NEWSLETTER_FORMAT.TEX. +% +% Author: Hunter Goatley +% +% Date: May 26, 1990 +% +% Modified by: +% +% 01-000 Hunter Goatley 3-JUN-1989 14:56 +% Original version. +% +\ifx\undefined\eoa\input newsletr \fi % Include macro definitions if needed + +\def\LO{\book{Lights Out!\/}} +\def\POBox{P.\thinspace O.~Box 9609\relax} +\def\CityState{Bowling Green, KY\relax} +\def\ZipCode{42102-9609\relax} +\def\LOAddress{\POBox, \CityState \ZipCode\relax} +\def\RRM{Robert~R. McCammon\relax} +\def\RM{Rick McCammon\relax} +\def\McC{McCammon\relax} +\newspage +\begindoublequotes %Handle double-quotes + +\say{Producing Robert R. McCammon Newsletter: Vol. 2 No. 1, Issue 5} + +\pageheaderlinetrue \pagefooterlinetrue % Do head/foot lines +\evenpageheader{}{Lights Out!}{} % Header for even pages +\oddpageheader{}{The Robert R. McCammon Newsletter}{} % Header for odd pages +\evenpagefooter{Page\ \folio}{}{January 1991} % Footer for even pages +\oddpagefooter{Vol.\ 2\ \ No.\ 1}{}{Page\ \folio} % Footer for odd pages + +%\say{} +%\say{************* PROOF MODE IS SET ************} +%\say{} + +\ignoreunderfill +% +% Normally, I have separate files that I include. +% +%\include{TITLE.TEX} +%\include{EDITORIAL.TEX} +%\include{KAZUE.TEX} +%\include{NEXTTIME.TEX} + +\include{LOSAMPLE.TEX} + +\bye diff --git a/Master/texmf-dist/tex/plain/newsletr/newsletr.tex b/Master/texmf-dist/tex/plain/newsletr/newsletr.tex new file mode 100644 index 00000000000..d05c957c533 --- /dev/null +++ b/Master/texmf-dist/tex/plain/newsletr/newsletr.tex @@ -0,0 +1,1453 @@ +% Save file as: NEWSLETR.TEX Source: FILESERV@SHSU.BITNET + \def\IDENT{01-014} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Copyright 1989--1991 by Hunter Goatley. This code may be freely % +% distributed and modified for non-commercial purposes as long as this % +% copyright notice is retained. Please notify the author of any fixes or % +% improvements you make. % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% File: NEWSLETTER_FORMAT.TEX +% +% Abstract: +% +% This file defines TeX control sequences required to produce a +% newsletter. It assumes plain.tex has been loaded. +% +% Author: Hunter Goatley +% VAX Systems Programmer +% Western Kentucky University +% Academic Computing, STH 226 +% Bowling Green, KY 42101 +% Voice: 502-745-5251 +% E-mail: goathunter@WKUVX1.BITNET +% +% Partially based on examples from _The TeXbook_, by +% Donald E. Knuth, and various other sources. Virtually +% all of the macros from other sources have been rewritten +% or at least modified. +% +% Date: June 3, 1989 +% +% Modified by: +% +% 01-014 Hunter Goatley 21-AUG-1991 10:47 +% Rewrote double-quote macros (they work now!). Cleaned up +% a little bit. Added \slant and \ital. +% +% 01-013 Hunter Goatley 25-JAN-1991 08:23 +% Added \newpage. Added \tt definitions to \*point macros. +% Fixed problem with \quotee (quotee name was getting split). +% Added setting of \hyphenpenalty and \emergencystretch to +% \newspage macro. +% +% 01-012 Hunter Goatley 15-JAN-1991 07:03 +% Added macro \round to help with keeping page & figure heights +% even. It helps some. Re-worked \beginquote and \endquote. +% Add \Quote and \quotee. Added \listindent and dimens. +% Modified \coltitle to include \noindent; changed amount of +% \vglue. Modified \beginlist and \endlist to check for +% a \parskip of 0pt; if 0, skip .5\baselineskip. Fixed +% \centerbox (was \vbox, now \hbox). +% +% 01-011 Hunter Goatley 5-JAN-1991 23:40 +% Changed \ednote macro so that \sl is redefined as \rm, not \ss. +% Changed \say macro to look like LaTeX's \typeout macro. +% +% 01-010 Hunter Goatley 6-OCT-1990 02:55 +% Commented out \ss calls at end of font macros. +% Placed newsletter hsize commands in a macro (\newspage) +% so that NEWTEX can be used like TeX normally is. +% +% 01-009 Hunter Goatley 10-MAR-1990 16:05 +% Added \par to the beginning of definition of \endlist. +% +% 01-008 Hunter Goatley 7-DEC-1989 22:07 +% Added \farright (place hbox flush right or on next line if it +% won't fit). Modified definition of \eoa to call \farright. +% Added \pmb -- "poor man's bold." Added font cmssxb. Added +% \eldots and \edots. +% +% 01-007 Hunter Goatley 1-OCT-1989 03:41 +% Added figure support for multiple column environment. +% Added \centerbox. +% +% 01-006 Hunter Goatley 17-AUG-1989 10:11 +% Modified so that "@" is an active character throughout the +% format file. Added new header/footer commands that are more +% flexible. Improved appearance of shadow box created by +% \leftshadowbox. +% +% 01-005 Hunter Goatley 10-AUG-1989 22:09 +% Modified \onepageout output routine so that it does not +% disable interline skip (commented out \offinterlineskip). +% This was causing the header and footer to appear flush +% with the main body of text on the page. Added routine +% \checkdqbalsub. Modified \include to automatically call +% \checkdqbalsub after the file has been read in. +% +% 01-004 Hunter Goatley 30-JUL-1989 03:10 +% Added macros to handle font size changes. Added code to +% let " be used. +% +% 01-003 Hunter Goatley 29-JUL-1989 19:26 +% Modified double column routines so that the number of columns +% can be specified. The routines now work for 2 to 6 columns +% of output. +% +% 01-002 Hunter Goatley 23-JUL-1989 22:21 +% Added more comments. Fixed double column routines so that +% page sizes are handled properly. +% +% 01-001 Hunter Goatley 2-JUL-1989 21:28 +% Added macros to handle bibliographies. +% +% 01-000 Hunter Goatley 3-JUN-1989 14:56 +% Original version. +% + +\def\say#1{{\let\protect\string\immediate\write10{#1}}} + +\say{TeX Input file for Newsletter format - version \IDENT} +\say{Copyright 1989-1991, Hunter Goatley} + +\everyjob{\say{TeX Newsletter version \IDENT. Copyright 1989-1991, Hunter Goatley}} + +% +% The \catcode command below lets us use "@" as a letter. It can therefore +% be used in command and variable names. PLAIN TeX uses this to avoid +% conflicts with user code, so we'll do it, too. +% +\catcode`@=11 % borrow the private macros of PLAIN (with care) + +\say{Loading fonts...} +% +% Load fonts and define commands to switch between fonts +% +\font\twelverm=cmr12 \font\tenrm=cmr10 \font\ninerm=cmr9 \font\eightrm=cmr8 +\font\twelvei=cmmi12 \font\teni=cmmi10 \font\ninei=cmmi9 \font\eighti=cmmi8 +%\font\twelvesy=cmsy12 \font\tensy=cmsy10 \font\ninesy=cmsy9 \font\eightsy=cmsy8 +\font\twelvebf=cmbx12 \font\tenbf=cmbx10 \font\ninebf=cmbx9 \font\eightbf=cmbx8 +\font\twelvett=cmtt12 \font\tentt=cmtt10 \font\ninett=cmtt9 \font\eighttt=cmtt8 +\font\twelveit=cmti12 \font\tenit=cmti10 \font\nineit=cmti9 \font\eightit=cmti8 +\font\twelvesl=cmsl12 \font\tensl=cmsl10 \font\ninesl=cmsl9 \font\eightsl=cmsl8 +\font\twelvess=cmss12 \font\tenss=cmss10 \font\niness=cmss9 \font\eightss=cmss8 +\font\twelvessi=cmssi12 \font\tenssi=cmssi10 \font\ninessi=cmssi9 +\font\eightssi=cmssi8 \font\tenssb=cmssbx10 +% +% 11-point font is scaled 10pt +% +\font\elevenrm=cmr10 scaled\magstephalf +\font\eleveni=cmmi10 scaled\magstephalf +\font\elevenbf=cmbx10 scaled\magstephalf +\font\eleventt=cmtt10 scaled\magstephalf +\font\elevenit=cmti10 scaled\magstephalf +\font\elevensl=cmsl10 scaled\magstephalf +\font\elevenss=cmss10 scaled\magstephalf +\font\elevenssi=cmssi10 scaled\magstephalf + +\font\seventeenrm=cmr17 \font\seventeenss=cmss17 \font\seventeenssi=cmssi17 + +\def\seventeenpoint{% + \def\sl{\seventeenssi}\def\it{\seventeenssi}\def\bf{\seventeenss}% + \def\rm{\seventeenrm}\def\ss{\seventeenss}\def\ssi{\seventeenssi}% + \baselineskip=19pt% % Change baselineskip + \rm% % By default, use sans serif +} +\def\twelvepoint{% + \def\sl{\twelvesl}\def\it{\twelveit}\def\bf{\twelvebf}% + \def\rm{\twelverm\let\sl=\twelvesl}\def\ss{\twelvess\let\sl=\ssi}% + \def\ssi{\twelvessi}\def\tt{\twelvett}% + \baselineskip=14pt% % Change baselineskip + \rm% % By default, use sans serif +} +\def\elevenpoint{% + \def\sl{\elevensl}\def\it{\elevenit}\def\bf{\elevenbf}% + \def\rm{\elevenrm\let\sl=\elevensl}\def\ss{\elevenss\let\sl=\ssi}% + \def\ssi{\elevenssi}% + \def\tt{\eleventt}% + \baselineskip=13pt% % Change baselineskip + \rm% % By default, use sans serif +} +\def\tenpoint{% + \def\sl{\tensl}\def\it{\tenit}\def\bf{\tenbf}% + \def\ssb{\tenssb}% + \def\rm{\tenrm\let\sl=\tensl}\def\ss{\tenss\let\sl=\ssi}% + \def\ssi{\tenssi}% + \def\tt{\tentt}% + \baselineskip=12pt% % Change baselineskip + \rm% % By default, use sans serif +} +\def\ninepoint{% + \def\sl{\ninesl}\def\it{\nineit}\def\bf{\ninebf}% + \def\rm{\ninerm\let\sl=\ninesl}\def\ss{\niness\let\sl=\ssi}% + \def\ssi{\ninessi}% + \def\tt{\ninett}% + \baselineskip=11pt% % Change baselineskip + \rm% % By default, use sans serif +} +\def\eightpoint{% + \def\sl{\eightsl}\def\it{\eightit}\def\bf{\eightbf}% + \def\rm{\eightrm\let\sl=\eightsl}\def\ss{\eightss\let\sl=\ssi}% + \def\ssi{\eightssi}% + \def\tt{\eighttt}% + \baselineskip=10pt% % Change baselineskip + \rm% % By default, use sans serif +} + +\font\HUGE=cmr17 %scaled\magstep2 +\font\verysmallrm=cmr5 % Used to make small copyright "C" +\font\smallsy=cmsy7 % Used to make small copyright circle +\def\tiny{\eightpoint\ss} % Equate \tiny to \eightpoint +\let\em=\eightssi +\font\quotefont=cmss12 at 14.4truept % Quotation font +\font\quoteefont=cmcsc10 % Font for quotee + +\say{Defining macros...} + +\newdimen\normalhsize % Create a new dimension +\newdimen\normalvsize % Create a new dimension + +\normalhsize=\hsize + +% +% \newspage +% +% Set up the page for a newsletter (7" by 9" of text, higher tolerance). +% +\def\newspage{% + \global\topskip=0pt % Set 1 inch top margin + \global\hoffset=-.25 true in % Move output .25 in to the left + \global\pretolerance=1000 % Set tolerance up (before hyphenation) + \global\tolerance=1500 % ... (after hyphenation) + \global\hyphenpenalty=500 % Discourage hyphenation + \global\emergencystretch=30pt + \global\normalhsize=7in + \global\hsize=\normalhsize % Pages are 7 inches wide + \global\vsize=9in % ... and 9 inches tall + \global\abovedisplayskip=\baselineskip + \global\belowdisplayskip=\baselineskip + \global\pagewidth=\hsize + \global\pageheight=\vsize +} + +\clubpenalty=500 %-1000 % Set penalties for club and widow lines +\widowpenalty=1000 % ... + +% +%=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +% Multiple Column Output +%=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +% +% Define macros to handle multiple column output +% +% These macros support figures, but the figures must be defined inside +% the multiple-column environment. Each column can have up to 3 figures +% of varying sizes; the figures are referred to as "top", "middle", and +% "bottom". Figures are identified via page number, column number, and +% the position. In addition, two special figures that span all columns +% can be specified using column 0 with "top" and "bottom". +% +% For example, {3}{2}{middle} refers to the middle figure in column 2 +% of output page 3. +% +% The figures are stored as temporary inserts (the inserts are freed +% after \endcolumns). The inserts are treated as an array whose first +% entry is \c@lfigstart. +% +% Note: column figures are not handled on the last page of column output. +% \balancecolumns does not understand how to deal with them. +% +% While in X column mode, the text is arranged as one column +% \columnwidth wide and \pageheight*X tall. This narrow column is +% then split into X boxes of equal height. +% +%*************************************** +% +% Allocate a bunch of dimens, boxes, and counts for use in multiple-column +% macros. +% +\newdimen\columnwidth % Width of a column +\newdimen\columnseprule % Width of rule between columns +\newdimen\columnsep % Width of whitespace between columns +\newdimen\pagewidth % Total width of page +\newdimen\pageheight % Total height of page +\newdimen\pageheightkeep % Total height of page +\newdimen\ruleht % Height of \hrules +\newif\ifcolfigs % Create a new \if (true if figures) +\newbox\partialpage % Box to hold partial page before cols. +\newbox\partialpagetop % Box to hold figure for top of page +\newbox\partialpagebottom % Box to hold figure for bottom of page +\newcount\mulc@lbegin % Allocate a counter +\newcount\mulc@lpart % Allocate a counter +\newcount\numberofcols % Number of columns +\newcount\c@lpageno % Current page # for column environment +\newcount\maxcolfigs % Maximum # of figures +\newcount\c@lfigstart % Starting array slot # for inserts +\newcount\c@lslot % Work counter to hold current slot # +\newcount\maxfigp@ges % Maximum # of pages of column output +\newcount\figsperp@ge % Number of figures on each page +% +% Allocate multi-column work counters and dimens. +% +\newdimen\tmp@ % Dimen used to calculate pageheights, etc. +\newdimen\tmp@one % Dimen used to calculate pageheights, etc. +\newcount\tmp@two % Usually # of cols * 2 +\newcount\tmp@three +\newcount\tmp@four +\newcount\tmp@five +\newcount\tmp@six +\newcount\tmp@seven +\newdimen\rtmp@ % Dimen used in rounding +% +% Initialize the \column* dimens. If \columnwidth is still 0pt when +% \begincolumns is called, the correct \columnwidth will be +% calculated from the current \hsize. This lets the user set a column +% width, without requiring that it be done. +% +\columnsep=20pt % Space between columns +\columnseprule=.4pt % Width of rule between columns +\columnwidth=0pt % Initialize columnwidth to 0pt +% +% Initialize pagewidth, pageheight, and ruleht +% +\pagewidth=\hsize \pageheight=\vsize \ruleht=.5pt +% +% Define constant values used to indicate type of figure stored in +% figure boxes. Probably inefficient to store them as macros, but it's +% easier that way (and they're not hardcoded in the macros below). +% +\def\TopFig@{500} % Figure is at top of page +\def\BotFig@{600} % Figure is at bottom of page +\def\RegFig@{321} % Figure is a corner figure +\def\topc@lpos{1} % The top figure position (1) +\def\middlec@lpos{2} % The middle figure position (2) +\def\bottomc@lpos{3} % The bottom figure position (3) + +% +% Macro \onepageout +% +% Output routine used to actually shipout pages to the DVI file. +% +\def\onepageout#1{\shipout\vbox{ % here we define one page of output + {\hsize=\pagewidth\makeheadline} % Do normal width headline + %\offinterlineskip % butt the boxes together + \vbox to \pageheightkeep{ % Create a vbox big enough + \boxmaxdepth=\maxdepth % Set boxmaxdepth + #1 % Now insert the information + } % \vbox to \pageheight + {\hsize=\pagewidth\makefootline} % Do normal width footline + } % End of \vbox + \advancepageno % Advance current page number + } % End of \def\onepageout + +%\output{\onepageout{\unvbox255}} % Send out any current output + +% +% When \begincolumns is called: +% +% \output is set to perform the following functions: +% Store the current vbox in the partialpage box (with some vskip) +% Eject the page (executing \output - page is not really ejected) +% Set new definition of output: +% Call \multiplecolumnout to output the columns +% Set \hsize = \columnwidth +% Set \vsize = (\pageheight * X) - (\ht\partialpage * X) --- each column will +% now be just as tall as the space below \partialpage +% +% Sometimes the first \output was executed twice in a row, which caused the +% first \partialpage to be lost. The code below includes a counter that is +% used to determine if the output routine is called a second time. If it +% is, the routine ships the previously stored partial page and then creates +% a new \partialpage. +% +% Originally, \begincolumns set \vsize = X * \pageheight (it did not +% take the height of the \partialpage into account). If the complete text +% would fit in the full \vsize, the balancing routine would have problems +% balancing and you'd end up with lots of whitespace on a page and the +% multiple columns would show up on the next page. Make sense? If not, +% just trust me; it caused problems. +% +% The solution to the problem was to set +% +% \vsize = (\pageheight * X) - (\ht\partialpage * X) +% +% and then set \vsize back to (X*\pageheight) after the first page had been +% ejected. This worked fine and dandy except for the fact that grouping was +% causing the changes to not hold. The solution (and it is a little +% dangerous) was to use \global\vsize so that the \vsize changes were never +% local to the group. \endcolumns then resets \vsize = \pageheight. +% Again, trust me; it seems to work OK. +% +\def\begincolumns#1{ + \ifnum#1<2 \errmessage{Invalid number of columns -- #1; must be 1 < X < 7}\fi + \ifnum#1>6 \errmessage{Invalid number of columns -- #1; must be 1 < X < 7}\fi + \begingroup % Begin a new group + \global\mulc@lbegin=1 % Set "first time" output counter + \global\mulc@lpart=1 % Set "first time" outputting dbl cols. + \global\pageheightkeep=\vsize % Initialize \pageheight + \global\pageheight=\vsize % Initialize \pageheight + \round{\pageheight}{\baselineskip}{<} % Round the pageheight down + \global\pagewidth=\hsize % Initialize \pagewidth + \global\tmp@two=#1 \global\advance\tmp@two by-1 + \global\numberofcols=#1 % Initialize number of columns + % Calculate column width unless user set a value + \ifdim\columnwidth=0pt % If user did not set \columnwidth + \columnwidth=\hsize % Set columnwidth = normal page width + \tmp@=-\columnsep % Copy neg. amount of columnsep to tmp@ + \multiply\tmp@ by\tmp@two % Multiply by X (total amount of colsep) + \advance\columnwidth by\tmp@ % Subtract width space between columns + \divide\columnwidth by\numberofcols % Divide by X to get X column output + \fi % End of \columnwidth calculation + \output={ + \ifnum\mulc@lbegin=1 % 1st time through? + \global\setbox\partialpage=\vbox{\unvbox255\bigskip} % Store partial + \global\mulc@lbegin=2 % Increment counter + \else % 2nd time through... + \onepageout{\vbox{\unvbox\partialpage}} % Ship previous partial + \global\setbox\partialpage=\vbox{\unvbox255\bigskip} % Make a new + \fi % ... partial + }\eject % Force the output routine to execute + \output={\multiplecolumnout} % Output X columns + \hsize=\columnwidth % Set hsize = col. width + % Set \vsize = (\pageheight * X) - (\ht\partialpage * X) + \global\vsize=\pageheight % Set \vsize=X*\pageht + \global\multiply\vsize by\numberofcols % Multiply by X + \tmp@=-\ht\partialpage \multiply\tmp@ by\numberofcols % Subtract (height of + \global\advance\vsize by\tmp@ % ... partial page * X) + \round{\vsize}{\baselineskip}{>} % Round it up + } % End of \begincolumns + +% +% \endcolumns performs the following functions: +% +% Sets \output to call \balancecolumns +% \vfills page and ejects it +% Terminates the group +% Resets vsize to original size +% Resets pagegoal = to original \vsize +% Skips parskip vertical space +% Signals that this is a good place for a break, if necessary +% +\def\endcolumns{\output={\balancecolumns} \eject + \endgroup \global\vsize=\pageheightkeep \pagegoal=\vsize \bigskip \goodbreak} +% +% \multiplecolumnout +% +% Sets splittopskip = topskip +% Sets splitmaxdepth = maxdepth +% Sets TeX register \dimen@ = to height of the page +% Subtracts the height of the partial page from \dimen@ +% Subtracts the heights of the top & bottom figures from \dimen@ +% Splits up the current output box into X boxes of size \dimen@, handling +% figures, if present +% Calls \onepageout to dump the new boxes +% Resets \vsize = (X * \pageheight) if first time through macro +% Frees up current output vbox (255) +% +\def\multiplecolumnout{\splittopskip=\topskip \splitmaxdepth=\maxdepth + \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage + \advance\dimen@ by-\ht\partialpagetop % Subtract height of top figure + \advance\dimen@ by-\ht\partialpagebottom % Subtract height of bottom fig. + \tmp@four=\numberofcols \multiply\tmp@four by2 % Calculate upper box # + \tmp@five=0 % Start boxes with box 0 + \ifcolfigs % Are there figures defined? + \splitfigc@ls % Yes - go handle text & figures + \else % No - split \box255 into X cols + % + % Split box255 into a box of dimen@ height. Loop until X boxes created. + % + {\loop + \global\setbox\tmp@five=\vsplit255 to\dimen@ \advance\tmp@five by2 + \ifnum\tmp@five<\tmp@four \repeat} % Loop if not done + \fi % \ifcolfigs + \onepageout\pagesofar % Send this page to DVI file + \ifnum\mulc@lpart=1 % Does vsize need to be reset? + \global\mulc@lpart=2 % Yes - change counter + \global\vsize=\pageheight % Set \vsize = X * \pageheight + \global\multiply\vsize by\numberofcols % ... + \fi % ... + \ifcolfigs % If figures defined... + \global\advance\c@lpageno by\@ne % Bump column output page no. + \handlefigures % Handle next page's figures + \fi % \ifcolfigs + \unvbox255 \penalty\outputpenalty % Free current output vbox +} % End of \multiplcolumnout + +% +% \splitfigc@ls +% +% This macro splits \box255 into X columns, handling the figures. +% +% Get figure array slot number for figure 1, column 1 on current page +% Loop for each column (starting with column in \tmp@five) +% Make a copy of \dimen@ -> \tmp@ +% If a figure is defined for top of column +% Decrease \tmp@ by the height of the figure +% Set box 1 = the figure +% Else +% Set box 1 = null vbox +% Bump figure array slot number - now points to slot for middle figure +% If a figure is defined for middle of column +% Decrease \tmp@ by the height of the figure +% Set box 5 = the figure +% Else +% Set box 5 = null vbox +% Bump figure array slot number - now points to slot for bottom figure +% If a figure is defined for bottom of column +% Decrease \tmp@ by the height of the figure +% Set box 9 = the figure +% Else +% Set box 9 = null vbox +% Bump figure array slot number - now points to slot for next top figure +% Split \box255 into 1 or 2 pieces (2 if there is a middle figure) +% Set \box\tmp@five = \box1 + \box3 + \box5 + \box7 + \box9 +% Advance \tmp@five by 2 and loop until X "columns" created +% +\def\splitfigc@ls{ + % + % Split box255 into a box of dimen@ height. Loop until X boxes created. + % + \tmp@two=1 % Figure counter + \calcc@lslot{\c@lpageno}{1}{\tmp@two} % Get slot for figure 2 on current page + {\loop % Start loop + \tmp@=\dimen@ % Make a working copy of dimen@ + % + % Handle top figure + % + \ifnum\count\c@lslot=\RegFig@ % If this slot holds a single-column fig + \advance\tmp@ by-\ht\c@lslot % Subtract figure's height from \tmp@ + \setbox1=\vbox{\unvbox\c@lslot} % Copy figure to \box1 +\say{Figure \the\tmp@two\space on page \the\c@lpageno, document page \folio} + \else \setbox1=\vbox{} % Else set box 1 = null page + \fi % \ifnum + % + % Handle middle figure + % + \advance\c@lslot by\@ne % Point to next figure + \advance\tmp@two by\@ne % Advance figure counter + \ifnum\count\c@lslot=\RegFig@ % If this slot holds a single-column fig + \advance\tmp@ by-\ht\c@lslot % Subtract figure's height from \tmp@ + \setbox5=\vbox{\unvbox\c@lslot} % Copy figure to \box3 +\say{Figure \the\tmp@two\space on page \the\c@lpageno, document page \folio} + \else \setbox5=\vbox{} % Else set box 3 = null page + \fi % \ifnum + % + % Handle bottom figure + % + \advance\c@lslot by\@ne % Point to next figure + \advance\tmp@two by\@ne % Advance figure counter + \ifnum\count\c@lslot=\RegFig@ % If this slot holds a single-column fig + \advance\tmp@ by-\ht\c@lslot % Subtract figure's height from \tmp@ + \setbox9=\vbox{\unvbox\c@lslot} % Copy figure to \box3 +\say{Figure \the\tmp@two\space on page \the\c@lpageno, document page \folio} + \else \setbox9=\vbox{} % Else set box 3 = null page + \fi % \ifnum + \advance\c@lslot by\@ne % Point to next figure in array + \advance\tmp@two by\@ne % Advance figure counter + % + % Here, top figure is in \box1, middle figure is in \box5, and bottom + % figure is in \box9. + % Split \box255 to fill the remaining column space, splitting in + % half if there is a middle figure. + % Special case: if height of \box1 = \pageheight, \box\tmp@five=null + % + \ifdim\ht1=\pageheight % Is top = whole column? + \global\setbox3=\vbox{} % Yes - set \box3 to null + \global\setbox7=\vbox{} % Yes - set \box7 to null + \else % No - go ahead and do split + \ifdim\ht5>0pt % Is there a middle figure? + \divide\tmp@ by2 % Yes - break text to 2 pieces + \global\setbox3=\vsplit255 to\tmp@ % Set \box3 = 1st piece + \global\setbox7=\vsplit255 to\tmp@ % Set \box7 = 2nd piece + \else % No middle column... + \global\setbox3=\vsplit255 to\tmp@ % Put all text in \box3 + \global\setbox7=\vbox{} % Set \box7 to null + \fi % \ifdim\ht5... + \fi % \ifdim + % + % Now put the 5 pieces together as one vbox in \box\tmp@five + % + \global\setbox\tmp@five=\vbox to\dimen@{\offinterlineskip% + \ifdim\ht1=0pt\else\vbox{\unvbox1}\fi + \ifdim\ht3=0pt\else\vbox{\unvbox3}\fi + \ifdim\ht5=0pt\else\vbox{\unvbox5}\fi + \ifdim\ht7=0pt\else\vbox{\unvbox7}\fi + \ifdim\ht9=0pt\else\vbox{\unvbox9}\fi + \vfil\vfilneg % Cancels spurious vglue ???? (it works) + } + \advance\tmp@five by2 % Bump column box # + \ifnum\tmp@five<\tmp@four \repeat} % Loop if not done +} % End of \splitc@lfigs + +% +% \pagesofar +% +% Releases \partialpage box +% Sets width of X boxes (from box 0 to box X) = to \columnwidth +% Creates an hbox = pagewidth that consists of box0 + separator rule + box 2 +% + separator rule + box X +% This new hbox is \box255 and can be used to \shipout +% +\def\pagesofar{\unvbox\partialpage + \unvbox\partialpagetop % Include top figure + \tmp@four=\numberofcols \multiply\tmp@four by2 % Loop boundary number + \tmp@five=0 % Start with box 0 + % + % For each box, set the width equal to the column width + % + {\loop \wd\tmp@five=\columnwidth \advance\tmp@five by2 + \ifnum\tmp@five<\tmp@four \repeat} % Loop until X done + % + % Now put all the boxes together like this: + % + % box | box | ... | box + % + \tmp@five=0 % Start with box 0 again + \hbox to\pagewidth{\box\tmp@five\advance\tmp@five by2% Do the left column + \loop \hfil\vrule width\columnseprule \hfil \box\tmp@five% + \advance\tmp@five by2 % Bump box counter + \ifnum\tmp@five<\tmp@four \repeat % Loop if not done + } % End of hbox + \unvbox\partialpagebottom % Include bottom figure +} % End of \pagesofar + +% +% \balancecolumns - Balance both columns at end of X column page +% +% Sets box 0 = current page +% Sets dimen@ = height of the vbox in box 0 +% Adds topskip value to dimen@ +% Subtracts X * \baselineskip from dimen@ +% Divides dimen@ by X -- dimen@ now has target height of each column +% Sets splittopskip = to topskip so it can be added to all columns +% Loops +% Copies box 0 to box 3 +% Splits box 3 to dimen@ and stores in box 1 & 3 +% Increments dimen@ by 1pt and loops if column in box 3 exceeds dimen@ +% Note: Splitting of box is actually implemented as a loop that creates +% X boxes +% Moves columns in odd-numbered boxes to corresponding even-numbered boxes +% Calls pagesofar to make the hbox for it +% +\def\balancecolumns{\setbox0=\vbox{\unvbox255} \dimen@=\ht0 + % + % Subtract X * \baselineskip from dimen@ and divide dimen@ by X + % + \tmp@two=\numberofcols \advance\tmp@two by-1 + \tmp@=-\baselineskip \multiply\tmp@ by\tmp@two \advance\dimen@ by\tmp@ + \divide\dimen@ by\numberofcols \splittopskip=\topskip % Dimen@/X + % + % Split the column X times so we have X columns of equal height. If our + % last column is > dimen@, bump dimen@ by one and loop. + % + \tmp@four=\numberofcols \multiply\tmp@four by2 % X * 2 + \tmp@seven=\tmp@four \advance\tmp@seven by-1 % Work box: (X*2)-1 + {\vbadness=10000 \loop \global\setbox\tmp@seven=\copy0 + \tmp@five=0 \tmp@six=1 % Work box starts with 1 + {\loop % Loop for X boxes + \global\setbox\tmp@six=\vsplit\tmp@seven to\dimen@ % Vsplit box + \advance\tmp@six by2 % Bump box counter + \ifnum\tmp@six<\tmp@seven \repeat} % Loop if not done + \ifdim\ht\tmp@seven>\dimen@ \global\advance\dimen@ by1pt \repeat} + % + % Here we have X columns of equal height. Note that the last column may + % not be equal to the others. + % + % Copy the columns to the even-numbered boxes in preparation for \pagesofar + % + \tmp@five=0 \tmp@six=1 + {\loop \global\setbox\tmp@five=\vbox to\dimen@{\unvbox\tmp@six} + \advance\tmp@five by2 \advance\tmp@six by2 + \ifnum\tmp@five<\tmp@four \repeat} + \pagesofar} % Call \pagesofar to build page +% +% \c@lnewinsert +% +% This macro is used to perform a \newinsert for temporary usage (inside a grp) +% +\def\c@lnewinsert{\advance\insc@unt by\m@ne % Decrement insert counter + \ch@ck0\insc@unt\count % Make sure count is available + \ch@ck1\insc@unt\dimen % Make sure dimen is available + \ch@ck2\insc@unt\skip % Make sure skip is available + \ch@ck4\insc@unt\box % Make sure box is available +% NEED TO EMPTY BOX!!! + \count\insc@unt=0 % Set the count to 0 + \allocationnumber=\insc@unt % Set the allocation number +} % End of \c@lnewinsert + +% +% \definefigs +% +% This macro is called to establish the figure environment inside of the +% multiple-column environment. It allocates (until \endcolumns) an array +% of inserts (boxes, counts, dimens, and skips) to handle all of the +% figures per page for the given number of pages. When the figures +% are defined using \definefig, the proper box is filled with the figure. +% +% Inputs: +% +% #1 - Number of pages of multiple-column output (should be as large +% as the total number of pages between \begincolumns and +% \endcolumns) +% +\def\definefigs#1{ + \colfigstrue % Set column figure flag + \global\c@lpageno=1 % Get current page number + \maxfigp@ges=#1 % Set maximum # of pages with figures + \figsperp@ge=\numberofcols % Calculate # of figures per page + \multiply\figsperp@ge by3 % Figs/Page = 2 + (3 * number of cols) + \advance\figsperp@ge by2 % ... + \maxcolfigs=\maxfigp@ges % Figure out how many inserts are needed + \multiply\maxcolfigs by\figsperp@ge % ... for all of the figures + \tmp@two=\maxcolfigs % Start there and work down to first box + \loop \c@lnewinsert \advance\tmp@two by\m@ne + \ifnum\tmp@two>0 \repeat + \c@lfigstart=\insc@unt % Save starting array slot # + % We've allocated all boxes now + } % End of \definefigs + +% +% \definefig +% +% This macro stores figure information in the appropriate slot in the insert +% array. After calculating the proper slot number for the figure, it stores +% the figure in the corresponding box and sets the corresponding \count to +% a code identifying the box as holding a figure. +% +% Inputs: +% +% #1 Output page number +% #2 Column Number +% #3 Position (top, middle, bottom) +% #4 The vbox for the figure +% +\def\definefig#1#2#3#4{ + \ifcolfigs % Has \definefigs been called? + \else + \errmessage{Illegal use of \string\definefig\space before \string\definefigs} + \fi % \ifnum + \ifnum#2>\numberofcols % Illegal column number? + \errmessage{Column number #2 exceeds number of columns} + \fi % \ifnum + \calcc@lslot{#1}{#2}{\csname #3c@lpos\endcsname} % Calculate slot # + \ifcase\csname #3c@lpos\endcsname + \or\setbox\c@lslot=\vbox{#4\vskip\belowdisplayskip} + \or\setbox\c@lslot=\vbox{\vskip\abovedisplayskip#4% + \vskip\belowdisplayskip} + \or\setbox\c@lslot=\vbox{\vskip\abovedisplayskip#4} + \tmp@=\ht\c@lslot % Round up the size + \round{\tmp@}{\baselineskip}{>} % ... + \tmp@one=\tmp@ \advance\tmp@one by-\ht\c@lslot + \setbox\c@lslot=\vbox to\tmp@{\box\c@lslot} + \fi + \ifnum#2=0 % If column # is 0, special fig. + \ifnum\csname #3c@lpos\endcsname=1\count\c@lslot=\TopFig@ + \else\count\c@lslot=\BotFig@\fi % Top or Bottom figure that + \else % ... spans all columns + \count\c@lslot=\RegFig@ % Otherwise, identify the box + \fi % ... as containing a figure +\say{Processed #3 figure for column #2\space on page #1\space + - slot \the\c@lslot} + \say{The height is \the\ht\c@lslot} +} + +% +% \calcc@lslot +% +% This macro is called to calculate the array slot number for a figure. +% The formula for normal figures is: +% +% ((column# - 1) * 3figs/column) + Position +% +% This macro assumes there can be 3 figures per column (top, middle, & bottom) +% +% Inputs: +% +% #1 - Page number +% #2 - Column number (0 = special figure that spans all columns) +% #3 - Figure number (1 = top, 2 = middle, 3 = bottom) +% +% Returns: +% +% \c@lslot - Slot number for given figure. This slot number +% identifies the allocated insert for the figure. +% +\def\calcc@lslot#1#2#3{ + \tmp@seven=#1 % Start with page # + \advance\tmp@seven by\m@ne % (Page - 1) + \multiply\tmp@seven by\figsperp@ge % (Page - 1) * # of figs + \ifnum#2=0 % If column is 0, special one + \ifnum#3=1\tmp@six=1\else\tmp@six=\figsperp@ge\fi + \advance\tmp@six by\m@ne % Decrement for slot # + \else + \tmp@six=#2 % Column # + \advance\tmp@six by\m@ne % (Column# - 1) + \multiply\tmp@six by3 % (Column# - 1) * 3 + \advance\tmp@six by#3 % (Column# - 1) * 3 + Position + \fi % Really + 1, but -1 negates it + \advance\tmp@seven by\tmp@six % Add figure # to page # + \advance\tmp@seven by\c@lfigstart % Figure slot number + \global\c@lslot=\tmp@seven % Set the slot number + } % End of \calcc@lslot +% +% \handlefigures +% +% This macro is called to step through all of the figures for the current +% page and subtract the height of each from the total \vsize. +% +% The two special figures (top (1) and bottom (\figsperp@ge)) are handled +% differently; because each spans all of the columns on the page, the height +% of each is multiplied by the number of columns before subtracting it from +% \vsize. The top figure is then placed in \partialpagetop and the bottom +% figure is placed in \partialpagebottom. +% +% Returns: Adjusted \vsize. +% +\def\handlefigures{ + \global\vsize=\pageheight % \vsize to pageheight + \global\multiply\vsize by\numberofcols % Multiply by # of columns + \tmp@three=\figsperp@ge % Start with figure X + \calcc@lslot{\c@lpageno}{0}{3} % Start with last figure box + {\loop + \ifnum\count\c@lslot=\TopFig@ % If box is top section of page + \global\setbox\partialpagetop=\vbox{\unvbox\c@lslot} % Copy it + \tmp@=\ht\partialpagetop % Get the height + \multiply\tmp@ by\numberofcols % Multiply by number of columns + \global\advance\vsize by-\tmp@ % (vsize - figure size) + \else % Else + \ifnum\count\c@lslot=\BotFig@ % If box is bottom section + \global\setbox\partialpagebottom=\vbox{\unvbox\c@lslot} + \tmp@=\ht\partialpagebottom + \multiply\tmp@ by\numberofcols + \global\advance\vsize by-\tmp@ % (vsize - figure size) + \else % Else, see if regular figure + \ifdim\ht\c@lslot>0pt\all@wfigure{\ht\c@lslot}\fi % \vsize + \fi % End \ifnum + \fi % End \ifnum + \advance\tmp@three by\m@ne % Point to next box + \advance\c@lslot by\m@ne % Point to next box + \ifnum\tmp@three>0 \repeat} % Loop until done + } % End of \handlefigures + +\def\all@wfigure#1{ + \tmp@=#1 % Height of figure + \global\advance\vsize by-\tmp@ % Subtract figure size from vsize + } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Macro: \round#1#2#3 +% +% Purpose: Round a dimen parameter (#1) to the nearest even multiple of +% parameter #2. Primarily used to ensure that the page height +% or a figure height is an even multiple of the baselineskip. +% +% NOTE: this macro assumes there is no stretch or shrink to #2. +% +% Inputs: +% #1 Dimen variable to change (e.g., \pageheight) +% #2 Dimen variable to use as multiple (e.g., \baselineskip) +% #3 Symbol indicating round up (>) or round down (<) +% \tmp@ Work dimen (saved and restored) +% +% Example: +% \pageheight=598.213pt \baselineskip=12pt +% \round{\pageheight}{\baselineskip}{<} %yields \pageheight=588.0pt +% \round{\pageheight}{\baselineskip}{>} %yields \pageheight=600.0pt +% +\def\round#1#2#3{\bgroup% %Keep \tmp@ changes local + \rtmp@=0pt %Initialize \tmp@ + \loop %Begin a loop + \advance\rtmp@ by #2 %Bump \tmp@ by #2 + \ifdim#1>\rtmp@ \repeat %Loop until \tmp@ > #1 + \ifx<#3 %If #3 = "<" then + \advance\rtmp@ by-#2 %... subtract #2 from \tmp@ + \fi %... + \global#1=\rtmp@ %Reset parameter #1 + \egroup %End the group +} %End of macro +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Define list macros +% +% Dimens: +% +% \llistindent - Amount of left indent (0pt by default) +% \rlistindent - Amount of right indent (0pt by default) +% +% Macros: +% +% \beginlist - Begin list (skips space, sets indent) +% \endlist - Terminates a list +% \beginlistt - Begin list with glue (used for list headers) +% \endlistt - Terminates a \beginlistt +% \dotitem - Itemize with a dot "o" +% +\newdimen\llistindent \llistindent=0pt +\newdimen\rlistindent \rlistindent=0pt +\def\listindent#1{\llistindent=#1\rlistindent=#1} + +\def\beginlist{\begingroup% + \ifdim\parskip=0pt \vskip.5\baselineskip % Skip 1/2 line + \else \vskip\parskip % or the \parskip + \fi % + \parindent=10pt\parskip=0pt% % Reset parindent + \leftskip=\llistindent \rightskip=\rlistindent} % Indent margins + +\def\endlist{\par\endgroup% + \ifdim\parskip=0pt \vskip.5\baselineskip + \else \vskip\parskip\fi} + +\def\dotitem#1\par{\item{$\bullet$} #1 \par} + +\def\beginlistt#1{#1\vglue0pt\begingroup% + \divide\parskip by2\vskip\parskip\parindent=10pt\parskip=0pt% + \leftskip=\llistindent \rightskip=\rlistindent} +\def\endlistt{\par\endgroup} %\vskip\parskip} + +% +% Define a small copyright (for use with 8-point type). +% +\def\smallcir{\smallsy\char13} +\def\smallcopyright{\leavevmode\raise.25ex\hbox{ + \ooalign{\hfil\raise.03ex\hbox{\kern .16em\verysmallrm C} + \hfil\crcr\smallcir}}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Define macros to manipulate boxes +% +% Dimens: +% +% \boxitrule=Xpt - Width of rules used to draw boxes +% \boxitspace=Xpt - Space between box rules and box contents +% \boxshadowsize=Xpt - Width of shadow boxes +% +% Macros: +% +% \articletitle{Title}{byline} - Do article title in double box +% \coltitle{Title} - Do a title box in a column +% \shadowbox{some_box} - Draw a shadow box around an hbox or vbox +% \leftshadowbox{somebox} - Draw a left-hand shadow box around a box +% \centerbox{somebox} - Center a \vbox on a page +% \boxit{some_box} - Draw a box around an hbox or vbox +% \ednote - Do editor's note in a box +% +\newdimen\boxitspace \newdimen\boxitrule \newdimen\boxitwidth +\boxitspace=3pt \boxitrule=1.2pt +\boxitwidth=\boxitspace \advance\boxitwidth by\boxitspace +\advance\boxitwidth by\boxitrule \advance\boxitwidth by\boxitrule + +% +% Define macro to write an article title inside a double box +% +% Parameters: +% +% #1 - Title of article +% #2 - Byline +% +% For both \articletitle and \coltitle, the width of the box(es) must be +% subtracted from the current hsize in order for centering and justification +% to work right (otherwise the letters will run into the lines of the box). +% +\def\articletitle#1#2{ + \bestbreak{ % Say that this is best break + \advance\hsize by -\boxitwidth % Bring margin in before \center + \advance\hsize by -\boxitwidth % Do for both boxes! + \vskip 10pt plus 5pt % Skip some space + \boxit{ % Box the box + \divide\boxitrule by 2 % Make inside box lines thinner + \boxit{ % Box the text + \vbox{\noindent % Create a box + \centerline{\seventeenpoint\ss #1} % Print title of article + \centerline{\ninepoint\ss #2} % Print article byline + }}}}} % Create the text box + +\def\coltitle#1\par{{% % Swallow next paragraph + \advance\hsize by -\boxitwidth % Bring margins in + \boxit{% % Draw a box around the text + \vbox{\ss\noindent #1}}}% % Create a vbox that contains + \vglue.5\baselineskip% % Skip some non-breakable space + \noindent} % Don't indent next paragraph + +\def\ednote#1{{ + \sl % Switch to slanted font + \def\sl{\/\rm} % Redefine \sl + \advance\hsize by -\boxitwidth % Bring margins in + \boxit{ % Draw a box around the text + \vbox{\noindent Editor's note: #1}}} % Create a vbox that contains + \vglue 0pt} % Finish it up + +\def\boxit#1{\vbox{\tithrule\hbox{\titvrule\kern\boxitspace% + \vbox{\kern\boxitspace #1 \kern\boxitspace}% + \kern\boxitspace\titvrule}\tithrule}} + +\def\tithrule{\hrule height\boxitrule} +\def\titvrule{\vrule width\boxitrule} + +% +% \centerbox +% +% Create a \vbox that contains a centered \hbox. The centering is relative +% to the current \hsize. +% +% Inputs: +% +% #1 - \vbox to center -> \centerbox{\shadowbox{...}} +% +\def\centerbox#1{\hbox{\hfil#1\hfil}} % Create a \vbox containing a centered + + +\newdimen\oboxht \newdimen\oboxwd \newdimen\boxshadowsize +\boxshadowsize=4pt % Shadow box size is 4pt +% +% Draw a righthand shadow box. This is accomplished by building a vbox +% containing an hbox that is the boxed text and an hbox that is the right +% hand shadow. This vbox is then joined with a vbox that forms +% the bottom shadow. +% +\def\shadowbox#1{{ + \setbox0=\vbox{\boxit{#1}} % Set box after \boxit + \oboxht=\ht0 \oboxwd=\wd0 % Store the dimensions + \advance\oboxwd by-\boxshadowsize % Subtract shadow size from wd + \vbox{ % Put it all in one vbox + \offinterlineskip % Butt \vboxes together + \vbox{ % Create a vbox of whole thing + \hbox{\vbox{\unvbox0} % Create box with text box + + \hskip-\fontdimen2\font + \lower\boxshadowsize % Draw the right-hand boxshadowsize + \hbox{\vrule width\boxshadowsize height\oboxht}} % ... Finish off \hbox + } % End of the \vbox + \advance\boxshadowsize by\boxitrule + \vskip-\boxshadowsize % Back up to bottom of \vbox + \vbox{ % Start a new \vbox + \hbox{\kern\boxshadowsize\vbox{ % Create \hbox that is shadow + \hrule height\boxshadowsize width\oboxwd}} % ... + } % End of the \vbox + } % End of \vbox + }} % End of \shadowbox +% +% Draw a lefthand shadow box. This is accomplished by building a lowered +% vbox containing an hbox that is the left hand shadow and an hbox that +% contains the boxed text. This vbox is then joined with a vbox that forms +% the bottom shadow. +% +\def\leftshadowbox#1{{ + \setbox0=\vbox{\boxit{#1}} % Set box after \boxit + \oboxht=\ht0 \oboxwd=\wd0 % Store the dimensions + \advance\oboxwd by-\boxshadowsize % Subtract shadow size from wd + \vbox{ + \offinterlineskip % Butt \vboxes together + \vbox{ % Create a vbox of whole thing + \hbox{ % Create an hbox + \hskip-\fontdimen2\font % Move left one character width + \hskip-\boxshadowsize % Move left = size of shadow box + \advance\boxitrule by\boxshadowsize % Make shadow a tad bit wider + \lower\boxshadowsize % Move down the same amount + \hbox{\vrule width\boxitrule height\oboxht} % Draw the left box + } % ... Finish off \hbox + \vskip-\oboxht\vskip-\boxshadowsize % Move back up to top of box + \hbox{\vbox{\unvbox0} % Create box with text inside it + }} % End of vboxes + \advance\boxshadowsize by\boxitrule % Make box a little thicker + % ... so it overlaps bottom line + \vskip-\boxitrule % Move up height of bottom line + \vbox{ % Start a new \vbox + \hbox{\vbox{ % Create \hbox that is shadow + \hrule height\boxshadowsize width\oboxwd}} % ... + } % End of the \vbox + } % End of \vbox + }} % End of \shadowbox + +\def\bestbreak{\par\penalty-1000} + +% +% Begin a quotation. The quote is separated from the main text by two +% hrules and is indented from the normal text. +% +\def\beginquote{ + \begingroup % Define beginning of a group + \quotefont\baselineskip=16.8pt + \hrule height2pt % Draw a line + \parindent 5pt % Indent paragraphs by 5pt + \vglue\medskipamount % Use some glue so rule sticks + \narrower\narrower % Bring margins in (10pt) + \noindent % Don't indent + } % End of macro +% +% End a quotation. +% +\def\endquote{ + \vglue\medskipamount % Use some glue so rule sticks + \hrule height2pt % Draw a line + \endgroup % End the quote group + } + +\def\quotee#1{{\hfill\break\hbox{}\nobreak\hfill\hbox{\quoteefont #1} + \finalhyphendemerits=0}} +\def\Quote#1#2{\vbox{\vskip1.2pt\beginquote #1% + \quotee{#2}\endquote\vskip1.20003pt}} + +% +% Insert current month and year +% +\def\DATE{\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\space\number\year} +% +% Include a TeX file. +% +\def\include#1{\immediate\write10{Including TeX file #1} + \input #1 % Read the file in + % Things to do after formatting the file + } +% +% Separate articles with some vskip and an \hrule +% +\def\articlesep{ % Rule to separate articles + \vglue 10pt plus2pt minus4pt % Use vglue + \hrule %height.4pt % Draw a rule equal to \hsize + \vskip 10pt plus2pt minus2pt % Skip some vertical space + } + +% Put release flush right. If it won't fit, put it on the next line. +% From TeXbook, Chapter 14. +\def\farright#1{{\unskip\nobreak\hfill\penalty50\hskip2em + \hbox{}\nobreak\hfill \hbox{#1}\finalhyphendemerits=0}} + +% +% Define end-of-article marker. +% +\def\eoa{\farright{\vrule height1.5ex width1.5ex depth0pt}} +% +% Generate a blank page and a blank line. +% +\def\nullpage{\eject\line{}\vfil\eject} % Define an empty page +\def\nullline{\break\hbox{}\hfil\break} % Define an empty line +% +% Start on a new page. +% +\def\newpage{\vfill\eject} +% +% Get rid of underfill errors +% +\def\ignoreunderfill{\vbadness=10000\hbadness=10000\tolerance=2000} + +%=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +% Macros for bibliography entries +%=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +% +% Sample usage: +% +% \beginbibliography +% \bibbook{The Wolf's Hour} +% \ENUM New York: Pocket Books, March 1989 (paperback) +% \endbibliography +% +\newcount\enumno % New counter - item # +% +% \beginbibliography - Begin a bibliography +% +\def\beginbibliography{\begingroup\global\enumno=1 + \tiny % Use 8pt font + \parskip=1pt plus 1pt % Skip up to 2 points + } % End of \beginbibliography +\def\endbibliography{\par\endbiblist\endgroup} % End of bibliography +% +% \beginbiblist - Begin a list of bibliographic references +% +\def\beginbiblist{\begingroup + \vglue0pt\parindent=30pt\parskip=0pt} +% +% \beginanotherlist - Begin a list inside a list of bibliographic references +% +\def\beginanotherlist{\begingroup + \divide\parskip by 2 + \vglue\parskip\advance\parindent by10pt\parskip=0pt} +\def\endbiblist{\par\endgroup\vskip4pt} + +% ENUM - Number items in a list +% ENum - No number, but spaced as if number was present +% NoENUM - Only one reference is present. Start reference where number would +% normally start (hanging into left column). +% +% Examples: +% +% \ENUM First one 1. First one +% \ENUM Second one Yields 2. Second one +% \ENum Third one Third one +% \NoENUM Fourth one Fourth one +% +\def\ENUM#1\par{\item{\the\enumno.}\advance\enumno by 1 #1 \par } +\def\ENum#1\par{\item{}\advance\enumno by 1 #1 \par } +\def\NoENUM#1\par{\advance\enumno by 1\par\hang\hskip-10pt #1 \par } +% +% \bibshort, \bibbook, \bibview +% +% Macros to begin a new bibliography entry for a short story, a book, and +% and interviews. These macros will terminate the previous bibliography +% entry (if there is one) and begin a new entry. +% +\def\bibshort#1{\ifnum\enumno>1 \bestbreak\endbiblist\fi % Short story + \noindent{\story{#1}}\beginbiblist + } +\def\bibbook#1{\ifnum\enumno>1 \endbiblist\fi % Book + \noindent{\sl #1}\beginbiblist + } +\def\bibview#1{\ifnum\enumno>1 \endbiblist\fi % Interview + \noindent{#1}\beginbiblist + } +\def\subbib#1{\hskip-20pt #1\hfill} %Subheading for a bib entry +\def\bibsectitle#1{ %Title of bib section (BOOKS...) + \vskip 8pt plus1pt minus1pt % Skip some space + \hrule % Draw an hrule + {\tenss #1} % Add text in 10pt font + \vglue 10pt plus1pt minus1pt % Skip some more space + } +%=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +% +% File: QUOTE.TEX +% +% Author: Hunter Goatley +% +% Date: August 14, 1991 +% +% Abstract: +% +% This file defines the macros \begindoublequotes and \enddoublequotes, +% which let TeX replace the double-quote character (") with TeX's +% left double-quote and right double-quote. For example: +% +% "This is a test." ---> ``This is a test.'' +% +% The double-quote character is still available via \dq. (\" is still +% treated as the umlaut accent.) +% +% This macro makes a couple of assumptions about the double-quotes: +% +% 1. Double-quotes are assumed to come in pairs. When replacing +% double-quotes, the macro alternates between `` and ''. The only +% exception to this is noted in (2) below. +% 2. A double-quote at the beginning of a paragraph is always treated +% as ``. This correctly handles the case where a quotation is +% continued into a second paragraph: +% +% "This is the first paragraph.\par +% "This is the second paragraph of the same quote." +% +% Normal TeX spacing after `` and '' is maintained by saving and +% restoring the \spacefactor. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% HOW IT WORKS: +% +% The double-quote character (") is made active by \begindoublequotes. +% The " macro keeps track of left-quote/right-quote pairs and inserts +% the appropriate `` and '' in its place. +% +% Each character has a \spacefactor associated with it, which specifies +% the amount of stretch or shrink that a space following the character +% can have. Most characters have a factor of 1000, but some punctuation +% marks have higher spacefactors, most notably the period, which has a +% \spacefactor of 3000. This means the space following a period can +% stretch up to 3 times more than the space after a regular character, +% accounting for the increased space at the end of sentences. +% +% The `` and '' ligatures are assigned \spacefactor's of 0, so that the +% \spacefactor that is applied to the next character is the same as that +% of the character preceding the quotes. Because " has been redefined as +% a macro, any spaces following " are swallowed by TeX. It was necessary +% to have this macro re-insert any needed space so that the following +% cases worked correctly: +% +% "This is a test," she said. --> ``This is a test,'' she said. +% "This is in a list"; etc. --> ``This is in a list''; etc. +% +% Without the added space, the first example becomes: +% +% ``This is a test,''she said. +% +% The solution was to save the current \spacefactor before inserting a +% right double-quote, then resetting the \spacefactor after the +% insertion. The net effect was that the " macro has a \spacefactor +% of 0, which matches the way TeX treats `` and ''. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +{% % Begin a group for which " is active +\catcode`\"=\active % Make " an active character +\catcode`\@=11 % Make @ an active character +% +% \begindoublequotes +% +% This macro makes " an active character, resets the control sequence +% \dblqu@te to L (left), and defines \dq as a replacement for ". +% +\gdef\begindoublequotes{% % \begindoublequotes enables " + \global\catcode`\"=\active % Make " an active character + \global\chardef\dq=`\" % Double-quote char. via \dq + \global\let\dblqu@te=L % Always start with a left double-quote + } % End of macro +% +% Define the macro that will be executed whenever " is encountered. +% +\gdef"{% + % If the double-quote is the first character in a new paragraph, + % make sure it becomes a left double-quote. This case can be + % detected by checking to see if TeX is currently in vertical mode. + % If so, the double-quote is at the beginning of the paragraph + % (since " hasn't actually generated any horizontal mode tokens + % yet, TeX is still in vertical mode). If the mode is vertical, + % set \dblqu@te equal to L. + % + \ifinner\else\ifvmode\let\dblqu@te=L\fi\fi + % + % Now insert the appropriate left or right double-quote. + % + % If \dblqu@te is L, insert a `` and set \dblqu@te to R. + % + \if L\dblqu@te``\global\let\dblqu@te=R% + % + % Otherwise, save the current \spacefactor, insert '', set \dblqu@te + % to L, and reset the original \spacefactor. + % + \else + \let\xxx=\spacefactor % Save the \spacefactor + ''\global\let\dblqu@te=L% % Insert '' and reset \dblqu@te + \spacefactor\xxx % Reset the \spacefactor + \fi % End of \if L\dblqu@te... + } % End of " macro +} % End of group + +\gdef\enddoublequotes{% + \catcode`\"=12 %Set " back to other + } +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Header & Footer Macros +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% These macros implement the headers and footers for the newsletter format. +% The macros accept three parameters: text that is to appear flush-left on +% the line, text that should be centered, and text that should be flush-right +% on the line. Parameters can be omitted by specifying empty braces ({}). +% +% The following macros are defined for headers and footers: +% +% \evenpageheader{LEFT}{CENTER}{RIGHT} +% \oddpageheader{LEFT}{CENTER}{RIGHT} +% \evenpagefooter{LEFT}{CENTER}{RIGHT} +% \oddpagefooter{LEFT}{CENTER}{RIGHT} +% +% If the headers/footers are the same for even & odd pages, the following +% macros can be used instead of the four above: +% +% \pageheader{LEFT}{CENTER}{RIGHT} +% \pagefooter{LEFT}{CENTER}{RIGHT} +% +% Additional header/footer definitions: +% +% \pageheaderlinetrue - A line should extend below header text +% \pageheaderlinefalse - Header does NOT have a line +% \pagefooterlinetrue - A line should extend above footer text +% \pagefooterlinefalse - Footer does NOT have a line +% \headfootrule=Xpt - Thickness of header/footer lines +% \pageheaderskip=Xpt - \vskip between header and line +% \pagefooterskip=Xpt - \vskip between footer and line +% \headfont=\fontname - Font to use for header text +% \footfont=\fontname - Font to use for footer text +% +% Example: +% +% \pageheader{}{My Newsletter}{} +% \pagefooter{October 1989}{}{\pageno} +% +\newif\ifpageheaderline \pageheaderlinefalse % By default, no header line +\newif\ifpagefooterline \pagefooterlinefalse % By default, no footer line +\newdimen\headfootrule \headfootrule=0.50pt % Height of header & footer rule +\newdimen\pageheaderskip \pageheaderskip=4pt % Space between header and rule +\newdimen\pagefooterskip \pagefooterskip=4pt % Space between rule and footer + +\let\headfont=\twelverm \let\footfont=\twelverm % Assign fonts for head/foot + +\def\@pageheader#1#2#3{% + \ifpageheaderline % If headerline + \vbox{\hbox to\normalhsize{{\headfont\rlap{#1}\hss{#2}\hss\llap{#3}}}% + \vskip\pageheaderskip\hrule height\headfootrule}% Do hbox and hrule + \else + {\headfont\rlap{#1}\hss{#2}\hss\llap{#3}} + \fi + } + +\def\@pagefooter#1#2#3{% + \ifpagefooterline + \vbox{\hrule height\headfootrule\vskip\pagefooterskip + \hbox to\normalhsize{\footfont\rlap{#1}\hss{#2}\hss\llap{#3}}}% + \else + {\footfont\rlap{#1}\hss{#2}\hss\llap{#3}} + \fi + } +% +% Define default headers and footers - null lines of text +% +\def\@oddhead{\nullline} \def\@evenhead{\nullline} +\def\@oddfoot{\nullline} \def\@evenfoot{\nullline} + +\def\@newhead{\headline{\ifodd\pageno\@oddhead\else\@evenhead\fi}} +\def\@newfoot{\footline{\ifodd\pageno\@oddfoot\else\@evenfoot\fi}} + +\def\oddpageheader#1#2#3{\@newhead\def\@oddhead{\@pageheader{#1}{#2}{#3}}} +\def\evenpageheader#1#2#3{\@newhead\def\@evenhead{\@pageheader{#1}{#2}{#3}}} +\def\oddpagefooter#1#2#3{\@newfoot\def\@oddfoot{\@pagefooter{#1}{#2}{#3}}} +\def\evenpagefooter#1#2#3{\@newfoot\def\@evenfoot{\@pagefooter{#1}{#2}{#3}}} +% +% If no difference between even and odd pages, just define both to be the same. +% +\def\pageheader#1#2#3{\evenpageheader{#1}{#2}{#3}\oddpageheader{#1}{#2}{#3}} +\def\pagefooter#1#2#3{\evenpagefooter{#1}{#2}{#3}\oddpagefooter{#1}{#2}{#3}} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Command for "poor man's bold": \pmb (use sparingly) +% +\def\pmb#1{\setbox0=\hbox{#1}% % Copy box to box0 + \leavevmode\hbox{% % Make an hbox that holds + \kern-.025em\copy0\kern-\wd0% % Move left 1/4 em and copy box0 + \kern.05em\copy0\kern-\wd0% % Move right 1/4 em and copy it + \kern-.025em\raise.0433em\box0 }} % Raise a little and copy again + +% +% Define dots for ending sentences (4 dots instead of 3) +% +\def\eldots{\mathinner{\ldotp\ldotp\ldotp\ldotp}} +\def\edots{\relax\ifmmode\eldots\else$\m@th\eldots\,$\fi} +\def\ellip{\hskip.2em\ifmmode\ldots\else$\ldots$\fi\hskip.25em} +% +% Define macros \ital and \slant to switch to italic (\it) and slanted (\sl) +% respectively. These macros automatically insert the italic correction +% unless the next character is a period or a comma. Based on the +% \predict macro presented in _TeX for the Impatient_, p. 233. +% +% These macros use \toks0 as a temporary. +% +% The \futurelet\it@next in \ital and \slant defines \it@next to be whatever +% the character following the parameter is. \d@slant checks to see if +% \it@next is a comma or period; if it is neither, the italic correction +% (\/) is included. +% +\def\ital#1{\toks0={#1}\let\slf@nt=\it\futurelet\it@next\d@slant} +\def\slant#1{\toks0={#1}\let\slf@nt=\sl\futurelet\it@next\d@slant} +\def\d@slant{{\slf@nt\the\toks0}% + \ifx\it@next,% % If \it@next not a comma + \else\ifx\it@next.% % ... and is not a period + \else\/% % ... insert the correction (\/) + \fi\fi% % ... + \let\it@next=\relax% % "Undefine" \it@next + } + +\def\book#1{\ital{#1}} %For ease, define \book too +% +% Important - make "@" a valid alphanumeric character again +% +\catcode`\@=12 % Follow TeX's lead on variable names + +\tenpoint % Default point size is 10pt diff --git a/Master/texmf-dist/tex/plain/newsletr/quote.tex b/Master/texmf-dist/tex/plain/newsletr/quote.tex new file mode 100644 index 00000000000..627dc44d627 --- /dev/null +++ b/Master/texmf-dist/tex/plain/newsletr/quote.tex @@ -0,0 +1,119 @@ +% Save file as: QUOTE.TEX Source: FILESERV@SHSU.BITNET +% +% File: QUOTE.TEX +% +% Author: Hunter Goatley +% goathunter@WKUVX1.BITNET +% +% Date: August 14, 1991 +% +% Abstract: +% +% This file defines the macros \begindoublequotes and \enddoublequotes, +% which let TeX replace the double-quote character (") with TeX's +% left double-quote and right double-quote. For example: +% +% "This is a test." ---> ``This is a test.'' +% +% The double-quote character is still available via \dq. (\" is still +% treated as the umlaut accent.) +% +% This macro makes a couple of assumptions about the double-quotes: +% +% 1. Double-quotes are assumed to come in pairs. When replacing +% double-quotes, the macro alternates between `` and ''. The only +% exception to this is noted in (2) below. +% 2. A double-quote at the beginning of a paragraph is always treated +% as ``. This correctly handles the case where a quotation is +% continued into a second paragraph: +% +% "This is the first paragraph.\par +% "This is the second paragraph of the same quote." +% +% Normal TeX spacing after `` and '' is maintained by saving and +% restoring the \spacefactor. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% HOW IT WORKS: +% +% The double-quote character (") is made active by \begindoublequotes. +% The " macro keeps track of left-quote/right-quote pairs and inserts +% the appropriate `` and '' in its place. +% +% Each character has a \spacefactor associated with it, which specifies +% the amount of stretch or shrink that a space following the character +% can have. Most characters have a factor of 1000, but some punctuation +% marks have higher spacefactors, most notably the period, which has a +% \spacefactor of 3000. This means the space following a period can +% stretch up to 3 times more than the space after a regular character, +% accounting for the increased space at the end of sentences. +% +% The `` and '' ligatures are assigned \spacefactor's of 0, so that the +% \spacefactor that is applied to the next character is the same as that +% of the character preceding the quotes. Because " has been redefined as +% a macro, any spaces following " are swallowed by TeX. It was necessary +% to have this macro re-insert any needed space so that the following +% cases worked correctly: +% +% "This is a test," she said. --> ``This is a test,'' she said. +% "This is in a list"; etc. --> ``This is in a list''; etc. +% +% Without the added space, the first example becomes: +% +% ``This is a test,''she said. +% +% The solution was to save the current \spacefactor before inserting a +% right double-quote, then resetting the \spacefactor after the +% insertion. The net effect was that the " macro has a \spacefactor +% of 0, which matches the way TeX treats `` and ''. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +{% % Begin a group for which " is active +\catcode`\"=\active % Make " an active character +\catcode`\@=11 % Make @ an active character +% +% \begindoublequotes +% +% This macro makes " an active character, resets the control sequence +% \dblqu@te to L (left), and defines \dq as a replacement for ". +% +\gdef\begindoublequotes{% % \begindoublequotes enables " + \global\catcode`\"=\active % Make " an active character + \global\chardef\dq=`\" % Double-quote char. via \dq + \global\let\dblqu@te=L % Always start with a left double-quote + } % End of macro +% +% Define the macro that will be executed whenever " is encountered. +% +\gdef"{% + % If the double-quote is the first character in a new paragraph, + % make sure it becomes a left double-quote. This case can be + % detected by checking to see if TeX is currently in vertical mode. + % If so, the double-quote is at the beginning of the paragraph + % (since " hasn't actually generated any horizontal mode tokens + % yet, TeX is still in vertical mode). If the mode is vertical, + % set \dblqu@te equal to L. + % + \ifinner\else\ifvmode\let\dblqu@te=L\fi\fi + % + % Now insert the appropriate left or right double-quote. + % + % If \dblqu@te is L, insert a `` and set \dblqu@te to R. + % + \if L\dblqu@te``\global\let\dblqu@te=R% + % + % Otherwise, save the current \spacefactor, insert '', set \dblqu@te + % to L, and reset the original \spacefactor. + % + \else + \let\xxx=\spacefactor % Save the \spacefactor + ''\global\let\dblqu@te=L% % Insert '' and reset \dblqu@te + \spacefactor\xxx % Reset the \spacefactor + \fi % End of \if L\dblqu@te... + } % End of " macro +} % End of group + +\gdef\enddoublequotes{% + \catcode`\"=12 %Set " back to other + } -- cgit v1.2.3