MODULE Brace; VAR Width := 1.5, Dip := 10; PRIVATE PRED SixBox(a, b, c, d, e, f) IS a HOR c AND c HOR e AND b HOR d AND d HOR f AND a VER b AND c VER d AND e VER f AND (a, c) CONG (c, e) AND (d, c) CONG (f, e) END; PROC HBrace(a, m) IS IF VAR b ~ (-0.01055, -0.06121) REL (a, m), c ~ (0.4856, -0.08366) REL (a, m), d ~ (0.475, -0.1449) REL (a, m), e ~ (0.9712, -0.1673) REL (a, m), f ~ (0.9606, -0.2285) REL (a, m), g ~ (-0.001406, -0.008162) REL (a, m), h ~ (-0.01195, -0.06937) REL (a, m), i ~ (0.4842, -0.09182) REL (a, m), j ~ (0.4736, -0.153) REL (a, m), k ~ (0.9698, -0.1755) REL (a, m), l ~ (0.9592, -0.2367) REL (a, m) IN SixBox(a, b, c, d, e, f) AND SixBox(g, h, i, j, k, l) AND Width = Geometry.Dist(a, g) AND Dip = Geometry.Dist(a, b) AND a VER g AND e VER k AND (a, g) CONG (b, h) AND m VER e -> PS.MoveTo(a); PS.CurveTo(b, c, d); PS.CurveTo(c, f, e); PS.LineTo(k); PS.CurveTo(l, i, j); PS.CurveTo(i, h, g); PS.Close(); PS.Fill() END FI END; UI PointTool(HBrace); CONST BraceGap = 5; PROC LabeledBrace(a, b, f, txt) IS IF VAR c ~ (-0.004695, -0.05915) REL (a, b), d ~ (0.5, 0) REL (c, e), e ~ (0.9642, -0.1857) REL (b, f) IN a VER c AND BraceGap = Geometry.Dist(a, c) AND d = Geometry.Mid(c, e) AND e = Geometry.HorVer(f, b) -> HBrace(c, b); TypeLinesC.Center(d, txt) END FI END; UI TextTool(LabeledBrace); PROC Cmd0() IS IF VAR a ~ (-81.04, 89.5), b ~ (32.57, 72.81), c ~ (-61.35, 32.62), d = R2.Plus(c, (128.8, -65.99)), e = R2.Plus(c, (-3.787, -50.82)) IN HBrace(a, b); LabeledBrace(c, d, e, "label") END FI END;