diff options
Diffstat (limited to 'macros/plain/contrib/newsletr')
l--------- | macros/plain/contrib/newsletr/README | 1 | ||||
-rw-r--r-- | macros/plain/contrib/newsletr/italic.tex | 37 | ||||
-rw-r--r-- | macros/plain/contrib/newsletr/lodriver.tex | 56 | ||||
-rw-r--r-- | macros/plain/contrib/newsletr/losample.tex | 379 | ||||
-rw-r--r-- | macros/plain/contrib/newsletr/newsletr.tex | 1465 | ||||
-rw-r--r-- | macros/plain/contrib/newsletr/newsletr.txt | 133 | ||||
-rw-r--r-- | macros/plain/contrib/newsletr/newssamp.dvi | bin | 0 -> 12288 bytes | |||
-rw-r--r-- | macros/plain/contrib/newsletr/newssamp.pdf | bin | 0 -> 55591 bytes | |||
-rw-r--r-- | macros/plain/contrib/newsletr/newssamp.tex | 266 | ||||
-rw-r--r-- | macros/plain/contrib/newsletr/quote.tex | 118 | ||||
-rw-r--r-- | macros/plain/contrib/newsletr/read.me | 85 | ||||
-rw-r--r-- | macros/plain/contrib/newsletr/sample.dvi | bin | 0 -> 17920 bytes | |||
-rw-r--r-- | macros/plain/contrib/newsletr/sample.pdf | bin | 0 -> 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 Binary files differnew file mode 100644 index 0000000000..ffe973b213 --- /dev/null +++ b/macros/plain/contrib/newsletr/newssamp.dvi diff --git a/macros/plain/contrib/newsletr/newssamp.pdf b/macros/plain/contrib/newsletr/newssamp.pdf Binary files differnew file mode 100644 index 0000000000..f7ab43a34b --- /dev/null +++ b/macros/plain/contrib/newsletr/newssamp.pdf 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 Binary files differnew file mode 100644 index 0000000000..f350c3f447 --- /dev/null +++ b/macros/plain/contrib/newsletr/sample.dvi diff --git a/macros/plain/contrib/newsletr/sample.pdf b/macros/plain/contrib/newsletr/sample.pdf Binary files differnew file mode 100644 index 0000000000..455a95ba27 --- /dev/null +++ b/macros/plain/contrib/newsletr/sample.pdf |