From ef91426863727b643a44a4122f266b4d878989b1 Mon Sep 17 00:00:00 2001 From: "Yann Esposito (Yogsototh)" Date: Tue, 1 Oct 2013 13:17:56 +0200 Subject: [PATCH] initial commit --- README.md | 47 +++ abstraction.png | Bin 0 -> 15024 bytes clean | 5 + examples/README.md | 3 + examples/abstraction.mp | 25 ++ examples/associativecomposition.mp | 22 ++ examples/boxfunctor.mp | 43 +++ examples/cat-example1.mp | 21 ++ examples/cat-example2.mp | 13 + examples/cat-example3.mp | 17 + examples/cat-example4.mp | 12 + examples/cat-example5.mp | 10 + examples/cat-hask-endofunctor.mp | 108 +++++++ examples/commutative-diagram-assoc.mp | 24 ++ examples/commutative-diagram-id.mp | 23 ++ examples/composition.mp | 27 ++ examples/endofunctor.mp | 46 +++ examples/functor-morphism-color.mp | 37 +++ examples/functor-morphism.mp | 87 +++++ examples/functor.mp | 34 ++ examples/graph-category.mp | 11 + examples/hask-endofunctor-morphisms.mp | 103 ++++++ examples/hask-endofunctor-objects.mp | 70 ++++ examples/hask-endofunctor.mp | 56 ++++ examples/hask.mp | 22 ++ examples/identity.mp | 11 + examples/list-maybe-endofunctor-morphism.mp | 8 + examples/list-tree-endofunctor-morphism.mp | 7 + examples/maybe-list-endofunctor-morphsm.mp | 9 + examples/monoid.mp | 14 + examples/morphisms.mp | 46 +++ examples/nattrans-list-maybe.mp | 20 ++ examples/nattrans-list-tree.mp | 21 ++ examples/nattrans-maybe-list.mp | 21 ++ examples/nattrans-tree-list.mp | 29 ++ examples/natural-transformation.mp | 21 ++ examples/numbers.mp | 19 ++ examples/objects.mp | 19 ++ examples/pipe.mp | 149 +++++++++ examples/preorder.mp | 20 ++ examples/set.mp | 15 + examples/strings.mp | 12 + examples/tree-list-endofunctor-morphism.mp | 9 + gen | 76 +++++ graph.mp | 339 ++++++++++++++++++++ 45 files changed, 1731 insertions(+) create mode 100644 README.md create mode 100644 abstraction.png create mode 100755 clean create mode 100644 examples/README.md create mode 100644 examples/abstraction.mp create mode 100644 examples/associativecomposition.mp create mode 100644 examples/boxfunctor.mp create mode 100644 examples/cat-example1.mp create mode 100644 examples/cat-example2.mp create mode 100644 examples/cat-example3.mp create mode 100644 examples/cat-example4.mp create mode 100644 examples/cat-example5.mp create mode 100644 examples/cat-hask-endofunctor.mp create mode 100644 examples/commutative-diagram-assoc.mp create mode 100644 examples/commutative-diagram-id.mp create mode 100644 examples/composition.mp create mode 100644 examples/endofunctor.mp create mode 100644 examples/functor-morphism-color.mp create mode 100644 examples/functor-morphism.mp create mode 100644 examples/functor.mp create mode 100644 examples/graph-category.mp create mode 100644 examples/hask-endofunctor-morphisms.mp create mode 100644 examples/hask-endofunctor-objects.mp create mode 100644 examples/hask-endofunctor.mp create mode 100644 examples/hask.mp create mode 100644 examples/identity.mp create mode 100644 examples/list-maybe-endofunctor-morphism.mp create mode 100644 examples/list-tree-endofunctor-morphism.mp create mode 100644 examples/maybe-list-endofunctor-morphsm.mp create mode 100644 examples/monoid.mp create mode 100644 examples/morphisms.mp create mode 100644 examples/nattrans-list-maybe.mp create mode 100644 examples/nattrans-list-tree.mp create mode 100644 examples/nattrans-maybe-list.mp create mode 100644 examples/nattrans-tree-list.mp create mode 100644 examples/natural-transformation.mp create mode 100644 examples/numbers.mp create mode 100644 examples/objects.mp create mode 100644 examples/pipe.mp create mode 100644 examples/preorder.mp create mode 100644 examples/set.mp create mode 100644 examples/strings.mp create mode 100644 examples/tree-list-endofunctor-morphism.mp create mode 100755 gen create mode 100644 graph.mp diff --git a/README.md b/README.md new file mode 100644 index 0000000..12d9aab --- /dev/null +++ b/README.md @@ -0,0 +1,47 @@ +# Generate graph in PNG using metapost + +First you need to install `metapost` and `imagemagick`. + +Then this code provide a nice code to draw graphs and automata. +Furthermore the script `gen` generate only PNG optimized for the web. + +## Example + +~~~ +z0=(1.3u,0); +z1=z0 shifted (u,0); +z2=z1 shifted (u,0); + +nodesize:=4bp; +nodespace:=6bp; + +drawstate(z0); +drawstate(z1); +drawstate(z2); + +drawarrow edge(z0,z1); +drawarrow edge(z1,z2); +drawarrow edgeAngle(z0,z2,-35); + +nodesize:=6bp; +ahlength:=.3nodesize; +drawarrow edge(z0,z0); +drawarrow edge(z1,z1); +drawarrow edge(z2,z2); + +label(btex $ = 3 = $ etex,origin); +drawstate((-1.5u,.2u)); +drawstate((-1.5u-.2u,-.2u)); +drawstate((-1.5u+.2u,-.2u)); +~~~ + +Render as + +
+The category for the number 3 +
+The category corresponding to number 3. +
+
+ + diff --git a/abstraction.png b/abstraction.png new file mode 100644 index 0000000000000000000000000000000000000000..5673e4d6dea36e908073f2f603c4fe4809aaa6ee GIT binary patch literal 15024 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 G^#1~@+-4L2 literal 0 HcmV?d00001 diff --git a/clean b/clean new file mode 100755 index 0000000..d60abea --- /dev/null +++ b/clean @@ -0,0 +1,5 @@ +#!/usr/bin/env zsh + +listfic=( *.png(N.) ) +((${#listfic} > 0)) && \rm -f $listfic +[[ -e /tmp/mp ]] && \rm -rf /tmp/mp diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000..1839e7e --- /dev/null +++ b/examples/README.md @@ -0,0 +1,3 @@ +# Examples + +Put the mp file in the upper directory then just run `./gen` in the upper directory. diff --git a/examples/abstraction.mp b/examples/abstraction.mp new file mode 100644 index 0000000..4cb255f --- /dev/null +++ b/examples/abstraction.mp @@ -0,0 +1,25 @@ +z0=(1.3u,0); +z1=z0 shifted (u,0); +z2=z1 shifted (u,0); + +nodesize:=4bp; +nodespace:=6bp; + +drawstate(z0); +drawstate(z1); +drawstate(z2); + +drawarrow edge(z0,z1); +drawarrow edge(z1,z2); +drawarrow edgeAngle(z0,z2,-35); + +nodesize:=6bp; +ahlength:=.3nodesize; +drawarrow edge(z0,z0); +drawarrow edge(z1,z1); +drawarrow edge(z2,z2); + +label(btex $ = 3 = $ etex,origin); +drawstate((-1.5u,.2u)); +drawstate((-1.5u-.2u,-.2u)); +drawstate((-1.5u+.2u,-.2u)); diff --git a/examples/associativecomposition.mp b/examples/associativecomposition.mp new file mode 100644 index 0000000..da1c659 --- /dev/null +++ b/examples/associativecomposition.mp @@ -0,0 +1,22 @@ +z0=origin; +z1=(gu,0); +z2=(2gu,0); +z3=(3gu,0); + +drawState(z0,"A"); +drawState(z1,"B"); +drawState(z2,"C"); +drawState(z3,"D"); + +drawEdge(z1,z2,"g"); + +drawoptions(withcolor blue); +drawEdgeAngle(z0,z2,"g\circ f",35); +drawEdge(z2,z3,"h"); + +drawoptions(withcolor green); +drawEdge(z0,z1,"f"); +drawEdgeAngle(z1,z3,"h\circ g",-35); + +drawoptions(withcolor yellow); +drawEdgeAngle(z0,z3,"(h\circ g)\circ f = h\circ (g\circ f)",50); diff --git a/examples/boxfunctor.mp b/examples/boxfunctor.mp new file mode 100644 index 0000000..fe535e3 --- /dev/null +++ b/examples/boxfunctor.mp @@ -0,0 +1,43 @@ +pair a,b; +a:=origin; +b:=a shifted (1.7gu,0); + +drawState(a,"a"); +drawState(b,"b"); +drawEdge(a,b,"f"); + +pair fa,fb; +fa=a shifted (0,-.6gu); +fb=b shifted (0,-.6gu); + +drawbox(fa,"F"); +drawState(fa,"a"); +drawbox(fb,"F"); +drawState(fb,"b"); + +pair mf,mff; +path ab,fafb; +ab :=edge(a,b); +fafb:=edge(fa,fb); +mf := midpoint(ab); +mff := midpoint(fafb); +path p, arr; +p := mf -- mff; +arr := subpath (0.05,0.65) of p; +drawoptions(withcolor yellow); +label.rt(btex $\mathtt{fmap}$ etex,midpoint(arr)); +drawoptions(withcolor yellow withpen pencircle scaled 1 dashed evenly); +drawarrow arr; +p:=edge(a,fa); +arr := subpath (0,0.7) of p; +drawarrow arr; +label.rt(btex $F$ etex,midpoint(arr)); +p:=edge(b,fb); +arr := subpath (0,0.7) of p; +drawarrow arr; +label.rt(btex $F$ etex,midpoint(arr)); +drawoptions(withcolor base1 dashed evenly); +drawEdgeAngle(fa,fb,"f",-35); +nodespace:=2u+1mm; +drawoptions(withcolor base1); +drawEdge(fa,fb,"\mathtt{fmap}\ f"); diff --git a/examples/cat-example1.mp b/examples/cat-example1.mp new file mode 100644 index 0000000..7adf8bd --- /dev/null +++ b/examples/cat-example1.mp @@ -0,0 +1,21 @@ +z0=(0,0); +z1=2(u,0); +z2=2(2u,0); + +nodesize:=4bp; +nodespace:=6bp; + +drawarrow edge(z0,z1); +drawarrow edge(z1,z2); +drawarrow edgeAngle(z0,z2,35); + +drawstate(z0); +drawstate(z1); +drawstate(z2); + +nodesize:=6bp; +ahlength:=.3nodesize; +drawarrow edge(z0,z0); +drawarrow edge(z1,z1); +drawarrow edge(z2,z2); + diff --git a/examples/cat-example2.mp b/examples/cat-example2.mp new file mode 100644 index 0000000..1b9aeec --- /dev/null +++ b/examples/cat-example2.mp @@ -0,0 +1,13 @@ +z0=(0,0); z1=3(u,0); z2=3(2u,0); +nodesize:=4bp; +nodespace:=6bp; +drawstate(z0); drawstate(z1); drawstate(z2); + +drawEdge(z0,z1,"f"); +drawEdge(z1,z2,"g"); + +nodesize:=6bp; +ahlength:=.3nodesize; +drawarrow edge(z0,z0); +drawarrow edge(z1,z1); +drawarrow edge(z2,z2); diff --git a/examples/cat-example3.mp b/examples/cat-example3.mp new file mode 100644 index 0000000..1d1b2c8 --- /dev/null +++ b/examples/cat-example3.mp @@ -0,0 +1,17 @@ +z0=(0,0); z1=(4u,0); z2=(2u,-3u); +nodesize:=4bp; +nodespace:=6bp; + +drawarrow edgeAngle(z0,z1,35); +drawarrow edgeAngle(z1,z0,35); +drawarrow edgeAngle(z1,z2,35); +drawarrow edgeAngle(z0,z2,-35); +drawstate(z0); +drawstate(z1); +drawstate(z2); + +nodesize:=6bp; +ahlength:=.3nodesize; +drawarrow edge(z0,z0); +drawarrow edge(z1,z1); +drawarrow edge(z2,z2); diff --git a/examples/cat-example4.mp b/examples/cat-example4.mp new file mode 100644 index 0000000..af4c36b --- /dev/null +++ b/examples/cat-example4.mp @@ -0,0 +1,12 @@ +z0=(0,0); z1=(gu,0); z2=(.5gu,-.75gu); +drawState(z0,"A"); +drawState(z1,"B"); +drawState(z2,"C"); + +drawarrow edgeAngle(z0,z1,35); +drawarrow edgeAngle(z1,z0,35); +drawarrow edgeAngle(z1,z2,35); +drawarrow edgeAngle(z2,z0,35); +drawarrow edge(z0,z0); +drawarrow edge(z1,z1); +drawarrow edge(z2,z2); diff --git a/examples/cat-example5.mp b/examples/cat-example5.mp new file mode 100644 index 0000000..35d47c8 --- /dev/null +++ b/examples/cat-example5.mp @@ -0,0 +1,10 @@ +z0=origin; +z1=(gu,0); + +drawState(z0,"A"); +drawState(z1,"B"); +drawEdgeAngle(z0,z1,"f",35); +drawEdge(z1,z0,"g"); +drawEdgeAngle(z0,z1,"h",-35); +drawEdge(z0,z0,"id_A"); +drawEdge(z1,z1,"id_B"); diff --git a/examples/cat-hask-endofunctor.mp b/examples/cat-hask-endofunctor.mp new file mode 100644 index 0000000..c799041 --- /dev/null +++ b/examples/cat-hask-endofunctor.mp @@ -0,0 +1,108 @@ +% DPI 180 +pair int,bool,func,intlist,list; +resize(.8cm); +int=origin; +% drawoptions (withcolor baseOne withpen pencircle scaled 1.2); + +intlist=int shifted (gu,0); +func=int shifted (0,-.6gu); +bool=func shifted (gu,0); +list=func shifted (2u,0); + + +drawLoopPoint(int,int shifted (0,1.6u),"\mathtt{sqrt}"); +drawEdge(int,int,"\mathtt{id}"); +drawEdgeAngle(int,bool,"\mathtt{odd}",-30); +drawEdgeAngle(int,bool,"\mathtt{even}",30); +drawEdge(intlist,intlist,"\mathtt{tail}"); +drawEdge(intlist,int,"\mathtt{length}"); + +% ---------- F ---------------- + +pair decal; +pair fint,fbool,ffunc,fintlist,flist; +decal := (-1.2gu,-1.5gu); +fint=int shifted decal; +fintlist=intlist shifted decal; +ffunc= func shifted decal; +fbool= bool shifted decal; +flist= list shifted decal; + +drawLoopPoint(fint,fint shifted (0,1.9u),"\scriptstyle\mathtt{fmap\ sqrt}"); +drawEdge(fint,fint,"\scriptstyle\mathtt{fmap\ id}"); +drawEdgeAngle(fint,fbool,"\scriptstyle\mathtt{fmap\ odd}",-30); +drawEdgeAngle(fint,fbool,"\scriptstyle\mathtt{fmap\ even}",30); +drawEdge(fintlist,fintlist,"\scriptstyle\mathtt{fmap\ tail}"); +drawEdge(fintlist,fint,"\scriptstyle\mathtt{fmap\ length}"); + +drawblock(fint,fbool,"\mathtt{F}"); + +pair ff; +ff = .5[fint,fintlist] shifted (0,u); +path b; +b := block(origin,origin); +draw b scaled .5 shifted ff; +label.top(btex $\mathtt{F\ F}$ etex, blockLabelPosition(b)) scaled .5 shifted ff; +draw b scaled .25 shifted ff; +label.top(btex $\mathtt{F\ F\ F}$ etex, blockLabelPosition(b)) scaled .25 shifted ff; + +% ------------ G -------------- +pair gdecal; +pair gint,gbool,gfunc,gintlist,glist; +gdecal := (1.2gu,-1.5gu); +gint=int shifted gdecal; +gintlist=intlist shifted gdecal; +gfunc= func shifted gdecal; +gbool= bool shifted gdecal; +glist= list shifted gdecal; + +drawLoopPoint(gint,gint shifted (0,1.9u),"\scriptstyle\mathtt{fmap\ sqrt}"); +drawEdge(gint,gint,"\scriptstyle\mathtt{fmap\ id}"); +drawEdgeAngle(gint,gbool,"\scriptstyle\mathtt{fmap\ odd}",-30); +drawEdgeAngle(gint,gbool,"\scriptstyle\mathtt{fmap\ even}",30); +drawEdge(gintlist,gintlist,"\scriptstyle\mathtt{fmap\ tail}"); +drawEdge(gintlist,gint,"\scriptstyle\mathtt{fmap\ length}"); + +drawblock(gint,gbool,"\mathtt{G}"); + +pair gf; +gf = .5[gint,gintlist] shifted (0,u); +path b; +b := block(origin,origin); +draw b scaled .5 shifted gf; +label.top(btex $\mathtt{G\ G}$ etex, blockLabelPosition(b)) scaled .5 shifted gf; +draw b scaled .25 shifted gf; +label.top(btex $\mathtt{G\ G\ G}$ etex, blockLabelPosition(b)) scaled .25 shifted gf; + + +drawState(int,"\mathtt{Int}"); +drawState(intlist,"\mathtt{[Int]}"); +drawState(func,"\mathtt{a\rightarrow b}"); +drawState(list,"\mathtt{[a]}"); +drawState(bool,"\mathtt{Bool}"); + +drawState(fint,"\mathtt{F\ Int}"); +drawState(fintlist,"\mathtt{F\ [Int]}"); +drawState(ffunc,"\mathtt{F\ a\rightarrow b}"); +drawState(flist,"\mathtt{F\ [a]}"); +drawState(fbool,"\mathtt{F\ Bool}"); + +drawState(gint,"\mathtt{G\ Int}"); +drawState(gintlist,"\mathtt{G\ [Int]}"); +drawState(gfunc,"\mathtt{G\ a\rightarrow b}"); +drawState(glist,"\mathtt{G\ [a]}"); +drawState(gbool,"\mathtt{G\ Bool}"); + +drawoptions(withcolor yellow); +label.top(btex $I$ etex, .5[int,intlist] shifted (0,u)); + +drawoptions(withpen pencircle scaled 2bp withcolor yellow); +ahlength:=.3u; + +drawEdgeAngle(.5[int,func] shifted (-.5u,0), ff shifted (0,2.2u), "?", -30); +drawEdgeAngle(ff shifted (-u,2.2u), .5[int,func] shifted (-.5u,u), "?", 30); +drawEdgeAngle(.5[intlist,bool] shifted (.5u,0), gf shifted (0,2.2u), "?", 30); +drawEdgeAngle(gf shifted (u,2.2u), .5[intlist,bool] shifted (.5u,u), "?", -30); + +drawEdgeAngle(.5[fintlist,fbool] shifted (1.1u,u), .5[gint,gfunc] shifted (-1.1u,u), "?", 30); +drawEdgeAngle(.5[gint,gfunc] shifted (-1.1u,u), .5[fintlist,fbool] shifted (1.1u,u), "?", 30); diff --git a/examples/commutative-diagram-assoc.mp b/examples/commutative-diagram-assoc.mp new file mode 100644 index 0000000..9de3aa7 --- /dev/null +++ b/examples/commutative-diagram-assoc.mp @@ -0,0 +1,24 @@ +z0=(0,0); +z1=(gu,0); +z2=(0,-gu); +z3=(gu,-gu); + +label("A",z0); +label("B",z1); +label("B",z2); +label("C",z3); + +drawEdge(z0,z1,"f"); + +drawEdge(z1,z2,"g"); + +path ac,ab; +drawEdge(z2,z3,"h"); + +ac:=edge(z1,z3); +drawarrow ac; +label.rt(btex $h \circ g$ etex,midpoint(ac)); + +ab:=edge(z0,z2); +drawarrow ab; +label.lft(btex $g \circ f$ etex,midpoint(ab)); diff --git a/examples/commutative-diagram-id.mp b/examples/commutative-diagram-id.mp new file mode 100644 index 0000000..480454f --- /dev/null +++ b/examples/commutative-diagram-id.mp @@ -0,0 +1,23 @@ +z0=(0,0); +z1=(gu,0); +z2=(0,-gu); +z3=(gu,-gu); +path ac,ab; + +label("A",z0); +label("A",z1); +label("B",z2); +label("B",z3); + +drawEdge(z0,z1,"id_A"); +drawEdge(z1,z2,"f"); +ab:=edge(z0,z2); +drawarrow ab; +label.lft(btex $f$ etex,midpoint(ab)); + +drawEdge(z2,z3,"id_B"); + +ac:=edge(z1,z3); +drawarrow ac; +label.rt(btex $f$ etex,midpoint(ac)); + diff --git a/examples/composition.mp b/examples/composition.mp new file mode 100644 index 0000000..7608828 --- /dev/null +++ b/examples/composition.mp @@ -0,0 +1,27 @@ + +z0=(0,0); +z1=z0 shifted (gu,0); + +z2=z0 shifted (2gu,0); +z3=z1 shifted (2gu,0); + +z4=(0.5gu,-.5gu); +z5=(1.5gu,0); +z6=(2.5gu,-.5gu); + + +drawState(z4, "A"); +drawState(z5, "B"); +drawState(z6, "C"); + + +drawoptions(withcolor red); +drawEdgeAngle(z4,z5, "f",30); + +drawoptions(withcolor blue); +drawEdgeAngle(z5,z6, "g",30); + + +drawoptions(withcolor yellow); +drawEdgeAngle(z4,z6, "g\circ f", 0); + diff --git a/examples/endofunctor.mp b/examples/endofunctor.mp new file mode 100644 index 0000000..d3b2e37 --- /dev/null +++ b/examples/endofunctor.mp @@ -0,0 +1,46 @@ +z0=(0,0); +z1=(gu,0); +z2=(.5gu,-.75gu); + +z3=z0 shifted (2gu,0); +z4=z1 shifted (2gu,0); +z5=z2 shifted (2gu,0); + +drawblock(z0,(xpart z1,ypart z2),"\mathcal{C}"); +drawblock(z3,(xpart z4,ypart z5),"\mathcal{C}"); + +drawoptions(withcolor yellow ); +drawState(z0,"A"); +drawState(z1,"B"); +drawState(z4,"B"); + +drawoptions(withcolor red ); +drawState(z2,"C"); +drawState(z5,"C"); + + +drawoptions(withcolor green ); +drawEdge(z2,z2,"id_C"); + + +drawoptions(withcolor magenta ); +drawarrow edgeFull(z1,z2,-90,180); +drawarrow edgeFull(z0,z2,-90,0); +drawarrow edgeFull(z4,z5,-90,180); + +drawoptions(withcolor blue ); +drawEdge(z0,z0,"id_A"); +drawEdge(z1,z1,"id_B"); +drawEdge(z4,z4,"id_B"); +drawarrow edgeAngle(z0,z1,35); +drawarrow edgeAngle(z1,z0,35); + +drawoptions(withcolor green ); +drawEdge(z5,z5,"id_C"); + +drawoptions(withcolor base01); +drawState(z3,"A"); +drawEdge(z3,z3,"id_A"); +drawarrow edgeAngle(z3,z4,35); +drawarrow edgeAngle(z4,z3,35); +drawarrow edgeFull(z3,z5,-90,0); diff --git a/examples/functor-morphism-color.mp b/examples/functor-morphism-color.mp new file mode 100644 index 0000000..1ae1e7d --- /dev/null +++ b/examples/functor-morphism-color.mp @@ -0,0 +1,37 @@ +z0=(0,0); +z1=(gu,0); +z2=(.5gu,-.75gu); +z3=z0 shifted (2gu,0); +z4=z3 shifted (0,-.75gu); + +drawblock(z0,(xpart z1,ypart z2),"\mathcal{C}"); +drawblock(z3,z4,"\mathcal{D}=\mathbf{F}(\mathcal{C})"); + +drawoptions(withcolor yellow ); +drawState(z0,"A"); +drawState(z1,"B"); +drawState(z3,"X"); + +drawoptions(withcolor red ); +drawState(z2,"C"); +drawState(z4,"Y"); + + +drawoptions(withcolor green ); +drawEdge(z2,z2,"id_C"); + + +drawoptions(withcolor magenta ); +drawarrow edgeFull(z1,z2,-90,180); +drawarrow edgeFull(z0,z2,-90,0); +drawarrow edgeFull(z3,z4,-35,35+180); + +drawoptions(withcolor blue ); +drawEdge(z0,z0,"id_A"); +drawEdge(z1,z1,"id_B"); +drawarrow edgeAngle(z0,z1,35); +drawarrow edgeAngle(z1,z0,35); +drawEdge(z3,z3,"id_X"); + +drawoptions(withcolor green ); +drawEdge(z4,z4,"id_Y"); diff --git a/examples/functor-morphism.mp b/examples/functor-morphism.mp new file mode 100644 index 0000000..3caf4b1 --- /dev/null +++ b/examples/functor-morphism.mp @@ -0,0 +1,87 @@ +z0=(0,0); +z1=(gu,0); +z2=(.5gu,-.75gu); +z3=z0 shifted (2gu,0); +z4=z3 shifted (0,-.75gu); + +drawblock(z0,(xpart z1,ypart z2),"\mathcal{C}"); +drawblock(z3,z4,"\mathcal{D}=\mathbf{F}(\mathcal{C})"); + +drawState(z0,"A"); +drawState(z1,"B"); +drawState(z2,"C"); + +drawState(z4,"Y"); +drawState(z3,"X"); + + +drawoptions(withcolor green withpen pencircle scaled 1); +drawEdge(z2,z2,"id_C"); + + +drawoptions(withcolor magenta withpen pencircle scaled 1); +drawarrow edgeFull(z1,z2,-90,180); +drawarrow edgeFull(z0,z2,-90,0); +drawarrow edgeFull(z3,z4,-35,35+180); + +drawoptions(withcolor blue withpen pencircle scaled 1); +drawEdge(z0,z0,"id_A"); +drawEdge(z1,z1,"id_B"); +drawarrow edgeAngle(z0,z1,35); +drawarrow edgeAngle(z1,z0,35); +drawEdge(z3,z3,"id_X"); + +drawoptions(withcolor green withpen pencircle scaled 1); +drawEdge(z4,z4,"id_Y"); + +% drawarrow edgeAngle(z0,z3,45); +% drawarrow edge(z1,z3); +% drawarrow edge(z2,z4); + +path la,lb,lc,lx,ly; +la := edge(z0,z0); +lb := edge(z1,z1); +lc := edge(z2,z2); +lx := edge(z3,z3); +ly := edge(z4,z4); + +pair ia,ib,ic,ix,iy; +ia := midpoint( la ); +ib := midpoint( lb ); +ic := midpoint( lc ); +ix := midpoint( lx ); +iy := midpoint( ly ); + +nodesize:= .5u; +nodespace:= .5u; +drawoptions(withcolor blue dashed evenly withpen pencircle scaled 1); + +drawarrow edgeAngle(ia,ix,35); +drawarrow edgeAngle(ib,ix,20); + +drawoptions(withcolor green dashed evenly withpen pencircle scaled 1); +drawarrow edgeAngle(ic,iy,0); + +path f,g,h,i; +f:= edgeAngle(z0,z1,35); +g:= edgeAngle(z1,z0,35); +h:= edgeFull(z1,z2,-90,180); +i:= edgeFull(z0,z2,-90,0); + +path k; +k:= edgeFull(z3,z4,-35,35+180); + +pair mf,mg,mh,mi,mk; +mf := midpoint(f); +mg := midpoint(g); +mh := midpoint(h); +mi := midpoint(i); +mk := midpoint(k); + + +drawoptions(withcolor blue dashed evenly withpen pencircle scaled 1); +drawarrow edgeAngle(mf,ix,40); +drawarrow edgeAngle(mg,ix,-15); +drawoptions(withcolor magenta dashed evenly withpen pencircle scaled 1); +drawarrow edgeAngle(mi,mk,30); +drawarrow edgeAngle(mh,mk,15); diff --git a/examples/functor.mp b/examples/functor.mp new file mode 100644 index 0000000..5153a65 --- /dev/null +++ b/examples/functor.mp @@ -0,0 +1,34 @@ +z0=(0,0); +z1=(gu,0); +z2=(.5gu,-.75gu); +z3=z0 shifted (2gu,0); +z4=z3 shifted (0,-.75gu); + +drawblock(z0,(xpart z1,ypart z2),"\mathcal{C}"); +drawblock(z3,z4,"\mathcal{D}=\mathbf{F}(\mathcal{C})"); + +drawEdge(z0,z0,"id_A"); +drawEdge(z1,z1,"id_B"); +drawEdge(z2,z2,"id_C"); +drawarrow edgeAngle(z0,z1,35); +drawarrow edgeAngle(z1,z0,35); +drawarrow edgeFull(z1,z2,-90,180); +drawarrow edgeFull(z0,z2,-90,0); + +drawEdge(z3,z3,"id_X"); +drawEdge(z4,z4,"id_Y"); +drawarrow edgeFull(z3,z4,-35,35+180); + +drawoptions(withcolor yellow withpen pencircle scaled 1); +drawState(z0,"A"); +drawState(z1,"B"); +drawState(z3,"X"); +drawoptions(withcolor yellow withpen pencircle scaled 1 dashed evenly); +drawarrow edgeAngle(z0,z3,45); +drawarrow edge(z1,z3); + +drawoptions(withcolor red withpen pencircle scaled 1); +drawState(z2,"C"); +drawState(z4,"Y"); +drawoptions(withcolor red withpen pencircle scaled 1 dashed evenly); +drawarrow edge(z2,z4); diff --git a/examples/graph-category.mp b/examples/graph-category.mp new file mode 100644 index 0000000..5aa4591 --- /dev/null +++ b/examples/graph-category.mp @@ -0,0 +1,11 @@ +pair a,b,c; +a=origin; +b=a shifted (gu,0); +c=a shifted (gu,0) rotated -60; + +drawState(a,"X"); +drawState(b,"Y"); +drawState(c,"Z"); +drawEdgeAngle(a,b,"\alpha",30); +drawEdgeAngle(b,c,"\beta",30); +drawEdgeAngle(c,a,"\gamma",30); diff --git a/examples/hask-endofunctor-morphisms.mp b/examples/hask-endofunctor-morphisms.mp new file mode 100644 index 0000000..647952a --- /dev/null +++ b/examples/hask-endofunctor-morphisms.mp @@ -0,0 +1,103 @@ +pair int,bool,func,intlist,list; +resize(.8cm); +int=origin; +% drawoptions (withcolor baseOne withpen pencircle scaled 1.2); + +intlist=int shifted (gu,0); +func=int shifted (0,-.6gu); +bool=func shifted (gu,0); +list=func shifted (2u,0); + + + +pair decal; +pair fint,fbool,ffunc,fintlist,flist; +decal := (1.7gu,0); +fint=int shifted decal; +fintlist=intlist shifted decal; +ffunc= func shifted decal; +fbool= bool shifted decal; +flist= list shifted decal; + +drawoptions(withcolor yellow withpen pencircle scaled 1); +drawLoopPoint(int,int shifted (0,1.6u),"\mathtt{sqrt}"); +drawLoopPoint(fint,fint shifted (0,1.9u),"\scriptstyle\mathtt{fmap\ sqrt}"); + +drawoptions(withcolor green withpen pencircle scaled 1); +drawEdge(int,int,"\mathtt{id}"); +drawEdge(fint,fint,"\scriptstyle\mathtt{fmap\ id}"); + +drawoptions(withcolor red withpen pencircle scaled 1); +drawEdgeAngle(int,bool,"\mathtt{odd}",-30); +drawEdgeAngle(fint,fbool,"\scriptstyle\mathtt{fmap\ odd}",-30); + +drawoptions(withcolor magenta withpen pencircle scaled 1); +drawEdgeAngle(int,bool,"\mathtt{even}",30); +drawEdgeAngle(fint,fbool,"\scriptstyle\mathtt{fmap\ even}",30); + +drawoptions(withcolor violet withpen pencircle scaled 1); +drawEdge(intlist,intlist,"\mathtt{tail}"); +drawEdge(fintlist,fintlist,"\scriptstyle\mathtt{fmap\ tail}"); + +drawoptions(withcolor blue withpen pencircle scaled 1); +drawEdge(intlist,int,"\mathtt{length}"); +drawEdge(fintlist,fint,"\scriptstyle\mathtt{fmap\ length}"); + +drawoptions(withcolor base1); +drawState(int,"\mathtt{Int}"); +drawState(fint,"\mathtt{F\ Int}"); +drawState(intlist,"\mathtt{[Int]}"); +drawState(fintlist,"\mathtt{F\ [Int]}"); +drawState(func,"\mathtt{a\rightarrow b}"); +drawState(ffunc,"\mathtt{F\ a\rightarrow b}"); +drawState(list,"\mathtt{[a]}"); +drawState(flist,"\mathtt{F\ [a]}"); +drawState(bool,"\mathtt{Bool}"); +drawState(fbool,"\mathtt{F\ Bool}"); + +drawblock(fint,fbool,"\mathtt{F}"); + +% Draw blocks +pair ff; +ff = .5[fint,fintlist] shifted (0,u); +path b; +b := block(origin,origin); +draw b scaled .5 shifted ff; +label.top(btex $\mathtt{F\ F}$ etex, blockLabelPosition(b)) scaled .5 shifted ff; +draw b scaled .25 shifted ff; +label.top(btex $\mathtt{F\ F\ F}$ etex, blockLabelPosition(b)) scaled .25 shifted ff; + +pair psqrt,pid,plength,podd,peven,ptail; +pair pfsqrt,pfid,pflength,pfodd,pfeven,pftail; + +psqrt := midpoint(loopPoint(int,int shifted (0,1.6u))); +pid := midpoint(edge(int,int)); +podd := midpoint(edgeAngle(int,bool,-30)); +peven := midpoint(edgeAngle(int,bool,30)); +ptail := midpoint(edge(intlist,intlist)); +plength := midpoint(edge(intlist,int)); +pfsqrt := midpoint(loopPoint(fint,fint shifted (0,1.9u))); +pfid := midpoint(edge(fint,fint)); +pfodd := midpoint(edgeAngle(fint,fbool,-30)); +pfeven := midpoint(edgeAngle(fint,fbool,30)); +pftail := midpoint(edge(fintlist,fintlist)); +pflength := midpoint(edge(fintlist,fint)); + +nodespace := 6bp; +drawoptions(withcolor yellow withpen pencircle scaled 1); +drawarrow edgeAngle(psqrt,pfsqrt,20) dashed evenly; + +drawoptions(withcolor green withpen pencircle scaled 1); +drawarrow edgeAngle(pid,pfid,20) dashed evenly; + +drawoptions(withcolor blue withpen pencircle scaled 1); +drawarrow edgeAngle(plength,pflength,-20) dashed evenly; + +drawoptions(withcolor red withpen pencircle scaled 1); +drawarrow edgeAngle(podd,pfodd,0) dashed evenly; + +drawoptions(withcolor magenta withpen pencircle scaled 1); +drawarrow edgeAngle(peven,pfeven,-20) dashed evenly; + +drawoptions(withcolor violet withpen pencircle scaled 1); +drawarrow edgeAngle(ptail,pftail,-5) dashed evenly; diff --git a/examples/hask-endofunctor-objects.mp b/examples/hask-endofunctor-objects.mp new file mode 100644 index 0000000..9bbbac8 --- /dev/null +++ b/examples/hask-endofunctor-objects.mp @@ -0,0 +1,70 @@ +pair int,bool,func,intlist,list; +resize(.8cm); +int=origin; +% drawoptions (withcolor baseOne withpen pencircle scaled 1.2); + +intlist=int shifted (gu,0); +func=int shifted (0,-.6gu); +bool=func shifted (gu,0); +list=func shifted (2u,0); + + +drawLoopPoint(int,int shifted (0,1.6u),"\mathtt{sqrt}"); +drawEdge(int,int,"\mathtt{id}"); +drawEdgeAngle(int,bool,"\mathtt{odd}",-30); +drawEdgeAngle(int,bool,"\mathtt{even}",30); +drawEdge(intlist,intlist,"\mathtt{tail}"); +drawEdge(intlist,int,"\mathtt{length}"); + +pair decal; +pair fint,fbool,ffunc,fintlist,flist; +decal := (1.7gu,0); +fint=int shifted decal; +fintlist=intlist shifted decal; +ffunc= func shifted decal; +fbool= bool shifted decal; +flist= list shifted decal; + +drawLoopPoint(fint,fint shifted (0,1.9u),"\scriptstyle\mathtt{fmap\ sqrt}"); +drawEdge(fint,fint,"\scriptstyle\mathtt{fmap\ id}"); +drawEdgeAngle(fint,fbool,"\scriptstyle\mathtt{fmap\ odd}",-30); +drawEdgeAngle(fint,fbool,"\scriptstyle\mathtt{fmap\ even}",30); +drawEdge(fintlist,fintlist,"\scriptstyle\mathtt{fmap\ tail}"); +drawEdge(fintlist,fint,"\scriptstyle\mathtt{fmap\ length}"); + + +drawblock(fint,fbool,"\mathtt{F}"); + +pair ff; +ff = .5[fint,fintlist] shifted (0,u); +path b; +b := block(origin,origin); +draw b scaled .5 shifted ff; +label.top(btex $\mathtt{F\ F}$ etex, blockLabelPosition(b)) scaled .5 shifted ff; +draw b scaled .25 shifted ff; +label.top(btex $\mathtt{F\ F\ F}$ etex, blockLabelPosition(b)) scaled .25 shifted ff; + +drawoptions(withcolor yellow withpen pencircle scaled 1); +drawarrow edgeAngle(int,fint,45) dashed evenly; +drawState(int,"\mathtt{Int}"); +drawState(fint,"\mathtt{F\ Int}"); + +drawoptions(withcolor green withpen pencircle scaled 1); +drawarrow edgeAngle(intlist,fintlist,-20) dashed evenly; +drawState(intlist,"\mathtt{[Int]}"); +drawState(fintlist,"\mathtt{F\ [Int]}"); + +drawoptions(withcolor blue withpen pencircle scaled 1); +drawarrow edgeAngle(func,ffunc,-20) dashed evenly; +drawState(func,"\mathtt{a\rightarrow b}"); +drawState(ffunc,"\mathtt{F\ a\rightarrow b}"); + +drawoptions(withcolor red withpen pencircle scaled 1); +drawarrow edgeAngle(list,flist,25) dashed evenly; +drawState(list,"\mathtt{[a]}"); +drawState(flist,"\mathtt{F\ [a]}"); + +drawoptions(withcolor magenta withpen pencircle scaled 1); +drawarrow edgeAngle(bool,fbool,-20) dashed evenly; +drawState(bool,"\mathtt{Bool}"); +drawState(fbool,"\mathtt{F\ Bool}"); diff --git a/examples/hask-endofunctor.mp b/examples/hask-endofunctor.mp new file mode 100644 index 0000000..1199f8c --- /dev/null +++ b/examples/hask-endofunctor.mp @@ -0,0 +1,56 @@ +pair int,bool,func,intlist,list; +resize(.8cm); +int=origin; +% drawoptions (withcolor baseOne withpen pencircle scaled 1.2); + +intlist=int shifted (gu,0); +func=int shifted (0,-.6gu); +bool=func shifted (gu,0); +list=func shifted (2u,0); + + +drawLoopPoint(int,int shifted (0,1.6u),"\mathtt{sqrt}"); +drawEdge(int,int,"\mathtt{id}"); +drawEdgeAngle(int,bool,"\mathtt{odd}",-30); +drawEdgeAngle(int,bool,"\mathtt{even}",30); +drawEdge(intlist,intlist,"\mathtt{tail}"); +drawEdge(intlist,int,"\mathtt{length}"); + +pair decal; +pair fint,fbool,ffunc,fintlist,flist; +decal := (1.7gu,0); +fint=int shifted decal; +fintlist=intlist shifted decal; +ffunc= func shifted decal; +fbool= bool shifted decal; +flist= list shifted decal; + + +drawLoopPoint(fint,fint shifted (0,1.9u),"\scriptstyle\mathtt{fmap\ sqrt}"); +drawEdge(fint,fint,"\scriptstyle\mathtt{fmap\ id}"); +drawEdgeAngle(fint,fbool,"\scriptstyle\mathtt{fmap\ odd}",-30); +drawEdgeAngle(fint,fbool,"\scriptstyle\mathtt{fmap\ even}",30); +drawEdge(fintlist,fintlist,"\scriptstyle\mathtt{fmap\ tail}"); +drawEdge(fintlist,fint,"\scriptstyle\mathtt{fmap\ length}"); + +drawblock(fint,fbool,"\mathtt{F}"); + +pair ff; +ff = .5[fint,fintlist] shifted (0,u); +path b; +b := block(origin,origin); +draw b scaled .5 shifted ff; +label.top(btex $\mathtt{F\ F}$ etex, blockLabelPosition(b)) scaled .5 shifted ff; +draw b scaled .25 shifted ff; +label.top(btex $\mathtt{F\ F\ F}$ etex, blockLabelPosition(b)) scaled .25 shifted ff; + +drawState(int,"\mathtt{Int}"); +drawState(fint,"\mathtt{F\ Int}"); +drawState(intlist,"\mathtt{[Int]}"); +drawState(fintlist,"\mathtt{F\ [Int]}"); +drawState(func,"\mathtt{a\rightarrow b}"); +drawState(ffunc,"\mathtt{F\ a\rightarrow b}"); +drawState(list,"\mathtt{[a]}"); +drawState(flist,"\mathtt{F\ [a]}"); +drawState(bool,"\mathtt{Bool}"); +drawState(fbool,"\mathtt{F\ Bool}"); diff --git a/examples/hask.mp b/examples/hask.mp new file mode 100644 index 0000000..301399d --- /dev/null +++ b/examples/hask.mp @@ -0,0 +1,22 @@ +pair int,bool,func,intlist,list; +resize(.8cm); +int=origin; +% drawoptions (withcolor baseOne withpen pencircle scaled 1.2); + +intlist=int shifted (gu,0); +func=int shifted (0,-.6gu); +bool=func shifted (gu,0); +list=func shifted (2u,0); + +drawState(int,"\mathtt{Int}"); +drawState(bool,"\mathtt{Bool}"); +drawState(func,"\mathtt{a\rightarrow b}"); +drawState(intlist,"\mathtt{[Int]}"); +drawState(list,"\mathtt{[a]}"); + +drawLoopPoint(int,int shifted (0,1.6u),"\mathtt{sqrt}"); +drawEdge(int,int,"\mathtt{id}"); +drawEdgeAngle(int,bool,"\mathtt{odd}",-30); +drawEdgeAngle(int,bool,"\mathtt{even}",30); +drawEdge(intlist,intlist,"\mathtt{tail}"); +drawEdge(intlist,int,"\mathtt{length}"); diff --git a/examples/identity.mp b/examples/identity.mp new file mode 100644 index 0000000..d25e00c --- /dev/null +++ b/examples/identity.mp @@ -0,0 +1,11 @@ + +z0=(0,0); +z1=z0 shifted (2gu,0); + +drawState(z0, "A"); +drawState(z1, "B"); + +drawoptions(withcolor yellow); +drawEdge(z0,z1, "id_B\circ f = f = f \circ id_A"); +drawEdge(z0,z0, "id_A"); +drawEdge(z1,z1, "id_B"); diff --git a/examples/list-maybe-endofunctor-morphism.mp b/examples/list-maybe-endofunctor-morphism.mp new file mode 100644 index 0000000..c0b21d7 --- /dev/null +++ b/examples/list-maybe-endofunctor-morphism.mp @@ -0,0 +1,8 @@ +pair tree,list; +resize(.8cm); + +list=origin; +tree=list shifted (gu,0); +drawState(list,"\mathtt{[]}"); +drawState(tree,"\mathtt{Maybe}"); +drawEdgeAngle(list,tree,"\mathtt{toMaybe}",30); diff --git a/examples/list-tree-endofunctor-morphism.mp b/examples/list-tree-endofunctor-morphism.mp new file mode 100644 index 0000000..33725e1 --- /dev/null +++ b/examples/list-tree-endofunctor-morphism.mp @@ -0,0 +1,7 @@ +pair tree,list; +resize(.8cm); +list=origin; +tree=list shifted (gu,0); +drawState(list,"\mathtt{[]}"); +drawState(tree,"\mathtt{List}"); +drawEdgeAngle(list,tree,"\mathtt{toList}",30); diff --git a/examples/maybe-list-endofunctor-morphsm.mp b/examples/maybe-list-endofunctor-morphsm.mp new file mode 100644 index 0000000..bd302c1 --- /dev/null +++ b/examples/maybe-list-endofunctor-morphsm.mp @@ -0,0 +1,9 @@ +pair tree,list; +resize(.8cm); +list=origin; + +tree=list shifted (gu,0); +drawState(list,"\mathtt{[]}"); +drawState(tree,"\mathtt{Maybe}"); +drawEdgeAngle(list,tree,"\mathtt{toMaybe}",30); +drawEdgeAngle(tree,list,"\mathtt{mToList}",30); diff --git a/examples/monoid.mp b/examples/monoid.mp new file mode 100644 index 0000000..47e63f1 --- /dev/null +++ b/examples/monoid.mp @@ -0,0 +1,14 @@ +pair A,B,C,D,E,F; +A:=(0,0); B:=(0,u); C:=(0,2u); +D:=(0,3u); E:=(0,4u); F:=(0,6u); + +nodesize:=4bp; +nodespace:=6bp; + +drawLoopPoint(A,B,"\varepsilon"); +drawLoopPoint(A,C,"a"); +drawLoopPoint(A,D,"b"); +drawLoopPoint(A,E,"ab"); +drawLoopPoint(A,F,"\omega"); +draw (0,4.8u)--(0,5.8u) dashed withdots; +draw A withpen pencircle scaled 4bp; diff --git a/examples/morphisms.mp b/examples/morphisms.mp new file mode 100644 index 0000000..f9574e4 --- /dev/null +++ b/examples/morphisms.mp @@ -0,0 +1,46 @@ + +z0=(0,0); +z1=z0 shifted (gu,0); +z2=z1 shifted (gu,0); +z3=z2 shifted (gu,-0.5gu); +z4=z3 shifted (gu,0); +z5=z4 shifted (1.5u,0); +z6=z5 shifted (2u,0); + +drawblock(z0,z6,"\mathcal{C}"); + +drawState(z0, "A"); +drawState(z1, "B"); +drawState(z2, "C"); + +drawState(z3, "D"); + +drawoptions(withcolor base01); +drawarrow loopPoint(z3,z3 shifted (0,3.8u)) dashed evenly; +drawarrow loopPoint(z3,z3 shifted (0,4u)) dashed evenly; +drawState(z4, "E"); +drawEdge(z4,z4, "id_E"); +drawarrow edgeAngle(z3,z4,0) dashed evenly; +drawarrow edgeAngle(z3,z4,20) dashed evenly; +drawarrow edgeAngle(z3,z4,-20) dashed evenly; +draw z5 -- z6 dashed withdots withpen pencircle scaled 2bp; + +drawoptions(withcolor yellow); +drawarrow loopPoint(z3,z3 shifted (0,3.5u)) dashed evenly; +drawEdge(z3,z3, "id_D"); +drawLoopPoint(z3,z3 shifted (0,2.5u),"\ell"); + +drawEdge(z0,z1, "f"); +drawEdgeAngle(z0,z1, "f'", 45); + +drawEdge(z0,z0, "id_A"); +drawEdge(z1,z1, "id_B"); +drawEdge(z2,z2, "id_C"); + +drawEdgeAngle(z1,z2, "g", 0); +drawEdgeAngle(z1,z2, "g'", 45); + +drawEdgeAngle(z0,z2, "h", -30); +drawarrow edgeAngle(z0,z2,-45) dashed evenly; +drawarrow edgeAngle(z0,z2,-55) dashed evenly withcolor base01; +drawarrow edgeAngle(z0,z2,-60) dashed evenly withcolor base01; diff --git a/examples/nattrans-list-maybe.mp b/examples/nattrans-list-maybe.mp new file mode 100644 index 0000000..ed2af14 --- /dev/null +++ b/examples/nattrans-list-maybe.mp @@ -0,0 +1,20 @@ +z0=(0,0); +z1=(1.5gu,0); +z2=(0,-gu); +z3=(1.5gu,-gu); +path ac,ab; + +label(btex $\mathtt{[a]}$ etex,z0); +label(btex $\mathtt{[b]}$ etex,z1); +label(btex $\mathtt{Maybe\ a}$ etex,z2 shifted (-u,0)); +label(btex $\mathtt{Maybe\ b}$ etex,z3 shifted (u,0)); + +drawEdge(z0,z1,"\mathtt{fmap_{[]}\ f}"); +drawEdge(z2,z3,"\mathtt{fmap_{Maybe}\ f}"); +ab:=edge(z0,z2); +drawarrow ab; +label.lft(btex $\mathtt{toMaybe}$ etex,midpoint(ab)); + +ac:=edge(z1,z3); +drawarrow ac; +label.rt(btex $\mathtt{toMaybe}$ etex,midpoint(ac)); diff --git a/examples/nattrans-list-tree.mp b/examples/nattrans-list-tree.mp new file mode 100644 index 0000000..ff09e59 --- /dev/null +++ b/examples/nattrans-list-tree.mp @@ -0,0 +1,21 @@ +z0=(0,0); +z1=(1.5gu,0); +z2=(0,-gu); +z3=(1.5gu,-gu); +path ac,ab; + +label(btex $\mathtt{[a]}$ etex,z0); +label(btex $\mathtt{[b]}$ etex,z1); +label(btex $\mathtt{List\ a}$ etex,z2 shifted (-u,0)); +label(btex $\mathtt{List\ b}$ etex,z3 shifted (u,0)); + +drawEdge(z0,z1,"\mathtt{fmap_{[]}\ f}"); +drawEdge(z2,z3,"\mathtt{fmap_{List}\ f}"); +ab:=edge(z0,z2); +drawarrow ab; +label.lft(btex $\mathtt{toList}$ etex,midpoint(ab)); + +ac:=edge(z1,z3); +drawarrow ac; +label.rt(btex $\mathtt{toList}$ etex,midpoint(ac)); + diff --git a/examples/nattrans-maybe-list.mp b/examples/nattrans-maybe-list.mp new file mode 100644 index 0000000..4ffb30a --- /dev/null +++ b/examples/nattrans-maybe-list.mp @@ -0,0 +1,21 @@ +z0=(0,0); +z1=(1.5gu,0); +z2=(0,-gu); +z3=(1.5gu,-gu); +path ac,ab; + +label(btex $\mathtt{[a]}$ etex,z0); +label(btex $\mathtt{[b]}$ etex,z1); +label(btex $\mathtt{Maybe\ a}$ etex,z2 shifted (-u,0)); +label(btex $\mathtt{Maybe\ b}$ etex,z3 shifted (u,0)); + +drawEdge(z0,z1,"\mathtt{fmap_{[]}\ f}"); +drawEdge(z2,z3,"\mathtt{fmap_{Maybe}\ f}"); + +path abb,acb; +abb:=edge(z2 shifted (.2u,0),z0 shifted (.2u,0)); +acb:=edge(z3 shifted (-.2u,0),z1 shifted (-.2u,0)); +drawarrow abb; +drawarrow acb; +label.rt(btex $\mathtt{mToList}$ etex,midpoint(abb)); +label.lft(btex $\mathtt{mToList}$ etex,midpoint(acb)); diff --git a/examples/nattrans-tree-list.mp b/examples/nattrans-tree-list.mp new file mode 100644 index 0000000..d2d87e5 --- /dev/null +++ b/examples/nattrans-tree-list.mp @@ -0,0 +1,29 @@ +z0=(0,0); +z1=(1.5gu,0); +z2=(0,-gu); +z3=(1.5gu,-gu); +path ac,ab; + +label(btex $\mathtt{[a]}$ etex,z0); +label(btex $\mathtt{[b]}$ etex,z1); +label(btex $\mathtt{List\ a}$ etex,z2 shifted (-u,0)); +label(btex $\mathtt{List\ b}$ etex,z3 shifted (u,0)); + +drawEdge(z0,z1,"\mathtt{fmap_{[]}\ f}"); +drawEdge(z2,z3,"\mathtt{fmap_{List}\ f}"); +ab:=edge(z0,z2); +drawarrow ab; +label.lft(btex $\mathtt{toList}$ etex,midpoint(ab)); + +ac:=edge(z1,z3); +drawarrow ac; +label.rt(btex $\mathtt{toList}$ etex,midpoint(ac)); + +drawoptions(withcolor yellow); +path abb,acb; +abb:=edge(z2 shifted (.2u,0),z0 shifted (.2u,0)); +acb:=edge(z3 shifted (-.2u,0),z1 shifted (-.2u,0)); +drawarrow abb; +drawarrow acb; +label.rt(btex $\mathtt{toHList}$ etex,midpoint(abb)); +label.lft(btex $\mathtt{toHList}$ etex,midpoint(acb)); diff --git a/examples/natural-transformation.mp b/examples/natural-transformation.mp new file mode 100644 index 0000000..8ef2add --- /dev/null +++ b/examples/natural-transformation.mp @@ -0,0 +1,21 @@ +z0=(0,0); +z1=(gu,0); +z2=(0,-gu); +z3=(gu,-gu); +path ac,ab; + +label(btex $F X$ etex,z0); +label(btex $F Y$ etex,z1); +label(btex $G X$ etex,z2); +label(btex $G Y$ etex,z3); + +drawEdge(z0,z1,"F f"); +drawEdge(z2,z3,"G f"); +ab:=edge(z0,z2); +drawarrow ab; +label.lft(btex $\eta_X$ etex,midpoint(ab)); + +ac:=edge(z1,z3); +drawarrow ac; +label.rt(btex $\eta_Y$ etex,midpoint(ac)); + diff --git a/examples/numbers.mp b/examples/numbers.mp new file mode 100644 index 0000000..0cf146f --- /dev/null +++ b/examples/numbers.mp @@ -0,0 +1,19 @@ +z0=(0,0); +drawblock(z0,z0,"0"); + +z1=(gu,0); + +drawblock(z1,z1,"1"); +drawState(z1, "0"); +drawEdge(z1,z1, "id_0"); + +z2=z1 shifted (gu,0); +z3=z2 shifted (gu,0); + +drawblock(z2,z3,"2"); + +drawState(z2, "0"); +drawState(z3, "1"); +drawEdge(z2,z2, "id_0"); +drawEdge(z3,z3, "id_1"); +drawarrow edge(z2,z3); diff --git a/examples/objects.mp b/examples/objects.mp new file mode 100644 index 0000000..11dfe28 --- /dev/null +++ b/examples/objects.mp @@ -0,0 +1,19 @@ + +z0=(0,0); +z1=z0 shifted (gu,0); +z2=z1 shifted (gu,0); +z3=z2 shifted (gu,-0.5gu); +z4=z3 shifted (gu,0); +z5=z4 shifted (1.5u,0); +z6=z5 shifted (2u,0); + +drawblock(z0,z6,"\mathcal{C}"); +draw z5 -- z6 dashed withdots withpen pencircle scaled 2bp; + +drawoptions(withcolor yellow); +drawState(z0, "A"); +drawState(z1, "B"); +drawState(z2, "C"); + +drawState(z3, "D"); +drawState(z4, "E"); diff --git a/examples/pipe.mp b/examples/pipe.mp new file mode 100644 index 0000000..08d1bab --- /dev/null +++ b/examples/pipe.mp @@ -0,0 +1,149 @@ + +vardef inmouthsize(expr pos,size) = + fullcircle xscaled 0.6 scaled size shifted pos +enddef; +vardef outmouthsize(expr pos,size) = + (subpath (0,4) of fullcircle rotated -90) xscaled 0.6 scaled size shifted pos +enddef; +vardef hiddenoutmouthsize(expr pos,size) = + (subpath (4,8) of fullcircle rotated -90) xscaled 0.6 scaled size shifted pos +enddef; +vardef inmouth(expr pos) = + inmouthsize(pos,2u) +enddef; +vardef outmouth(expr pos) = + outmouthsize(pos,2u) +enddef; +vardef hiddenoutmouth(expr pos) = + hiddenoutmouthsize(pos,2u) +enddef; +def drawoutmouth(expr pos) = + draw outmouth(pos); +enddef; + +def drawtube(expr pos) = + begingroup; + save midin,midout; + pair midin,midout; + midin := pos; + midout := pos shifted (gu,0); + drawoutmouth(midin); + drawoutmouth(midout); + + save topin,topout,botin,botout; + pair topin,topout,botin,botout; + topin=pos shifted (0,u); + topout=topin shifted (gu,0); + botin=pos shifted (0,-u); + botout=botin shifted (gu,0); + draw topin -- topout; + draw botin -- botout; + endgroup; +enddef; +def drawtubelabel(expr pos,l) = + drawtube(pos); + label(l,pos shifted (.5gu,0)); +enddef; +def drawtwotubes(expr posintop,posinbot,posout) = + begingroup; + draw outmouth(posintop); + draw outmouth(posinbot); + draw outmouth(posout); + + save intopt,intopb,inbott,inbotb,outt,outb; + pair intopt,intopb,inbott,inbotb,outt,outb; + intopt=posintop shifted (0,u); + intopb=posintop shifted (0,-u); + inbott=posinbot shifted (0,u); + inbotb=posinbot shifted (0,-u); + outt=posout shifted (0,u); + outb=posout shifted (0,-u); + + draw intopt{right} .. {right}outt; + draw intopb{right} .. {left}inbott; + draw inbotb{right} .. {right}outb; + + endgroup; +enddef; +def drawtwotubeslabel(expr ptop,pbot,pout,l) = + begingroup; + drawtwotubes(ptop,pbot,pout); + save mid; + pair mid; + mid = 6/30ptop+6/30pbot+18/30pout; + label(l,mid); + endgroup; +enddef; +def drawlongbegintube (expr pos,len) = + draw (subpath (4,8) of fullcircle rotated -90) scaled 2u shifted pos shifted (-len,0); + draw (pos shifted (-len,u)){right}..{right}(pos shifted (0,u)); + draw (pos shifted (-len,-u)){right}..{right}(pos shifted (0,-u)); + draw outmouth(pos); +enddef; +def drawbegintube (expr pos) = + drawlongbegintube(pos,2u); +enddef; + +def drawbegintubelabel(expr pos,l) = + drawbegintube(pos); + label(l,pos shifted (-1.5u,0)); +enddef; + +def drawtube(expr pos) = + begingroup; + save midin,midout; + pair midin,midout; + midin := pos; + midout := pos shifted (gu,0); + draw outmouth(midin); + draw outmouth(midout); + + save topin,topout,botin,botout; + pair topin,topout,botin,botout; + topin=pos shifted (0,u); + topout=topin shifted (gu,0); + botin=pos shifted (0,-u); + botout=botin shifted (gu,0); + draw topin -- topout; + draw botin -- botout; + endgroup; +enddef; +def drawtubelabel(expr pos,l) = + drawtube(pos); + label(l,pos shifted (.5gu,0)); +enddef; + +pair pos; +pos:=origin; +z0=(2.5gu,.5gu); +z1=(0,-1.5gu); +z2=z1 shifted (3gu,0); + +drawbegintubelabel(pos shifted (-.5gu,.5gu),btex $42$ etex); +drawbegintubelabel(pos shifted (-.5gu,-.5gu),btex $\mathtt{"foo"}$ etex); +drawtwotubeslabel(pos shifted (0,.5gu), pos shifted (0,-.5gu), pos shifted (gu,0),btex $+$ etex); +draw inmouth(pos shifted (0,.5gu) ); +draw inmouth(pos shifted (0,-.5gu) ); + +drawbegintubelabel(z0 shifted (-2u,-gu),btex $\mathtt{"foo"}$ etex); +drawoptions(withcolor green); +drawbegintubelabel(z0,btex $42$ etex); +drawtwotubeslabel(z0, z0 shifted (0,-gu), z0 shifted (gu,-0.5gu),btex $+$ etex); +draw inmouth(z0 shifted (0,-gu)); + + +drawoptions(withcolor green); +drawbegintubelabel(z1,btex $\mathtt{"foo"}$ etex); +drawtubelabel(z1,btex $\mathtt{(+\ 42)}$ etex) + +drawoptions(withcolor red); +drawlongbegintube(z2,5u); +label(btex $\mathtt{(+\ 42\ "foo")}$ etex,z2 shifted (-3u,0)); +draw z2 shifted (-4u,2u) -- z2 shifted (0,-2u) dashed evenly withpen pencircle scaled 1bp; +draw z2 shifted (-4u,-2u) -- z2 shifted (0,2u) dashed evenly withpen pencircle scaled 1bp; + +drawoptions(withcolor base01); +drawarrow pos shifted (gu+2u,0) -- pos shifted (gu+4u,0); +drawarrow z0 shifted (-gu,-gu-u) .. z1 shifted (gu,2u); +drawarrow pos shifted (gu+u,-1.5gu) -- pos shifted (gu+3u,-1.5gu); + diff --git a/examples/preorder.mp b/examples/preorder.mp new file mode 100644 index 0000000..55ddb90 --- /dev/null +++ b/examples/preorder.mp @@ -0,0 +1,20 @@ +pair A,B,C,D; +A=(0,0); +B=A shifted (-1.5gu,0); +C=A shifted (1.5gu,0); +D=C shifted (1.5gu,0); + +drawState(A, "A"); +drawState(B, "B"); +drawState(C, "C"); +drawState(D, "D"); + +drawEdge(B,A,"A \leq B"); +drawEdge(C,A,"A \leq C"); +drawEdge(D,C,"C \leq D"); +drawEdgeAngle(D,A,"A \leq D", 35); + +drawEdge(A,A,"A \leq A"); +drawEdge(B,B,"B \leq B"); +drawEdge(C,C,"C \leq C"); +drawEdge(D,D,"D \leq D"); diff --git a/examples/set.mp b/examples/set.mp new file mode 100644 index 0000000..382ccb4 --- /dev/null +++ b/examples/set.mp @@ -0,0 +1,15 @@ +pair A,B,C,D; +A=(0,0); +B=A shifted (.7gu,1/2gu); +C=A shifted (.7gu,-1/2gu); +D=C shifted (.7gu,0); + +drawState(A, "A"); +drawState(B, "B"); +drawState(C, "C"); +drawState(D, "D"); + +drawEdge(A,A,"id_A"); +drawEdge(B,B,"id_B"); +drawEdge(C,C,"id_C"); +drawEdge(D,D,"id_D"); diff --git a/examples/strings.mp b/examples/strings.mp new file mode 100644 index 0000000..6d45dce --- /dev/null +++ b/examples/strings.mp @@ -0,0 +1,12 @@ +pair A,B,C,D,E,F; +A:=(0,0); B:=(0,u); C:=(0,2u); +D:=(0,3u); E:=(0,4u); F:=(0,6u); +nodesize:=4bp; +nodespace:=6bp; +drawLoopPoint(A,B,"''"); +drawLoopPoint(A,C,"a"); +drawLoopPoint(A,D,"b"); +drawLoopPoint(A,E,"ab"); +drawLoopPoint(A,F,"\omega"); +draw (0,4.8u)--(0,5.8u) dashed withdots; +draw A withpen pencircle scaled 4bp; diff --git a/examples/tree-list-endofunctor-morphism.mp b/examples/tree-list-endofunctor-morphism.mp new file mode 100644 index 0000000..aa1295c --- /dev/null +++ b/examples/tree-list-endofunctor-morphism.mp @@ -0,0 +1,9 @@ +pair tree,list; +resize(.8cm); +list=origin; +tree=list shifted (gu,0); +drawState(list,"\mathtt{[]}"); +drawState(tree,"\mathtt{List}"); +drawEdgeAngle(list,tree,"\mathtt{toList}",30); +drawoptions(withcolor yellow); +drawEdgeAngle(tree,list,"\mathtt{toHList}",30); diff --git a/gen b/gen new file mode 100755 index 0000000..06f1202 --- /dev/null +++ b/gen @@ -0,0 +1,76 @@ +#!/usr/bin/env zsh + +function err(){ print -- $@ >&2; exit 1 } + +# scriptdir is the directory of the current executable +if [[ ${0[0]} = '/' ]]; then + scriptdir="${0:h}" +else + scriptdir="$PWD/${0:h}" +fi + +# the tmp directory where compilation occurs with a lot of temporary files +tmpdir=/tmp/mp +[[ ! -d $tmpdir ]] && mkdir $tmpdir + +# the list of mp files without argument all file in the current tree +typeset -a fics +if (($#<1)); then + fics=( $scriptdir/*.mp(N) ) +else + for f in $@; fics=( $fics $scriptdir/$f ) +fi + +(( ${#fics} == 0 )) && err "No .mp files into $scriptdir" + +(( ${#fics} == 1 )) && [[ ${fics[1]} = "$scriptdir/graph.mp" ]] && \ + err "Only graph.mp files indo $scriptdir" + +\cp -f $fics $tmpdir +cd $tmpdir +for fpfic in $fics; do + fic=${fpfic:t} + tmp=${fic:r}-tmp.mp + eps=${fic:r}-tmp.1 + png=${fic:r}.png + old=${fic:r}.old + [[ $fic = "graph.mp" ]] && continue + { + echo -n >&2 "MPOST [$fic]" + cat $scriptdir/graph.mp + echo 'beginfig(1)' + echo ' drawoptions (withcolor base01);' + cat $fic + echo 'endfig;' + echo 'bye;' + } | sed 's/base00/baseZeroZero/g' \ + | sed 's/base01/baseZeroOne/g' \ + | sed 's/base02/baseZeroTwo/g' \ + | sed 's/base03/baseZeroThree/g' \ + | sed 's/base0/baseZero/g' \ + | sed 's/base1/baseOne/g' \ + | sed 's/base2/baseTwo/g' \ + | sed 's/base3/baseThree/g' \ + | sed 's/red/s_red/g' \ + | sed 's/blue/s_blue/g' \ + | sed 's/green/s_green/g' > $tmp + [[ -e $old ]] && diff $tmp $old >/dev/null && { echo " identical"; continue } + + dpi=$(grep '% DPI' $tmp | awk '{print $3}') + [[ $dpi = "" ]] && dpi=600 + + print + print "[DPI]: $dpi" + + # addshadow="'(' +clone -background black -shadow 90x4+0+1 ')' +swap -background none -layers merge +repage" + addshadow="" + reducesize=" -colors 254 -quality 75" + cmd="convert -colorspace rgb -density $((4*dpi)) $eps -resize 25% $addshadow $reducesize $png" + + print -- "[$PWD]: mpost $tmp && convert -density $dpi $tmp.1 $png" + mpost --tex=latex $tmp && \ + eval $cmd && \ + \cp -f $png $scriptdir && \ + \cp -f $tmp $old && \ + echo "updated" +done diff --git a/graph.mp b/graph.mp new file mode 100644 index 0000000..3ba5584 --- /dev/null +++ b/graph.mp @@ -0,0 +1,339 @@ +% solarized color scheme +color baseZeroThree, baseZeroTwo, baseZeroOne, baseZeroZero + , baseZero, baseOne, baseTwo, baseThree, yellow, orange + , red, magenta, violet, blue, cyan, green; +baseZeroThree :=(0.0 ,0.168627450980392,0.211764705882353); +baseZeroTwo :=(0.0274509803921569,0.211764705882353,0.258823529411765); +baseZeroOne :=(0.345098039215686 ,0.431372549019608,0.458823529411765); +baseZeroZero :=(0.396078431372549 ,0.482352941176471,0.513725490196078); +baseZero :=(0.513725490196078 ,0.580392156862745,0.588235294117647); +baseOne :=(0.576470588235294 ,0.631372549019608,0.631372549019608); +baseTwo :=(0.933333333333333 ,0.909803921568627,0.835294117647059); +baseThree :=(0.992156862745098 ,0.964705882352941,0.890196078431372); +yellow :=(0.709803921568627 ,0.537254901960784,0.0); +orange :=(0.796078431372549 ,0.294117647058824,0.0862745098039216); +red :=(0.862745098039216 ,0.196078431372549,0.184313725490196); +magenta :=(0.827450980392157 ,0.211764705882353,0.509803921568627); +violet :=(0.423529411764706 ,0.443137254901961,0.768627450980392); +blue :=(0.149019607843137 ,0.545098039215686,0.823529411764706); +cyan :=(0.164705882352941 ,0.631372549019608,0.596078431372549); +green :=(0.52156862745098 ,0.6 ,0.0); + + +%%%%%%%%%%%%%%%%%%%% +% Automata drawing % +%%%%%%%%%%%%%%%%%%%% +u:=.5cm; % unity +gu:=5u; % distance between states +nodesize := u; %size of a node +nodespace := u+.1cm; %size of a node + +def resize(expr nu)= + u:=nu; + gu:=5u; % distance between states + nodesize := u; %size of a node + nodespace := u+.1cm; %size of a node +enddef; + +% return the middle of a path +vardef midpoint(expr p)= + save r; pair r; + r:=point 1/2length(p) of p; + r +enddef; + +% shorten a path of length d at the beginning and the end +vardef shorten(expr p,d) = + save q,bcirc,ecirc; + path q,bcirc,ecirc; + bcirc := fullcircle scaled d shifted point 0 of p; + ecirc := fullcircle scaled d shifted point length(p) of p; + q := p cutbefore bcirc cutafter ecirc; + q +enddef; + +% Return a rounded box around top left and bottom right point. +vardef block(expr tl,br) = + save p; + save d,shift; + save topleft,bottomright; + save tll,tlt,trt,trr,brr,brb,blb,bll; + path p; + numeric d,shift; + d := 1/3u; + shift := 1.2u; + pair topleft,bottomright; + topleft := tl shifted (-shift,2shift); + bottomright := br shifted (shift,-.5shift); + pair tll,tlt,trt,trr,brr,brb,blb,bll; + tll := topleft shifted (-d,0); + tlt := topleft shifted (0,d); + trt := (xpart bottomright, ypart topleft) shifted (0,d); + trr := (xpart bottomright, ypart topleft) shifted (d,0); + brr := bottomright shifted (d,0); + brb := bottomright shifted (0,-d); + blb := (xpart topleft, ypart bottomright) shifted (0,-d); + bll := (xpart topleft, ypart bottomright) shifted (-d,0); + p:=tlt---trt..trr---brr..brb---blb..bll---tll..cycle; + p +enddef; + +% b being the path of the block +vardef blockLabelPosition(expr b)= + save pos; + pair pos; + pos := point 0.5 of b; + pos +enddef; + +% draw a block with the right math-mode tex label on top of it +def drawblock(expr topleftpoint, bottomrightpoint, l)= + save b,pos; + path b; + b:=block(topleftpoint,bottomrightpoint); + pair pos; + pos := blockLabelPosition(b); + draw b withcolor base01; + label.top(TEX("$"&l&"$"),pos); +enddef; + +% -- Generic private functions + +% return the edge between points A and B. +% out angle from A is inan +% in angle to B is outan +% nodesize is the size of the node +vardef edgeFull(expr posA,posB,inan,outan) = + save sub,s; + path sub,s; + s := posA {dir inan} .. {dir outan} posB ; + sub := shorten(s,nodespace); + sub +enddef; + +% return a picture of the label l for edge e +vardef edgeLabel(expr e,l) = + save ret,mid,an,lab,height,width; + picture ret; + pair mid; + mid := midpoint(e); + numeric an; + an := angle (direction 1/2length(e) of e); + picture lab; + pair height,width; + lab:=thelabel(TEX("$"&l&"$"),origin); + height:=(0,ypart (ulcorner lab - llcorner lab)); + width:=(xpart (urcorner lab - ulcorner lab),0); + if (an>-35) and (an<35): + ret:=lab shifted height rotated an shifted mid; + elseif (an>145) or (an<-145): + ret:=lab shifted height rotated (an+180) shifted mid; + elseif (an>75) and (an<120): + ret:=lab shifted mid shifted -width; + elseif (an>-120) and (an<-75): + ret:=lab shifted mid shifted width; + else: + ret:=lab shifted mid shifted height; + fi; + ret +enddef; + + + +% --- LABELED GRAPHS --- +% return the edge between points A and B. +% out angle from A is an + angle from A to B +vardef edgeAngle(expr posA,posB,an) = + save res,d; + path res; + numeric d; + d := angle(posB-posA); + res := edgeFull(posA,posB,d+an,d-an); + res +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% %% +%% LOOPS %% +%% %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +vardef dist(expr a,b)= + save width,height,res; + numeric width,height,res; + width:=xpart b - xpart a; + height:=ypart b - ypart a; + res:=sqrt(width*width + height*height); +enddef; +% return a loop +vardef loopFull(expr a,b,an) = + save ba,ea; + save circ,p,s; + pair ba,ea; + path circ,p,s; + p:=a{1,1}..b..{1,-1}cycle; + circ:= fullcircle scaled nodespace shifted a; + ba = circ intersectionpoint (subpath (0,1) of p); + ea = circ intersectionpoint (subpath (1,2) of p); + s:= ba{1,1}..b..{1,-1}ea; + s shifted -a rotated an shifted a +enddef; + +vardef loopPoint(expr a,b) = + loopFull(a,b,0) +enddef; + +vardef loopAngle(expr a,an) = + loopFull(a,a shifted (0,nodesize),an) +enddef; + +vardef loop(expr a) = + loopFull(a,a shifted (0,nodesize),0) +enddef; + +% return the direct edge between A and B +vardef edge(expr posA,posB) = + save an; + save sub; + numeric an; + path sub; + if (posA = posB): + sub := loop(posA); + else: + an := angle(posB-posA); + sub := edgeFull(posA,posB,an,an); + fi + sub +enddef; + +def drawLoopPoint(expr a,b,l) = + begingroup; + save s; + path s; + s:=loopPoint(a,b); + drawarrow s; + label.top(TEX("$"&l&"$"),midpoint(s)); + endgroup; +enddef; +def drawLoop(expr a,l) = + begingroup; + save s; + path s; + s:=loop(a); + drawarrow s; + label.top(TEX("$"&l&"$"),midpoint(s)); + endgroup; +enddef; + +def drawstate(expr pos) = + draw pos withpen pencircle scaled 4bp; +enddef; + +% draw some state with some label insize +def drawState(expr pos,l) = + begingroup; + save lab,reslab; + save height,width; + save size; + % Draw the circle + draw fullcircle scaled nodesize shifted pos; + + % Draw the label with the right size + picture lab,reslab; + numeric height,width; + numeric size; + lab=thelabel(TEX("$"&l&"$"),origin); + height:=ypart (ulcorner lab - llcorner lab); + width :=xpart (urcorner lab - ulcorner lab); + size := sqrt(height*height + width*width); + if size>.9nodesize: + reslab:=lab scaled (.9nodesize/size) shifted pos; + else: + reslab:=lab shifted pos; + fi + % help for debug to draw boundaries + % draw ulcorner reslab -- urcorner reslab -- lrcorner reslab -- llcorner reslab -- cycle; + draw reslab; + endgroup; +enddef; + +% draw an edge +def drawEdgeFull(expr posA,posB,l,inan,outan) = + begingroup; + save sub; + path sub; + sub := edgeFull(posA,posB,inan,outan); + drawarrow sub; + draw edgeLabel(sub,l); + endgroup; +enddef; + +def drawEdgeAngle(expr posA,posB,l,inan) = + begingroup; + save sub; + path sub; + sub := edgeAngle(posA,posB,inan); + drawarrow sub; + draw edgeLabel(sub,l); + endgroup; +enddef; + +def drawEdge(expr posA,posB,l) = + begingroup; + save sub; + path sub; + sub := edge(posA,posB); + drawarrow sub; + draw edgeLabel(sub,l); + endgroup; +enddef; + +vardef box(expr posA) = + save b,size; + path b; + numeric size; + size:=2nodesize; + b := unitsquare scaled size shifted posA shifted (-.5size,-.5size); + b +enddef; + +def drawbox(expr posA,l) = + begingroup; + save b,pos; + path b; + pair pos; + b:=box(posA); + draw b; + pos=point 3 of b; + label.lrt(TEX("$"&l&"$"),pos); + endgroup; +enddef; + +prologues:=3; + +verbatimtex +%&latex +\documentclass{minimal} +\begin{document} +etex + +% TEX macro is short enough to be copied +string preverbatimtex_, postverbatimtex_; + +vardef TEXPRE text s = preverbatimtex_ := s; enddef; + +vardef TEXPOST text s = postverbatimtex_ := s; enddef; + +vardef TEX primary s = + if known preverbatimtex_: + write "verbatimtex "&preverbatimtex_&" etex" to "mptextmp.mp"; + fi + write "btex "&s&" etex" to "mptextmp.mp"; + if known postverbatimtex_: + write "verbatimtex "&postverbatimtex_&" etex" to "mptextmp.mp"; + fi + write EOF to "mptextmp.mp"; + scantokens "input mptextmp" +enddef; + +TEXPRE("\documentclass{minimal}\begin{document}"); +TEXPOST("\end{document}");