%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Chapter{Subgroup Lattices - Systematic Description}

In this chapter we give details about the various options and menus
available in a systematic way.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{GraphicSubgroupLattice}

\>GraphicSubgroupLattice( <g> )!{default sheet size form}

`GraphicSubgroupLattice' creates a new graphic sheet for the Hasse
diagram of the subgroup lattice of <g>.  The next sections describe
how to select and move vertices and the following sections describe the
available menus.

\begintt
gap> GraphicSubgroupLattice( DihedralGroup(8) );
<graphic subgroup lattice "GraphicSubgroupLattice">
\endtt

\>GraphicSubgroupLattice( <g>, <width>, <height> )!{sheet size setting form}

In this form `GraphicSubgroupLattice' creates a graphic sheet of initial
dimensions <width> times <height>.  However it is still possible to change
these dimensions later using either the menu (described in
"GraphicSubgroupLattice, Poset Menu") or the operation `Resize' for graphic 
sheets (see "Resize").

This function is the same for all types of groups. It only behaves differently
according to some properties of the group. For example finitely presented
groups are treated differently because other algorithms apply in this case
and some of the standard ones are not feasible to be carried out. 

In contrast to the {\GAP3} version of {\XGAP} all graphic subgroup lattices 
are interactive so you can always remove vertices. For a finite group you 
can still get the full lattice by choosing `All Subgroups' for the whole 
group.

