#import "core/draw/group.typ" #let _grp(name, desc: none, type: "default", elmts, ..style) = { return (( type: "grp", draw: group.render-start, name: name, desc: desc, grp-type: type, elmts: elmts, style: style.named() ),) } #let _alt(desc, elmts, ..elses-style) = { let all-elmts = () all-elmts += elmts let elses = elses-style.pos() let style = elses-style.named() for i in range(0, elses.len(), step: 2) { let else-desc = elses.at(i) let else-elmts = elses.at(i + 1, default: ()) all-elmts.push(( type: "else", draw: group.render-else, desc: else-desc )) all-elmts += else-elmts } return _grp("alt", desc: desc, type: "alt", all-elmts, ..style) } #let _loop(desc, min: none, max: auto, elmts, ..style) = { let name = "loop" if min != none { if max == auto { max = "*" } name += "(" + str(min) + "," + str(max) + ")" } _grp(name, desc: desc, type: "loop", elmts, ..style) } #let _opt(desc, elmts, ..style) = _grp("opt", desc: desc, type: "opt", elmts, ..style.named()) #let _break(desc, elmts, ..style) = _grp("break", desc: desc, type: "break", elmts, ..style.named())