summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/plain/newsletr
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-12 23:46:46 +0000
committerKarl Berry <karl@freefriends.org>2006-01-12 23:46:46 +0000
commitb1c871653d37d9c6fd0f97b048dca051b5b1db27 (patch)
tree3f925e95aa3461b9ecb75df861259a7f71bc3f23 /Master/texmf-dist/tex/plain/newsletr
parent82770e7491344072d5dd54ce9a78546eebe99c3f (diff)
trunk/Master/texmf-dist/tex/plain
git-svn-id: svn://tug.org/texlive/trunk@621 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/plain/newsletr')
-rw-r--r--Master/texmf-dist/tex/plain/newsletr/italic.tex38
-rw-r--r--Master/texmf-dist/tex/plain/newsletr/lodriver.tex57
-rw-r--r--Master/texmf-dist/tex/plain/newsletr/newsletr.tex1453
-rw-r--r--Master/texmf-dist/tex/plain/newsletr/quote.tex119
4 files changed, 1667 insertions, 0 deletions
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
+ }