%`GraphicSubgroupLattice( <g>, \"prime\"\ )'
%
%If you supply the parameter \"prime\", then a vertex will be placed above
%another  vertex  if the   number  of prime factors   in  the size  of the
%corresponding subgroup is larger than the number of  prime factors in the
%size  of  the  subgroup belonging   to  the second  vertex.   The default
%behaviour is to compare the sizes instead of number of prime factors.

%\begintt
%gap> GraphicSubgroupLattice( CyclicGroup(20) );;
%gap> GraphicSubgroupLattice( CyclicGroup(20), "prime" );; 
%\endtt

%`GraphicSubgroupLattice( <g>, \"normal subgroups\"\ )'

%If you supply the parameter  \"normal subgroups\", then only the  lattice
%of normal subgroups of <g> will be drawn on the graphic sheet.

%\begintt
%gap> GraphicSubgroupLattice( DihedralGroup(8), "normal subgroups" );
%\endtt

%It is possible to abbreviate \"prime\"\  and \"normal subgroups\"\ and to
%supply one or both.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{GraphicSubgroupLattice, Protocol of Group Theoretic Constructions}

\label{loggingfacility}
{\XGAP} offers the possibility to write a protocol of the group
theoretic constructions you perform via mouse clicks. This is
convenient because otherwise you have no record of what you did. The
normal {\GAP} command script cannot supply this because the menu
entries you select do not produce useful output there.

You start the protocol facility by selecting `Start logging' from the
`Subgroups' menu. You are prompted for the file name of the protocol with 
a file selector box. After selecting `OK' in this box, all subsequent
actions are logged in the protocol file. You can switch this feature
off by selecting `Stop logging' from the `Subgroups' menu.

Note that when you select `SelectedGroups to GAP' from the `Subgroups' 
menu, the usual {\GAP} logging is also directed to the {\XGAP} log
  file. This is stopped when you select `InsertVertices from GAP' from 
  the `Subgroups' menu. The idea of this is that you also see the
  {\GAP} commands you issue within an {\XGAP} session in the {\XGAP}
  protocol file, if you temporarily work with the keyboard instead of
  the mouse. See "Start logging" and "Stop logging" for a description
  of the menu entries.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{GraphicSubgroupLattice, Labelling of Levels}

\label{levelsintro}
We intend to represent subgroups of the same index at the same height
of the graphic lattice. For this purpose we introduce ``levels'' as 
horizontal slices of a graphic subgroup lattice. 

All vertices for subgroups of a certain finite index are
placed in exactly one common level. But what about infinite indices?

Every level has a ``level parameter''.
There are three types of levels: ``finite index'', ``finite size'', and 
``infinity''. ``finite index'' means, that the index of the subgroups
in this level is a certain, finite natural number, the level parameter 
is exactly this number. ``finite size'' means, that the size of the
subgroups in this level is finite *and* the index is either not known
(to {\GAP}) or `infinity'. The level parameter is the size but with a
negative sign. If the index is `infinity' and the size is
not known, the third type applies: ``infinity''. In each ``infinity''
level only one vertex can exist.

This means that ``finite index'' takes precedence over ``finite size'' 
and ``infinity'', and ``finite size'' takes precedence over
``infinity'' if {\XGAP} is in doubt which level to choose for a new
vertex. 

If the group in question is a space group provided by the CRYST 
package, levels of type ``infinity'' are also labelled by the Hirsch 
length of the subgroup, which is the number of infinite cyclic factors
in any given subnormal series. Note that this is only implemented for 
space groups as of this writing, although the Hirsch length is defined for
a wider range of groups.

For every graphic subgroup lattice the levels are partially ordered by
the following rules:

\beginlist%unordered
\item{--} A ``finite index'' level is greater than an ``infinity'' level.

\item{--} An ``infinity'' is greater than a ``finite size'' level.

\item{--} The ``finite index'' levels are totally ordered by descending indices.

\item{--} The ``finite size'' levels are totally ordered by ascending sizes. 

\item{--} For space groups the ``infinity'' levels are partially ordered by
     the Hirsch lengths of the subgroups.
\endlist

Note that in general different ``infinity'' levels are not comparable in this
partial order!

On the screen, the levels are of course always totally ordered with respect
to their height. {\XGAP} ensures that this total ordering is always
compatible with the abovementioned partial ordering. This means, that the
user can permute ``infinity'' levels, as long as this does not violate the
partial order by the Hirsch lengths and the
principle, that a vertex ``containing'' another one is drawn higher on
the screen.

Note that the level a vertex belongs to will be changed, when new
information about the subgroup is available. This happens if the user
chooses any entry in the information menu and new information is
available thereafter.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{GraphicSubgroupLattice, Moving Vertices}

In order to move a vertex, place the  pointer inside the vertex using the
mouse, and press the *left* mouse button.  Hold the mouse button pressed,
and start moving  the pointer by moving  the mouse.  The  vertex will now
follow the pointer, but it is not possible to move the vertex out of
the boundaries of its level.
%(or number of prime  factors, if \"prime\"\ was
%given as parameter to `GraphicSubgroupLattice') 
or lower than a vertex of a group of smaller
size.
%(or number of prime factors).  
As soon as you release the left mouse
button the vertex will stop following the pointer  and, if the vertex was
a member of a  conjugacy class, the remaining elements  of the class  are
moved.

If you hold  down  the <SHIFT> key before  moving  a vertex as  described
above then  only the selected vertex is moved but not all members of the
same class. You can realign the vertices of a class by selecting one of
them and choose `Rearrange Classes' in the `Poset' menu 
(see "Rearrange Classes").

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{GraphicSubgroupLattice, Selecting Vertices}

Selected vertices are represented by a slightly thicker circle and, if
your screen supports color, are colored red.  There are five different
ways to select or deselect a vertex or a bunch of vertices.

Place the  pointer inside  a  vertex and press   the *left* mouse button.
Release   the button immediately   without  moving the  mouse.  This will
deselect all other vertices  and select this vertex.   If the vertex  was
already the only selected vertex it is deselected.

Place the  pointer inside a vertex, hold  down the <SHIFT> key, and press
the  *left* mouse button.   Release the button immediately without moving
the    mouse, release the   <SHIFT> key  afterwards.   If  the vertex was
deselected this action will  select it in  addition to any other selected
vertices. If the vertex was already selected it will be deselected.

Place the pointer  outside any vertex  and press the *left* mouse button.
Keep the button pressed and start moving the pointer.  This will create a
rubber band rectangle.  One corner at the position  where you pressed the
mouse button, the opposite corner following  the pointer.  As soon as you
release the left mouse button,   all  vertices inside the rectangle   are
selected, all vertices outside the rectangle are deselected.

Place the pointer outside any vertex, hold down the <SHIFT> key and press
the *left*  mouse button.  Again  you see a rubber  band, however, now as
soon as you release  the mouse button,  all vertices inside the rectangle
are selected in addition to any other selected vertices.

To select vertices from the {\GAP} command window call the function
`SelectGroups' with a subgroup or a list of subgroups to select.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{GraphicSubgroupLattice, Inserting Vertices}

To insert new vertices into a graphic sheet one has to use the
following operation:

\>InsertVertex( <sheet>, <grp>, <conj>, <hint> )
\>InsertVertex( <sheet>, <grp> )

Inserts the group <grp> as a new vertex into the sheet. If the lattice
is *not*  the   subgroup lattice  of a  finitely  presented  group, it
checks, if the group is already in the lattice  or if there is already
a conjugate  subgroup.  Further,  the new  vertex is  sorted into  the
poset. So  `InsertVertex'  checks for  all vertices  on higher levels,
whether the new vertex  is contained,  and  for all vertices on  lower
levels, whether they are contained in the new vertex. It then tries to
add edges to the appropriate vertices.  If  the lattice is the lattice
of a  finitely presented group,  nothing is  done with respect  to the
connections of any vertex.  `InsertVertex' returns a list with the new
vertex as first entry and  a flag as  second, which says, whether this
vertex was inserted right now or has already  been there.  

<hint> is a list of $x$ coordinates which should give some hint for
the choice of the new $x$ coordinate. It can for example be the $x$
coordinates of those groups which were parameter for the operation
which calculated the group. <hints> can be empty but must always be a
list!

If <conj> is a vertex we put the new vertex into the class of this
vertex.  Otherwise <conj> should either be `false' or `fail'.

You have access to the simpler form of the above functions via the
`Subgroups' menu and the mouse. If you select 
`InsertVertices from GAP'
in the `Subgroups' menu, the function `InsertVertex' is called 
for the group in the (automatic) variable `last', or, if `last'
contains a list of subgroups, for all of those subgroups. This is an
easy way to insert results of calculations with {\GAP} into the
lattice. If `last' is neither a subgroup nor a list of subgroups,
nothing happens.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{GraphicSubgroupLattice, Sheet Menu}

The `Sheet' menu will  be pulled down if  you place the pointer inside  the
`Sheet' button  and press the left mouse  button.  Keep the button down and
choose an entry by moving the pointer on  top of this entry.  Release the
mouse button to select an entry.

\>`save as postscript'{save as postscript}@{`save as postscript'}

Selecting this entry pops up a file  selector.  If you  enter a file name
and click on <OK>, this will save a  description of the graphic sheet and
graphic objects on  the sheet as encapsulated postscript  output. This
output should be imported easily into other documents.

\>`close graphic sheet'{close graphic sheet}@{`close graphic sheet'}

This entry will close the current graphic sheet and the window containing
the sheet  and all  ``Information'' menus related  to  this sheet.  On some
window system or using  some window manager the window  itself has also a
close button or menu entry.  However,  using the window close method will
not close associated ``Information'' menus.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{GraphicSubgroupLattice, Poset Menu}

The `Poset' menu will be pulled down if you place the pointer inside the
`Poset' button and  press the left mouse  button.  Keep  the button down
and choose an entry by moving the pointer on top of  this entry.  Release
the mouse button to select an entry.

This menu is a generic menu for any graphic poset and is not specific to
subgroup lattices. So you find here options for the handling of general
posets. 

\>`Redraw'{Redraw}@{`Redraw'}

  The whole lattice will be redrawn. Use this option if some manipulation
  has disturbed the window.
  
\>`Show Levels'{Show Levels}@{`Show Levels'}

  If this menu entry is activated (after clicking it will have a small
  check sign at its right, clicking again deactivates it), there will be a
  little blue box under each level at the left edge of the graphic
  sheet. You can use these little boxes to change the height of a level by
  moving it up or down like a vertex. In cases where the order of the
  levels is not given by some ``external source'' like the index of the
  subgroups you can move levels by moving the corresponding blue box with
  pressed <SHIFT> button.
  
\>`Show Levelparameters'{Show Levelparameters}@{`Show Levelparameters'}

  This menu entry controls the display of the level parameters at the right 
  edge of the graphic sheet. Normally these are displayed but you can
  switch it off with this menu entry.

\>`Delete Vertices'{Delete Vertices}@{`Delete Vertices'}

  Selecting the entry will delete all selected vertices. All edges from or
  to one of these are also deleted. However, inclusion information is
  preserved. This means that new edges are created from all vertices which
  were maximal in the deleted one to all vertices in which the deleted
  vertex was maximal. So you get the Hasse diagram of the poset which is
  the restriction of the former one to the not selected vertices.

\>`Delete Edge'{Delete Edge}@{`Delete Edge'}

  This menu entry is normally not selectable because it would destroy the
  Hasse diagram.
  
\>`Merge Classes'{Merge Classes}@{`Merge Classes'}

This menu  entry merges all  classes within each  level that contain a
selected  vertex.    Afterwards  `RearrangeClasses'  (see   below)  is
performed.  Use `Merge Classes' to  unite classes within a level,  but
use it  with care: No further test  is performed! If you unite classes
of subgroups that are not conjugate, other  errors may follow, because
conjugacy tests  are later on only  performed by  looking at the first
subgroup in a given class!

\>`Magnify Lattice'{Magnify Lattice}@{`Magnify Lattice'}

  Selecting the entry will multiply the dimensions of the graphic sheet by
  the square root of $2$ and enlarge the lattice accordingly.

\>`Shrink Lattice'{Shrink Lattice}@{`Shrink Lattice'}

  Selecting  the entry will divide the  dimensions  of the graphic sheet by 
  the square root of $2$ and shrink the lattice accordingly.

\>`Resize Lattice'{Resize Lattice}@{`Resize Lattice'}

Selecting this entry will pop up a dialog box asking for an x and y factor
separated by a comma.  You can enter integers or quotients. If you enter
only one number this is used for x and y.  The graphic sheet is then
enlarged or shrunk and the lattice is resized accordingly.

\>`Resize Sheet'{Resize Sheet}@{`Resize Sheet'}

This  entry is similar to `Resize  Lattice' except that  only the graphic
sheet is changed, the lattice remains unchanged. The numbers you enter must 
be integers and mean pixel numbers.

\>`Change Labels'{Change Labels}@{`Change Labels'}

