summaryrefslogtreecommitdiff
path: root/macros/plain/contrib/newsletr
diff options
context:
space:
mode:
Diffstat (limited to 'macros/plain/contrib/newsletr')
l---------macros/plain/contrib/newsletr/README1
-rw-r--r--macros/plain/contrib/newsletr/italic.tex37
-rw-r--r--macros/plain/contrib/newsletr/lodriver.tex56
-rw-r--r--macros/plain/contrib/newsletr/losample.tex379
-rw-r--r--macros/plain/contrib/newsletr/newsletr.tex1465
-rw-r--r--macros/plain/contrib/newsletr/newsletr.txt133
-rw-r--r--macros/plain/contrib/newsletr/newssamp.dvibin0 -> 12288 bytes
-rw-r--r--macros/plain/contrib/newsletr/newssamp.pdfbin0 -> 55591 bytes
-rw-r--r--macros/plain/contrib/newsletr/newssamp.tex266
-rw-r--r--macros/plain/contrib/newsletr/quote.tex118
-rw-r--r--macros/plain/contrib/newsletr/read.me85
-rw-r--r--macros/plain/contrib/newsletr/sample.dvibin0 -> 17920 bytes
-rw-r--r--macros/plain/contrib/newsletr/sample.pdfbin0 -> 95640 bytes
13 files changed, 2540 insertions, 0 deletions
diff --git a/macros/plain/contrib/newsletr/README b/macros/plain/contrib/newsletr/README
new file mode 120000
index 0000000000..3ce516d7db
--- /dev/null
+++ b/macros/plain/contrib/newsletr/README
@@ -0,0 +1 @@
+read.me \ No newline at end of file
diff --git a/macros/plain/contrib/newsletr/italic.tex b/macros/plain/contrib/newsletr/italic.tex
new file mode 100644
index 0000000000..de8459deca
--- /dev/null
+++ b/macros/plain/contrib/newsletr/italic.tex
@@ -0,0 +1,37 @@
+%
+% File: ITALIC.TEX
+%
+% Author: Hunter Goatley
+% goathunter@goatley.com
+%
+% 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/macros/plain/contrib/newsletr/lodriver.tex b/macros/plain/contrib/newsletr/lodriver.tex
new file mode 100644
index 0000000000..9c63879c39
--- /dev/null
+++ b/macros/plain/contrib/newsletr/lodriver.tex
@@ -0,0 +1,56 @@
+%
+% 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 1234\relax}
+\def\CityState{Nowhere, NA\relax}
+\def\ZipCode{12345-6789\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/macros/plain/contrib/newsletr/losample.tex b/macros/plain/contrib/newsletr/losample.tex
new file mode 100644
index 0000000000..a92a7c3af7
--- /dev/null
+++ b/macros/plain/contrib/newsletr/losample.tex
@@ -0,0 +1,379 @@
+%% TITLE.TEX %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begingroup
+\font\HUGE=cmss17 %scaled\magstep2
+
+\pageheader{}{}{}
+\pagefooter{}{}{}
+
+\setbox0=\vbox{\hsize=2.25in
+ \vskip4.25in
+ {\baselineskip=21pt
+ \centerline{\HUGE Vol.\ 1\ \ No.\ 4}
+ \centerline{\HUGE June 1990}
+ }
+ }
+
+\vbox to9in{\unvbox0
+
+\vskip 1.75in
+\vfil
+\vbox{\hbox to\hsize{\hfill
+\leftshadowbox{
+ \hsize=6in
+ \vsize=1.75in
+ \vbox to\vsize{
+ \vfil
+ {\baselineskip=19pt
+ \centerline{\HUGE Inside This Issue:}
+ }
+ \vfil
+ \centerline{$\bullet$\ "The State of Where," by \RRM}
+ \centerline{$\bullet$\ An interview with Jeffrey Sackett, by Hunter Goatley}
+ \centerline{$\bullet$\ Interviews with Al Sarrantonio and Kazue Tanaka,
+ by \RRM}
+ \centerline{$\bullet$\ A letters column}
+ \centerline{$\bullet$\ Reports on NECON X and the 1990 WFC}
+ \centerline{$\bullet$\ A Joe R. Lansdale update}
+ \centerline{$\bullet$\ News of \McC's new novel \book{Boy's Life}}
+ \vfil
+ }}
+\hfill}
+\vfil
+}} % End of \vbox
+
+\eject
+\endgroup
+
+%% EDITORIAL.TEX %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Lights Out! Vol. 2 No. 1
+% Editorial page
+%
+\newbox\edboxone \newbox\edboxtwo % \newbox\edbox3 \newbox\edbox4
+\newdimen\edcolwidth
+
+%
+%\edcolwidth=\pagewidth
+%\advance\edcolwidth by -\wd\edboxone
+%\advance\edcolwidth by -\columnsep
+%\advance\edcolwidth by -\columnsep
+%
+%\setbox\edboxtwo=\vbox to 9in{\hsize\edcolwidth
+%%{\hsize 4in
+\articletitle{"And Now, the End Is Near\edots"}{A Look at the Future by Hunter
+Goatley}
+
+\begincolumns{2}
+\ninepoint \rm
+
+\noindent
+Well, once again, finally! As you all know, I think,
+this issue has been delayed because my family and I moved again, this
+time from Knoxville to Bowling Green, KY. Again, I appreciate your
+patience and understanding.
+
+Each time I go to press, the issue seems to change from what I originally
+intended. I've been telling you for awhile that this issue would feature a new
+McCammon short story---well, it doesn't. It does, however, have an essay
+entitled "The State of Where," written by \McC\ exclusively for \LO\ \ The
+essay describes where McCammon is in his career, and where he's going. I think
+you'll find it interesting.
+
+Now the bad news. As you probably gathered from the title above, I'm
+extinguishing the lights on \LO\ \ Despite my best efforts, finding the time to
+devote to the newsletter is becoming more and more difficult.
+The fact that I've only been able to do three
+issues in the last 13 months shows that something's not right.
+There are several reasons that I won't be able to keep up \LO:
+
+\beginlist\parindent=18pt
+\item{1.)} Production costs have steadily risen as I've moved around the
+ country. The last issue and this one were more expensive than
+ the previous three issues had been; in fact, much of the
+ subscription renewals went to pay for those issues. I also
+ severely
+ over-estimated the growth of \LO---the renewals since June
+ will not cover the cost of four more issues; more on that in
+ a minute.
+\item{2.)} I \slant{like} my job now. In the beginning, \LO\ was a
+ much-needed diversion from a programming job that had become
+ unbearable---only I didn't realize it at the time. Now that
+ I'm out of the "hell-job," I find myself less willing to spend
+ my free time working on \LO
+\item{3.)} I've been stepping up my writing for the technical journal
+ \book{VAX Professional}. Since 1986 I've written 16 articles
+ for them; this year I'm to start a series of programming
+ articles that will probably be published as a book.
+\item{4.)} I'm going to be teaching some programming classes this fall at
+ Western Kentucky University.
+\item{5.)} And most importantly, my almost-two-year-old daughter Margaret
+ wants---and should have---more
+ time to spend with Daddy. Lately, between work and \LO\ she
+ and Dana have had to spend too much time without me---and vice
+ versa.
+\endlist
+
+Since renewals have been lower than anticipated and new subscriptions have been
+virtually non-existent, I cannot afford to publish four more issues of
+\LO---instead of offering refunds, I've decided that there will be one more
+issue of \LO\ sometime later this year. This special issue will be longer than
+previous issues and will be available to \slant{current subscribers only}.
+Book dealers will not be selling them and I won't have any extra copies for
+sale.
+
+Rick McCammon has been a joy to work with, and when I told him of my plans
+to discontinue \LO\ he offered to help me make the last issue very special
+for you. Therefore, the next and final issue of \LO\ will feature not one,
+but \slant{two} excerpts from abandoned \RRM\ novels!
+
+Though Rick once told me that he would never show \book{The Address} to anyone,
+he has volunteered to let me publish what he had written at the time he shelved
+the book. That's about 50 manuscript pages. Rick is also providing me with the
+beginning of \book{The Midnight Man}, a novel he started last year. In addition,
+the issue will feature a brand-new interview with Rick, where we'll discuss
+\book{Boy's Life} and more about Rick's plans for the future. I'll be driving
+to Birmingham in March or April to sit down and talk with Rick, so if you have
+any questions you want me to ask him, please send them soon.
+
+As you can see, I'm planning for \LO\ to go with a {\ss BANG!} And since the
+next issue is for current subscribers only, there won't be very many copies.
+I've got plenty of back issues of issues 2 and 3 sitting around being a fire
+hazard; if you'd like extra copies of those issues, send \$1 for each copy and
+I'll mail them out immediately. The \$1 will cover postage and the envelope(s).
+There are no limits, except that the offer is available only to current
+subscribers. I still have some of issues 1 and 4, but I'm not sure how many;
+let me know if you want those issues and I'll include them as long as they last.
+Please send all correspondence to the address at the bottom of this page. And
+thanks for your patience---the last issue will be out this summer.
+
+\vskip.5\baselineskip \hrule \vskip.5\baselineskip
+{\eightpoint\ss\noindent
+On the cover: the artwork for McCammon's upcoming novel, \book{Boy's Life},
+and a magazine illustration accompanying a Japanese translation of "The Thang."
+\eoa}
+\endcolumns
+
+
+\vfill
+
+\setbox0=\vbox to 1.25in{\hsize=125pt%
+ \vfil\elevenpoint
+ \centerline{\bf Lights Out!}
+ \vfil\hrule\vfil
+ \centerline{The}
+ \centerline{\RRM}
+ \centerline{Newsletter}
+ \vfil \hrule \vfil\ninepoint
+ \line{Vol.~2\ \ No.~1\hfill February 1991\hskip2pt}
+ \vfil
+ }
+
+\setbox1=\vbox to 1.25in{\hsize=120pt%
+ \vfil\vfil
+ \centerline{\ss Published by:}
+ \centerline{\bf Hunter Goatley}
+ \vfil \hrule \vfil
+ \centerline{\LO}
+ \centerline{\POBox}
+ \centerline{\CityState}
+ \centerline{\ZipCode}
+ \vfil\vfil
+ }
+
+\setbox2=\vbox to 1.25in{\hsize=120pt%
+ \vfil\noindent\eightpoint\ss\parindent=6pt\narrower
+ Thanks to Paddy McKillop, Jodi Strissel, Paul Schulz, Adam Rothberg,
+ \& you.
+ Thanks especially to Jeffrey Sackett, Kazue Tanaka, Al Sarrantonio,
+ Joe Lansdale, and Rick \& Sally McCammon.
+ Incredibly special thanks to Dana \& Margaret Goatley!
+ % for putting up with me!
+ \par
+ \vfil}
+
+\setbox3=\vbox to 1.25in{\hsize=125pt%
+ \vfil\noindent\eightpoint\ss\leftskip=6pt
+ This newsletter was typeset on a Digital VAX 6320, using the \TeX\
+ typesetting system developed by Donald~E. Knuth.
+ \par
+ \vfil \hrule \vfil
+ \noindent\smallcopyright\ 1991 by Hunter Goatley. All rights reserved.
+ Permission to reprint required.\par
+ \vfil}
+
+
+\setbox\edboxone=\vbox{\hbox{\box0\vrule\box1\vrule\box2\vrule\box3}}
+
+\setbox\edboxone=\vbox to1.5in{
+ \boxitspace=6pt
+ \vfill
+ \boxit{\unvbox\edboxone}
+ \vfill
+ }
+
+\box\edboxone
+
+\eject % Force a page break
+
+%% KAZUE.TEX %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% TeX file: KAZUE.TEX
+%
+% Desc: Interview with Kazue Tanaka, by Robert R. McCammon
+%
+% Interview Date: 03-NOV-1990
+% Transcription Date: 24-NOV-1990
+%
+\articletitle{Interview: Kazue Tanaka}{Conducted by \RRM; transcribed by Hunter Goatley}
+
+\begincolumns{2}
+\definefigs{2} % Define figures for up to 7 pages
+
+%\definefig{2}{2}{top}{\Certo}
+
+%\definefig{3}{2}{middle}{\Quote{%
+% I think it's a challenge to see the world
+% through different eyes. And I think that's what writing, in a way, is
+% all about.\qRM}}
+
+%\handlefigures
+%
+% "RM:" in 10pt roman is 22.xx pts wide, so let's put these things in boxes
+% that size with about 5pts whitespace following them.
+%
+\def\RM:{\vskip6pt\noindent\hbox to27pt{\bf RM:\hfil}}
+\def\KT:{\vskip6pt\noindent\hbox to27pt{\bf KT:\hfil}}
+
+
+\ednote{Ms.~Kazue Tanaka is a Japanese writer/translator who has translated
+\RRM's stories from \book{Night Visions IV} into Japanese. The following
+interview was conducted at the 1990 World Fantasy Convention, where Ms.~Tanaka
+finished up a month-long visit to the United States. Ms.~Tanaka is currently
+at work translating \McC's 1981 vampire epic, \book{They Thirst}.
+%\hfill\break\vskip-12pt
+}
+
+\RM: I'd like to know how you go about translating, say, one of my books.
+Do you read the book first?
+
+\KT: Yes. Usually I read the book a couple of times and then I start
+translating. Maybe you know that we have a completely different grammatical
+diction from English, so we can't put a word in the same order in Japanese.
+Usually I read a sentence and grasp the meaning of it and reconstruct it in
+Japanese.
+
+\RM: I would think that would be very difficult to do.
+
+\KT: It is!
+
+\RM: I'm sure it is, because there's such a great difference in the grammatical
+form. You have to be very careful, I guess, in terms of reading in English and
+translating to Japanese. That seems to me to be very difficult. How did you
+train to do this?
+
+\KT: Usually we have some kind of mentor or teacher.
+
+\RM: Were you like an apprentice, and someone teaches you to do this?
+
+\KT: Yes. We put the original stories [beside] the translations and compare
+the sentences.
+
+\RM: How long would it take you to translate \book{They Thirst}?
+
+\KT: It depends on how long the story is. \book{They Thirst} will take at
+least three months. How long did it take you to write~it?
+
+\RM: Well, it took about six or seven months to write.
+
+\KT: Maybe I'll need that kind of time, too!
+
+\RM: But it's almost like, if you're interpreting, you're almost doing some
+writing yourself. If you're making something more concise, or---do you do that?
+Are you abridging? Do you think anything gets changed in the translation?
+
+\KT: We try not to change, but sometimes a little change is necessary. We
+don't have some things that you have here in America. For instance, some brand
+names. We don't have the culture of your country, and the Japanese readers
+don't know if I translated correctly, but it is impossible for Japanese readers
+to understand that culture. Maybe, in that case, things get changed sometimes.
+
+\RM: Do you feel that you interpret the story more so your countrymen can
+understand what's going on in the book? Do you think you add more of your
+culture to the story?
+
+\KT: Basically, we don't add anything, we don't take away anything. But in
+that case, we explain [the cultural differences] after the story in an
+afterword.
+
+\RM: How many books have you translated?
+
+\KT: Maybe twelve, or something. Among them, \book{Brain Child}, by John Saul,
+and some mysteries. I'm going to translate some stories of Orson Scott Card's.
+
+\RM: I think it would be very interesting, if I could read Japanese, to read my
+book and see what the changes are. Or how it's geared toward that culture.
+
+\KT: Conversation---when people talk---is very difficult to put
+into Japanese. If the character is a woman, a man, a boy, or a girl, Japanese
+has a very distinctive way of speaking. Especially between a man and woman.
+English does not have as much difference.
+
+\RM: Well, that's fascinating. I think it would be a very tough thing to
+do---to translate something into an entirely different culture and still have
+the flavor of the American version, at least. I wouldn't want to do it---I
+don't think I could do it very well.
+
+\KT: Your stories are very American---that may be why they appeal to Japanese
+readers.
+
+\RM: Really? I was going to ask you why my stories appeal---if they do
+appeal---to Japanese readers. Well, first, I didn't know that horror fiction
+was so popular in Japan. Is it? Is it becoming more popular? What do you
+think the situation is?
+
+\KT: Your [novels] have not been translated at all yet. So, apart from you,
+Stephen King and Dean~R. Koontz are very popular---they are as popular as
+other big writers. Other horror writers are not so well-known. Some very keen
+fans like American horror.
+
+\RM: Why do you think that is? King and Koontz are definitely very American
+writers. Do you think that's their appeal---the American style?
+
+\KT: Yes, I do.
+
+\RM: Not necessarily because of the story being told, but because maybe it's
+told in an American voice?
+
+\KT: Yes, sometimes. I'm still trying to [learn] the American voice---it's
+very hard to do.
+
+\RM: Well, I know that's very tough to do, and I'm looking forward to seeing
+the books when they are translated.
+
+\KT: I'm looking forward to it too!\eoa
+
+\endcolumns
+
+%% NEXTTIME.TEX %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\vfill
+
+\begingroup
+\font\HUGE=cmss17 %scaled\magstep2
+\setbox0=\vbox{\hsize=5in
+ \twelvepoint\ss\noindent%
+ The final issue of \LO\ will feature excerpts from \RRM's unpublished
+ novels \book{The Address} and \book{The Midnight Man}, a brand-new
+ interview with \McC\ about \book{Boy's Life}, more author
+ interviews, and the latest news! Coming Summer 1991!
+ \vfill%
+ }
+
+\centerline{\shadowbox{\vbox to 1in{%
+ \hsize=6in
+ \vfil
+ \offinterlineskip
+ \noindent\hfil\box0\hfil
+ \vfil
+ }}}
+
+\endgroup
diff --git a/macros/plain/contrib/newsletr/newsletr.tex b/macros/plain/contrib/newsletr/newsletr.tex
new file mode 100644
index 0000000000..c2c012072d
--- /dev/null
+++ b/macros/plain/contrib/newsletr/newsletr.tex
@@ -0,0 +1,1465 @@
+ \def\IDENT{01-016}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Copyright 1989--2004 by Hunter Goatley.
+%
+% Permission is granted to anyone to use this software for any purpose
+% on any computer system, and to redistribute it freely, subject to the
+% following restrictions:
+%
+% 1. This software is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+%
+% 2. Altered versions must be plainly marked as such, and must not be
+% misrepresented as being the original software.
+%
+% End
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% 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
+% E-mail: goathunter@goatley.com
+%
+% 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-016 Hunter Goatley 22-JAN-2004 09:23
+% Changed the license for the code to make it truly free.
+%
+% 01-015 Hunter Goatley 28-JAN-2001 15:45
+% I'm back! Eliminate undesired whitespace in header and
+% footer macros.
+%
+% 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-2004, Hunter Goatley}
+
+\everyjob{\say{TeX Newsletter version \IDENT. Copyright 1989-2004, 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
+\def\story#1{``#1''} %Short story title (add quotes)
+%
+% 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/macros/plain/contrib/newsletr/newsletr.txt b/macros/plain/contrib/newsletr/newsletr.txt
new file mode 100644
index 0000000000..6badec3a08
--- /dev/null
+++ b/macros/plain/contrib/newsletr/newsletr.txt
@@ -0,0 +1,133 @@
+ Help for NEWSLETTER_FORMAT.TEX
+ Hunter Goatley
+ August 21, 1991
+
+\newspage - Sets up larger page for newsletter (taller/wider)
+\DATE - Include current month and year (July 1989)
+\include{file.ext} - Include a .TeX file (prints message)
+\say{Message} - Writes a message to the terminal
+\newpage - Begin a new page
+\nullpage - Creates an empty page with header/footer in place
+\nullline - Creates an empty line
+
+\ignoreunderfill - Avoids undervfill and underhfill messages
+
+\articlesep - Article separator; creates hrule = \hsize
+
+\ital{text} - Set in \it font (with proper italic correction)
+\slant{text} - Set in \sl font (with proper italic correction)
+\book{Title} - Book titles (uses \ital)
+
+\Quote{quote}{quotee} - Insert a quote with the quotee in small caps font
+\beginquote - Begins a quote; draws hrule, indents, larger font
+\endquote - Ends a quote; resets font to original size
+
+\articletitle{Title}{Byline}
+ - Builds an articletitle box (see example)
+\coltitle{Title} - Builds boxed title for use in double-column format
+
+\headfootrule=Xpt - Define height of rule in header & footer
+\columnsep=Xpt - Amount of space between columns in multi-column mode
+\columnwidth=Xpt - Width of a column in multi-column mode (calc. by def.)
+\columnseprule=Xpt - Width of vertical rule between columns (can be 0pt)
+\begincolumns{x} - Begins multiple-column mode (1 < X < 7)
+\endcolumns - Ends multiple-column mode
+
+\definefigs{#ofPages} - Initializes figures for multi-column mode
+\handlefigures - Must be specified right after \definefigs (bug)
+\definefig{Page}{Col}{Pos}{box}
+ - Defines a figure
+\abovedisplayskip - Amount of vskip before middle and bottom figures
+\belowdisplayskip - Amount of vskip below top and middle figures
+
+\shadowbox{some_box} - Draw a shadow box around an hbox or vbox
+\leftshadowbox{somebox} - Draw a left-hand shadow box around an hbox or vbox
+\centerbox{somebox} - Center a \vbox on a page
+\boxshadowsize=Xpt - Width of shadow boxes
+\boxit{some_box} - Draw a box around an hbox or vbox
+\boxitrule=Xpt - Width of rules used to draw boxes
+\boxitspace=Xpt - Space between box rules and box contents
+\bestbreak - Tell TeX that this is a pretty good place to break
+\ednote - Do editor's note in a box
+
+\listindent - Specify the amount to indent lists
+\beginlist - Begin a simple list of dotted items
+\endlist - End item list
+\beginlistt{title} - Begin list with a title (attached with vglue)
+\endlistt - End list with title (ends with \par)
+\dotitem - Item list with a bullet
+
+\beginbibliography - Begin a bibliography - main setup
+\endbibliography - End a bibliography
+\beginbiblist - Begin a list of references
+\beginanotherlist - Begin a dotitem list inside a \beginbiblist
+\endbiblist - End a bibliography list of references
+\ENUM item - Number items in a list
+\ENum item - Don't number, but indent as if number is present
+\NoENUM item - Don't number; start text where number would appear
+\bibshort{Title} - Short story entry
+\bibbook{Title} - Book entry
+\bibview{The...} - Interview entry
+\subbib{Subheading} - Subtitle for an entry
+\bibsectitle{title} - Adds a bibliography section title (BOOKS, etc.)
+
+\begindoublequote - Enable double-quote as a macro
+\enddoublequote - Disable double-quote as a macro
+" - Alternates between `` and ''
+\eoa - End of Article; draws black rectangle at right of line
+\smallcopyright - Insert a small (7pt) copyright character
+\farright{text} - Place text flush against the right-margin, possibly
+ on a new line if it won't fit.
+\ellip - Insert ellipsis with proper spacing (word\ellip word)
+\edots - Insert ellipsis at end of sentence (4 dots)
+
+The font commands below redefine \sl, \it, \bf, \rm, \ss, and \ssi for that font
+
+\twelvepoint - Switch to twelve-point fonts
+\elevenpoint - Switch to eleven-point fonts
+\tenpoint - Switch to ten-point fonts
+\ninepoint - Switch to nine-point fonts
+\eightpoint - Switch to eight-point fonts
+
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+ 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{#1}{}{\pageno}
+
+ Defaults:
+
+ \pageheaderlinefalse \pagefooterlinefalse
+ \pageheaderskip=4pt \pageheaderskip=4pt
+ \pageheader{}{}{} \pagefooter{}{}{}
+
diff --git a/macros/plain/contrib/newsletr/newssamp.dvi b/macros/plain/contrib/newsletr/newssamp.dvi
new file mode 100644
index 0000000000..ffe973b213
--- /dev/null
+++ b/macros/plain/contrib/newsletr/newssamp.dvi
Binary files differ
diff --git a/macros/plain/contrib/newsletr/newssamp.pdf b/macros/plain/contrib/newsletr/newssamp.pdf
new file mode 100644
index 0000000000..f7ab43a34b
--- /dev/null
+++ b/macros/plain/contrib/newsletr/newssamp.pdf
Binary files differ
diff --git a/macros/plain/contrib/newsletr/newssamp.tex b/macros/plain/contrib/newsletr/newssamp.tex
new file mode 100644
index 0000000000..e0af4e8250
--- /dev/null
+++ b/macros/plain/contrib/newsletr/newssamp.tex
@@ -0,0 +1,266 @@
+%
+% File: NEWSLETTER_SAMPLE.TEX
+%
+% Functional description:
+%
+% This file is a sample TeX file to demonstrate the functionality of the
+% NEWSLETTER_FORMAT macros.
+%
+% It depends on the file NEWSLETTER_FORMAT.TEX.
+%
+% Author: Hunter Goatley
+%
+% Date: August 15, 1991
+%
+\ifx\undefined\eoa\input newsletr \fi % Include macro definitions
+\say{Producing sample newsletter}
+%
+% Define the page headers and footers. Different for even/odd pages.
+%
+\pageheaderlinetrue \pagefooterlinetrue
+\evenpageheader{}{Goat Droppings!}{}
+\oddpageheader{}{My Newsletter}{}
+\evenpagefooter{August\ 1991}{}{Page\ \folio}
+\oddpagefooter{Page \folio}{}{Vol.\ 1\ \ No.\ 1}
+
+\begindoublequotes % Handle double quotes
+
+\ignoreunderfill % Ignore undervfill errors
+\parskip=0pt % Don't skip between paragraphs
+\parindent=18pt % Indent paragraphs 18pt
+\rm % Use tenpoint roman
+
+%
+% Define a few commands to make typing easier.
+%
+\def\RRM{Robert~R. McCammon}
+\edef\TeX{\TeX\null}
+\def\LaTeX{{\rm L\kern-.36em\raise.3ex\hbox{\quoteefont a}\kern-.15em
+ T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}
+%
+% Now define a short verbatim, which can be used for short strings:
+%
+\def\cmd#1{{\tt\string#1}}
+
+%
+% Setup for newsletter page (a little taller and wider, with increased
+% \tolerance, etc.)
+%
+\newspage
+
+%\nullpage % Null page w/ head/foot
+
+%
+% Now start the first article. Do the article in double-column format.
+%
+% The title and by-line are written in a double-box.
+%
+\articletitle{Using \TeX\ to Do A Newsletter}{By Hunter Goatley}
+
+\begincolumns{2} % Begin double-columns
+
+%
+% Reserve boxes for up to 3 pages of figures.
+%
+\definefigs{3}
+
+%
+% Define a quote as a figure in the middle of column 2 on page 1 of this
+% article.
+%
+\definefig{1}{2}{middle}{\Quote{%
+ Nothing beats \TeX\null. Nothing.}{Hunter Goatley}}
+%
+% Now do one that extends across the whole page.
+%
+\definefig{2}{0}{top}{\hsize=\normalhsize%
+\vbox{\centerline{\shadowbox{%
+ \hsize=5in
+ \vsize=.5in
+ \vbox to\vsize{
+ \vfill
+ \centerline{This is inside a \cmd{\shadowbox}.}
+ \vfill
+ } %End vbox
+ } %End shadowbox
+ }} %End vbox
+ \vskip12pt
+ \centerline{This is a figure across the whole page.}
+ } %End definefig
+
+\handlefigures % Necessary, but shouldn't be.
+\noindent
+This document attempts to describe how my plain \TeX\ newsletter format works.
+The documentation is sparse, but I hope to let it speak for itself through
+the use of examples. Will they be meaningful examples? Probably not. But,
+hey, I'll give it a shot.
+
+I started producing {\it Lights Out!---The \RRM\ Newsletter\/}
+in June 1989. For those who don't know, \RRM\ is a very popular author whose
+books have primarily been categorized in the horror genr\'e. His latest,
+\book{Boy's Life}, was published in hardcover by Pocket Books in August 1991.
+\book{Boy's Life} is {\sl not\/} horror---it's a wonderful tale of how 1964
+looked to a 12-year-old boy. There's a mystery, but the book is primarily
+about remembering life when you were young. I urge you to find the book and
+give it a try. Here are quotes from a couple of reviews of McCammon's previous
+novel, \book{Mine}:
+
+%
+% A sample \dotitem'ed list.
+%
+\bgroup % Start a new group to keep \listindent local
+\listindent{10pt}\beginlist
+\dotitem "\book{Mine} grips you tightly by the throat, right at the
+ start, and squeezes\edots" \farright{---\book{The New York Daily
+ News}}
+\dotitem "McCammon at his very best\ \dots\ and then some."
+ \farright{---\book{The Birmingham News}}%
+\endlist
+\egroup
+
+\noindent % Don't indent the paragraph after the quotes.
+Well, enough about \RRM. Even if you don't like horror, I think you'll like
+McCammon's work. Other titles include \book{Swan Song}, \book{Blue World},
+and \book{Mystery Walk}.
+
+I'll now break and we'll start a new sub-article under this main
+article. I used this approach in a regular column entitled "Things Unearthed,"
+which consisted of various news items about new book releases and other
+news items.
+
+%
+% Begin a new sub-article. \coltitle draws a box around the title. This
+% one has two centered lines, with a box around it.
+%
+\articlesep
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\coltitle{\centerline{Why I Chose \TeX\ Over}\break
+ \centerline{Ventura and PageMaker}}
+
+When I decided I was going to start producing a newsletter, I started looking
+at the options I had available to me. Because I'm a VAX systems programmer,
+I preferred to use something on the VAX. I had had some exposure to \TeX\ and
+knew that it would do the job, but I thought I'd look at PC-based choices.
+
+I played around with PageMaker some, and read about Ventura---and decided that
+they were way too clumsy to do what I wanted. I liked the fact that \TeX\ used
+regular text files with embedded commands---I could use the editor I was
+accustomed to, \TeX\ was available for a variety of platforms, and \TeX\ was
+incredibly flexible.
+
+So I decided on \TeX, I had to decide if I was going to use \TeX\ or \LaTeX.
+But that's another sub-article.
+
+\articlesep % Line to separate arts
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\coltitle{\centerline{Why I Chose Plain \TeX}\break % Column title box
+ \centerline{Instead of \LaTeX}}
+
+I had originally intended to use \LaTeX, because that's what the technical
+writing group of my employer-at-the-time was using to produce their manuals.
+I knew that I wanted multiple columns and to be able to switch back and forth
+between single- and double-columns on the same page at will. After trying
+many variations of the \LaTeX\ double-column style, I finally decided I
+couldn't easily do it. (This was before Frank Mittelbach's \LaTeX\ macros
+appeared in {\it The TUGboat\/}.)
+
+So, once I decided on \TeX, I decided I better learn about \TeX\ so I could
+write my own macros. Two years later, I still modify the file some, but it
+has been lots of fun and I learned a whole lot about \TeX.
+
+I've since learned that, apparently, not many people use plain \TeX.
+Personally, I don't know why everybody flocks to \LaTeX---plain \TeX\ is
+so much more flexible. It is true that you need a default set of macros
+to get you going, but once they're there, I believe \TeX\ is actually
+easier to use than \LaTeX.
+
+An aside here: if you haven't seen \book{\TeX\ for the Impatient}, by Paul~W.
+Abrahams, I strongly recommend a copy. It's a great reference book for
+plain \TeX, and his {\tt eplain.tex} (Extended Plain \TeX) provides some
+very useful macros. It was published last year by Addison-Wesley.
+
+\articlesep
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\coltitle{\centerline{Some of the Highlights}\break
+ \centerline{of the Newsletter Format}}
+
+There are variety of commands provided by my newsletter format. Because
+{\it Lights Out!\/} covered a horror author, some of the commands are
+specifically designed to handle books and interviews. While I was developing
+the format, I tried to make sure that I kept things as generic as possible
+so that it could be used to generate other newsletters. It remains to be
+seen if whether or not I was successful.
+
+%The next page features a list of some of the commands that are available
+%and how they're used.
+
+I've included the commands \cmd{\twelvepoint}, \cmd{\elevenpoint},
+\dots, \cmd{\eightpoint} to change font sizes. I didn't do these
+the "official" \TeX\ way (font families) out of laziness. To get the
+eight-point font {\tt cmss8} you simply type: \cmd{\eightpoint\string\ss},
+probably within a group.
+
+My multiple columns command supports up to 6 columns on a page. When you
+increase the number of columns on a page, you usually need to change
+the font size (for three columns, I switched to the {\tt cmss8} font---it
+seemed to work out OK because the sans serif font helped differentiate
+between the "Letters" column and the rest of the newsletter).
+
+One of the things that seems to be hardest in \TeX---especially when multiple
+columns are involved---is the insertion of figures. I like things to be
+very structured---the mathematical side of me, I guess---so when I added
+figure support to my macros, I did it by setting up my multiple column
+output routine to place figures in certain locations on a page. You can
+specify that a figure is inserted across the entire page at the top and
+bottom of the page, or at the top, middle, or bottom of each column.
+Here comes the really kludgy part of my format.
+
+The macro \cmd{\definefigs} must be executed to tell \TeX\ how many pages
+are following that may contain figures. What happens is that a large block
+of boxes is allocated. I tried various combinations to make it more dynamic,
+but had little luck. Because of time constraints, I went with the way that
+worked. This shouldn't really cause a problem, because you define figures
+within an article, and most articles aren't so long that you exceed the number
+of boxes \TeX\ has. The command to define a figure is:
+\vskip\baselineskip
+\centerline{\cmd{\definefig\string{Page\string}\string{Column\string}%
+ \string{Position\string}\string{Box\string}}}
+\vskip\baselineskip
+where \cmd{Box} is a \cmd{\vbox} containing your figure. This can be an empty
+\cmd{\vbox} \cmd{\vfill}'ed to the correct size for later pasting. The quote
+on the previous page was inserted with a \cmd{\Quote} as the argument to
+the \cmd{\definefig} command.
+
+That's all I'm going to say about the commands for now. Notice that when
+you end the double columns, they are automatically balanced.\eoa
+
+\endcolumns % End of double columns
+
+
+\articlesep % Separate the articles w/ rule
+
+%
+% Now do another article in single column format.
+%
+\articletitle{This Is Another Article}{By Me, Of Course}
+
+\begincolumns{3}
+
+This is more just to show that you can also do three-columns on the same page
+with single- and double-column formats without \TeX\ complaining about it.
+I hope this example has been of some use to you.
+
+Note that balancing these columns still has a few glitches---but nothing adding
+or subtracting a few words won't fix. I've been using this format to generate
+five newsletters so far.
+
+\endcolumns
+
+\articlesep
+
+This is more just to show that you can keep both single-, double-, and
+triple-column formats on the same page. \TeX\ won't complain about it
+at all (usually).\eoa
+
+
+\bye
diff --git a/macros/plain/contrib/newsletr/quote.tex b/macros/plain/contrib/newsletr/quote.tex
new file mode 100644
index 0000000000..79aa2a5430
--- /dev/null
+++ b/macros/plain/contrib/newsletr/quote.tex
@@ -0,0 +1,118 @@
+%
+% File: QUOTE.TEX
+%
+% Author: Hunter Goatley
+% goathunter@goatley.com
+%
+% 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
+ }
diff --git a/macros/plain/contrib/newsletr/read.me b/macros/plain/contrib/newsletr/read.me
new file mode 100644
index 0000000000..b500c4741d
--- /dev/null
+++ b/macros/plain/contrib/newsletr/read.me
@@ -0,0 +1,85 @@
+ NEWSLETR - A newsletter format for Plain TeX
+ Hunter Goatley
+ January 22, 2004
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Copyright 1989--2004 by Hunter Goatley.
+%
+% Permission is granted to anyone to use this software for any purpose
+% on any computer system, and to redistribute it freely, subject to the
+% following restrictions:
+%
+% 1. This software is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+%
+% 2. Altered versions must be plainly marked as such, and must not be
+% misrepresented as being the original software.
+%
+% End
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+NEWSLETR is a file of plain TeX macros that I wrote to publish a printed
+newsletter about author Robert McCammon. Most of the macros are original,
+but some came from _The TeXbook_ and other sources; most of these have been
+either rewritten or modified. The following files should be found here (and
+the names are short for people using MS-DOS):
+
+ READ.ME This file
+ NEWSLETR.TEX The newsletter format
+ NEWSLETR.TXT List of commands in newsletter format
+ NEWSSAMP.TEX Sample newsletter file
+ LODRIVER.TEX Sample newsletter driver (part of a real newsletter)
+ LOSAMPLE.TEX Sample newsletter title page, articles, etc.
+
+The format is for plain TeX, not LaTeX---real TeXies don't use LaTeX! 8-)
+Seriously, I developed my newsletter format because LaTeX wasn't flexible
+enough for the stuff I wanted to do---namely multiple columns (1--6 columns),
+switching columns on the same page, and including figures.
+
+When you see it, some of the stuff will look kludged---but it sounds like
+what some of you are using now was kludged, so it shouldn't be much worse!
+
+Because the format file (NEWSLETR.TEX) is pretty big, I'd suggest that you
+create a new TeX format file that contains it. Under VMS using DECUS TeX,
+the command would be:
+
+ $ TEX/INIT/NOFORMAT "&plain \input newsletr \dump"
+ $ TEX/FORMAT=newsletr
+
+NEWSLETR is set up so that it can be used as an extended plain TeX (you have
+access to the macros, with all of TeX's default settings). When building
+a newsletter, you can execute \newspage to use pages that are a little taller
+and wider (7" x 9") and to change some of TeX's penalties, etc.
+
+Finally, I would like to point out a couple of features that I think would be
+useful for anybody who uses TeX for any reason. I've extracted these two
+pieces into separate files so that you can easily include them in other
+documents.
+
+As you all know, TeX requires that you use `` and '' instead of " to get
+proper double-quotes. I have written a macro that will let the double-quote
+character (") work like `` and ''. It assumes that they come in pairs, except
+that a " as the first character of a paragraph is treated as ``. To enable
+the double-quote recognition, simply add \begindoublequotes to your file.
+(You can disable it using \enddoublequotes.) Proper spacing after '' is
+maintained. (QUOTE.TEX)
+
+I've also included macros \ital and \slant for typesetting text in the
+italic (\it) and slanted (\sl) fonts, respectively. A lot of people don't
+seem to know about---or forget to use---the italic correction (\/) when
+switching among fonts. The \ital and \slant macros look at the next character
+following the parameter and add the italic correction unless the next character
+is a period or a comma, as recommended on page 14 of _The TeXbook_. Using
+these macros, you should never need to type \/ again. (ITALIC.TEX)
+
+I would appreciate being kept informed of bug fixes or improvements you make to
+the file. I can't promise support, but I use these macros too, and I'm willing
+to help whenever/wherever I can.
+
+Questions, comments, or suggestions are welcome.
+
+Hunter
+------
+Hunter Goatley, Process Software, http://www.process.com/
+<goathunter@GOATLEY.COM> http://www.goatley.com/hunter/
diff --git a/macros/plain/contrib/newsletr/sample.dvi b/macros/plain/contrib/newsletr/sample.dvi
new file mode 100644
index 0000000000..f350c3f447
--- /dev/null
+++ b/macros/plain/contrib/newsletr/sample.dvi
Binary files differ
diff --git a/macros/plain/contrib/newsletr/sample.pdf b/macros/plain/contrib/newsletr/sample.pdf
new file mode 100644
index 0000000000..455a95ba27
--- /dev/null
+++ b/macros/plain/contrib/newsletr/sample.pdf
Binary files differ