NAME
       pack - Geometry manager that packs around edges of cavity

SYNOPSIS
       pack option arg ?arg ...?


DESCRIPTION
       The pack command is used to communicate with the packer, a
       geometry manager that arranges the children of a parent by
       packing them in order around the edges of the parent.  The
       pack command can have any of several forms,  depending  on
       the option argument:

       pack slave ?slave ...? ?options?
              If the first argument to pack is a window name (any
              value starting with ``.''),  then  the  command  is
              processed in the same way as pack configure.

       pack configure slave ?slave ...? ?options?
              The  arguments  consist of the names of one or more
              slave windows followed by pairs of  arguments  that
              specify how to manage the slaves.  See ``THE PACKER
              ALGORITHM'' below for details on  how  the  options
              are  used by the packer.  The following options are
              supported:

              -after other
                     Other must the name of another window.   Use
                     its master as the master for the slaves, and
                     insert the slaves just after  other  in  the
                     packing order.

              -anchor anchor
                     Anchor  must be a valid anchor position such
                     as n or sw; it specifies where  to  position
                     each  slave in its parcel.  Defaults to cen-
                     ter.

              -before other
                     Other must the name of another window.   Use
                     its master as the master for the slaves, and
                     insert the slaves just before other  in  the
                     packing order.

              -expand boolean
                     Specifies   whether  the  slaves  should  be
                     expanded to consume  extra  space  in  their
                     master.  Boolean may have any proper boolean
                     value, such as 1 or no.  Defaults to 0.

              -fill style
                     If a  slave's  parcel  is  larger  than  its
                     requested  dimensions,  this  option  may be
                     used to stretch the slave.  Style must  have
                     one of the following values:

                      none   Give  the slave its requested dimen-
                             sions  plus  any  internal   padding
                             requested  with  -ipadx  or  -ipady.
                             This is the default.

                      x      Stretch the  slave  horizontally  to
                             fill  the entire width of its parcel
                             (except leave  external  padding  as
                             specified by -padx).

                      y      Stretch the slave vertically to fill
                             the  entire  height  of  its  parcel
                             (except  leave  external  padding as
                             specified by -pady).

                      both   Stretch the slave both  horizontally
                             and vertically.

              -in other
                     Insert  the slave(s) at the end of the pack-
                     ing order for the  master  window  given  by
                     other.

              -ipadx amount
                     Amount  specifies how much horizontal inter-
                     nal padding to leave on  each  side  of  the
                     slave(s).   Amount  must  be  a valid screen
                     distance, such as 2 or .5c.  It defaults  to
                     0.

              -ipady amount
                     Amount  specifies how much vertical internal
                     padding  to  leave  on  each  side  of   the
                     slave(s).  Amount  defaults to 0.

              -padx amount
                     Amount  specifies how much horizontal exter-
                     nal padding to leave on  each  side  of  the
                     slave(s).  Amount defaults to 0.

              -pady amount
                     Amount  specifies how much vertical external
                     padding  to  leave  on  each  side  of   the
                     slave(s).  Amount defaults to 0.

              -side side
                     Specifies  which  side  of  the  master  the
                     slave(s) will be packed  against.   Must  be
                     left,  right,  top,  or bottom.  Defaults to
                     top.
              If no -in, -after or -before  option  is  specified
              then each of the slaves will be inserted at the end
              of the packing list for its  parent  unless  it  is
              already  managed  by  the  packer (in which case it
              will be left where it is).  If one of these options
              is  specified  then all the slaves will be inserted
              at the specified point.  If any of the  slaves  are
              already  managed  by  the geometry manager then any
              unspecified options for them retain their  previous
              values rather than receiving default values.

       pack forget slave ?slave ...?
              Removes  each  of the slaves from the packing order
              for its  master  and  unmaps  their  windows.   The
              slaves will no longer be managed by the packer.

       pack newinfo slave
              Returns  a list whose elements are the current con-
              figuration state of the slave given by slave in the
              same  option-value  form that might be specified to
              pack configure.  The first two elements of the list
              are ``-in master'' where master is the slave's mas-
              ter.  Starting with Tk  4.0  this  option  will  be
              renamed "pack info".

       pack propagate master ?boolean?
              If boolean has a true boolean value such as 1 or on
              then propagation is enabled for master, which  must
              be  a  window  name  (see  ``GEOMETRY PROPAGATION''
              below).  If boolean has a false boolean value  then
              propagation  is  disabled for master.  In either of
              these  cases  an  empty  string  is  returned.   If
              boolean  is omitted then the command returns 0 or 1
              to  indicate  whether  propagation   is   currently
              enabled  for  master.   Propagation  is  enabled by
              default.

       pack slaves master
              Returns a list of all of the slaves in the  packing
              order  for  master.  The order of the slaves in the
              list is the same as  their  order  in  the  packing
              order.   If  master  has  no  slaves  then an empty
              string is returned.