Selecting  this entry will pop  up a dialog  box for each selected vertex
asking for a new label.  Clicking on <CANCEL>  will cancel the relabelling
of the remaining vertices but will not reset the already changed labels.

\>`Average Y Positions'{Average Y Positions}@{`Average Y Positions'}

Selecting this entry will average the y coordinates of all vertices
belonging to the same level. For graphic subgroup lattices this means all
subgroups with the same index in the whole group.

\>`Average X Positions'{Average X Positions}@{`Average X Positions'}

Selecting this entry  will  average the x   coordinates  of two or   more
selected vertices.  This will only work if the corresponding subgroups do
not have the same size and is used to align certain vertices
vertically.

\>`Rearrange Classes'{Rearrange Classes}@{`Rearrange Classes'}

Selecting this entry will clean up all classes which contain a selected
vertex. You need this option if you have moved a vertex without its class
(holding down the <SHIFT> key). The vertices in a class are arranged one
next to the other horizontally without changing the order of the x
coordinates. So you can permute the vertices within a class carelessly and
then again get a nice picture with the new order by selecting this menu
entry.

\>`Use Black\&White'{Use BlackWhite}@{`Use Black\&White'}

Switches to black and white in case of a color screen or back to colors.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{GraphicSubgroupLattice, Subgroups Menu}

