

The LaTeX Project Public License
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

LPPL Version 1.2  1999-09-03

Copyright 1999 LaTeX3 Project
    Everyone is allowed to distribute verbatim copies of this
    license document, but modification of it is not allowed.


PREAMBLE
========

The LaTeX Project Public License (LPPL) is the license under which the
base LaTeX distribution is distributed.

You may use this license for any program that you have written and wish
to distribute.  This license may be particularly suitable if your
program is TeX-related (such as a LaTeX package), but you may use it
even if your program is unrelated to TeX.  The section `WHETHER AND HOW
TO DISTRIBUTE PROGRAMS UNDER THIS LICENSE`, below, gives instructions,
examples, and recommendations for authors who are considering
distributing their programs under this license.

In this license document, `The Program` refers to any program
distributed under this license.

This license gives conditions under which The Program may be distributed
and conditions under which modified versions of The Program may be
distributed.  Individual files of The Program may bear supplementary
and/or superseding conditions on modification of themselves and on the
distribution of modified versions of themselves, but *no* file of The
Program may bear supplementary or superseding conditions on the
distribution of an unmodified copy of the file.  A distributor wishing
to distribute a complete, unmodified copy of The Program therefore
needs to check the conditions only in this license and nowhere else.

Activities other than distribution and/or modification of The Program
are not covered by this license; they are outside its scope.  In
particular, the act of running The Program is not restricted.

We, the LaTeX3 Project, believe that the conditions below give you
the freedom to make and distribute modified versions of The Program
that conform with whatever technical specifications you wish while
maintaining the availability, integrity, and reliability of
The Program.  If you do not see how to achieve your goal while 
meeting these conditions, then read the document `cfgguide.tex`
in the base LaTeX distribution for suggestions.


CONDITIONS ON DISTRIBUTION AND MODIFICATION
===========================================

You may distribute a complete, unmodified copy of The Program.
Distribution of only part of The Program is not allowed.

You may not modify in any way a file of The Program that bears a legal
notice forbidding modification of that file.

You may distribute a modified file of The Program if, and only if, the
following eight conditions are met:

  1. You must meet any additional conditions borne by the file on the
     distribution of a modified version of the file as described below
     in the subsection `Additional Conditions on Individual Files of
     The Program`.
 
  2. If the file is a LaTeX software file, then you must meet any
     applicable additional conditions on the distribution of a modified
     version of the file that are described below in the subsection
     `Additional Conditions on LaTeX Software Files`.
 
  3. You must not distribute the modified file with the filename of the
     original file.
 
  4. In the modified file, you must acknowledge the authorship and
     name of the original file, and the name (if any) of the program
     which contains it.
 
  5. You must change any identification string in the file to indicate
     clearly that the modified file is not part of The Program.
 
  6. You must change any addresses in the modified file for the
     reporting of errors in the file or in The Program generally to
     ensure that reports for files no longer maintained by the original
     maintainers will be directed to the maintainers of the modified
     files.
 
  7. You must distribute the modified file under a license that forbids
     distribution both of the modified file and of any files derived
     from the modified file with the filename of the original file.
 
  8. You must do either (A) or (B):

       (A) distribute a copy of The Program (that is, a complete,
           unmodified copy of The Program) together with the modified
           file; if your distribution of the modified file is made by
           offering access to copy the modified file from a designated
           place, then offering equivalent access to copy The Program
           from the same place meets this condition, even though third
           parties are not compelled to copy The Program along with the
           modified file;

       (B) provide to those who receive the modified file information
           that is sufficient for them to obtain a copy of The Program;
           for example, you may provide a Uniform Resource Locator (URL)
           for a site that you expect will provide them with a copy of 
           The Program free of charge (either the version from which
           your modification is derived, or perhaps a later version).

Note that in the above, `distribution` of a file means making the
file available to others by any means.  This includes, for instance,
installing the file on any machine in such a way that the file is
accessible by users other than yourself.  `Modification` of a file
means any procedure that produces a derivative file under any
applicable law -- that is, a file containing the original file or
a significant portion of it, either verbatim or with modifications
and/or translated into another language.

Changing the name of a file (other than as necessitated by the file
conventions of the target file systems) is considered to be a
modification of the file.

The distribution conditions in this license do not have to be
applied to files that have been modified in accordance with the
above conditions.  Note, however, that Condition 7. does apply to
any such modified file.

The conditions above are not intended to prohibit, and hence do not
apply to, the updating, by any method, of a file so that it becomes
identical to the latest version of that file of The Program.

 

A Recommendation on Modification Without Distribution
-----------------------------------------------------

It is wise never to modify a file of The Program, even for your own
personal use, without also meeting the above eight conditions for
distributing the modified file.  While you might intend that such
modified files will never be distributed, often this will happen by
accident -- you may forget that you have modified the file; or it may
not occur to you when allowing others to access the modified file
that you are thus distributing it and violating the conditions of
this license.  It is usually in your best interest to keep your copy
of The Program identical with the public one.  Many programs provide
ways to control the behavior of that program without altering its
licensed files.


Additional Conditions on Individual Files of The Program
--------------------------------------------------------

An individual file of The Program may bear additional conditions that
supplement and/or supersede the conditions in this license if, and only
if, such additional conditions exclusively concern modification of the
file or distribution of a modified version of the file.  The conditions
on individual files of The Program therefore may differ only with
respect to the kind and extent of modification of those files that
is allowed, and with respect to the distribution of modified versions
of those files.


