Penrose
Create beautiful diagrams just by typing notation in plain text.
README
Penrose
Penrose is a platform that enables people to
create beautiful diagrams just by typing notation in plain
text. The goal is to make it easy for non-experts to create and explore
high-quality diagrams and provide deeper insight into challenging technical
concepts. We aim to democratize the process of creating visual intuition.
Usage
You can try Penrose in your browser
without any installation. For a more detailed step-by-step introduction, check
out our tutorials. Or, for
more reference-style information, take a look at our
Example
Here's a simple Penrose visualization in the domain of set theory.
It's specified by the following trio of Domain, Substance, and Style programs
(with variation MonsoonCaterpillar95943):
- setTheory.domain:
type Set
predicate NotIntersecting(Set s1, Set s2)
predicate Intersecting(Set s1, Set s2)
predicate IsSubset(Set s1, Set s2)
- tree.substance:
Set A, B, C, D, E, F, G
IsSubset(B, A)
IsSubset(C, A)
IsSubset(D, B)
IsSubset(E, B)
IsSubset(F, C)
IsSubset(G, C)
NotIntersecting(E, D)
NotIntersecting(F, G)
NotIntersecting(B, C)
AutoLabel All
- venn.style:
canvas {
width = 800
height = 700
}
forall Set x {
shape x.icon = Circle { }
shape x.text = Equation {
string : x.label
fontSize : "32px"
}
ensure contains(x.icon, x.text)
encourage norm(x.text.center - x.icon.center) == 0
layer x.text above x.icon
}
forall Set x; Set y
where IsSubset(x, y) {
ensure disjoint(y.text, x.icon, 10)
ensure contains(y.icon, x.icon, 5)
layer x.icon above y.icon
}
forall Set x; Set y
where NotIntersecting(x, y) {
ensure disjoint(x.icon, y.icon)
}
forall Set x; Set y
where Intersecting(x, y) {
ensure overlapping(x.icon, y.icon)
ensure disjoint(y.text, x.icon)
ensure disjoint(x.text, y.icon)
}
Contributing
See [CONTRIBUTING.md](CONTRIBUTING.md).
License
This repository is licensed under the MIT License.