The `Subgroups' menu will be pulled down  if you place the pointer inside
the `Subgroups' button and press the left mouse  button.  Keep the button
down and choose an entry   by moving the pointer  on  top of this  entry.
Release the mouse button to select an entry.

Note that you can also get the `Subgroups' menu as a popup menu by
clicking with the right mouse button into the graphic sheet of the subgroup
lattice, but *not* on a vertex.

The result   of a computation from   any of the  following  entries is
colored green, if your screen supports color.  There will also be a short
information message in the {\GAP} window about the result.

In the following descriptions   we use ``vertices'' as abbreviation  for
``subgroups associated with vertices''.

The following descriptions do not apply to the case of finitely presented
groups. See "GraphicSubgroupLattice for FpGroups, Subgroups Menu" for this
case. 

\>`All Subgroups'{All Subgroups}@{`All Subgroups'}

For each selected vertex `All Subgroups' computes and displays all its
subgroups. Requires at least one selected vertex. Use with care! This can
cause huge computations!  See also "ref:LatticeSubgroups" in the {\GAP}
reference manual.

\>`Centralizers'{Centralizers}@{`Centralizers'}

For each selected vertex `Centralizers' computes and displays its
centralizer with respect to the whole group.  Requires at least one
selected vertex.  See also "ref:Centralizer" in the {\GAP}
reference manual.

\>`Centres'{Centres}@{`Centres'}

For each selected vertex `Centres' computes and displays its centre.
Requires at least one selected vertex. See also "ref:Centre" in the {\GAP}
reference manual.

\>`Closure'{Closure}@{`Closure'}

computes and displays the common closure of the selected vertices.
Requires at least one selected vertex. See also "ref:ClosureGroup" in the
{\GAP} reference manual.

\>`Closures'{Closures}@{`Closures'}

computes and displays the closure of each pair of selected vertices.
Requires at least two selected vertices. See also "ref:ClosureGroup" in the
{\GAP} reference manual.

\>`Commutator Subgroups'{Commutator Subgroups}@{`Commutator Subgroups'}

computes and displays  the commutator  subgroup of each pair of selected
vertices.    Requires  at  least    two   selected  vertices. See    also
"ref:CommutatorSubgroup" in the {\GAP}
reference manual.

\>`Conjugate Subgroups'{Conjugate Subgroups}@{`Conjugate Subgroups'}

computes and displays the conjugacy  class (with  respect to the  whole
group) of each  selected vertex.  Requires  at least one selected vertex.
See also "ref:ConjugacyClass" in the {\GAP}
reference manual.

\>`Cores'{Cores}@{`Cores'}

For each selected vertex `Cores' computes and displays its core with
respect to the whole group.  Requires at least one selected vertex. See
also "ref:Core" in the {\GAP}
reference manual.

\>`Derived Series'{Derived Series}@{`Derived Series'}

For   each  selected vertex  `Derived  Series'  computes and displays its
derived series.   Requires  at   least  one selected vertex.    See  also
"ref:DerivedSeriesOfGroup" in the {\GAP}
reference manual.

\>`Derived Subgroups'{Derived Subgroups}@{`Derived Subgroups'}

For each selected vertex `Derived Subgroups' computes and displays its
derived subgroup.  Requires at least one selected vertex.  See also
"ref:DerivedSubgroup" in the {\GAP}
reference manual.

\>`Fitting Subgroups'{Fitting Subgroups}@{`Fitting Subgroups'}

For each selected vertex `Fitting Subgroups' computes and displays its
Fitting subgroup.  Requires at least one selected vertex.  See also
"ref:FittingSubgroup" in the {\GAP}
reference manual.

\>`Intermediate Subgroups'{Intermediate Subgroups}@{`Intermediate Subgroups'}