Additional Conditions on LaTeX Software Files
---------------------------------------------

If a file of The Program is intended to be used with LaTeX (that is,
if it is a LaTeX software file), then the following additional
conditions, which supplement and/or supersede the conditions
above, apply to the file according to its filename extension:

  - You may not modify any file with filename extension `.ins` since
    these are installation files containing the legal notices that are
    placed in the files they generate.
 
  - You may distribute modified versions of files with filename
    extension `.fd` (LaTeX font definition files) under the standard
    conditions of the LPPL as described above.  You may also distribute
    such modified LaTeX font definition files with their original names
    provided that:
    (1) the only changes to the original files either enable use of
        available fonts or prevent attempts to access unavailable fonts;
    (2) you also distribute the original, unmodified files (TeX input
        paths can be used to control which set of LaTeX font definition
        files is actually used by TeX).

  - You may distribute modified versions of files with filename
    extension `.cfg` (configuration files) with their original names.
    The Program may (and usually will) specify the range of commands
    that are allowed in a particular configuration file.
 
Because of portability and exchangeability issues in LaTeX software,
The LaTeX3 Project deprecates the distribution of modified versions of
components of LaTeX or of generally available contributed code for them,
but such distribution can meet the conditions of this license.


NO WARRANTY
===========

There is no warranty for The Program.  Except when otherwise stated in
writing, The Copyright Holder provides The Program `as is`, without
warranty of any kind, either expressed or implied, including, but not
limited to, the implied warranties of merchantability and fitness for
a particular purpose.  The entire risk as to the quality and performance
of The Program is with you.  Should The Program prove defective, you
assume the cost of all necessary servicing, repair, or correction.

In no event unless agreed to in writing will The Copyright Holder, or
any author named in the files of The Program, or any other party who may
distribute and/or modify The Program as permitted above, be liable to
you for damages, including any general, special, incidental or
consequential damages arising out of any use of The Program or out of
inability to use The Program (including, but not limited to, loss of
data, data being rendered inaccurate, or losses sustained by anyone as
a result of any failure of The Program to operate with any other
programs), even if The Copyright Holder or said author or said other
party has been advised of the possibility of such damages.


WHETHER AND HOW TO DISTRIBUTE PROGRAMS UNDER THIS LICENSE
=========================================================

This section contains important instructions, examples, and
recommendations for authors who are considering distributing their
programs under this license.  These authors are addressed as `you` in
this section.


Choosing This License or Another License
----------------------------------------

If for any part of your program you want or need to use *distribution*
conditions that differ from those in this license, then do not refer to
this license anywhere in your program but instead distribute your
program under a different license.  You may use the text of this license
as a model for your own license, but your license should not refer to
the LPPL or otherwise give the impression that your program is
distributed under the LPPL.

The document `modguide.tex` in the base LaTeX distribution explains
the motivation behind the conditions of this license.  It explains,
for example, why distributing LaTeX under the GNU General Public
License (GPL) was considered inappropriate.  Even if your program is
unrelated to LaTeX, the discussion in `modguide.tex` may still be
relevant, and authors intending to distribute their programs under any
license are encouraged to read it.


How to Use This License
-----------------------

To use this license, place in each of the files of your program both
an explicit copyright notice including your name and the year and also
a statement that the distribution and/or modification of the file is
constrained by the conditions in this license.

Here is an example of such a notice and statement:

  %% pig.dtx
  %% Copyright 2001 M. Y. Name
  %
  % This program may be distributed and/or modified under the
  % conditions of the LaTeX Project Public License, either version 1.2
  % of this license or (at your option) any later version.
  % The latest version of this license is in
  %   http://www.latex-project.org/lppl.txt
  % and version 1.2 or later is part of all distributions of LaTeX 
  % version 1999/12/01 or later.
  %
  % This program consists of the files pig.dtx and pig.ins

Given such a notice and statement in a file, the conditions given in
this license document would apply, with `The Program` referring to the
two files `pig.dtx` and `pig.ins`, and `The Copyright Holder` referring
to the person `M. Y. Name`.


Important Recommendations
-------------------------

 Defining What Constitutes The Program

   The LPPL requires that distributions of The Program contain all the
   files of The Program.  It is therefore important that you provide a
   way for the licensee to determine which files constitute The Program.
   This could, for example, be achieved by explicitly listing all the
   files of The Program near the copyright notice of each file or by
   using a line like

    % This program consists of all files listed in manifest.txt.

   in that place.  In the absence of an unequivocal list it might be
   impossible for the licensee to determine what is considered by you
   to comprise The Program.

 Noting Exceptional Files
  
   If The Program contains any files bearing additional conditions on
   modification, or on distribution of modified versions, of those
   files (other than those listed in `Additional Conditions on LaTeX
   Software Files`), then it is recommended that The Program contain a
   prominent file that defines the exceptional conditions, and either
   lists the exceptional files or defines one or more categories of
   exceptional files.

   Files containing the text of a license (such as this file) are
   often examples of files bearing more restrictive conditions on
   modification.  LaTeX configuration files (with filename extension
   `.cfg`) are examples of files bearing less restrictive conditions
   on the distribution of a modified version of the file.  The
   additional conditions on LaTeX software given above are examples 
   of declaring a category of files bearing exceptional additional
   conditions.




