let draw_edge_neighborhood ed1 ed2 fa1 fa2 col1 col2 st1 st2 ~turn = 
      let size1 = List.length ed1 and size2 = List.length ed2 in 
      set_window (-2.,-2.,2.,2.);
      set_unit_factor 1.5;
      initialize_pspicture ();
      let c1 = (List.nth col2 0) in 
      if (c1<>0) then 
        ext (Printf.sprintf "  \\pscircle*[linecolor=vertexcolor%i](0,-0.5){3pt}\n" c1);
        ext "  \\cnode[linewidth=0.4pt](0,-0.5){3pt}{A}\n\n";
      let c2 = (List.nth col1 0) in 
      if (c2<>0) then 
        ext (Printf.sprintf "  \\pscircle*[linecolor=vertexcolor%i](0,0.5){3pt}\n" c2);
        ext "  \\cnode[linewidth=0.4pt](0,0.5){3pt}{B}\n";
      if ((List.nth ed1 0)<>(List.nth ed2 0)) then failwith "Edge neighborhood problem";
      ext (Printf.sprintf "  \\ncline[linecolor=edgecolor%i,linewidth=3pt]{A}{B}\n"
        (List.nth ed1 0));
      ext (Printf.sprintf "  \\pscustom[fillstyle=solid,fillcolor=facecolorlight%i,%%\n      linecolor=facecolor%i,linearc=0.1]{%%\n    \\pspolygon(0.15,-0.4)(0.55,-0.4)(0.55,0.4)(0.35,0.4)(0.15,0.2)}\n" 
        (List.nth fa2 0) (List.nth fa2 0));
      ext (Printf.sprintf "  \\rput(0.35,0){\\psscaleboxto(0,0.22){%%\n      \\textcolor{facecolor%i}{$\\strut %s$}}}\n"
        (List.nth fa2 0) (greek_of_int (List.nth fa2 0)));
      ext (Printf.sprintf "  \\pscustom[fillstyle=solid,fillcolor=facecolorlight%i,%%\n      linecolor=facecolor%i,linearc=0.1]{%%\n    \\pspolygon(-0.15,-0.2)(-0.35,-0.4)(-0.55,-0.4)(-0.55,0.4)(-0.15,0.4)}\n" 
        (List.nth fa1 0) (List.nth fa1 0));
      ext (Printf.sprintf "  \\rput(-0.35,0){\\psscaleboxto(0,0.22){%%\n      \\textcolor{facecolor%i}{$\\strut %s$}}}\n"
        (List.nth fa1 0) (greek_of_int (List.nth fa1 0)));
      for i = 1 to (size1-1) do
        let ang = 3.14159+.(float (i-1))*.3.14159/.(float (size1-2)) in
        let col = (List.nth col1 i) in 
          if (col<>0) then ext (Printf.sprintf
                                  "  \\pscircle*[linecolor=vertexcolor%i](%f,%f){2pt}\n" 
                                  col (0.+.0.5*.cos(ang)) (-0.5+.0.5*.sin(ang)));
          ext (Printf.sprintf "  \\cnode[linewidth=0.1pt](%f,%f){2pt}{A%i}\n" 
            (0.+.0.5*.cos(ang)) (-0.5+.0.5*.sin(ang)) i);
          ext (Printf.sprintf "  \\ncline[linecolor=edgecolor%i]{A}{A%i}\n" 
            (List.nth ed1 i) i);
          ext (Printf.sprintf "  \\rput(%f,%f){\\psscaleboxto(0,0.12){$%i$}}\n"
            (0.+.0.65*.cos(ang)) (-0.5+.0.65*.sin(ang)) 
            (if ((st1+i)>size1) then (st1+i-size1) else (st1+i)));
      done;
      ext "  \\psarc[arrowsize=1.5pt,linewidth=0.5pt]{->}(0,-0.5){0.12}{90}{0}\n";
      for i = 1 to (size2-1) do
        let ang = (float (i-1))*.3.14159/.(float (size2-2)) in
        let col = (List.nth col2 i) in 
          if (col<>0) then ext (Printf.sprintf
                                  "  \\pscircle*[linecolor=vertexcolor%i](%f,%f){2pt}\n" 
                                  col (0.+.0.5*.cos(ang)) (0.5+.0.5*.sin(ang)));
          ext (Printf.sprintf "  \\cnode[linewidth=0.1pt](%f,%f){2pt}{B%i}\n" 
            (0.+.0.5*.cos(ang)) (0.5+.0.5*.sin(ang)) i);
          ext (Printf.sprintf "  \\ncline[linecolor=edgecolor%i]{B}{B%i}\n" 
            (List.nth ed2 i) i);
          ext (Printf.sprintf "  \\rput(%f,%f){\\psscaleboxto(0,0.12){$%i$}}\n"
            (0.+.0.65*.cos(ang)) (0.5+.0.65*.sin(ang)) 
            (if (turn) then (if ((st2+i)>size2) then (st2+i-size2) else (st2+i))
             else (if ((st2-i)<1) then (st2-i+size2) else (st2-i))));
      done;
      ext "  \\psarc[arrowsize=1.5pt,linewidth=0.5pt]{->}(0,0.5){0.12}{270}{180}\n";
      finalize_pspicture ()