computes and displays all intermediate subgroups between two selected
groups. Requires exactly two selected vertices. See also
"ref:IntermediateSubgroups" in the {\GAP}
reference manual. 

\>`Intersection'{Intersection}@{`Intersection'}

computes and displays the common intersection of the selected vertices.
Requires at least one selected vertex.  See also "ref:Intersection" in the
{\GAP} reference manual.

\>`Intersections'{Intersections}@{`Intersections'}

For each pair of selected vertices `Intersections' computes and displays
the intersection of the two vertices.  Requires at least two selected
vertices.  See also "ref:Intersection" in the {\GAP}
reference manual.

\>`Normalizers'{Normalizers}@{`Normalizers'}

For each selected vertex `Normalizers' computes and displays its normalizer
with respect to the whole group.  Requires at least one selected vertex.
See also "ref:Normalizer" in the {\GAP}
reference manual.

\>`Normal Closures'{Normal Closures}@{`Normal Closures'}

For each selected vertex `Normal Closure' computes and displays its normal
closure with respect to the whole group.  Requires at least one selected
vertex.  See also "ref:NormalClosure" in the {\GAP}
reference manual.

\>`Normal Subgroups'{Normal Subgroups}@{`Normal Subgroups'}

For   each selected vertex `Normal  Subgroups'  computes and displays the
normal subgroups of the subgroup associated  with this vertex.  These new
subgroups are not  necessarily  normal in the  whole  group.  Requires at
least one selected vertex.  See also "ref:NormalSubgroups" in the {\GAP}
reference manual.

\>`Sylow Subgroups'{Sylow Subgroups}@{`Sylow Subgroups'}

pops  up a dialog  box asking   for a prime.   After entering  a  prime $p$ 
and pressing  <return> or  clicking  <OK> it computes   and displays  a Sylow
$p$-subgroup  for   each selected vertex.  Requires   at   least one selected
vertex.  See also "ref:SylowSubgroup" in the {\GAP}
reference manual.

\>`SelectedGroups to GAP'{SelectedGroups to GAP}@{`SelectedGroups to GAP'}

If  the  user  selects  this menu entry,  the  subgroups   belonging to the
selected  vertices are put into a  list which  is  stored into the variable
`last'.  This is equivalent  to the  statement `SelectedGroups(sheet);;' if
`sheet' contains the graphic sheet  object. If {\XGAP}  logging is on, then
the normal {\GAP} logging via `LogTo'  is also directed  to the {\XGAP} log
file.

\>`InsertVertices from GAP'{InsertVertices from GAP}@{`InsertVertices from GAP'}

If the user selects this  menu entry, the  value of the variable `last'  is
used to insert new vertices into the graphic sheet.  If  `last' is equal to
one subgroup, it  is inserted via  `InsertVertex'. If `last'  is a list  of
subgroups, `InsertVertex' is  called for all  those subgroups. There is  no
error  issued if one of  the entries of `last'   is no subgroup. If {\XGAP}
logging is on, then the normal {\GAP} logging via `LogTo'  is switched off! 
The idea of this is to switch  the logging temporarily from {\XGAP} logging
to normal  {\GAP} logging between two clicks  to  `SelectedGroups to GAP'
and `InsertVertices from GAP' respectively.

\>`Start Logging'{Start Logging}@{`Start Logging'}

After clicking on this menu entry the user is prompted for a filename. From 
this point on all commands issued via mouse clicks in the subgroup menu are 
logged into that file, such that one can afterwards see ``what happened''
in the {\XGAP} session. The information displayed is the same as in the
info displays in the {\GAP} window. 

\>`Stop Logging'{Stop Logging}@{`Stop Logging'}

A click onto this menu entry stops the {\XGAP} logging.

\bigskip%

These menu entries represent only a small selection of the functions
of {\GAP} which the authors of {\XGAP} considered most frequently
used. You can calculate other subgroups like for example prefrattini
subgroups from the {\GAP} command window. See sections "gapxgap" and
"xgapgap" for examples how to transfer information from the graphical
lattice of {\XGAP} to {\GAP} (via `SelectedGroups', see
"GraphicSubgroupLattice, Selecting Vertices") and vice versa (via
`SelectGroups', see "GraphicSubgroupLattice, Selecting Vertices", and
`InsertVertex', see "GraphicSubgroupLattice, Inserting Vertices").


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{GraphicSubgroupLattice, Information Menu}

Note that this section does not deal with the case of a finitely presented
group. See "GraphicSubgroupLattice for FpGroups, Information Menu" for this 
case.

Placing the pointer  inside a vertex (selected  or not)  and pressing the
*right* mouse button pops up the  ``Information'' menu.  Clicking on any of
the text  lines will compute  the corresponding  property of the subgroup
$u$ associated  with  this vertex.  Clicking   on `all' will  compute all
properties, clicking on `close' will close the ``Information'' menu.

\>`Size'{Size}@{`Size'}

computes and displays the size of $u$.  See also "ref:Size" in the
{\GAP} reference manual.