THE PACKER ALGORITHM
       For each master the packer maintains an  ordered  list  of
       slaves  called  the  packing  list.   The -in, -after, and
       -before configuration options are used to specify the mas-
       ter for each slave and the slave's position in the packing
       list.  If none of these options is given for a slave  then
       the  slave is added to the end of the packing list for its
       parent.
       The packer arranges the slaves for a  master  by  scanning
       the  packing list in order.  At the time it processes each
       slave, a rectangular area within the master is still unal-
       located.   This  area is called the cavity;  for the first
       slave it is the entire area of the master.

       For each slave the packer carries out the following steps:

       [1]    The  packer  allocates a rectangular parcel for the
              slave along the side of the  cavity  given  by  the
              slave's -side option.  If the side is top or bottom
              then the width of the parcel is the  width  of  the
              cavity  and  its  height is the requested height of
              the slave plus the -ipady and -pady  options.   For
              the  left or right side the height of the parcel is
              the height of the  cavity  and  the  width  is  the
              requested  width  of  the slave plus the -ipadx and
              -padx options.  The parcel may be enlarged  further
              because  of  the  -expand option (see ``EXPANSION''
              below)

       [2]    The packer chooses the  dimensions  of  the  slave.
              The  width  will  normally be the slave's requested
              width plus twice its -ipadx option and  the  height
              will  normally be the slave's requested height plus
              twice its -ipady option.   However,  if  the  -fill
              option  is x or both then the width of the slave is
              expanded to fill the width  of  the  parcel,  minus
              twice  the  -padx option.  If the -fill option is y
              or both then the height of the slave is expanded to
              fill the width of the parcel, minus twice the -pady
              option.

       [3]    The packer positions the slave over its parcel.  If
              the  slave  is  smaller  than  the  parcel then the
              -anchor option determines where in the  parcel  the
              slave  will  be  placed.  If -padx or -pady is non-
              zero, then the given  amount  of  external  padding
              will always be left between the slave and the edges
              of the parcel.

       Once a given slave has been packed, the area of its parcel
       is subtracted from the cavity, leaving a smaller rectangu-
       lar cavity for the next slave.  If a slave doesn't use all
       of  its parcel, the unused space in the parcel will not be
       used by subsequent slaves.  If the  cavity  should  become
       too small to meet the needs of a slave then the slave will
       be given whatever space is left in  the  cavity.   If  the
       cavity  shrinks to zero size, then all remaining slaves on
       the packing list will be unmapped from  the  screen  until
       the master window becomes large enough to hold them again.
EXPANSION
       If a master window is so large that there  will  be  extra
       space  left over after all of its slaves have been packed,
       then the extra space is distributed uniformly among all of
       the  slaves  for  which  the -expand option is set.  Extra
       horizontal  space  is  distributed  among  the  expandable
       slaves  whose  -side  is left or right, and extra vertical
       space is distributed among  the  expandable  slaves  whose
       -side is top or bottom.


GEOMETRY PROPAGATION
       The packer normally computes how large a master must be to
       just exactly meet the needs of its slaves, and it sets the
       requested  width  and height of the master to these dimen-
       sions.  This causes geometry information to  propagate  up
       through  a  window hierarchy to a top-level window so that
       the entire sub-tree sizes itself to fit the needs  of  the
       leaf  windows.  However, the pack propagate command may be
       used to turn off propagation for one or more masters.   If
       propagation  is  disabled then the packer will not set the
       requested width and height of the  packer.   This  may  be
       useful  if,  for  example, you wish for a master window to
       have a fixed size that you specify.


RESTRICTIONS ON MASTER WINDOWS
       The master for each slave must either be the slave's  par-
       ent  (the  default) or a descendant of the slave's parent.
       This restriction is necessary to guarantee that the  slave
       can  be placed over any part of its master that is visible
       without danger of the slave being clipped by its parent.


PACKING ORDER
       If the master for a slave is not its parent then you  must
       make  sure  that the slave is higher in the stacking order
       than the master.  Otherwise the master  will  obscure  the
       slave  and  it  will  appear  as  if the slave hasn't been
       packed correctly.  The easiest way to make sure the  slave
       is  higher  than the master is to create the master window
       first:  the most recently created window will  be  highest
       in  the  stacking  order.   Or,  you can use the raise and
       lower commands to change the stacking order of either  the
       master or the slave.


KEYWORDS
       geometry  manager,  location, packer, parcel, propagation,
       size
