BSD 4_3_Tahoe development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Mon, 27 Oct 1986 05:56:44 +0000 (21:56 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Mon, 27 Oct 1986 05:56:44 +0000 (21:56 -0800)
Work on file usr/src/new/news/doc/Makefile
Work on file usr/src/new/news/doc/mn.7
Work on file usr/src/new/news/doc/tmac.n
Work on file usr/src/new/news/doc/copyright.mn

Synthesized-from: CSRG/cd2/4.3tahoe

usr/src/new/news/doc/Makefile [new file with mode: 0644]
usr/src/new/news/doc/copyright.mn [new file with mode: 0644]
usr/src/new/news/doc/mn.7 [new file with mode: 0644]
usr/src/new/news/doc/tmac.n [new file with mode: 0644]

diff --git a/usr/src/new/news/doc/Makefile b/usr/src/new/news/doc/Makefile
new file mode 100644 (file)
index 0000000..30c12c0
--- /dev/null
@@ -0,0 +1,20 @@
+# make the various documents
+
+ROFF=nroff
+
+all: howto manner standard copyright install
+
+install: install.mn tmac.n
+       $(ROFF) tmac.n install.mn
+
+howto: howto.mn tmac.n
+       $(ROFF) tmac.n howto.mn
+
+manner: manner.mn tmac.n
+       $(ROFF) tmac.n manner.mn
+
+standard: standard.mn tmac.n
+       $(ROFF) tmac.n standard.mn
+
+copyright: copyright.mn tmac.n
+       $(ROFF) tmac.n copyright.mn
diff --git a/usr/src/new/news/doc/copyright.mn b/usr/src/new/news/doc/copyright.mn
new file mode 100644 (file)
index 0000000..bdc1d4c
--- /dev/null
@@ -0,0 +1,606 @@
+.ds .f copyright.mn
+.ds h0 "Copyright Law
+.ds h1
+.ds h2 %
+.ds f0 "\*(vr
+.ds f1
+.ds f2 "February 26, 1986
+.mt
+Copyright Law
+.au
+Jordan J. Breslow
+.ai
+1225 Alpine Road, Suite 200
+Walnut Creek, CA 94596
++1 415 932 4828
+.bt
+.fn
+\(co Copyright 1986 Breslow, Redistributed by permission
+.ef
+.pg
+I am an attorney practicing copyright law and computer
+law.  I read a series of queries in net.legal about
+copyright law and was dismayed to find that people who
+had no idea what they were talking about were spreading
+misinformation over the network.  Considering that the
+penalties for copyright infringement can include
+$50,000.00 damages per infringed work, attorneys fees,
+court costs, criminal fines and imprisonment, and
+considering that ignorance is no excuse and innocent
+intent is not even a recognized defense, I cringe to see
+the network used as a soapbox for the ill-informed.  For
+that reason, this article will discuss copyright law and
+license law as they pertain to computer software.
+.pg
+My goal is to enable readers to determine when they
+should be concerned about infringing and when they can
+relax about it.  I also want to let programmers know how
+to obtain copyright for their work.  I'll explain the
+purpose of software licenses, and discuss the effect
+that the license has on copyright.  For those of you who
+are programmers, I'll help you decide whether you own
+the programs you write on the job or your boss owns
+them.  I will also mention trademark law and patent law
+briefly, in order to clarify some confusion about which
+is which.  Incidentally, if you read this entire essay,
+you will be able to determine whether or not the essay
+is copyrighted and whether or not you can make a
+printout of it.
+.pg
+This is a long article, and you may not want to
+read all of it.  Here is an outline to help you decide
+what to read and what to ignore:
+.nf
+.si 10
+1.     The Meaning of Copyright from the Viewpoint of the Software User
+1.1    A bit of history
+1.2    The meaning of \f2copyright\fP
+1.3    The meaning of \f2public domain\fP
+1.4    A hypothetical software purchase
+1.5    Can you use copyrighted software?
+1.6    Can you make a backup copy?
+1.7    Licenses may change the rules
+1.8    Can you modify the program?
+1.9    Can you break the copy protection scheme?
+1.10   Summary
+.sp
+2.     Copyright Sounds Neat -- How Do I Get One? Or, How Do I Know If
+       this Program is Copyrighted?
+2.1    How do you get a copyright?
+2.2    How do you lose a copyright?
+2.3    How do you waste a stamp?
+2.4    Do you have to register?
+2.5    How copyright comes into existence
+2.6    The copyright notice
+2.7    Advantages of registration
+2.8    A test to see if you understand this article
+.sp
+3.     Who Owns The Program You Wrote?
+3.1    Introduction
+3.2    Programs written as an employee
+3.3    Programs written as a contractor
+.sp
+4.     A Brief Word about Licenses
+4.1    Why a license?
+4.2    Is it valid?
+.sp
+.5     I Have a Neat Idea.  Can I Trademark it? What about a Patent?
+5.1    Trademark law explained
+5.2    Patent law
+.sp
+6.     Conclusion
+.ei
+.fi
+.sp 2
+.hn 1
+The Meaning of Copyright from the Viewpoint of the Software User
+.hn 2
+A bit of history
+.pg
+If you're not interested in history, you can
+skip this paragraph.
+.i Modern
+copyright law first came
+into existence in 1570,  by an act of Parliament called
+the Statute of Anne.  Like most laws, it hasn't changed
+much since.  It was written with books and pictures in
+mind.  Parliament, lacking the foresight to predict the
+success of the Intel and IBM corporations, failed to
+consider the issue of copyrighting computer programs. 
+.pg
+At first, courts questioned whether programs could be
+copyrighted at all.  The problem was that judges
+couldn't read the programs and they figured the
+Copyright Law was only meant to apply to things humans
+(which arguably includes judges) could read without the
+aid of a machine.  I saw some mythical discussion about
+that in some of the net.legal drivel.  Let's lay that to
+rest:  programs are copyrightable as long as there is
+even a minimal amount of creativity.  The issue was laid
+to rest with the Software Act of 1980.  That Act
+modified the Copyright Act (which is a Federal law by
+the way), in such a way as to make it clear that
+programs are copyrightable.  The few exceptions to this
+rule will rarely concern anyone.  The next question to
+arise was whether a program was copyrightable if it was
+stored in ROM rather than on paper.   The decision in
+the Apple v. Franklin case laid that to rest:  it is.
+.hn 2
+The meaning of \f2copyright\fP
+.pg
+Now, what is copyright?  As it is commonly
+understood, it is the right to make copies of something
+-- or to put it the other way around, it is the right to
+prohibit other people from making copies.  This is known
+as an exclusive right -- the exclusive right to
+.i reproduce ,
+in the biological language of the Copyright
+Act -- and what most people don't know is that copyright
+involves not one, not two, but five exclusive rights.   
+These are (1) the exclusive right to make copies, (2)
+the exclusive right to distribute copies to the public,
+(3) the exclusive right to prepare 
+.i "derivative works"
+(I'll explain, just keep reading), (4) the exclusive
+right to perform the work in public (this mainly applies
+to plays, dances and the like, but it could apply to
+software), and (5) the exclusive right to display the
+work in public (such as showing a film).
+.hn 2
+The meaning of \f2public domain\fP
+.pg
+Before we go any further, what is public
+domain?  I saw some discussion on the net about public
+domain software being copyrighted.  Nonsense.  The
+phrase 
+.i "public domain,"
+when used correctly, means the
+absence of copyright protection.  It means you can copy
+public domain software to your heart's content.  It
+means that the author has none of the exclusive rights
+listed above.  If someone uses the phrase
+.i "public domain"
+to refer to
+.i freeware
+(software which is copyrighted but is distributed without advance payment
+but with a request for a donation), he or she is using
+the term incorrectly.  Public domain means no copyright
+-- no exclusive rights.
+.hn 2
+A hypothetical software purchase
+.pg
+Let's look at those exclusive rights from the
+viewpoint of someone who has legitimately purchased a
+single copy of a copyrighted computer program.  For the
+moment, we'll have to ignore the fact that the program
+is supposedly licensed, because the license changes
+things.  I'll explain that later.  For now, assume you
+went to Fred's Diner and Software Mart and bought a
+dozen eggs, cat food and a word processing program.  And
+for now, assume the program is copyrighted.
+.hn 2
+Can you use copyrighted software?
+.pg
+What can you do with this copyrighted
+software?  Let's start with the obvious:  can you use it
+on your powerful Timex PC?  Is this a joke?  No.  Prior
+to 1980, my answer might have been No, you can't use it!
+.pg
+People actually pay me for advice like that!  Well
+think:  you take the floppy disk out of the zip lock
+baggy, insert it in drive A and load the program into
+RAM.  What have you just done?  You've made a copy in
+RAM -- in legalese, you've reproduced the work, in
+violation of the copyright owner's exclusive right to
+reproduce.  (I better clarify something here:  the
+copyright owner is the person or company whose name
+appears in the copyright notice on the box, or the disk
+or the first screen or wherever.  It may be the person
+who wrote the program, or it may be his boss, or it may
+be a publishing company that bought the rights to the
+program.  But in any case, it's not you. When you buy a
+copy of the program, you do not become the copyright
+owner.  You just own one copy.)
+.pg
+Anyway, loading the program into RAM means
+making a copy.  The Software Act of 1980 addressed this
+absurdity by allowing you to make a copy if the copy \*(lqis
+created as an essential step in the utilization of the
+computer program in conjunction with a machine and ...
+is used in no other manner ....\*(rq  By the way,
+somebody tell me what 
+.i "a machine"
+means.  If you connect
+5 PC's on a network is that 
+.i "a machine"
+or
+.i "several machines" ?
+A related question is whether or not running
+software on a network constitutes a performance.  The
+copyright owner has the exclusive right to do that,
+remember?
+.hn 2
+Can you make a backup copy?
+.pg
+OK, so you bought this copyrighted program
+and you loaded it into RAM or onto a hard disk without
+the FBI knocking on your door.  Now can you make a
+backup copy? 
+.b YES .
+The Software Act also provided that
+you can make a backup copy, provided that it \*(lqis for
+archival purposes only ....\*(rq  What you cannot do,
+however, is give the archive copy to your friend so that
+you and your pal both got the program for the price of
+one.  That violates the copyright owner's exclusive
+right to distribute copies to the public.  Get it?  You
+can, on the other hand, give both your original and
+backup to your friend -- or sell it to him, or lend it
+to him, as long as you don't retain a copy of the
+program you are selling.  Although the copyright owner
+has the exclusive right to distribute (sell) copies of
+the program, that right only applies to the first sale
+of any particular copy.  By analogy, if you buy a
+copyrighted book, you are free to sell your book to a
+friend.  The copyright owner does not have the right to
+control resales.  
+.hn 2
+Licenses may change the rules
+.pg
+At this point, let me remind you that we have
+assumed that the program you got at the store was sold
+to you, not licensed to you.  Licenses may change the
+rules.
+.hn 2
+Can you modify the program?
+.pg
+Now, you're a clever programmer, and you know
+the program could run faster with some modifications. 
+You could also add graphics and an interactive mode and
+lots of other stuff.  What does copyright law say about
+your plans?  Well ... several different things,
+actually.  First, recall that the copyright owner has
+the exclusive right to make derivative works.  A
+derivative work is a work based on one or more
+preexisting works.  It's easy to recognize derivative
+works when you think about music or books.  If a book is
+copyrighted, derivative works could include a
+screenplay, an abridged edition, or a translation into
+another language.  Derivative works of songs might be
+new arrangements (like the jazz version of Love Potion
+Number 9), a movie soundtrack, or a written
+transcription, or a 
+.i "long version" ,
+(such as the fifteen minute version of \*(lqWipe Out\*(rq with an extended
+drum solo for dance parties).  In my opinion, you are making a
+derivative work when you take the store-bought word
+processor and modify it to perform differently.  The
+same would be true if you 
+.i translated
+a COBOL program
+into BASIC.  Those are copyright infringements -- you've
+horned in on the copyright owner's exclusive right to
+make derivative works.  There is, however, some
+breathing room.  The Software Act generously allows you
+to 
+.i adapt
+the code if the adaptation \*(lqis created as an
+essential step in the utilization of the computer
+program in conjunction with a machine ....\*(rq  For
+example, you might have to modify the code to make it
+compatible with your machine.
+.hn 2
+Can you break the copy protection scheme?
+.pg
+Moving right along, let's assume your store
+bought program is copy protected, and you'd really like
+to make a backup copy.  You know this nine-year-old whiz
+who can crack any copy-protection scheme faster than you
+can rearrange a Rubix cube.  Is there a copyright
+violation if he succeeds?  There's room to argue here. 
+When you try to figure out if something is an
+infringement, ask yourself, what exclusive right am I
+violating?  In this case, not the right to make copies,
+and not the right to distribute copies.  Public
+performance and display have no relevance.  So the key
+question is whether you are making a 
+.i "derivative work" .
+My answer to that question is, \*(lqI doubt it.\*(rq  On the
+other hand, I also doubt that breaking the protection
+scheme was \*(lqan essential step\*(rq in using the program in
+conjunction with a machine.  It might be a \*(lqfair use,\*(rq
+but that will have to wait for another article.  Anyone
+interested in stretching the limits of the \*(lqfair use\*(rq
+defense should read the Sony 
+.i Betamax
+case.
+.hn 2
+Summary
+.pg
+Let me summarize. Copyright means the
+copyright owner has the exclusive right to do certain
+things. Copyright infringement means you did one of
+those exclusive things (unless you did it within the
+limits of the Software Act, i.e., as an essential step ....).
+.hn 1
+Copyright Sounds Neat -- How Do I Get One?  Or, How Do I Know if this Program is Copyrighted?
+.hn 2
+How do you get a copyright?
+.pg
+If you've written an original program, what do you have to do to get a
+copyright? Nothing. You already have one.
+.hn 2
+How do you lose a copyright?
+.pg
+If you've written an original
+program, what do you have to do to lose your copyright
+protection?  Give copies away without the copyright
+notice.
+.hn 2
+How do you waste a stamp?
+.pg
+If you mail the program to yourself
+in a sealed envelope, what have you accomplished? 
+You've wasted a stamp and an envelope and burdened the
+postal system unnecessarily.
+.hn 2
+Do you have to register?
+.pg
+Do you have to register your program
+with the U.S. Copyright Office?  No, but it's a damn
+good idea.
+.hn 2
+How copyright comes into existence
+.pg
+Copyright protection (meaning the five
+exclusive rights) comes into existence the moment you
+.i fix
+your program in a 
+.i "tangible medium" .
+That means
+write it down, or store it on a floppy disk, or do
+something similar.  Registration is optional.  The one
+thing you must do, however, is protect your copyright by
+including a copyright notice on every copy of every
+program you sell, give away, lend out, etc.  If you
+don't, someone who happens across your program with no
+notice on it can safely assume that it is in the public
+domain (unless he actually knows that it is not).  
+.hn 2
+The copyright notice
+.pg
+The copyright notice has three parts.  The
+first can be either a c with a circle around it (\(co), or the
+word 
+.b Copyright
+or the abbreviation 
+.b Copr.
+The c
+with a circle around it is preferable, because it is
+recognized around the world; the others are not.  That's
+incredibly important.  Countries around the world have
+agreed to recognize and uphold each others' copyrights,
+but this world-wide protection requires the use of the c
+in a circle.  On disk labels and program packaging, use
+the encircled c.  Unfortunately, computers don't draw
+small circles well, so programmers have resorted to a c
+in parentheses: (c).  Too bad.  That has no legal
+meaning.  When you put your notice in the code and on
+the screen, use 
+.b Copyright
+or 
+.b Copr.
+if you can't make a circle.
+.pg
+The second part of the notice is the \*(lqyear
+of first publication of the work.\*(rq  
+.i Publication
+doesn't mean distribution by Osborne Publishing Co.  It
+means distribution of copies of the program to the
+public \*(lqby sale or other transfer of ownership, or by
+rental, lease, or lending.\*(rq  So when you start handing
+out or selling copies of your precious code, you are
+publishing.  Publication also takes place when you
+merely OFFER to distribute copies to a group for further
+distribution.  Your notice must include the year that
+you first did so.
+.pg
+The third part of the notice is the name of
+the owner of the copyright.  Hopefully, that's you, in
+which case your last name will do.  If your company owns
+the program -- a legal issue which I will address later
+in this article -- the company name is appropriate.
+.pg
+Where do you put the notice?  The general
+idea is to put it where people are likely to see it. 
+Specifically, if you're distributing a human-readable
+code listing, put it on the first page in the first few
+lines of code, and hard code it so that it appears on
+the title screen, or at sign-off, or continuously.  If
+you're distributing machine-readable versions only, hard
+code it.  As an extra precaution, you should also place
+the notice on the gummed disk label or in some other
+fashion permanently attached to the storage medium.
+.hn 2
+Advantages of registration
+.pg
+Now, why register the program?  If no one
+ever rips off your program, you won't care much about
+registration.  If someone does rip it off, you'll kick
+yourself for not having registered it.  The reason is
+that if the program is registered before the
+infringement takes place, you can recover some big bucks
+from the infringer, called statutory damages, and the
+court can order the infringer to pay your attorneys
+fees.  Registration only costs $10.00, and it's easy to
+do yourself.  The only potential disadvantage is the
+requirement that you deposit the first and last 25 pages
+of your source code, which can be inspected (but not
+copied) by members of the public.  
+.hn 2
+A test to see if you understand this article
+.pg
+Now, someone tell me this:  is this article copyrighted?  Can you print it?
+.hn 1
+Who Owns The Program You Wrote?
+.hn 2
+Introduction
+.pg
+The starting point of this analysis is that if you wrote
+the program, you are the author, and copyright belongs
+to the author.  HOWEVER, that can change instantly. 
+There are two common ways for your ownership to shift to
+someone else:  first, your program might be a \*(lqwork for
+hire.\*(rq  Second, you might sell or assign your 
+.i rights
+in the program, which for our purposes means the
+copyright.  
+.hn 2
+Programs written as an employee
+.pg
+Most of the programs which you write at
+work, if not all of them, belong to your employer. 
+That's because a program prepared by an employee within
+the scope of his or her employment is a \*(lqwork for hire,\*(rq
+and the employer is considered the 
+.i author .
+This is more or less automatic if you are an employee -- no
+written agreement is necessary to make your employer the
+copyright owner.  By contrast, if you can convince your
+employer to let you be the copyright owner, you must
+have that agreement in writing.
+.pg
+By the way, before you give up hope of
+owning the copyright to the program you wrote at work,
+figure out if you are really an employee.  That is
+actually a complex legal question, but I can tell you
+now that just because your boss says you are an employee
+doesn't mean that it's so.  And remember that if you
+created the program outside the 
+.i scope
+of your job, the
+program is not a \*(lqwork for hire.\*(rq  Finally, in
+California and probably elsewhere, the state labor law
+provides that employees own products they create on
+their own time, using their own tools and materials. 
+Employment contracts which attempt to make the employer
+the owner of those off-the-job 
+.i inventions
+are void, at least in sunny California.
+.hn 2
+Programs written as a contractor
+.pg
+Wait a minute:  I'm an independent
+contractor to Company X, not an employee.  I come and go
+as I please, get paid by the hour with no tax withheld,
+and was retained to complete a specific project.  I
+frequently work at home with my own equipment.  Is the
+program I'm writing a \*(lqwork for hire,\*(rq owned by the
+Company?  Maybe, maybe not.  In California, this area is
+full of landmines for employers, and gold for
+contractors.
+.pg
+A contractor's program is not a \*(lqwork for
+hire,\*(rq and is not owned by the company, unless (1) there
+is a written agreement between the company and the
+contractor which says that it is, and (2) the work is a
+.i "commissioned work" .
+A
+.i "commissioned work"
+is one of
+the following:  (a)  a contribution to a 
+.i "collective work" ,
+(b) an audiovisual work (like a movie, and maybe like a video game),
+(c) a translation, (d) a compilation, (e) an instructional text,
+(f) a test or answer to a test, or (g) an atlas.  I know you must be
+tired of definitions, but this is what the real legal
+world is made of.  An example of a  collective work is a
+book of poetry, with poems contributed by various
+authors.  A piece of code which is incorporated into a
+large program isn't a contribution to a collective work,
+but a stand-alone program which is packaged and sold
+with other stand-alone programs could be.   
+.pg
+So where are we?  If you are a contract
+programmer, not an employee, and your program is a
+.i "commissioned work" ,
+and you have a written agreement
+that says that the program is a \*(lqwork for hire\*(rq owned by
+the greedy company, who owns the program?  That's right,
+the company.  But guess what?  In California and
+elsewhere the company just became your employer!  This
+means that the company must now provide worker's
+compensation benefits for you
+.b "AND UNEMPLOYMENT INSURANCE" .
+.hn 1
+A Brief Word About Licenses. 
+.hn 2
+Why a license?
+.pg
+When you get software at the local five and dime, the
+manufacturer claims that you have a license to use that
+copy of the program.  The reason for this is that the
+manufacturer wants to place more restrictions on your
+use of the program than copyright law places.  For
+example, licenses typically say you can only use the
+program on a single designated CPU.  Nothing in the
+copyright law says that.  Some licenses say you cannot
+make an archive copy.  The copyright law says you can,
+remember?  But if the license is a valid license, now
+you can't.  You can sell or give away your copy of a
+program if you purchased it, right?  That's permitted by
+copyright law, but the license may prohibit it.  The
+more restrictive terms of the license will apply instead
+of the more liberal copyright rules.
+.hn 2
+Is it valid?
+.pg
+Is the license valid?  This is hotly debated
+among lawyers.  (What isn't?  We'll argue about the time
+of day.)  A few states have passed or will soon pass
+laws declaring that they are valid.  A few will go the
+other way.  Federal legislation is unlikely.  My
+argument is that at the consumer level, the license is
+not binding because there is no true negotiation (unless
+a state law says it is binding), but hey that's just an
+argument and I'm not saying that that's the law.  In any
+case, I think businesses which buy software will be
+treated differently in court than consumers.  Businesses
+should read those licenses and negotiate with the
+manufacturer if the terms are unacceptable.  
+.hn 1
+I Have A Neat Idea. Can I Trademark It?  What About patent?
+.hn 2
+Trademark law explained
+.pg
+Sorry, no luck.  Trademark law protects names:  names of
+products and names of services.  (Note that I did not
+say names of companies.  Company names are not
+trademarkable.)  If you buy a program that has a
+trademarked name, all that means is that you can't sell
+your own similar program under the same name.  It has
+nothing to do with copying the program.  
+.hn 2
+Patent Law
+.pg
+Patent law can apply to computer programs,
+but it seldom does.  The main reasons it seldom applies
+are practical:  the patent process is too slow and too
+expensive to do much good in the software world.  There
+are also considerable legal hurdles to overcome in order
+to obtain a patent.  If, by chance, a program is
+patented, the patent owner has the exclusive right to
+make, use or sell it for 17 years.
+.hn 1
+CONCLUSION
+.pg
+I know this is a long article,
+but believe it or not I just scratched the surface. 
+Hopefully, you'll find this information useful, and
+you'll stop passing along myths about copyright law.  If
+anyone needs more information, I can be reached at the
+address on the first page.
+Sorry, but I do not usually have
+access to the network, so you can't reach me there. 
+.sp
+Thank you.  JORDAN J. BRESLOW
diff --git a/usr/src/new/news/doc/mn.7 b/usr/src/new/news/doc/mn.7
new file mode 100644 (file)
index 0000000..281d05f
--- /dev/null
@@ -0,0 +1,268 @@
+.TH MN 7 "News Version B2.11"
+.SH NAME
+mn \- text formatting macros for the news documentation
+.SH SYNOPSIS
+.B "nroff  \-mn"
+[ options ]  file  ...
+.br
+.B "troff  \-mn"
+[ options ]  file  ...
+.SH DESCRIPTION
+.PP
+This package of
+.IR nroff (1)
+and
+.IR troff (1)
+macro definitions provides a formatting facility
+which may be used to run off the formatted news documents.
+When reverse line motions are needed,
+filter the output through
+.IR col (1).
+.PP
+All \-mn macros,
+diversions,
+string registers,
+and number registers are defined below.
+Many
+.I nroff
+and
+.I troff
+requests are unsafe in conjunction with this package.
+However,
+the requests below may be used with impunity:
+.LP
+.ta 5n 12n
+.nf
+       .bp     begin new page
+       .br     break output line
+       .sp \f2n\fP     insert \f2n\fP spacing lines
+       .ce \f2n\fP     center next \f2n\fP lines
+       .ls \f2n\fP     line spacing: \f2n\fP=1 single, \f2n\fP=2 double space
+       .na     no alignment of right margin
+.fi
+.PP
+Font and point size changes with \ef and \es are also allowed;
+for example,
+\&``\ef2word\efR'' will italicize \f2word.\fP
+Output of the
+.IR tbl (1),
+.IR eqn (1),
+and
+.IR refer (1)
+preprocessors for equations,
+tables,
+and references is acceptable as input.
+.SH FILES
+/usr/lib/tmac/tmac.n
+.SH "SEE ALSO"
+eqn(1), refer(1), tbl(1), troff(1)
+.SH WARNINGS
+.PP
+If you do not set the string register ``.f'' to the file name,
+you will only be told the line number on which any errors occur.
+If you define this string to be the file name,
+you will get the file name,
+too.
+This is useful when dealing with a document
+split up into many files.
+.PP
+This package is not now intended for uses
+other than with the news documentation.
+.PP
+Bug reports are always welcome;
+please send them to the author.
+(Include a sample of the input;
+this helps track down the bug.)
+.SH AUTHOR
+Matt Bishop
+.RI ( mab@riacs.arpa ,
+.IR ihnp4!ames!riacs!mab ,
+.IR decvax!decwrl!riacs!mab )
+.SH REQUESTS
+.PP
+In the
+.I Note
+column,
+.I b
+means the request causes a break,
+and
+.I i
+means the macro,
+number register,
+string register,
+or diversion is internal and should not be used for anything.
+In the
+.I "What It Is"
+column,
+.IR div " means " diversion ,
+.IR mac " means " macro ,
+.IR num " means " "number register" ,
+and
+.IR str " means " "string register" .
+In the
+.I "Initial Value"
+column,
+a hyphen means no initial value is used,
+anything else is the initial value,
+and if two values are given,
+the first is for
+.I nroff
+and the second for
+.IR troff .
+.PP
+.if n .in 0
+.ds x \f2x\fP\|
+.ds y \f2y\fP\|
+.ds z \f2z\fP\|
+.ds X "\*x
+.ds Y "\*x \*y
+.ds Z "\*x \*y \*z
+.tr _.
+.ta \w'MacroNames'u +\w'WhatItIs'u +\w'InitialVal'u +\w'Note 'u
+.sp .3
+.nf
+Macro  What    Initial Note    \0 Explanation
+Name   It Is   Value
+.sp .3
+_f     num     \-      \-      file name, used in error messages if set
+_ai    mac     \-      \-      author's institution
+_au    mac     \-      b       author's name
+_b \*Z mac     \-      \-      print \*x in font 3, \*y after, \*z before;
+                               if no arguments, switch to font 3
+b      num     \-      i       used to embolden italics
+_bi \*Z        mac     \-      \-      print \*x in emboldened font 2, \*y after,
+                               \*z before
+bm     num     1i,1i+1v        \-      height of bottom margin
+_bt    mac     \-      \-      print pottom title
+bt     num     .5i+1v  \-      bottom of footer to bottom of page
+_cf \*Z        mac     \-      \-      print contents of header line (double
+                               quotes around \*x, \*y before, \*z after)
+cm     num     0       \-      0 if no cut marks, nonzero if cut marks
+_cn \*Z        mac     \-      \-      print computer/site name; same as _i
+_dd    div     \-      i       text of display
+dg     str     \(**,\(dg       \-      footnote mark
+dw     str     \f2current\fP   \-      name of current day of week
+dy     str     \f2current\fP   \-      full date
+_ed    mac     \-      b       end display
+_ef    mac     \-      b       end footnote
+_ei    mac     \-      b       move left margin to the right
+_er    mac     \-      \-      print error message
+_et    mac     \-      b,i     macro called at end of text
+f0     str     \-      \-      left bottom title
+f1     num     \-      i       current font number
+f1     str     \f2date\fP,\-   \-      center bottom title
+f2     num     \-      i       previous font number
+f2     str     \-      \-      right bottom title
+fc     num     \-      i       per-page footnote count
+_fd    mac     \-      b,i     drop footnotes
+fg     num     \-      i       gets fudge factor for footnote
+fl     num     5.5i    \-      default footnote line length
+_fn    mac     \-      \-      begin footnote
+_fo    mac     \-      \-      bottom of page (footer) macro
+fp     num     \-      i       current location of trap for _fo macro
+_fs    mac     \-      i       print text/footnote separator
+fs     num     \-      i       position where footnote printing should begin
+_fx    mac     \-      i       collect overflow footnotes
+_fy    div     \-      i       text of footnote overflow
+_fz    mac     \-      i       move overflow footnotes from _fy to _tf
+gs     num     \-      i       used to be sure footnotes fit
+h0     num     0       i       current level 1 section number
+h0     str     \-      \-      left header title
+h1     num     0       i       current level 2 section number
+h1     str     \f2\- page \-\fP        \-      center header title
+h2     num     0       i       current level 3 section number
+h2     str     \-      \-      right header title
+h3     num     0       i       current level 4 section number
+_hd    mac     \-      i       top of page (header) macro
+_hf    mac     \-      \-      print header field name; same as _cf
+_hn \*x        mac     \-      b       numbered section; if present, \*x is level
+hn     num     0       i       current level of numbering (temporary)
+hs     num     1v      \-      default intra-section spacing
+_hu    mac     \-      b       unnumbered section header
+_i \*Z mac     \-      \-      print \*x in font 2, \*y after, \*z before;
+                               if no arguments, switch to font 2
+i1     num     \-      i       current indent
+i2     num     \-      i       previous indent
+id     num     0       i       1 if in display, 0 otherwise
+if     num     0       i       1 if in footnote, 0 otherwise
+_is \*Z        mac     \-      \-      print \*x 2p bigger, \*y after, \*z before;
+                               if no arguments, increase point size by 2p
+it     num     0       i       0 before _bt called, 1 after
+l0     num     0       i       leftmost position for left margin
+l1     num     \-      i       first level of indent for left margin
+l2     num     \-      i       second level of indent for left margin
+l3     num     \-      i       third level of indent for left margin
+l4     num     \-      i       fourth level of indent for left margin
+l5     num     \-      i       fifth level of indent for left margin
+l6     num     \-      i       sixth level of indent for left margin
+l7     num     \-      i       seventh level of indent for left margin
+l8     num     \-      i       eighth level of indent for left margin
+l9     num     \-      i       ninth level of indent for left margin
+li     num     5n      \-      paragraph indent
+ll     num     6i      \-      default line length
+lm     num     0       i       current level of indent for left margin
+lo     num     \-      i       previous level for left margin
+_lp \*Y        mac     \-      b       labelled paragraph; \*x is label, \*y indent
+lq     str     ",``    \-      left double quotation marks
+mo     str     \f2current\fP   \-      name of current month
+_mt    mac     \-      b       title
+mt     num     1.5i+1v \-      distance of title from top of page
+_ng \*Z        mac     \-      \-      newsgroup name; same as _b
+_nl    mac     \-      b       reset point size to default
+ns     num     0       i       if nonzero, _fn does not call _fs
+_op \*Z        mac     \-      \-      command option; same as _b
+p1     num     0       i       1 after PDP-11(tm) footnote printed,
+                               0 before
+_pa \*Z        mac     \-      \-      print protocol appellation; same as _i
+_pd \*Y        mac     \-      \-      print PDP-11(tm), footnote; \*x after,
+                               \*y before
+pd     num     1v,.3v  \-      intra-paragraph spacing
+_pf    mac     \-      \-      print footer title
+_pg \*x        mac     \-      b       paragraph; if \*x is l, left justify
+pi     num     5n      \-      default paragraph indent
+po     num     1.25i   \-      default page offset
+ps     num     12p     \-      default point size
+_pt \*x        mac     \-      \-      print header; \*x is distance from top of
+                               page
+_qc \*Z        mac     \-      \-      print name of control char; \*x is name,
+                               in font 3, between <>, \*y after, \*z before
+_qp \*Z        mac     \-      \-      print char; same as _b
+_r     mac     \-      \-      switch to font 1
+rq     str     ",''    \-      right double quotation marks
+s1     num     \-      i       current point size
+s2     num     \-      i       previous point size
+_sd \*X        mac     \-      \-      start display; if \*x is c, center display
+sf     num     \-      i       1 if center display, 0 otherwise
+_si \*x        num     \-      \-      indent left margin by \*x (5n default)
+_sm \*Z        mac     \-      \-      print \*x 2p smaller, \*y after, \*z before;
+                               if no arguments, decrease point size by 2p
+_sn \*x        mac     \-      b       space by \*x (1v default), enter nospace mode
+_sr \*x        mac     \-      \-      enter spacemode, space by \*x (1v default)
+t2     num     0       i       0 if little/no space, nonzero otherwise
+_tf    div     \-      i       text of footnotes
+tm     num     1i-.5v  \-      height of top margin
+tt     num     .5i-.5v \-      distance from top of page to header
+_ux \*Y        mac     \-      \-      print UNIX(tm), footnote; \*x after,
+                               \*y before
+ux     num     0       i       1 after UNIX(tm) footnote printed,
+                               0 before
+v1     num     \-      i       current vertical spacing
+v2     num     \-      i       previous vertical spacing
+vr     str     \-      \-      current version of news
+vs     num     16p     \-      default vertical spacing
+vx     num     0       i       1 after VAX(tm) footnote printed,
+                               0 before
+_vx \*Y        mac     \-      \-      print VAX(tm), footnote; \*x after,
+                               \*y before
+ws     str     \-      \-      used to construct error message
+_ya    mac     \-      \-      same as calling _yf, _yi, _ys, _yv
+_yf    mac     \-      \-      restore fonts saved by _zf
+_yi    mac     \-      \-      restore indents saved by _zi
+_ys    mac     \-      \-      restore point sizes saved by _zs
+_yv    mac     \-      \-      restore vertical spacings saved by _zv
+_za    mac     \-      \-      same as calling _zf, _zi, _zs, _zv
+_zf    mac     \-      \-      save previous, current fonts
+_zi    mac     \-      \-      save previous, current indents
+_zs    mac     \-      \-      save previous, current point sizes
+_zv    mac     \-      \-      save previous, current vertical spacings
+.fi
diff --git a/usr/src/new/news/doc/tmac.n b/usr/src/new/news/doc/tmac.n
new file mode 100644 (file)
index 0000000..0520d06
--- /dev/null
@@ -0,0 +1,649 @@
+.\" The News macro package
+.\"
+.\" This  is  the macro package that is used to format news documents.  It
+.\" was written because many sites do not have one of the -mm or -ms pack-
+.\" ages that the documents use.   This is NOT compatible with EITHER, but
+.\" (I hope) will become the standard for all news  documents  (man  pages
+.\" excepted, since everyone seems to have -man.)
+.\"
+.\" This package was written using  only  the  "NROFF/TROFF Users' Guide",
+.\" and  therefore  if  you  can run NROFF/TROFF, you can legitimately use
+.\" this package.  However, because NROFF/TROFF are proprietary  programs,
+.\" I  cannot  place  this  package in the public domain.  This should not
+.\" matter, because if you legitimately have  NROFF/TROFF,  you  have  the
+.\" documentation; if not, you can't run off the documentation anyway.
+.\"
+.\" This  package may be circulated freely with the news documentation; it
+.\" may not be sold, but is to be distributed with  the  unformatted  news
+.\" documents.  However,  the name of the author and the place at which it
+.\" was written (in the author's own  time,  of  course)  are  not  to  be
+.\" removed  from the package regardless of how it is modified or altered.
+.\" Further, please do not distribute this package if you make any changes
+.\" because  I  don't want to get bug reports of macros I haven't written;
+.\" if you have a goodie you want me to add, send it to me and we'll talk.
+.\" (I really do like feedback!)  I'd really appreciate your cooperation.
+.\"
+.\" Author:    Matt Bishop
+.\"            Research Institute for Advanced Computer Science
+.\"            Mail Stop 230-5
+.\"            NASA Ames Research Center
+.\"            Moffett Field, CA  94035
+.\"
+.\" version 1.0                September 28, 1985      mab@riacs.arpa
+.\"    initial version
+.\" version 1.1                October 25, 1985        mab@riacs.arpa
+.\"    fixed an incredibly obscure footnote bug (that occurred twice in
+.\"    the news documentation!) which put footnoted words on  one  page
+.\"    and the footnote on the next if the word was in the next-to-last
+.\"    or last line; commented it, and generally cleaned up
+.\" Version 1.2                October 27, 1985        mab@riacs.arpa
+.\"    Added a few more comments and a check to keep footnotes lined up
+.\"    with the bottom margin.
+.\" Version 1.3                February 12, 1986       mab@riacs.arpa
+.\"    Added an error check to catch unmatched ef's and ed's
+.\"
+.\" **********
+.\" these preserve and restore various things
+.\" they are used to shorten other macros
+.de yf                                 \" restore fonts
+.ft \\n(f2                             \" previous font
+.ft \\n(f1                             \" current font
+..
+.de yi                                 \" restore indents
+'in \\n(i2u                            \" previous indent
+'in \\n(i1u                            \" current indent
+..
+.de ys                                 \" restore point sizes
+.ps \\n(s2                             \" previous point size
+.ps \\n(s1                             \" current point size
+..
+.de yv                                 \" restore vertical spacings
+.vs \\n(v2u                            \" previous vertical spacing
+.vs \\n(v1u                            \" current vertical spacing
+..
+.de ya                                 \" restore everything
+.yf                                    \" restore fonts
+.yi                                    \" restore indents
+.ys                                    \" restore point sizes
+.yv                                    \" restore vertical spacing
+..
+.de zf                                 \" preserve fonts
+.nr f1 \\n(.f                          \" current font
+.ft                                    \" switch to previous font
+.nr f2 \\n(.f                          \" previous font
+.ft                                    \" back to current font
+..
+.de zi                                 \" preserve indents
+.nr i1 \\n(.iu                         \" current indent
+'in                                    \" switch to previous indent
+.nr i2 \\n(.iu                         \" previous indent
+'in                                    \" back to current indent
+..
+.de zs                                 \" preserve point sizes
+.nr s1 \\n(.su                         \" current point size
+.ps                                    \" switch to previous point size
+.nr s2 \\n(.su                         \" previous point size
+.ps                                    \" back to current point size
+..
+.de zv                                 \" preserve vertical spacings
+.nr v1 \\n(.vu                         \" current vertical spacing
+.vs                                    \" switch to previous vertical spacing
+.nr v2 \\n(.vu                         \" previous vertical spacing
+.vs                                    \" back to current vertical spacing
+..
+.de za                                 \" save everything
+.zf                                    \" save fonts
+.zi                                    \" save indents
+.zs                                    \" save point sizes
+.zv                                    \" save vertical spacings
+..
+.\" **********
+.\" these actually print the header and footer titles
+.\" they are defined separately from the "hd" and "fo" macros
+.\" to make user redefinition easy
+.de pt                                 \" print header title
+.                                      \" omit header on first page
+.if \\n%>1 \{\
+'      sp |\\$1u                       \" move to proper position
+.      ft 1                            \" change to default font
+.      ps \\n(ps                       \" change to default point size
+.      vs \\n(vs                       \" change to default spacing
+.      tl '\\*(h0'\\*(h1'\\*(h2'       \" center title
+.      vs                              \" restore current vertical spacing
+.      ps                              \" restore current point size
+.      ft                              \" restore current font
+.\}
+..
+.de pf                                 \" print footer title
+.ft 1                                  \" change to default font
+.ps \\n(ps                             \" change to default point size
+.vs \\n(vs                             \" change to default spacing
+.ie \\n%=1 .tl '\\*(h0'\\*(h1'\\*(h2'  \" on first page, print the header here
+.el        .tl '\\*(f0'\\*(f1'\\*(f2'  \" on other pages, print the footer
+.vs                                    \" restore current vertical spacing
+.ps                                    \" restore current point size
+.ft                                    \" restore current font
+..
+.\" **********
+.\" these are the top of page (header) and bottom of page (footer) macros
+.\" they don't actually print anything, just call the right macros
+.de hd                                 \" header -- do top of page processing
+.if t .if \\n(cm .tl '\(rn'''          \" drop cut mark if needed
+.pt \\n(ttu                            \" print header
+.nr fc 0 1                             \" init footnote count
+.nr fs \\n(.pu-\\n(bmu-1u              \" if any footnotes, start print here
+.nr fp 0-\\n(bmu                       \" reset current footer place
+.ch fo -\\n(bmu                                \" reset footer trap
+.if \\n(dn .fz                         \" put leftover footnotes st bottom
+.ya                                    \" restore font, etc.
+'sp |\\n(tmu                           \" move to top of body
+.ns                                    \" don't allow any more space
+..
+.de fo                                 \" footer -- do bottom of page processing
+.za                                    \" save font, etc.
+.rs                                    \" you want motions here
+.nr dn 0                               \" clobber diversion size register
+.if \\n(fc .fd                         \" now print the footnotes, if any
+'bp                                    \" force out page
+..
+.\" **********
+.\" these are the footnote macros
+.\" here's an overview:
+.\"    Footnotes are processed in environment #1, which is  initialized
+.\"    at the bottom of this package.  When "fn" is called, nroff/troff
+.\"    switches to this environment.  The body of the footnote is saved
+.\"    in  the  diversion  "tf" (for "temporary footnote"), so you will
+.\"    NEVER spring a trap during the first reading of a footnote. When
+.\"    "ef" ("end footnote" is called,  the  diversion  is  closed.  If
+.\"    this  is the first footnote on the page (ie, the number register
+.\"    "fc" is 1), and the footnote height (plus the height of 1  line)
+.\"    crosses  the  bottom  margin,  you get the footnoted word on one
+.\"    page and the footnote on the other.  In this case we  just  call
+.\"    "fo"  manually  (taking case it cannot be re-invoked on the same
+.\"    page!)  If this situation does not occur,  we  just  adjust  the
+.\"    footer  trap's  position upwards (we'll get to how far in a min-
+.\"    ute); if this puts the trap above the current line,  we  reposi-
+.\"    tion  the trap just beneath the current line to be sure of trig-
+.\"    triggering it once the current line is forced out.
+.\"     To reposition the footer trap, we proceed as  follows.  Because
+.\"    the  trap  may be sprung in the middle of a line, it is possible
+.\"    that the footnote will not fit on the page (regardless of  where
+.\"    on the page the footnoted word occurs -- really!) if we move the
+.\"    trap up by the size of  the  footnote  diversion  "tf".  So,  we
+.\"    fudge things a little bit -- for the first footnote on each page
+.\"    we move the footer trap up 1 extra line ("line" being 1v in env-
+.\"    ironment  #0).   Unless  the point size and vertical spacing are
+.\"    increased between the first footnote and the footer trap's being
+.\"    sprung,  this  will  keep  the footnotes on the same page as the
+.\"    footnoted word.  But as there may be now as much as 1v of  space
+.\"    between the footnote and the bottom margin, which looks HIDEOUS,
+.\"    we use the number register "fs" to mark where  the  footer  trap
+.\"    would  REALLY go, and just space to it when it comes time to put
+.\"    out the footnotes.
+.de fd                                 \" dump footnotes
+.nr gs 1v                              \" get a measure of 1 line in env #0
+.ev 1                                  \" switch to footnote environment
+.nr gs +2v                             \" min of 2 lines of footnotes
+.                                      \" if the number register ns > 0,
+.                                      \" the last text line may contain a
+.                                      \" footnote that is too big to fit;
+.                                      \" this checks for such a note and
+.                                      \" if so, forces the footnote into
+.                                      \" the "fy" diversion that carries
+.                                      \" it onto the next text page
+.ie (\\n(nsu>0)&(\\n(gsu>=\\n(.tu) 'sp \\n(gsu \" be sure you can get it down
+.el .if \\n(fsu>\\n(nlu 'sp \\n(fsu-\\n(nlu    \" move to footnote start position
+'nf                                    \" don't reprocess footnotes
+'in 0                                  \" don't indent them any more either
+.tf                                    \" drop text of footnotes
+.rm tf
+.if '\\n(.z'fy' .di                    \" end overflow diversion, if any
+.nr fc 0                               \" re-init footnote count
+.ev                                    \" return to usual environment
+..
+.de fn                                 \" start footnote
+.                                      \" look for nested footnotes -- ILLEGAL
+.ie \\n(if>0 .er "footnote within footnote"
+.el .da tf                             \" append footnote to footnote diversion
+.nr if +1                              \" increment level of footnoting
+.nr fc +1                              \" one more footnote on this page
+.if \\n(fc=1 .nr fp -1v                        \" The reason for this "fudge factor"
+.                                      \" is that there is no way to force
+.                                      \" NROFF/TROFF to invoke a macro at
+.                                      \" the end of each line.  At times,
+.                                      \" the trap boundary will not match up
+.                                      \" with the bottom of a line, so the
+.                                      \" "fo" trap which is set at 2320 may
+.                                      \" not be triggered until 2340 -- and
+.                                      \" then the footnote won't fit.  This
+.                                      \" gives some slack so the footnote is
+.                                      \" more likely to fit. *sigh*
+.ev 1                                  \" enter footnote environment
+.if \\n(fc=1 .fs                       \" drop separator if first footnote
+.br                                    \" flush out any previous line in footnote
+.fi                                    \" process footnote in fill mode
+..
+.de ef                                 \" end footnote
+.br                                    \" flush out the line in footnote
+.ie \\n(if<=0 .er "end footnote has no corresponding begin footnote"
+.el \{\
+.      nr if -1                        \" decrement level of footnoting
+.      nr fg 2v                        \" remember this for repositioning fo
+.      ev                              \" back to usual environment
+.      if \\n(if=0 \{\
+.              di                      \" end of footnote proper
+.              nr fp -\\n(dnu          \" "fo" will be moved at least up this far
+.              nr fs -\\n(dnu          \" increase size of footnote
+.              ch fo \\n(fpu           \" reposition "fo" trap (first guess)
+.                                      \" the first part of the "ie" clause
+.                                      \" is taken in the special case
+.                                      \" described above
+.              ie (\\n(fc=1)&((\\n(nlu+1v+\\n(fgu)>=(\\n(.pu-\\n(bmu)) \{\
+.                      nr ns \\n(dnu   \" suppress footnote separator
+.                                      \" since this footnote contains it
+.                                      \" keep "fo" from being invoked twice
+.                      ch fo \\n(.pu+1i
+.                      fo              \" force the page out AT ONCE
+.                      nr ns 0         \" re-enable footnote separator
+.              \}
+.                                      \" footnote won't fit completely
+.              el .if (\\n(nlu+1v)>=(\\n(.pu+\\n(fpu) .ch fo \\n(nlu+1u
+.      \}
+.\}
+..
+.de fs                                 \" drop footnote separator
+.                                      \" only if not already dropped
+.if \\n(ns=0 \l'1i'
+.nr ns 0                               \" in case footnotes are over 1 page long
+..
+.de fx                                 \" process footnote overflow
+.if \\n(fc .di fy                      \" stuff them in the right place
+..
+.de fz                                 \" deposit footnote overflow
+.fn                                    \" treat it as a footnote
+.nf                                    \" it's already been processed
+.in 0                                  \"   and indented
+.fy                                    \" "fx" put it here
+.ef                                    \" end the footnote
+..
+.\" **********
+.\" the ones after here are user-invoked (like "fn" and "ef" above)
+.\" title, author, etc.
+.de mt                                 \" main title
+\&
+.sp |\\n(mtu                           \" space
+.ft 3                                  \" in bold
+.ps \\n(ps+2p                          \" large point size and
+.vs \\n(vs+2p                          \" vertical spacing
+.ce 1000                               \" center the title
+.nr t2 1                               \" space it
+..
+.de au                                 \" author
+.nr t2 0                               \" spacing here
+.sp 2v                                 \" space
+.ft 2                                  \" in italics
+.ps \\n(ps                             \" usual point size and
+.vs \\n(vs                             \" vertical spacing
+.ce 1000                               \" center the name(s)
+..
+.de ai                                 \" author's institution
+.if \\n(t2 .sp 2v                      \" space after a title
+.nr t2 0                               \" institution
+.ft 2                                  \" in italics
+.ps \\n(ps                             \" usual point size and
+.vs \\n(vs                             \" vertical spacing
+.ce 1000                               \" center the name(s)
+..
+.de bt                                 \" begin text macro
+.nr t2 0                               \" hold it here
+.nr it +1                              \" mark as called
+.ce 0                                  \" end any centering
+.sn 3v                                 \" a little bit of space
+..
+.\" paragraph
+.de si                                 \" start indented section
+.nr lo \\n(lm                          \" remember the current level
+.nr lm +1                              \" go to the next level
+.ie '\\$1'' .nr l\\n(lm \\n(l\\n(lo+5n \" if no arg, indent 5n
+.el         .nr l\\n(lm \\$1n          \" otherwise, indent that much
+..
+.de ei                                 \" end indent
+.nr lm -1                              \" down one level
+.if \\n(lm<0 .nr lm 0                  \" make sure you don't go too far
+..
+.de pg                                 \" plain old paragraph
+.if !\\n(it .bt                                \" end the title and such
+.sn \\n(pdu                            \" inter-paragraph spacing
+.ft 1                                  \" reset a few things (paranoia)
+.                                      \" these ONLY if not in footnote
+.ie \\n(if=0 \{\
+.      ps \\n(ps                       \" reset point size
+.      vs \\n(vs                       \" reset vertical spacing
+.      ne 1v+\\n(.Vu                   \" slightly more than 1 line
+.\}
+.el \{\
+.      ps \\n(ps-2p                    \" reset point size
+.      vs \\n(vs-2p                    \" reset vertical spacing
+.\}
+.in \\n(l\\n(lmu                       \" stop any indenting
+.ce 0                                  \" stop any centering
+.if !'\\$1'L' .if !'\\$1'l' .ti +\\n(piu       \" indent the sucker
+..
+.de lp                                 \" labelled paragraph
+.pg l                                  \" reset paragraph
+.if \\n(.$>1 .nr li \\$2n              \" if indent given use it
+.in +\\n(liu                           \" indent for paragraph
+.ti -\\n(liu                           \" force first line NOT to indent
+.ta +\\n(liu                           \" for the label
+\&\\$1\t\c
+.if \\w'\\$1'u>=(\\n(l\\n(lmu+\\n(liu) .br     \" don't overwrite
+..
+.\" section
+.de hu                                 \" header, unnumbered
+.if !\\n(it .bt                                \" end the title and such
+.br                                    \" force out previous line
+.b
+.ps \\n(ps
+.vs \\n(vs
+.in \\n(l\\n(lmu                       \" stop any indenting
+.sn \\n(hsu                            \" inter-section spacing
+.ne 3v+\\n(.Vu                         \" slightly more than 3 lines
+.fi                                    \" process the text, too
+..
+.de hn                                 \" header, numbered
+.hu
+.ie !'\\$1'' .nr hn \\$1
+.el          .nr hn 1
+.ie \\n(hn>0 .nr hn -1
+.el          .nr hn 0
+.ie \\n(hn=0 \{\
+.      nr h0 +1                        \" add 1 to main section header
+.      nr h1 0                         \" zap remaining section numbers
+.      nr h2 0                         \" zap remaining section numbers
+.      nr h3 0                         \" zap remaining section numbers
+\\n(h0.
+.\}
+.el .ie \\n(hn=1 \{\
+.      nr h1 +1                        \" add 1 to the section header
+.      nr h2 0                         \" zap remaining section numbers
+.      nr h3 0                         \" zap remaining section numbers
+\\n(h0.\\n(h1.
+.\}
+.el .ie \\n(hn=2 \{\
+.      nr h2 +1                        \" add 1 to the section header
+.      nr h3 0                         \" zap remaining section numbers
+\\n(h0.\\n(h1.\\n(h2.
+.\}
+.el \{\
+.      nr h3 +1                        \" add 1 to the section number
+\\n(h0.\\n(h1.\\n(h2.\\n(h3.
+.\}
+.if \\n(.$=2 \\$2
+..
+.\" displays (no floats, thank God!)
+.de sd                                 \" start display
+.                                      \" look for nested displays -- ILLEGAL
+.ie \\n(id>0 .er "display within display"
+.el \{\
+.      ie '\\$1'c' .nr sf 1            \" center the sucker
+.      el          .nr sf 0            \" don't center it
+.\}
+.sn \\n(pdu                            \" a little bit of space
+.ev 2                                  \" switch to display environment
+.nf                                    \" what you type is what you get
+.if \\n(id=0 .di dd                    \" start saving text
+.rs                                    \" don't eat leading space
+.nr id +1                              \" increment level of display
+..
+.de ed                                 \" end display
+.br                                    \" flush line
+.ie \\n(id<=0 .er "end display has no corresponding begin display"
+.el \{\
+.      nr id -1                        \" decrement level of display
+.      if \\n(id=0 \{\
+.              di                      \" end diversion
+.              fi                      \" resume filling
+.              in -\\n(piu             \" dedent
+.              ev                      \" pop environment
+.              ne \\n(dnu              \" be sure you have room
+.              nf                      \" don't reprocess display
+.              rs                      \" don't eat leading space
+.              zi                      \" save indents
+.              ie \\n(sf .in (\\n(llu-\\n(dlu)/2u      \" center on the line length
+.              el .in +\\n(piu         \" indent the sucker
+.              dd                      \" drop display
+.              yi                      \" restore indents
+.      \}
+.\}
+.fi                                    \" resume filling
+.sn \\n(pdu                            \" a little bit of space
+..
+.\" **********
+.\" fonts -- if argument(s), apply only to first
+.de b                                  \" bold (font 3)
+.ie \\n(.$>0 \\&\\$3\\f3\\$1\\fP\\$2
+.el .ft 3
+..
+.de i                                  \" italics (font 2)
+.ie \\n(.$>0 \\&\\$3\\f2\\$1\\fP\\$2
+.el .ft 2
+..
+.de r                                  \" roman (font 1)
+.ft 1                                  \" just restore it
+..
+.de bi                                 \" bold italics (embolden font 2)
+\\&\\$3\c
+\\kb\\f2\\$1\\fP\\h'|\\nbu+2u'\\f2\\$1\\fP\\$2
+..
+.\" **********
+.\" point sizes -- if argument(s), apply only to first
+.de sm                                 \" reduce point size by 2
+.ie \\n(.$>0 \\&\\$3\\s-2\\$1\\s0\\$2
+.el .ps -2
+..
+.de is                                 \" increase point size by 2
+.ie \\n(.$>0 \\&\\$3\\s+2\\$1\\s0\\$2
+.el .ps +2
+..
+.de nl                                 \" return to normal size
+.ps \\n(ps                             \" just reset the point size
+..
+.\" **********
+.\" handy force space/inhibit more space macros
+.de sn                                 \" space, then turn on nospace mode
+.sp \\$1                               \" space
+.ns                                    \" ignore any more space requests
+..
+.de sr                                 \" force out space
+.rs                                    \" turn on spacing mode
+.sp \\$1                               \" space
+..
+.\" **********
+.\" end of text and error macros
+.de et                                 \" end of text macro
+.br                                    \" flush out remaining line
+.tf                                    \" dump any footnotes
+.                                      \" check for open displays or footnotes
+.if \\n(id>0 .er "unfinished display"
+.if \\n(if>0 .er "unfinished footnote"
+.                                      \" this one means an -mn bug (*sigh*)
+.if !'\\n(.z'' .er "diversion \\n(.z not closed"
+..
+.de er                                 \" print error message
+.                                      \" flag it as an error
+.ds ws "** ERROR **
+.                                      \" if you have it, give the file name
+.if !'\\*(.f'' .as ws " file \\*(.f,
+.                                      \" put out the line number
+.as ws " line \\n(.c
+.                                      \" and finally the error message
+.tm \\*(ws: \\$1
+..
+.\" **********
+.\" macros in this section are VERY specific to the news documentation
+.de pa                                 \" protocol appellation (darn names!)
+\\&\\$3\\f2\\$1\\fP\\$2
+..
+.de ng                                 \" news group name
+\\&\\$3\\f3\\$1\\fP\\$2
+..
+.de cn                                 \" computer name
+\\&\\$3\\f2\\$1\\fP\\$2
+..
+.de hf                                 \" header field
+\\&\\$3\\*(lq\\$1\\*(rq\\$2
+..
+.de cf                                 \" contents of field
+\\&\\$3\\*(lq\\$1\\*(rq\\$2
+..
+.de qc                                 \" quote control char (command)
+\\&\\$3\\f3<\\s-2\\$1\\s0>\\fP\\$2
+..
+.de qp                                 \" quote printing char (command)
+\\&\\$3\\f3\\$1\\fP\\$2
+..
+.de op                                 \" option
+\\&\\$3\\f3\\$1\\fP\\$2
+..
+.\" **********
+.\" trademarked names
+.de pd                                 \" print "PDP-11"
+.ie \\n(p1 \\&\\$2\\s-1PDP\\s0-11\\$1
+.el \{\
+.      nr p1 +1                        \" mark footnote as dropped
+\\&\\$2\\s-1PDP\\s0-11\\*(dg\\$1
+.      fn                              \" put out the footnote
+\\&\\*(dgPDP-11 is a trademark of Digital Equipment Corporation.
+.      ef                              \" short and sweet ...
+.\}
+..
+.de ux                                 \" print "UNIX"
+.ie \\n(ux \\&\\$2\\s-1UNIX\\s0\\$1
+.el \{\
+.      nr ux +1                        \" mark footnote as dropped
+\\&\\$2\\s-1UNIX\\s0\\s-5\\u\\*(rg\\s0\\d\\$1
+.      fn                              \" put out the footnote
+\\&\\s-5\\u\\*(rg\\s0\\dUNIX is a registered trademark of AT&T.
+.      ef                              \" short and sweet ...
+.\}
+..
+.de vx                                 \" print "VAX"
+.ie \\n(vx \\&\\$2\\s-1VAX\\s0\\$1
+.el \{\
+.      nr vx +1                        \" mark footnote as dropped
+\\&\\$2\\s-1VAX\\s0\\*(dg\\$1
+.      fn                              \" put out the footnote
+\\&\\*(dgVAX is a trademark of Digital Equipment Corporation.
+.      ef                              \" short and sweet ...
+.\}
+..
+.\" **********
+.\" set up string and number registers
+.                                      \" set up for the date
+.if \n(mo=1  .ds mo January
+.if \n(mo=2  .ds mo February
+.if \n(mo=3  .ds mo March
+.if \n(mo=4  .ds mo April
+.if \n(mo=5  .ds mo May
+.if \n(mo=6  .ds mo June
+.if \n(mo=7  .ds mo July
+.if \n(mo=8  .ds mo August
+.if \n(mo=9  .ds mo September
+.if \n(mo=10 .ds mo October
+.if \n(mo=11 .ds mo November
+.if \n(mo=12 .ds mo December
+.ds dy "\*(mo \n(dy, 19\n(yr
+.if \n(dw=1  .ds dw Sunday
+.if \n(dw=2  .ds dw Monday
+.if \n(dw=3  .ds dw Tuesday
+.if \n(dw=4  .ds dw Wednesday
+.if \n(dw=5  .ds dw Thursday
+.if \n(dw=6  .ds dw Friday
+.if \n(dw=7  .ds dw Saturday
+.                                      \" NROFF dependencies
+.if n \{\
+.                                      \" string registers
+.      ds dg *
+.      ds rg *
+.      ds lq ""
+.      ds rq ""
+.      ds f1 "\*(dy
+.                                      \" number registers
+.      nr hs 1v                        \" space before section header
+.      nr pd 1v                        \" inter-paragraph spacing
+.      nr bm 1.0i                      \" height of bottom margin
+.\}
+.if t \{\
+.                                      \" string registers
+.      ds dg \(dg
+.      ds rg \(rg
+.      ds lq ``
+.      ds rq ''
+.                                      \" number registers
+.      nr hs 1v                        \" space before section header
+.      nr pd 0.3v                      \" inter-paragraph spacing
+.      nr bm 1.0i+1v                   \" height of bottom margin (wacky laser)
+.\}
+.                                      \" these are the same for [NT]ROFF
+.ds vr "News Version B 2.11
+.ds h1 - % -
+.nr bt 0.5i+1v                         \" bottom of page to footer
+.nr cm 0                               \" no cut marks
+.nr fc 0 1                             \" init footnote count
+.nr fl 5.5i                            \" footnote line length
+.nr fp 0-\n(bmu                                \" fo macro trap location
+.nr h0 0                               \" init section header level 0
+.nr h1 0                               \" init section header level 1
+.nr h2 0                               \" init section header level 2
+.nr h3 0                               \" init section header level 3
+.nr id 0                               \" 1 in display
+.nr if 0                               \" 1 in keep
+.nr it 0                               \" 1 when beyond title, etc.
+.nr li 5n                              \" indent for labelled paragraph
+.nr ll 6.5i                            \" line length
+.nr lm 0                               \" left margin
+.nr l0 0                               \" first indent level
+.nr mt 1.5i+1v                         \" title goes down this far
+.nr pi 5n                              \" regular paragraph indent
+.nr po 1.0i                            \" page offset
+.nr ps 10                              \" point size
+.nr tm 1.0i                            \" height of top margin
+.nr tt 0.5i-0.5v                       \" top of page to header
+.nr p1 0                               \" no PDP-TM message yet
+.nr ux 0                               \" no UNIX-TM message yet
+.nr vx 0                               \" no VAX-TM message yet
+.nr vs 12                              \" vertical spacing
+.\" set things up
+.po \n(pou                             \" set page offset
+.ps \n(ps                              \" set previous, current
+.ps \n(ps                              \"   point sizes
+.vs \n(vs                              \" set previous, current
+.vs \n(vs                              \"   vertical spacings
+.ll \n(llu                             \" set line length
+.lt \n(llu                             \" set title line length
+.ev 1                                  \" *** footnote environment
+.ps \n(ps-2p                           \" set previous, current
+.ps \n(ps-2p                           \"   point sizes
+.vs \n(vs-2p                           \" set previous, current
+.vs \n(vs-2p                           \"   vertical spacings
+.ll \n(flu                             \" set line length
+.lt \n(flu                             \" set title line length
+.ev                                    \" *** pop environment
+.ev 2                                  \" *** footnote environment
+.ps \n(ps                              \" set previous, current
+.ps \n(ps                              \"   point sizes
+.vs \n(vs                              \" set previous, current
+.vs \n(vs                              \"   vertical spacings
+.ll \n(llu                             \" set line length
+.lt \n(llu                             \" set title line length
+.ev                                    \" *** pop environment
+.\" install traps
+.wh 0i hd                              \" position header trap
+.wh -\n(bmu fo                         \" position footer trap
+.wh \n(.pu+1i fx                       \" put footnote overflow trap here
+.ch fx -\n(bmu                         \" move it over fo
+.wh -\n(btu pf                         \" print the bottom margin here
+.em et                                 \" at end of file, call et
+.\" couple of miscellaneous requests
+.bd S 3 3                              \" embolden special font chars if B
+.hy 2                                  \" don't hyphenate last lines