\>`Index'{Index}@{`Index'}

computes and displays the  index  of $u$ in   the whole group.  See  also
"ref:IndexInWholeGroup" in the {\GAP} reference manual.
%FIXME: eigentlich ref:Index, der ist aber falsch!

\>`IsAbelian'{IsAbelian}@{`IsAbelian'}

\>`IsCyclic'{IsCyclic}@{`IsCyclic'}

\>`IsNilpotent'{IsNilpotent}@{`IsNilpotent'}

\>`IsPerfect'{IsPerfect}@{`IsPerfect'}

\>`IsSimple'{IsSimple}@{`IsSimple'}

\>`IsSolvable'{IsSolvable}@{`IsSolvable'}

computes and displays the corresponding property of $u$.  See also
"ref:IsAbelian", "ref:IsCyclic", "ref:IsNilpotentGroup", "ref:IsPerfectGroup",
"ref:IsSimpleGroup", and "ref:IsSolvableGroup"  in the {\GAP}
reference manual.

\>`IsCentral'{IsCentral}@{`IsCentral'}

\>`IsNormal'{IsNormal}@{`IsNormal'}

computes and displays the corresponding  property of $u$ with respect  to
the whole group.  See also "ref:IsCentral" and "ref:IsNormal" in the {\GAP}
reference manual.

\>`Isomorphism'{Isomorphism}@{`Isomorphism'}

computes and displays  the isomorphism type of  $u$.  This will only work
if the size of $u$ is small.  See "smallgrp:IdGroup"  in the smallgrp
reference manual for details.

\bigskip%

Note that the exact result of all these information displays is stored in
the global variable `LastResultOfInfoDisplay' after each operation. So you
can access this easily from the {\GAP} command prompt. It is also returned
as `last' value.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%\Section{GraphicSubgroupLattice, Sheet Menu}
%
%In order to adjust any margin place the pointer outside of any vertex and
%press the  *right* mouse  button,  keep the button  pressed.  The `Sheet'
%menu will pop up.
%
%`Left Margin'
%
%selecting <Left  Margin> will narrow the  graphic sheet, setting  the new
%left margin to the x coordinate of your mouse click.
%
%`Right Margin'
%
%selecting <Right  Margin> will narrow the graphic  sheet, setting the new
%right margin to the x coordinate of your mouse click.
%
%`Top Margin'
%
%selecting <Top Margin> will narrow the graphic sheet, setting the new top
%margin to the y coordinate of your mouse click.
%
%`Bottom Margin'
%
%selecting <Bottom Margin> will narrow the graphic  sheet, setting the new
%bottom margin to the y coordinate of your mouse click.
%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Vertex Shapes}

The following vertex shapes can appear in an interactive lattice:

\>`circle'{circle!vertex shape}@{`circle'!vertex shape}

  Subgroup is not normal in whole group.

\>`diamond'{diamond!vertex shape}@{`diamond'!vertex shape}

  Subgroup is normal in whole group.

\>`rectangle'{rectangle!vertex shape}@{`rectangle'!vertex shape}

  Subgroup has an index that is too big for automatic calculation of
  normality. So it is not yet known whether this group is normal.

\bigskip%

Automatic calculation is controlled by the following variable:

\>`GGLLimitForIsNormalCalc' V

  Only for subgroups with index smaller than this number an automatic
  `IsNormal' test is performed when the vertex is added to the sheet.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{GraphicSubgroupLattice for FpGroups, Subgroups Menu}

The `Subgroups' menu will be pulled down  if you place the pointer inside
the `Subgroups' button and press the  left mouse button.  Keep the button
down and  choose an entry by  moving  the pointer on   top of this entry.
Release the mouse button to select an entry.

Note that you can also get the `Subgroups' menu as a popup menu by
clicking with the right mouse button into the graphic sheet of the subgroup
lattice, but *not* on a vertex.

The result of  a computation  from any  of  the following entries  is
colored green, if  your screen supports color.   In most cases there will
also be short information message in the {\GAP} window about the result.

Note that  some of   the menu entries  make  it  necessary  to compute
presentations of subgroups   using a modified Todd-Coxeter  algorithm. 
This can be very time consuming and  in some cases even impossible, if
the index is too high.

In  the following descriptions, we  use ``vertices'' as abbreviation for
``subgroups associated with vertices''.

\>`Abelian Prime Quotient'{Abelian Prime Quotient}@{`Abelian Prime Quotient'}

pops  up a dialog  box asking  for a  prime  $p$.  It  then computes  and
displays the largest elementary   abelian  $p$ quotient of  the  selected
vertex.  If no presentation for the  subgroup associated to the vertex is
known   a presentation is  first computed  using  a modified Todd-Coxeter
algorithm.     It then calls    `PrimeQuotient' to   compute  the largest
elementary abelian quotient.  `Abelian PrimeQuotient' requires exactly one
selected vertex. 

\>`All Overgroups'{All Overgroups}@{`All Overgroups'}

computes and   displays all overgroups   of the selected vertex.   It first
computes the permutation  action of the whole group  on  the cosets of  the
subgroup  associated with  the selected vertex  and then  searches for  all
block  systems. If the   subgroup of the   selected vertex is  normal, then
everything is   calculated within the  (finite) factor  group in   a better
representation. `All Overgroups' requires exactly one selected vertex.

\>`Closure'{Closure!for FpGroups}@{`Closure'!for FpGroups}

computes and displays the common closure of the selected vertices.
Requires at least one selected vertex. See also "ref:ClosureGroup" in the
{\GAP} reference manual.

\>`Compare Subgroups'{Compare Subgroups}@{`Compare Subgroups'}

A non-empty set of vertices must be selected to choose this menu entry. All
subgroups belonging to these vertices are compared pairwise, and the inclusion
information is displayed in the lattice. It may happen that two or more
vertices are merged if {\GAP} notices, that the subgroups are
equal. 

\>`Conjugacy Class'{Conjugacy Class}@{`Conjugacy Class'}

computes and  displays  the   conjugacy  class of  the   selected vertex.
`Conjugacy Class' requires  exactly  one selected vertex.  

\>`Cores'{Cores!for FpGroups}@{`Cores'!for FpGroups}

computes and  displays the cores  of the selected vertices.   `Cores'
requires at least one selected vertex.

\>`Derived Subgroups'{Derived SubgroupsFp}@{Derived Subgroups}

computes and displays the derived subgroups of  the selected vertices. 
If applied   to a proper subgroup  of   the whole group it   will only
display  those derived  subgroups  whose  index is  finite.   `Derived
Subgroups' requires at least one selected vertex.

\>`Epimorphisms (GQuotients)'{Epimorphisms (GQuotients)}%
@{`Epimorphisms (GQuotients)'}

pops up another menu. Requires exactly one selected vertex.

\begintt
Sym(n)
Alt(n)
PSL(d,q)
Library
User Defined 
\endtt

Click on any of these entries to try to find a quotient isomorphic to the
symmetric group (`Sym(n)'), the alternating group (`Alt(n)'), the projective
special linear group (`PSL(d,q)'), a group in a library supplied with
{\XGAP} (this will pop up a file selector), or a user defined group stored
in the variable `IMAGE_GROUP'.  After supplying additional parameters, for
example, the degree of the symmetric group or the dimension and field of
$PSL$ using dialog boxes, the corresponding entry will change, for example
to something like

\begintt
Sym(3)        3 found
\endtt

After one or more quotients were found click <display> to display them.

Note that in {\XGAP4} in fact the kernel of the epimorphism is marked whereas 
in {\XGAP3} this was not the case, even though the {\XGAP3} manual stated
this.  

In fact in {\XGAP3} a stabilizer of a permutation action on an orbit was
put into the lattice.

In case that the image of the epimorphism is a permutation group you can
get this functionality by clicking on <display point stabilizer> instead of 
<display>. 

\>`Intermediate Subgroups'{Intermediate Subgroups!for FpGroups}%
@{`Intermediate Subgroups'!for FpGroups}

computes and displays all intermediate subgroups between two selected
groups. Requires exactly two selected vertices. See also
"ref:IntermediateSubgroups" in the {\GAP} reference manual. 

\>`Intersection'{Intersection!for FpGroups}@{Intersection!for FpGroups}

computes and displays the common intersection of the selected vertices.
Requires at least one selected vertex.  See also "ref:Intersection" in the
{\GAP} reference manual.

\>`Intersections'{Intersections!for FpGroups}@{Intersections!for FpGroups}

computes and   displays   the pairwise   intersections  of  the  selected
vertices.  `Intersections' requires at least two selected vertices.

\>`Low Index Subgroups'{Low Index Subgroups}@{`Low Index Subgroups'}

pops up a dialog box asking for index  limit $k$.  It  will then do a low
index subgroup search for  subgroups of index at  most $k$ of the selected
vertex using `LowIndexSubgroupsFpGroup'.    If no  presentation  for  the
subgroup   associated to  the vertex  is  known a  presentation  is first
computed using a  modified  Todd-Coxeter algorithm. `Low Index Subgroups'
requires  exactly one selected vertex.

\>`Normalizers'{Normalizers!for FpGroups}@{`Normalizers'!for FpGroups}

computes and displays the normalizers of the selected vertices.
`Normalizers' requires at least one selected vertex.

\>`Prime Quotient'{Prime Quotient}@{`Prime Quotient'}

pops up a dialog box asking for a prime $p$ and another dialog box asking
for a class $c$.  It then  computes and displays the largest $p$-quotient
of class $c$ of the selected vertex.  If no presentation for the subgroup
associated to the vertex is known a  presentation is first computed using
a   modified  Todd-Coxeter algorithm.   It    then calls `PrimeQuotient'.
`Prime Quotient' requires exactly one selected vertex.

\>`Test Conjugacy'{Test Conjugacy}@{`Test Conjugacy'}

walks through all levels and tests for all pairs of classes, that contain a 
selected vertex, whether the groups in the classes are conjugates. If so,
the classes are merged. After these calculations `Rearrange Classes' is
called. Note that conjugacy calculations can take lots of time for finitely 
presented groups!

\>`SelectedGroups to GAP'{SelectedGroups to GAP!for FpGroups}%
@{`SelectedGroups to GAP'!for FpGroups}

If  the  user  selects  this menu entry,  the  subgroups   belonging to the
selected  vertices are put into a  list which  is  stored into the variable
`last'.  This is equivalent  to the  statement `SelectedGroups(sheet);;' if
`sheet' contains the graphic sheet  object. If {\XGAP}  logging is on, then
the normal {\GAP} logging via `LogTo'  is also directed  to the {\XGAP} log
file.

\>`InsertVertices from GAP'{InsertVertices from GAP!for FpGroups}%
@{`InsertVertices from GAP'!for FpGroups}

If the user selects this  menu entry, the  value of the variable `last'  is
used to insert new vertices into the graphic sheet.  If  `last' is equal to
one subgroup, it  is inserted via  `InsertVertex'. If `last'  is a list  of
subgroups, `InsertVertex' is  called for all  those subgroups. There is  no
error  issued if one of  the entries of `last'   is no subgroup. If {\XGAP}
logging is on, then the normal {\GAP} logging via `LogTo'  is switched off! 
The idea of this is to switch  the logging temporarily from {\XGAP} logging
to normal  {\GAP} logging between two clicks  to  ``SelectedGroups to GAP''
and ``InsertVertices from GAP'' respectively.

\>`Start Logging'{Start Logging!for FpGroups}@{`Start Logging'!for FpGroups}

After clicking on this menu entry the user is prompted for a filename. From 
this point on all commands issued via mouse clicks in the subgroup menu are 
logged into that file, such that one can afterwards see ``what happened''
in the {\XGAP} session. The information displayed is the same as in the
info displays in the {\GAP} window. 

\>`Stop Logging'{Stop Logging!for FpGroups}@{`Stop Logging'!for FpGroups}

A click onto this menu entry stops the {\XGAP} logging.

\bigskip%

These menu entries represent only a small selection of the functions of
{\GAP} which the authors of {\XGAP} considered most frequently used. You
can calculate other subgroups from
the {\GAP} command window. See sections "gapxgap" and
"xgapgap" for examples how to transfer information from the graphical
lattice of {\XGAP} to {\GAP} (via `SelectedGroups', see
"GraphicSubgroupLattice, Selecting Vertices") and vice versa (via
`SelectGroups', see "GraphicSubgroupLattice, Selecting Vertices", and
`InsertVertex', see "GraphicSubgroupLattice, Inserting Vertices").


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{GraphicSubgroupLattice for FpGroups, Information Menu}

Placing the pointer  inside a vertex (selected  or not) and  pressing the
*right* mouse button pops up the ``Information''  menu.  Clicking on any of
the text  lines will compute the corresponding   property of the subgroup
$u$  associated  with this  vertex. Clicking  on `close'  will  close the
``Information'' menu.

\>`Index'{Index!for FpGroups}@{`Index'!for FpGroups}

displays  the index of  $u$ in the whole  group.

\>`IsNormal'{IsNormal!for FpGroups}@{`IsNormal'!for FpGroups}

checks  if $u$ is  normal  in the  whole group.

\>`IsFpGroup'{IsFpGroup}@{`IsFpGroup'}

checks if $u$ is a finitely presented group. Note that a subgroup of a
finitely presented group that is defined by a coset table or as kernel
of an epimorphism is *not* automatically known to {\GAP} as a finitely
presented group. This means, that certain algorithms can not be
applied. Use `IsomorphismFpGroup' (see "ref:IsomorphismFpGroup" in the
{\GAP} reference manual) to calculate a finitely presented group and
an isomorphism onto it, if some calculation does not work automatically.

\>`Abelian Invariants'{Abelian Invariants}@{`Abelian Invariants'}

computes  and  displays  the  abelian invariants  of  $u$.

\>`Coset Table'{Coset Table}@{`Coset Table'}

computes   a   coset table for   $u$.

\>`IsomorphismFpGroup'{IsomorphismFpGroup}@{`IsomorphismFpGroup'}

computes a finitely presented group that is isomorphic to $u$ and displays
the number of generators and relators of it.

\>`Factor Fp Group'{Factor Fp Group}@{`Factor Fp Group'}

computes the factor group  of the whole group by $u$, if $u$ is normal.

\bigskip%

Note that the exact result of all these information displays is stored in
the global variable `LastResultOfInfoDisplay' after each operation. So you
can access this easily from the {\GAP} command prompt. It is also returned
as `last' value.


%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "manual"
%%% End: 
