From 6aa8f2b342b21f4f02a4bfe24ab4508dd139017c Mon Sep 17 00:00:00 2001 From: jollywatt Date: Thu, 6 Mar 2025 16:17:38 +0000 Subject: [PATCH] fletcher:0.5.6 --- packages/preview/fletcher/0.5.6/LICENSE | 21 + packages/preview/fletcher/0.5.6/README.md | 291 ++++ .../0.5.6/docs/gallery/1-commutative.svg | 419 ++++++ .../0.5.6/docs/gallery/1-commutative.typ | 11 + .../0.5.6/docs/gallery/2-algebra-cube.svg | 905 +++++++++++ .../0.5.6/docs/gallery/2-algebra-cube.typ | 47 + .../0.5.6/docs/gallery/3-ml-architecture.svg | 441 ++++++ .../0.5.6/docs/gallery/3-ml-architecture.typ | 42 + .../0.5.6/docs/gallery/4-io-flowchart.svg | 384 +++++ .../0.5.6/docs/gallery/4-io-flowchart.typ | 28 + .../fletcher/0.5.6/docs/gallery/5-digraph.svg | 264 ++++ .../fletcher/0.5.6/docs/gallery/5-digraph.typ | 25 + .../0.5.6/docs/gallery/6-node-groups.svg | 780 ++++++++++ .../0.5.6/docs/gallery/6-node-groups.typ | 38 + .../0.5.6/docs/gallery/7-uml-diagram.svg | 351 +++++ .../0.5.6/docs/gallery/7-uml-diagram.typ | 22 + .../preview/fletcher/0.5.6/docs/manual.pdf | Bin 0 -> 606566 bytes .../preview/fletcher/0.5.6/docs/manual.typ | 1334 +++++++++++++++++ .../1-first-isomorphism-theorem-dark.svg | 315 ++++ .../1-first-isomorphism-theorem-light.svg | 315 ++++ .../1-first-isomorphism-theorem.typ | 6 + .../readme-examples/2-flowchart-trap-dark.svg | 244 +++ .../2-flowchart-trap-light.svg | 244 +++ .../docs/readme-examples/2-flowchart-trap.typ | 15 + .../readme-examples/3-state-machine-dark.svg | 650 ++++++++ .../readme-examples/3-state-machine-light.svg | 650 ++++++++ .../docs/readme-examples/3-state-machine.typ | 16 + .../4-feynman-diagram-dark.svg | 210 +++ .../4-feynman-diagram-light.svg | 210 +++ .../readme-examples/4-feynman-diagram.typ | 5 + .../preview/fletcher/0.5.6/docs/style.typ | 169 +++ .../preview/fletcher/0.5.6/src/coords.typ | 301 ++++ .../fletcher/0.5.6/src/default-marks.typ | 387 +++++ packages/preview/fletcher/0.5.6/src/deps.typ | 1 + .../preview/fletcher/0.5.6/src/diagram.typ | 561 +++++++ packages/preview/fletcher/0.5.6/src/draw.typ | 894 +++++++++++ packages/preview/fletcher/0.5.6/src/edge.typ | 1117 ++++++++++++++ .../preview/fletcher/0.5.6/src/exports.typ | 10 + packages/preview/fletcher/0.5.6/src/marks.typ | 441 ++++++ packages/preview/fletcher/0.5.6/src/node.typ | 566 +++++++ .../preview/fletcher/0.5.6/src/shapes.typ | 469 ++++++ packages/preview/fletcher/0.5.6/src/utils.typ | 313 ++++ packages/preview/fletcher/0.5.6/typst.toml | 25 + 43 files changed, 13537 insertions(+) create mode 100644 packages/preview/fletcher/0.5.6/LICENSE create mode 100644 packages/preview/fletcher/0.5.6/README.md create mode 100644 packages/preview/fletcher/0.5.6/docs/gallery/1-commutative.svg create mode 100644 packages/preview/fletcher/0.5.6/docs/gallery/1-commutative.typ create mode 100644 packages/preview/fletcher/0.5.6/docs/gallery/2-algebra-cube.svg create mode 100644 packages/preview/fletcher/0.5.6/docs/gallery/2-algebra-cube.typ create mode 100644 packages/preview/fletcher/0.5.6/docs/gallery/3-ml-architecture.svg create mode 100644 packages/preview/fletcher/0.5.6/docs/gallery/3-ml-architecture.typ create mode 100644 packages/preview/fletcher/0.5.6/docs/gallery/4-io-flowchart.svg create mode 100644 packages/preview/fletcher/0.5.6/docs/gallery/4-io-flowchart.typ create mode 100644 packages/preview/fletcher/0.5.6/docs/gallery/5-digraph.svg create mode 100644 packages/preview/fletcher/0.5.6/docs/gallery/5-digraph.typ create mode 100644 packages/preview/fletcher/0.5.6/docs/gallery/6-node-groups.svg create mode 100644 packages/preview/fletcher/0.5.6/docs/gallery/6-node-groups.typ create mode 100644 packages/preview/fletcher/0.5.6/docs/gallery/7-uml-diagram.svg create mode 100644 packages/preview/fletcher/0.5.6/docs/gallery/7-uml-diagram.typ create mode 100644 packages/preview/fletcher/0.5.6/docs/manual.pdf create mode 100644 packages/preview/fletcher/0.5.6/docs/manual.typ create mode 100644 packages/preview/fletcher/0.5.6/docs/readme-examples/1-first-isomorphism-theorem-dark.svg create mode 100644 packages/preview/fletcher/0.5.6/docs/readme-examples/1-first-isomorphism-theorem-light.svg create mode 100644 packages/preview/fletcher/0.5.6/docs/readme-examples/1-first-isomorphism-theorem.typ create mode 100644 packages/preview/fletcher/0.5.6/docs/readme-examples/2-flowchart-trap-dark.svg create mode 100644 packages/preview/fletcher/0.5.6/docs/readme-examples/2-flowchart-trap-light.svg create mode 100644 packages/preview/fletcher/0.5.6/docs/readme-examples/2-flowchart-trap.typ create mode 100644 packages/preview/fletcher/0.5.6/docs/readme-examples/3-state-machine-dark.svg create mode 100644 packages/preview/fletcher/0.5.6/docs/readme-examples/3-state-machine-light.svg create mode 100644 packages/preview/fletcher/0.5.6/docs/readme-examples/3-state-machine.typ create mode 100644 packages/preview/fletcher/0.5.6/docs/readme-examples/4-feynman-diagram-dark.svg create mode 100644 packages/preview/fletcher/0.5.6/docs/readme-examples/4-feynman-diagram-light.svg create mode 100644 packages/preview/fletcher/0.5.6/docs/readme-examples/4-feynman-diagram.typ create mode 100644 packages/preview/fletcher/0.5.6/docs/style.typ create mode 100644 packages/preview/fletcher/0.5.6/src/coords.typ create mode 100644 packages/preview/fletcher/0.5.6/src/default-marks.typ create mode 100644 packages/preview/fletcher/0.5.6/src/deps.typ create mode 100644 packages/preview/fletcher/0.5.6/src/diagram.typ create mode 100644 packages/preview/fletcher/0.5.6/src/draw.typ create mode 100644 packages/preview/fletcher/0.5.6/src/edge.typ create mode 100644 packages/preview/fletcher/0.5.6/src/exports.typ create mode 100644 packages/preview/fletcher/0.5.6/src/marks.typ create mode 100644 packages/preview/fletcher/0.5.6/src/node.typ create mode 100644 packages/preview/fletcher/0.5.6/src/shapes.typ create mode 100644 packages/preview/fletcher/0.5.6/src/utils.typ create mode 100644 packages/preview/fletcher/0.5.6/typst.toml diff --git a/packages/preview/fletcher/0.5.6/LICENSE b/packages/preview/fletcher/0.5.6/LICENSE new file mode 100644 index 0000000000..f8de216aef --- /dev/null +++ b/packages/preview/fletcher/0.5.6/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Joseph Wilson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/packages/preview/fletcher/0.5.6/README.md b/packages/preview/fletcher/0.5.6/README.md new file mode 100644 index 0000000000..1df478f6b9 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/README.md @@ -0,0 +1,291 @@ +![Version](https://img.shields.io/badge/version-0.5.6-green) +[![Development version](https://img.shields.io/badge/dynamic/toml?url=https%3A%2F%2Fgithub.com%2FJollywatt%2Ftypst-fletcher%2Fraw%2Fdev%2Ftypst.toml&query=package.version&label=dev&color=blue)](https://github.com/Jollywatt/typst-fletcher/tree/dev) +[![Repo](https://img.shields.io/badge/GitHub-repo-blue)](https://github.com/Jollywatt/typst-fletcher) + +# fletcher + +_**fletcher** (noun) a maker of arrows_ + +A [Typst](https://typst.app/) package for drawing diagrams with arrows, +built on top of [CeTZ](https://github.com/johannes-wolf/cetz). + +See the [manual](docs/manual.pdf?raw=true) for documentation or ask the community for help. + +[![Manual](https://img.shields.io/badge/docs-manual.pdf-orange)](docs/manual.pdf?raw=true) +[![Ask on Discord](https://img.shields.io/badge/ask-on%20Typst%20forum-239dad +)](https://forum.typst.app) +[![Ask on Discord](https://img.shields.io/badge/ask-on%20Discord-2a4d7e +)](https://discord.com/channels/1054443721975922748/1260973351900414102) + + +```typ +#import "@preview/fletcher:0.5.6" as fletcher: diagram, node, edge +``` + + + + + + + +```typ +#diagram(cell-size: 15mm, $ + G edge(f, ->) edge("d", pi, ->>) & im(f) \ + G slash ker(f) edge("ur", tilde(f), "hook-->") +$) +``` + + + + + + +```typ +// https://xkcd.com/1195/ +#import fletcher.shapes: diamond +#set text(font: "Comic Neue", weight: 600) // testing: omit + +#diagram( + node-stroke: 1pt, + node((0,0), [Start], corner-radius: 2pt, extrude: (0, 3)), + edge("-|>"), + node((0,1), align(center)[ + Hey, wait,\ this flowchart\ is a trap! + ], shape: diamond), + edge("d,r,u,l", "-|>", [Yes], label-pos: 0.1) +) +``` + + + + + + +```typ +#set text(10pt) +#diagram( + node-stroke: .1em, + node-fill: gradient.radial(blue.lighten(80%), blue, center: (30%, 20%), radius: 80%), + spacing: 4em, + edge((-1,0), "r", "-|>", `open(path)`, label-pos: 0, label-side: center), + node((0,0), `reading`, radius: 2em), + edge(`read()`, "-|>"), + node((1,0), `eof`, radius: 2em), + edge(`close()`, "-|>"), + node((2,0), `closed`, radius: 2em, extrude: (-2.5, 0)), + edge((0,0), (0,0), `read()`, "--|>", bend: 130deg), + edge((0,0), (2,0), `close()`, "-|>", bend: -40deg), +) +``` + + + + + + +```typ +#diagram($ + e^- edge("rd", "-<|-") & & & edge("ld", "-|>-") e^+ \ + & edge(gamma, "wave") \ + e^+ edge("ru", "-|>-") & & & edge("lu", "-<|-") e^- \ +$) +``` + + + + +# More examples +Pull requests are most welcome! + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + +## Change log + +### 0.5.6 + +- **Require `typst` version `>=0.13.0`.** +- Update `cetz` dependency to `0.3.3`. +- Support CeTZ anchors on nodes which dynamically enclose other nodes (#81). +- Allow nested enclosing of nodes (#45). +- Add `floating` option to `edge()` to make certain objects not affect the diagram's bounds (#38). +- Make `debug` annotations "floating" so they don't affect diagram size and layout. + +### 0.5.5 + +- Update `cetz` dependency to `0.3.2`. +- Fix deprecated type comparisons (#75). +- Add space ` ` line style for empty stroke (#70). +- Fix bug with `label-side` for corner edges (#74). + +### 0.5.4 + +- Allow relative lengths for the `label-pos` option of `edge()` (#61). +- Fix layout bugs for diagrams with non-default `axes` options (#62, #66). +- Fix a line breaking issue with justified text in nodes (#64). + +### 0.5.3 + +- Support CeTZ anchors in edge coordinates, e.g., `edge(, ..)`. +- Fix crash when `stroke: none` set on polyline edges (#60, [@SillyFreak](https://github.com/SillyFreak!)). +- Fix bug with crossing edges in math mode (#54). +- Fix layout bugs for diagrams with non-default `axes` options (#62, #66). + +### 0.5.2 + +- **Require `typst` version `>=0.12.0`.** +- Update `cetz` dependency to `0.3.1`. **Note:** This may slightly change edge label positions. +- Add `loop-angle` option to `edge()` (#36). + +### 0.5.1 + +- Fix nodes which `enclose` absolute coordinates. +- Allow CeTZ-style coordinate expressions in node `enclose` option. +- Fix crash with polar coordinates. +- Fix edges which bend at 0deg or 180deg (e.g., `edge("r,r")` or `edge("r,l")`) and enhance the way the corner radius adapts to the bend angle. **Note:** This may change diagram layout from previous versions. +- Improve error messages. +- Add marks for crow's foot notation: `n` (many), `n?` (zero or more), `n!` (one or more), `1` (one), `1?` (zero or one), `1!` (exactly one). +- Add `node-shape` option to `diagram()`. + +### 0.5.0 + +- Greatly enhance coordinate system. + - Support CeTZ-style coordinate expressions (relative, polar, interpolating, named coordinates, etc). + - Absolute coordinates (physical lengths) can be used alongside "elastic" coordinates (row/column positions). +- Add `label-angle` option to `edge()`. +- Add `label-wrapper` option to allow changing the label inset, outline stroke, and so on (#26). +- Add `label-size` option to control default edge label text size (#35) +- Add `trapezium` node shape. +- Disallow string labels to be passed as positional arguments to `edge()` (to eliminate ambiguity). Used named argument or pass content instead. + +### 0.4.5 + +- Add isosceles triangle node shape (#31). +- Add `fit` and `dir` options to various node shapes to adjust sizing and orientation. +- Allow more than one consecutive edge to have an implicit end vertex. +- Allow `snap-to` to be `none` to disable edge snapping (#32). + +### 0.4.4 + +- Support fully customisable marks/arrowheads! + - Added new mark styles and tweaked some existing defaults. **Note.** This may change the micro-typography of diagrams from previous versions. +- Add node groups via the `enclose` option of `node()`. +- Node labels can be aligned inside the node with `align()`. +- Node labels wrap naturally when label text is wider than the node. **Note:** This may change diagram layout from previous versions. +- Add a `layer` option to nodes and edges to control drawing order. +- Add node shapes: `ellipse`, `octagon`. + +### 0.4.3 + +- Fixed edge crossing backgrounds being drawn above nodes (#14). +- Add `fletcher.hide()` to hide elements with/without affecting layout, useful for incremental diagrams in slides (#15). +- Support `shift`ing edges by coordinate deltas as well as absolute lengths (#13). +- Support node names (#8). + +### 0.4.2 + +- Improve edge-to-node snapping. Edges can terminate anywhere near a node (not just at its center) and will automatically snap to the node outline. Added `snap-to` option to `edge()`. +- Fix node `inset` being half the amount specified. If upgrading from previous version, you will need to divide node `inset` values by two to preserve diagram layout. +- Add `decorations` option to `edge()` for CeTZ path decorations (`"wave"`, `"zigzag"`, and `"coil"`, also accepted as positional string arguments). + +### 0.4.1 + +- Support custom node shapes! Edges connect to node outlines automatically. + - New `shapes` submodule, containing `diamond`, `pill`, `parallelogram`, `hexagon`, and other node shapes. +- Allow edges to have multiple segments. + - Add `vertices` an `corner-radius` options to `edge()`. + - Relative coordinate shorthands may be comma separated to signify multiple segments, e.g., `"r,u,ll"`. +- Add `dodge` option to `edge()` to adjust end points. +- Support `cetz:0.2.0`. + +### 0.4.0 + +- Add ability to specify diagrams in math-mode, using `&` to separate nodes. +- Allow implicit and relative edge coordinates, e.g., `edge("d")` becomes `edge(prev-node, (0, 1))`. +- Add ability to place marks anywhere along an edge. Shorthands now accept an optional middle mark, for example `|->-|` and `hook-/->>`. +- Add “hanging tail” correction to marks on curved edges. Marks now rotate a bit to fit more comfortably along tightly curving arcs. +- Add more arrowheads for the sake of it: `}>`, `<{`, `/`, `\`, `x`, `X`, `*` (solid dot), `@` (solid circle). +- Add `axes` option to `diagram()` to control the direction of each axis in the diagram's coordinate system. +- Add `width`, `height` and `radius` options to `node()` for explicit control over size. +- Add `corner-radius` option to `node()`. +- Add `stroke` option to `edge()` replacing `thickness` and `paint` options. +- Add `edge-stroke` option to `diagram()` replacing `edge-thickness`. + +### 0.3.0 + +- Make round-style arrow heads better approximate the default math font. +- Add solid arrow heads with shorthand `<|-`, `-|>` and double-bar `||-`, `-||`. +- Add an `extrude` option to `node()` which duplicates and extrudes the node's stroke, enabling double stroke effects. + +### 0.2.0 + +- Experimental support for customising arrowheads. +- Add right-angled edges with `edge(..., corner: left/right)`. + +## Star History + + + + + + Star History Chart + + \ No newline at end of file diff --git a/packages/preview/fletcher/0.5.6/docs/gallery/1-commutative.svg b/packages/preview/fletcher/0.5.6/docs/gallery/1-commutative.svg new file mode 100644 index 0000000000..85f39aa969 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/gallery/1-commutative.svg @@ -0,0 +1,419 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/fletcher/0.5.6/docs/gallery/1-commutative.typ b/packages/preview/fletcher/0.5.6/docs/gallery/1-commutative.typ new file mode 100644 index 0000000000..1327b78203 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/gallery/1-commutative.typ @@ -0,0 +1,11 @@ +#import "@preview/fletcher:0.5.6" as fletcher: diagram, node, edge +#set page(width: auto, height: auto, margin: 5mm, fill: white) + +#diagram( + spacing: (1em, 3em), + $ + & tau^* (bold(A B)^n R slash.double R^times) edge(->) & bold(B)^n R slash.double R^times \ + X edge("ur", "-->") edge("=") & X edge(->, tau) edge("u", <-) & bold(B) R^times edge("u", <-) + $, + edge((2,1), "d,ll,u", "->>", text(blue, $Gamma^*_R$), stroke: blue, label-side: center) +) \ No newline at end of file diff --git a/packages/preview/fletcher/0.5.6/docs/gallery/2-algebra-cube.svg b/packages/preview/fletcher/0.5.6/docs/gallery/2-algebra-cube.svg new file mode 100644 index 0000000000..81ae849bec --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/gallery/2-algebra-cube.svg @@ -0,0 +1,905 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/fletcher/0.5.6/docs/gallery/2-algebra-cube.typ b/packages/preview/fletcher/0.5.6/docs/gallery/2-algebra-cube.typ new file mode 100644 index 0000000000..c7b326db89 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/gallery/2-algebra-cube.typ @@ -0,0 +1,47 @@ +#import "@preview/fletcher:0.5.6" as fletcher: diagram, node, edge +#set page(width: auto, height: auto, margin: 5mm, fill: white) + +#diagram( + node-defocus: 0, + spacing: (1cm, 2cm), + edge-stroke: 1pt, + crossing-thickness: 5, + mark-scale: 70%, + node-fill: luma(97%), + node-outset: 3pt, + node((0,0), "magma"), + + node((-1,1), "semigroup"), + node(( 0,1), "unital magma"), + node((+1,1), "quasigroup"), + + node((-1,2), "monoid"), + node(( 0,2), "inverse semigroup"), + node((+1,2), "loop"), + + node(( 0,3), "group"), + + { + let quad(a, b, label, paint, ..args) = { + paint = paint.darken(25%) + edge(a, b, text(paint, label), "-|>", stroke: paint, label-side: center, ..args) + } + + quad((0,0), (-1,1), "Assoc", blue) + quad((0,1), (-1,2), "Assoc", blue, label-pos: 0.3) + quad((1,2), (0,3), "Assoc", blue) + + quad((0,0), (0,1), "Id", red) + quad((-1,1), (-1,2), "Id", red, label-pos: 0.3) + quad((+1,1), (+1,2), "Id", red, label-pos: 0.3) + quad((0,2), (0,3), "Id", red) + + quad((0,0), (1,1), "Div", yellow) + quad((-1,1), (0,2), "Div", yellow, label-pos: 0.3, "crossing") + + quad((-1,2), (0,3), "Inv", green) + quad((0,1), (+1,2), "Inv", green, label-pos: 0.3) + + quad((1,1), (0,2), "Assoc", blue, label-pos: 0.3, "crossing") + }, +) diff --git a/packages/preview/fletcher/0.5.6/docs/gallery/3-ml-architecture.svg b/packages/preview/fletcher/0.5.6/docs/gallery/3-ml-architecture.svg new file mode 100644 index 0000000000..bb19a2030d --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/gallery/3-ml-architecture.svg @@ -0,0 +1,441 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/fletcher/0.5.6/docs/gallery/3-ml-architecture.typ b/packages/preview/fletcher/0.5.6/docs/gallery/3-ml-architecture.typ new file mode 100644 index 0000000000..8a59bc2fbf --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/gallery/3-ml-architecture.typ @@ -0,0 +1,42 @@ +#import "@preview/fletcher:0.5.6" as fletcher: diagram, node, edge +#import fletcher.shapes: house, hexagon +#set page(width: auto, height: auto, margin: 5mm, fill: white) +#set text(font: "New Computer Modern") + +#let blob(pos, label, tint: white, ..args) = node( + pos, align(center, label), + width: 28mm, + fill: tint.lighten(60%), + stroke: 1pt + tint.darken(20%), + corner-radius: 5pt, + ..args, +) + +#diagram( + spacing: 8pt, + cell-size: (8mm, 10mm), + edge-stroke: 1pt, + edge-corner-radius: 5pt, + mark-scale: 70%, + + blob((0,1), [Add & Norm], tint: yellow, shape: hexagon), + edge(), + blob((0,2), [Multi-Head\ Attention], tint: orange), + blob((0,4), [Input], shape: house.with(angle: 30deg), + width: auto, tint: red), + + for x in (-.3, -.1, +.1, +.3) { + edge((0,2.8), (x,2.8), (x,2), "-|>") + }, + edge((0,2.8), (0,4)), + + edge((0,3), "l,uu,r", "--|>"), + edge((0,1), (0, 0.35), "r", (1,3), "r,u", "-|>"), + edge((1,2), "d,rr,uu,l", "--|>"), + + blob((2,0), [Softmax], tint: green), + edge("<|-"), + blob((2,1), [Add & Norm], tint: yellow, shape: hexagon), + edge(), + blob((2,2), [Feed\ Forward], tint: blue), +) diff --git a/packages/preview/fletcher/0.5.6/docs/gallery/4-io-flowchart.svg b/packages/preview/fletcher/0.5.6/docs/gallery/4-io-flowchart.svg new file mode 100644 index 0000000000..6af6f0fa4c --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/gallery/4-io-flowchart.svg @@ -0,0 +1,384 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/fletcher/0.5.6/docs/gallery/4-io-flowchart.typ b/packages/preview/fletcher/0.5.6/docs/gallery/4-io-flowchart.typ new file mode 100644 index 0000000000..da28baa6cf --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/gallery/4-io-flowchart.typ @@ -0,0 +1,28 @@ +#import "@preview/fletcher:0.5.6" as fletcher: diagram, node, edge +#set page(width: auto, height: auto, margin: 5mm, fill: white) +#set text(white, font: "New Computer Modern") +#let colors = (maroon, olive, eastern) + +#diagram( + edge-stroke: 1pt, + node-corner-radius: 5pt, + edge-corner-radius: 8pt, + mark-scale: 80%, + + node((0,0), [input], fill: colors.at(0)), + node((2,+1), [memory unit (MU)], fill: colors.at(1)), + node((2, 0), align(center)[arithmetic & logic \ unit (ALU)], fill: colors.at(1)), + node((2,-1), [control unit (CU)], fill: colors.at(1)), + node((4,0), [output], fill: colors.at(2), shape: fletcher.shapes.hexagon), + + edge((0,0), "r,u,r", "-}>"), + edge((2,-1), "r,d,r", "-}>"), + edge((2,-1), "r,dd,l", "--}>"), + edge((2,1), "l", (1,-.5), marks: ((inherit: "}>", pos: 0.65, rev: false),)), + + for i in range(-1, 2) { + edge((2,0), (2,1), "<{-}>", shift: i*5mm, bend: i*20deg) + }, + + edge((2,-1), (2,0), "<{-}>"), +) \ No newline at end of file diff --git a/packages/preview/fletcher/0.5.6/docs/gallery/5-digraph.svg b/packages/preview/fletcher/0.5.6/docs/gallery/5-digraph.svg new file mode 100644 index 0000000000..92cd6bde7b --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/gallery/5-digraph.svg @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/fletcher/0.5.6/docs/gallery/5-digraph.typ b/packages/preview/fletcher/0.5.6/docs/gallery/5-digraph.typ new file mode 100644 index 0000000000..9a68a19bb3 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/gallery/5-digraph.typ @@ -0,0 +1,25 @@ +#import "@preview/fletcher:0.5.6" as fletcher: diagram, node, edge, shapes +#set page(width: auto, height: auto, margin: 5mm, fill: white) + +#let nodes = ("A", "B", "C", "D", "E", "F", "G") +#let edges = ( + (3, 2), + (4, 1), + (1, 4), + (0, 4), + (3, 0), + (5, 6), + (6, 5), +) + +#diagram({ + for (i, n) in nodes.enumerate() { + let θ = 90deg - i*360deg/nodes.len() + node((θ, 18mm), n, stroke: 0.5pt, name: str(i)) + } + for (from, to) in edges { + let bend = if (to, from) in edges { 10deg } else { 0deg } + // refer to nodes by label, e.g., <1> + edge(label(str(from)), label(str(to)), "-|>", bend: bend) + } +}) \ No newline at end of file diff --git a/packages/preview/fletcher/0.5.6/docs/gallery/6-node-groups.svg b/packages/preview/fletcher/0.5.6/docs/gallery/6-node-groups.svg new file mode 100644 index 0000000000..47b75143c0 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/gallery/6-node-groups.svg @@ -0,0 +1,780 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/fletcher/0.5.6/docs/gallery/6-node-groups.typ b/packages/preview/fletcher/0.5.6/docs/gallery/6-node-groups.typ new file mode 100644 index 0000000000..8eae7227a1 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/gallery/6-node-groups.typ @@ -0,0 +1,38 @@ +#import "@preview/fletcher:0.5.6" as fletcher: diagram, node, edge +#set page(width: auto, height: auto, margin: 5mm, fill: white) + + +#diagram( + node-corner-radius: 4pt, + node((0,0), $S a$), + node((1,0), $T b$), + node((0,1), $S a'$), + node((1,1), $T b'$), + edge((0,0), (1,0), "->", $f$), + edge((0,1), (1,1), "->", $f'$), + edge((0,0), (0,1), "->", $alpha$), + edge((1,0), (1,1), "->", $beta$), + + node((2,0), $(a, b, f)$), + edge("->", text(0.8em, $(alpha, beta)$)), + node((2,1), $(a', b', f')$), + + node((0,2), $S a$), + edge("->", $f$), + node((1,2), $T b$), + + node((2,2), $(a, b, f)$), + + { + let tint(c) = (stroke: c, fill: rgb(..c.components().slice(0,3), 5%), inset: 8pt) + node(enclose: ((0,0), (1,1)), ..tint(teal), name: ) + node(enclose: ((2,0), (2,1)), ..tint(teal), name: ) + node(enclose: ((0,2), (1,2)), ..tint(green), name: ) + node(enclose: ((2,2),), ..tint(green), name: ) + }, + + edge(, , "<==>", stroke: teal + .75pt), + edge(, , "<==>", stroke: green + .75pt), + edge(, , "<=>", stroke: .75pt), + edge(, , "<=>", stroke: .75pt), +) \ No newline at end of file diff --git a/packages/preview/fletcher/0.5.6/docs/gallery/7-uml-diagram.svg b/packages/preview/fletcher/0.5.6/docs/gallery/7-uml-diagram.svg new file mode 100644 index 0000000000..357f762c27 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/gallery/7-uml-diagram.svg @@ -0,0 +1,351 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/fletcher/0.5.6/docs/gallery/7-uml-diagram.typ b/packages/preview/fletcher/0.5.6/docs/gallery/7-uml-diagram.typ new file mode 100644 index 0000000000..0b066a2569 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/gallery/7-uml-diagram.typ @@ -0,0 +1,22 @@ +#import "@preview/fletcher:0.5.6" as fletcher: diagram, node, edge +#set page(width: auto, height: auto, margin: 5mm, fill: white) + +#diagram( + spacing: (18mm, 10mm), + node-stroke: luma(80%), + node((0.5,0), [*Diagram*], name: ), + node((0,1), [*Node*], name: ), + node((1,1), [*Edge*], name: ), + + edge(, ((), "|-", (0,0.5)), ((), "-|", ), , "1!-n!"), + edge(, ((), "|-", (0,0.5)), ((), "-|", ), , "1!-n?"), + + + edge("1!-n?"), + + node((1,2), [*Mark*], name: ), + + edge(, "-|>", , stroke: teal, label: text(teal)[snap], left), + + edge((rel: (-15pt, 0pt), to: ), , "-|>", bend: 40deg, stroke: orange, text(orange)[layout], label-angle: auto) +) \ No newline at end of file diff --git a/packages/preview/fletcher/0.5.6/docs/manual.pdf b/packages/preview/fletcher/0.5.6/docs/manual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..16a03691141a4000501e58230259c58f54d89a66 GIT binary patch literal 606566 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%0A*PcktR#!m#B+ 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\&Q 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 QCQ=*z;)_?We)#GA-vy#ePXGV_ literal 0 HcmV?d00001 diff --git a/packages/preview/fletcher/0.5.6/docs/manual.typ b/packages/preview/fletcher/0.5.6/docs/manual.typ new file mode 100644 index 0000000000..7d9db047bb --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/manual.typ @@ -0,0 +1,1334 @@ +#import "/src/exports.typ" as fletcher: diagram, node, edge +#import "/docs/style.typ" +#let tidy = style.tidy + +#set page(numbering: "1") +#set par(justify: true) +#show link: underline.with(stroke: 1pt + blue.lighten(70%)) + +// show references to headings as the heading title with a link +// not as "Section 1.2.3" +#show ref: it => { + if it.element.func() == heading { + link(it.target, it.element.body) + } else { it } +} + +#show heading.where(level: 1): set text(18pt) + +#let VERSION = toml("/typst.toml").package.version + +// link to a specific parameter of a function +#let param(func, arg, full: false) = { + let func = func.text + let arg = arg.text + let l1 = style.fn-param-label(func, arg) + let l2 = style.fn-label(func) + if full { + [the #link(l1, raw(arg)) option of #link(l2, raw(func + "()"))] + } else { + link(l1, raw(arg)) + } +} +#let the-param = param.with(full: true) + +#let scope = ( + fletcher: fletcher, + diagram: fletcher.diagram, + node: node, + edge: edge, + cetz: fletcher.cetz, + param: param, + the-param: the-param, + +) + +#let show-fns(file, only: none, exclude: (), level: 1, outline: false) = { + let module-doc = tidy.parse-module(read(file), scope: scope, old-syntax: true) + + if only != none { + let ordered-fns = only.map(fn-name => { + module-doc.functions.find(fn => fn.name == fn-name) + }) + module-doc.functions = ordered-fns + } + + module-doc.functions = module-doc.functions.filter(fn => fn.name not in exclude) + + tidy.show-module( + module-doc, + show-outline: outline, + sort-functions: none, + first-heading-level: level, + style: style, + ) +} + +#show heading.where(level: 1): it => it + v(0.5em) + +#v(.2fr) + +#align(center)[ + #stack( + spacing: 14pt, + { + set text(1.3em) + fletcher.diagram( + edge-stroke: 1pt, + spacing: 27mm, + label-sep: 6pt, + node((0,1), $A$), + node((1,1), $B$), + edge((0,1), (1,1), $f$, ">>->"), + ) + }, + text(2.7em, `fletcher`), + [_(noun) a maker of arrows_], + ) + + #v(30pt) + + A #link("https://typst.app/")[Typst] package for diagrams with lots of arrows, + built on top of #link("https://cetz-package.github.io")[CeTZ]. + + #emph[ + Commutative diagrams, + flow charts, + state machines, + block diagrams... + ] + + #link("https://github.com/Jollywatt/typst-fletcher")[`github.com/Jollywatt/typst-fletcher`] + + *Version #VERSION* +] + +#set raw(lang: "typc") +#show raw.where(block: false): it => { + // if raw block is a function call, like `foo()`, make it a link + if it.text.match(regex("^[a-z-]+\(\)$")) == none { it } + else { + let l = label(it.text) + context { + if query(l).len() > 0 { + link(l, it) + } else { + it + } + } + } +} + +#show raw.where(block: true): set text(7pt) + +#v(1fr) + + +#columns(2)[ + #outline( + title: align(center, box(width: 100%)[Guide]), + indent: 1em, + target: selector(heading).before(, inclusive: false), + ) + #colbreak() + #outline( + title: align(center, box(width: 100%)[Reference]), + indent: 1em, + target: selector(heading.where(level: 1)).or(heading.where(level: 2)).after(, inclusive: true), + ) + +] + +#v(1fr) + + + + +// friends :) +#show "CeTZ": it => link("https://github.com/johannes-wolf/cetz", it) +#show "Touying": it => link("https://github.com/touying-typ/touying", it) + + + + + + +#let gallery-page = true + +#if gallery-page [ +#pagebreak() + +#align(center)[ + + #diagram( + node-defocus: 0, + spacing: (1cm, 2cm), + edge-stroke: 1pt, + crossing-thickness: 5, + node-fill: luma(97%), + node-outset: 3pt, + node((0,0), "magma"), + + node((-1,1), "semigroup"), + node(( 0,1), "unital magma"), + node((+1,1), "quasigroup"), + + node((-1,2), "monoid"), + node(( 0,2), "inverse semigroup"), + node((+1,2), "loop"), + + node(( 0,3), "group"), + + { + let quad(a, b, label, paint, ..args) = { + paint = paint.darken(25%) + edge(a, b, text(paint, label), "-latex", stroke: paint, label-side: center, ..args) + } + + quad((0,0), (-1,1), "Assoc", blue) + quad((0,1), (-1,2), "Assoc", blue, label-pos: 0.3) + quad((1,2), (0,3), "Assoc", blue) + + quad((0,0), (0,1), "Id", red) + quad((-1,1), (-1,2), "Id", red, label-pos: 0.3) + quad((+1,1), (+1,2), "Id", red, label-pos: 0.3) + quad((0,2), (0,3), "Id", red) + + quad((0,0), (1,1), "Div", yellow) + quad((-1,1), (0,2), "Div", yellow, label-pos: 0.3, "crossing") + + quad((-1,2), (0,3), "Inv", green) + quad((0,1), (+1,2), "Inv", green, label-pos: 0.3) + + quad((1,1), (0,2), "Assoc", blue, label-pos: 0.3, "crossing") + }, + ) + + #v(1fr) + + #diagram( + spacing: (40mm, 35mm), + node-defocus: 0, + axes: (ltr, btt), + { + let c(x, y, z) = (x + 0.5*z, y + 0.4*z) + + let v000 = c(0, 0, 0) + + node(v000, $P$) + node(c(1,0,0), $P$) + node(c(2,0,0), $X$) + node(c(0,1,0), $J P$) + node(c(1,1,0), $J P$) + node(c(2,1,0), $J X$) + + node(c(0,0,1), $pi^*(T X times.circle T^* X)$) + node(c(1,0,1), $pi^*(T X times.circle T^* X)$) + node(c(2,0,1), $T X times.circle T^* X$) + node(c(0,1,1), $T P times.circle pi^* T^* X$) + node(c(1,1,1), $T P times.circle pi^* T^* X$) + node(c(2,1,1), $T_G P times.circle T^* X$) + + + // away + edge(v000, c(0,0,1), $"Id"$, "->", bend: 0deg) + edge(c(1,0,0), c(1,0,1), $"Id"$, "->") + edge(c(2,0,0), c(2,0,1), $"Id"$, "->") + + edge(c(0,1,0), c(0,1,1), $i_J$, "hook->") + edge(c(1,1,0), c(1,1,1), $i_J$, "hook->") + edge(c(2,1,0), c(2,1,1), $i_C$, "hook->") + + // down + edge(c(0,1,0), v000, $pi_J$, "=>", label-pos: 0.2) + edge(c(1,1,0), c(1,0,0), $pi_J$, "->", label-pos: 0.2) + edge(c(2,1,0), c(2,0,0), $pi_"CP"$, "->", label-pos: 0.2) + + edge(c(0,1,1), c(0,0,1), $c_pi$, "..>", label-pos: 0.2) + edge(c(1,1,1), c(1,0,1), $c_pi$, "->", label-pos: 0.2) + edge(c(2,1,1), c(2,0,1), $overline(c)_pi$, "-||->", label-pos: 0.2) + + // across + edge(v000, c(1,0,0), $lambda_g$, "->") + edge(c(1,0,0), c(2,0,0), $pi^G=pi$, "->") + + edge(c(0,0,1), c(1,0,1), $lambda_g times 1$, "..>", label-pos: 0.2) + edge(c(1,0,1), c(2,0,1), $pi^G$, "..>", label-pos: 0.2) + + edge(c(0,1,0), c(1,1,0), $j lambda_g$, "->", label-pos: 0.7) + + edge(c(0,1,1), c(1,1,1), $dif lambda_g times.circle (lambda_g times 1)$, "->") + edge(c(1,1,1), c(2,1,1), $pi^G$, "->") + + edge(c(1,1,1), c(2,1,1), $Ω$, "<..>", bend: 40deg) + }) + #v(1cm) + + #v(1fr) + + #{ + set text(white, font: "Fira Sans") + let colors = (maroon, olive, eastern) + fletcher.diagram( + edge-stroke: 1pt, + node-corner-radius: 5pt, + edge-corner-radius: 8pt, + mark-scale: 80%, + node((0,0), [input], fill: colors.at(0)), + node((2,+1), [memory unit (MU)], fill: colors.at(1)), + node((2, 0), align(center)[arithmetic & logic \ unit (ALU)], fill: colors.at(1)), + node((2,-1), [control unit (CU)], fill: colors.at(1)), + node((4,0), [output], fill: colors.at(2), shape: fletcher.shapes.hexagon), + + edge((0,0), "r,u,r", "-}>"), + edge((2,-1), "r,d,r", "-}>"), + edge((2,-1), "r,dd,l", "--}>"), + edge((2,1), "l", (1,-.5), marks: ((inherit: "}>", pos: 0.65, rev: false),)), + + for i in range(-1, 2) { + edge((2,0), (2,1), "<{-}>", shift: i*5mm, bend: i*20deg) + }, + + edge((2,-1), (2,0), "<{-}>"), + ) + } +] + +] + + + +#pagebreak() + + += Usage examples + +Avoid importing everything with `*` as many internal functions are also exported. + +#raw(lang: "typ", "#import \"@preview/fletcher:" + VERSION + "\" as fletcher: diagram, node, edge") + + +#let code-example(src) = ( + { + set text(.85em) + let code = src.text.replace(regex("(^|\n).*// hide\n|^[\s|\S]*// setup\n"), "") + box(raw(block: true, lang: src.lang, code)) // box to prevent pagebreaks + }, + eval( + src.text, + mode: "markup", + scope: scope + ), +) + +#let code-example-row(src) = stack( + dir: ltr, + spacing: 1fr, + ..code-example(src) +) + +#table( + columns: (2fr, 1fr), + align: (top, center), + stroke: none, + inset: (x: 0pt, y: 7pt), + + ..code-example(```typ + // You can specify nodes in math-mode, separated by `&`: + #diagram($ + G edge(f, ->) edge("d", pi, ->>) & im(f) \ + G slash ker(f) edge("ur", tilde(f), "hook-->") + $) + ```), + + ..code-example(```typ + // Or you can use code-mode, with variables, loops, etc: + #diagram(spacing: 2cm, { + let (A, B) = ((0,0), (1,0)) + node(A, $cal(A)$) + node(B, $cal(B)$) + edge(A, B, $F$, "->", bend: +35deg) + edge(A, B, $G$, "->", bend: -35deg) + let h = 0.2 + edge((.5,-h), (.5,+h), $alpha$, "=>") + }) + ```), + + ..code-example(```typ + #diagram( + spacing: (10mm, 5mm), // wide columns, narrow rows + node-stroke: 1pt, // outline node shapes + edge-stroke: 1pt, // make lines thicker + mark-scale: 60%, // make arrowheads smaller + edge((-2,0), "r,u,r", "-|>", $f$, label-side: left), + edge((-2,0), "r,d,r", "..|>", $g$), + node((0,-1), $F(s)$), + node((0,+1), $G(s)$), + node(enclose: ((0,-1), (0,+1)), stroke: teal, inset: 10pt, + snap: false), // prevent edges snapping to this node + edge((0,+1), (1,0), "..|>", corner: left), + edge((0,-1), (1,0), "-|>", corner: right), + node((1,0), text(white, $ plus.circle $), inset: 2pt, fill: black), + edge("-|>"), + ) + ```), + + ..code-example(```typ + An equation $f: A -> B$ and \ + an inline diagram #diagram($A edge(->, text(#0.8em, f)) & B$). + ```), + + + ..code-example(```typ + #import fletcher.shapes: diamond + #diagram( + node-stroke: black + 0.5pt, + node-fill: gradient.radial(white, blue, center: (40%, 20%), + radius: 150%), + spacing: (10mm, 5mm), + node((0,0), [1], name: <1>, extrude: (0, -4)), // double stroke + node((1,0), [2], name: <2>, shape: diamond), + node((2,-1), [3a], name: <3a>), + node((2,+1), [3b], name: <3b>), + edge(<1>, "->", <2>)[go], + edge(<2.east>, "->", <3a>, bend: -15deg), + edge(<2.east>, "->", <3b>, bend: +15deg), + edge(<3b>, "~>", <3b>, bend: -130deg, loop-angle: 120deg)[loop!], + ) + ```) +) + + +#pagebreak() + += Diagrams + +Diagrams are collections of _nodes_ and _edges_ rendered on a CeTZ canvas with `diagram()`. + +== Elastic coordinates + +Diagrams are laid out on a _flexible coordinate grid_, visible when #the-param[diagram][debug] is on. +When a node is placed, the rows and columns grow to accommodate the node's size, like a table. + +By default, coordinates $(u, v)$ have $u$ going $arrow.r$ and $v$ going $arrow.b$. +This can be changed with #the-param[diagram][axes]. +The #param[diagram][cell-size] option is the minimum row and column width, and #param[diagram][spacing] is the gutter between rows and columns. + +#code-example-row(```typ +#let c = (orange, red, green, blue).map(x => x.lighten(50%)) +#diagram( + debug: 1, + spacing: 10pt, + node-corner-radius: 3pt, + node((0,0), [a], fill: c.at(0), width: 10mm, height: 10mm), + node((1,0), [b], fill: c.at(1), width: 5mm, height: 5mm), + node((1,1), [c], fill: c.at(2), width: 20mm, height: 5mm), + node((0,2), [d], fill: c.at(3), width: 5mm, height: 10mm), +) +```) + + +So far, this is just like a table --- however, elastic coordinates can be _fractional_. +Notice how the column sizes change as the green node is gradually moved between columns: + +#stack( + dir: ltr, + spacing: 1fr, + ..(0, .25, .5, .75, 1).map(t => { + let c = (orange, red, green, blue).map(x => x.lighten(50%)) + fletcher.diagram( + debug: 1, + spacing: 0mm, + node-corner-radius: 3pt, + node((0,0), [a], fill: c.at(0), width: 10mm, height: 10mm), + node((1,0), [b], fill: c.at(1), width: 5mm, height: 5mm), + node((t,1), $(#t, 1)$, fill: c.at(2), width: 20mm, height: 5mm), + node((0,2), [d], fill: c.at(3), width: 5mm, height: 10mm), + ) + }), +) + +== Absolute coordinates + +As well as _elastic_ or $u v$ coordinates, which are row/column numbers, you can also use _absolute_ or $x y$ coordinates, which are physical lengths. + +#table( + columns: (1fr, 1fr), + stroke: none, + align: center, + ..([Elastic coordinates, e.g., `(2, 1)`], [Physical coordinates, e.g., `(10mm, 5mm)`]).map(strong), + [Dimensionless, dependent on row/column sizes.], + [Lengths, independent of row/column sizes.], + [Node positions and sizes affect diagram layout.], + [Nodes are _floating_ and never affect layout.], +) + +Absolute coordinates let you position nodes _exactly_, whereas elastic coordinates are useful for table-like layouts. +Absolutely positioned nodes never affect the positions of other nodes --- the row and column sizes of a diagram depend only on the positions and sizes of nodes at elastic coordinates. + +== Coordinate expressions + +You can use CeTZ-style coordinate expressions such as _relative_ `(rel: (1, 2))`, _polar_ `(45deg, 1cm)`, _interpolating_ `(

, 80%, )`, _perpendicular_ `(, "|-", )`, and so on. +// Elastic and absolute coordinates can be mixed, for example: + +#code-example-row(```typ +#diagram( + node((1, 0), name: ), // elastic coordinate + for θ in range(16).map(i => i/16*360deg) { + node((rel: (θ, 10mm), to: ), $ * $, inset: 1pt) // absolute offset + edge() + } +) +```) + + + += Nodes + +#link(label("node()"))[`node(coord, label, ..options)`] + +Nodes are content centered at a particular coordinate. +Nodes automatically fit to the size of their label (with an #param[node][inset]), but can also be given an exact `width`, `height`, or `radius`, as well as a #param[node][stroke] and #param[node][fill]. For example: + +#code-example-row(```typ +#diagram( + debug: true, // show a coordinate grid + spacing: (5pt, 4em), // small column gaps, large row spacing + node((0,0), $f$), + node((1,0), $f$, stroke: 1pt), + node((2,0), $f$, stroke: blue, shape: rect), + node((3,0), $f$, stroke: 1pt, radius: 6mm, extrude: (0, 3)), + { + let b = blue.lighten(70%) + node((0,1), `xyz`, fill: b, ) + let dash = (paint: blue, dash: "dashed") + node((1,1), `xyz`, stroke: dash, inset: 1em) + node((2,1), `xyz`, fill: b, stroke: blue, extrude: (0, -2)) + node((3,1), `xyz`, fill: b, height: 5em, corner-radius: 5pt) + } +) +```) + + + +== Node shapes + +By default, nodes are circular or rectangular depending on the aspect ratio of their label. +The #param[node][shape] option accepts `rect`, `circle`, various shapes provided in the #link(, `fletcher.shapes`) submodule, or a function. + +#code-example-row(```typ +#import fletcher.shapes: pill, parallelogram, diamond, hexagon +#diagram( + node-fill: gradient.radial(white, blue, radius: 200%), + node-stroke: blue, + ( + node((0,0), [Blue Pill], shape: pill), + node((1,0), [_Slant_], shape: parallelogram.with(angle: 20deg)), + node((0,1), [Choice], shape: diamond), + node((1,1), [Stop], shape: hexagon, extrude: (-3, 0), inset: 10pt), + ).intersperse(edge("o--|>")).join() +) +```) + +Custom node shapes may be implemented with CeTZ via #the-param[node][shape], but it is up to the user to support outline extrusion for custom shapes. +The predefined shapes are: + +#table( + columns: (1fr,)*4, + stroke: none, + align: center + horizon, + ..{ + let colors = ( + blue, + red, + orange, + teal, + olive, + green, + purple, + fuchsia, + eastern, + yellow, + aqua, + maroon, + ) + dictionary(fletcher.shapes).pairs() + .filter(((key, value)) => type(value) != module) + .zip(colors) + .map((((name, shape), color)) => { + diagram(node((0,0), box(inset: 1pt, link(label(name + "()"), raw(name))), shape: shape, + fill: color.lighten(90%), stroke: color)) + }) + } +) + +Shapes respect the #param[node][stroke], #param[node][fill], #param[node][width], #param[node][height], and #param[node][extrude] options of `edge()`. + + +== Node groups + +Nodes are usually centered at a particular coordinate, but they can also #param[node][enclose] multiple centers. +When #the-param[node][enclose] is given, the node automatically resizes. + +#code-example-row(```typ +#diagram( + node-stroke: 0.6pt, + node($Sigma$, enclose: ((1,1), (1,2)), // a node spanning multiple centers + inset: 10pt, stroke: teal, fill: teal.lighten(90%), name: ), + node((2,1), [X]), + node((2,2), [Y]), + edge((1,1), "r", "->", snap-to: (, auto)), + edge((1,2), "r", "->", snap-to: (, auto)), +) +```) + +You can also #param[node][enclose] other nodes by coordinate or #param[node][name] to create node groups: + +#code-example-row(```typ +#diagram( + node-stroke: 0.6pt, + node-fill: white, + node((0,1), [X]), + edge("->-", bend: 40deg), + node((1,0), [Y], name: ), + node($Sigma$, enclose: ((0,1), ), + stroke: teal, fill: teal.lighten(90%), + snap: -1, // prioritise other nodes when auto-snapping + name: ), + edge(, , "->"), + node((2.5,0.5), [Z], name: ), +) +```) + + +== Node anchors + +You can reference anchor points on node shapes like in CeTZ, provided the node has a #param[node][name]. +For example, `` and `(name: "A", anchor: "north")` are equivalent coordinate expressions that can be referenced in other nodes or edges. + +#code-example-row(````typ +#diagram( + node-shape: rect, + node(circle(stroke: white, text(white, $Delta$)), name: , fill: navy), + node(, circle(fill: white, radius: 6pt, $ plus.circle $)), + edge((, 25%, ), "l,u", "-O"), + edge((, 50%, ), "l,l", "-@"), + edge((, 75%, ), "l,d", "-O"), +) +````) + +Node anchors count as _absolute_ coordinates, meaning that nodes positioned with anchors are _floating_ and never affect the diagram's grid (the sizes of the rows and columns used for elastic coordinates). + += Edges + +#link(label("edge()"))[`edge(..vertices, marks, label, ..options)`] + +An edge connects two coordinates. +By default, edges _snap_ to nodes' bounding shapes (after applying the node's #param[node][outset]). +This can be adjusted with #the-param[edge][snap-to]. + +An edge can have a #param[edge][label], can #param[edge][bend] into an arc, and can have various arrow #param[edge][marks]. + +#code-example-row(```typ +#diagram(spacing: (12mm, 6mm), { + let (a, b, c, abc) = ((-1,0), (0,1), (1,0), (0,-1)) + node(abc, $A times B times C$) + node(a, $A$) + node(b, $B$) + node(c, $C$) + + edge(a, b, bend: -18deg, "dashed") + edge(c, b, bend: +18deg, "<-<<") + edge(a, abc, $a$) + edge(b, abc, "<=>") + edge(c, abc, $c$) + + node((.6,3), [_just a thought..._]) + edge(b, "..|>", corner: right) +}) +```) + +== Specifying edge vertices + +The first few arguments given to `edge()` specify its #param[edge][vertices], of which there can be two or more. +Like node positions, vertices may be CeTZ-style coordinate expressions, combining elastic and physical coordinates, and node anchors. + +Here is a more advanced example using coordinate expressions and `()`, the edge's previous vertex. + +#code-example-row(```typ +#diagram(edge-stroke: 1pt, node-stroke: 1pt, { + node((0,0), name: )[Input, $arrow(x)$] + node((0,1), name: )[Ground truth, $arrow(y)$] + node((1,0.5), name: )[MSE] + let verts = ( // () means the previous vertex + ((), "-|", (, 50%, )), + ((), "|-", ), ) + edge(, ..verts, "->") // () == + edge(, ..verts) // () == +}) +```) + +=== Use `auto` for the previous or next node + +If an edge's first or last vertex is `auto`, the previous or next node is used, according to the order that nodes and edges are passed to `diagram()`. +A single vertex, such as `edge(to)`, is interpreted as `edge(auto, to)`. +Given no vertices, an edge connects the nearest nodes on either side. + + +#code-example-row(```typ +#diagram( + node((0,0), [London]), + edge("..|>", bend: 20deg), + edge("<|--", bend: -20deg), + node((1,1), [Paris]), +) +```) + +Implicit coordinates can be handy for diagrams in math-mode: + + +#code-example-row(```typ +#diagram($ L edge("->", bend: #30deg) & P $) +```) + +// However, don't forget you can also use variables in code-mode, which is a more explicit and flexible way to reduce repetition of coordinates. + +// #code-example-row(```typ +// #diagram(node-fill: blue, { +// let (dep, arv) = ((0,0), (1,1)) +// node(dep, text(white)[London]) +// node(arv, text(white)[Paris]) +// edge(dep, arv, "==>", bend: 40deg) +// }) +// ```) + +=== Relative coordinate shorthands + +You may use strings such as `"u"` for up or `"sw"` for south west as shorthands for relative vertex coordinates of the form `(rel: (du, dv))`. Any combination of +#strong[t]op/#strong[u]p/#strong[n]orth, +#strong[b]ottom/#strong[d]own/#strong[s]outh, +#strong[l]eft/#strong[w]est, and +#strong[r]ight/#strong[e]ast +are allowed. Together with implicit coordinates, this allows you to do things like: + +#code-example-row(```typ +#diagram($ A edge("rr", ->, #[jump!], bend: #30deg) & B & C $) +```) + +=== Node anchors + +Nodes can be given a #param[node][name], which is a label (not a string) identifying that node. +A label as an edge vertex is interpreted as the position of the node with that label. + +#code-example-row(```typ +#diagram( + node((0,0), $frak(A)$, name: ), + node((1,0.5), $frak(B)$, name: ), + edge(, , "-->") +) +```) + + + +== Edge types + +There are three types of edges: `"line"`, `"arc"`, and `"poly"`. +All edges have at least two `vertices`, but `"poly"` edges can have more. +If unspecified, #param[edge][kind] is chosen based on #param[edge][bend] and the number of #param[edge][vertices]. + + +#code-example-row(```typ +#diagram( + edge((0,0), (1,1), "->", `line`), + edge((2,0), (3,1), "->", bend: -30deg, `arc`), + edge((4,0), (4,1), (5,1), (6,0), "->", `poly`), +) +```) + +All vertices except the first can be relative coordinate shorthands (see above), so that in the example above, the `"poly"` edge could also be written in these equivalent ways: + +```typc +edge((4,0), (rel: (0,1)), (rel: (1,0)), (rel: (1,-1)), "->", `poly`) +edge((4,0), "d", "r", "ur", "->", `poly`) // using relative coordinate names +edge((4,0), "d,r,ur", "->", `poly`) // shorthand +``` + +Only the first and last #param[edge][vertices] of an edge automatically snap to nodes. + +== Ways to adjust edge connection points + +A node's #param[node][outset] controls how _close_ edges connect to the node's boundary. +To adjust _where_ along the boundary the edge connects, you can adjust the edge's end coordinates by a fractional amount. + +#code-example-row(```typ +#diagram( + node-stroke: (thickness: .5pt, dash: "dashed"), + node((0,0), [no outset], outset: 0pt), + node((0,1), [big outset], outset: 10pt), + edge((0,0), (0,1)), + edge((-0.1,0), (-0.4,1), "-o", "wave"), // shifted with fractional coordinates + edge((0,0), (0,1), "=>", shift: 15pt), // shifted by a length +) +```) + +Alternatively, #the-param[edge][shift] lets you shift edges sideways by an absolute length: +#block(breakable: false, code-example-row(```typ +#diagram($A edge(->, shift: #3pt) edge(<-, shift: #(-3pt)) & B$) +```)) + +By default, edges which are incident at an angle are automatically adjusted slightly, especially if the node is wide or tall. +Aesthetically, things can look more comfortable if edges don't all connect to the node's exact center, but instead spread out a bit. +Notice the (subtle) difference the figures below. + +#align(center, stack( + dir: ltr, + spacing: 20%, + ..(([Node with defocus (default)], 0.2), ([No defocus adjustment], 0)).map(((label, d)) => { + figure( + caption: label, + fletcher.diagram( + spacing: 10mm, + node-defocus: d, + node((0,0), $A times B times C$), + edge((-1,1)), + edge(( 0,1.5)), + edge((+1,1)), + ) + ) + }) +)) + +The strength of this adjustment is controlled by #the-param[node][defocus] or #the-param[diagram][node-defocus]. + += Marks and arrows + +// Edges can be arrows. +Arrow marks can be specified like `edge(a, b, "-->")` or with #the-param[edge][marks]. +Some mathematical arrow heads are supported, which match $arrow$, $arrow.double$, $arrow.triple$, $arrow.bar$, $arrow.twohead$, and $arrow.hook$ in the default font. + +#align(center, fletcher.diagram( + debug: 0, + spacing: (14mm, 12mm), +{ + for (i, str) in ( + "->", + "=>", + "==>", + "|->", + "->>", + "hook->", + ).enumerate() { + for j in range(2) { + let label = if j == 0 { raw("\""+str+"\"") } + edge((2*i, j), (2*i + 1, j), str, bend: 50deg*j, stroke: 0.9pt, + label: label, label-sep: 1em) + } + } +})) + +A few other marks are provided, and all marks can be placed anywhere along the edge. + +#align(center, fletcher.diagram( + debug: 0, + spacing: (14mm, 12mm), +{ + for (i, str) in ( + ">>-->", + "||-/-|>", + "o..O", + "hook'-x-}>", + "-*-harpoon" + ).enumerate() { + let label = raw("\""+str+"\"") + edge((2*i, 0), (2*i + 1, 0), str, stroke: 0.9pt, + label: label, label-sep: 1em) + } +})) + +All the built-in marks (see @all-marks) are defined in the state variable `fletcher.MARKS`, which you may access with `context fletcher.MARKS.get()`. +You add or tweak mark styles by modifying `fletcher.MARKS`, as described in @mark-objects. + +#context [#figure( + caption: [Default marks by name. Properties such to size, angle, spacing, or fill can be adjusted.], + gap: 1em, + table( + columns: (1fr,)*6, + stroke: none, + ..fletcher.MARKS.get().pairs().map(((k, v)) => [ + #set align(center) + #raw(lang: none, k) \ + #diagram(spacing: 18mm, edge(stroke: 1pt, marks: (v, v))) + ]), + ) +) ] + +Marks can be flipped by appending `'` to the name. + +#code-example-row(```typ +#diagram(edge("harpoon'-hook", stroke: 1pt)) +#diagram(edge("hook'-harpoon", stroke: 1pt)) +```) + +If there is a common mark style that you believe should be included with `fletcher` by default, please #link("https://github.com/Jollywatt/typst-fletcher")[open an issue]! + +#pagebreak() + +== Custom marks + +While shorthands like `"|=>"` exist for specifying marks and stroke styles, finer control is possible. +Marks can be specified by passing an array of _mark objects_ to #the-param[edge][marks]. +For example: + + +#code-example-row(```typ +#diagram( + edge-stroke: 1.5pt, + spacing: 28mm, + edge((0,1), (-0.1,0), bend: -8deg, marks: ( + (inherit: ">>", size: 6, delta: 70deg, sharpness: 65deg), + (inherit: "head", rev: true, pos: 0.8, sharpness: 0deg, size: 17), + (inherit: "bar", size: 1, pos: 0.3), + (inherit: "solid", size: 12, rev: true, stealth: 0.1, fill: red.mix(purple)), + ), stroke: green.darken(50%)), +) +```) + + +In fact, shorthands like `"|=>"` are expanded with `interpret-marks-arg()` into a form more like the example above. +More precisely, `edge(from, to, "|=>")` is equivalent to: + +```typc +context edge(from, to, ..fletcher.interpret-marks-arg("|=>")) +``` + +If you want to explore the internals of mark objects, you might find it handy to inspect the output of `context fletcher.interpret-marks-arg(..)` with various mark shorthands as input. + +=== Mark objects + +A _mark object_ is a dictionary with, at the very least, a `draw` entry containing the CeTZ objects to be drawn. +These CeTZ objects are translated and scaled to fit the edge; the mark should be centered at `(0, 0)`, and the stroke's thickness is defined as the unit length. +For example, here is a basic circle mark: + +#code-example-row(```typ +#import cetz.draw +#let my-mark = ( + draw: draw.circle((0,0), radius: 2, fill: none) +) +#diagram( + edge((0,0), (1,0), stroke: 1pt, marks: (my-mark, my-mark), bend: 30deg), + edge((0,1), (1,1), stroke: 3pt + orange, marks: (none, my-mark)), +) +```) + +A mark object can contain arbitrary parameters. +Parameters can be functions `mark => (..)` referencing other `mark` parameters defined earlier. +For example, the mark above could also be written as: + +```typ +#let my-mark = ( + size: 2, + draw: mark => draw.circle((0,0), radius: mark.size, fill: none) +) +``` + +This form makes it easier to change the size without modifying the `draw` function, for example: + +#code-example-row(```typ +#import cetz.draw +#let my-mark = ( + size: 2, + draw: mark => draw.circle((0,0), radius: mark.size, fill: none) +) // setup +#diagram(edge(stroke: 3pt, marks: (my-mark + (size: 4), my-mark))) +```) + +Lastly, mark objects may _inherit_ properties from other marks in `fletcher.MARKS` by containing an `inherit` entry, for example: + +#code-example-row(```typ +#let my-mark = ( + inherit: "stealth", // base mark on `fletcher.MARKS.stealth` + fill: red, + stroke: none, + extrude: (0, -3), +) +#diagram(edge("rr", stroke: 2pt, marks: (my-mark, my-mark + (fill: blue)))) +```) + +Internally, marks are passed to `resolve-mark()`, which resolves all entries to their final values. + +=== Special mark properties + +A mark object may contain any properties, but some have special functions. + +#{ + show table.cell.where(y: 0): emph + set par(justify: false) + let little-mark(..args) = diagram(spacing: 5mm, edge(..args, stroke: 0.5pt)) + + table( + columns: 3, + stroke: (x: none), + + table.header([Name], [Description], [Default]), + + `inherit`, + [ + The name of a mark in `fletcher.MARKS` to inherit properties from. + This can be used to make mark aliases, for instance, `"<"` is defined as `(inherit: "head", rev: true)`. + ], + none, + + `draw`, + [ + As described above, this contains the final CeTZ objects to be drawn. Objects should be centered at $(0,0)$ and be scaled so that one unit is the stroke thickness. + The default `stroke` and `fill` is inherited from the edge's style. + ], + none, + + `pos`, + [ + Location of the mark along the edge, from `0` (start) to `1` (end). + ], + `auto`, + + [`fill`\ `stroke`], + [ + The default fill and stroke styles for CeTZ objects returned by `draw`. + If `none`, polygons will not be filled/stroked by default, and if `auto`, the style is inherited from the edge's stroke style. + ], + `auto`, + + `rev`, + [ + Whether to reverse the mark so it points backwards. + + ], + `false`, + + `flip`, + [ + Whether to reflect the mark across the edge; the difference between + #diagram(spacing: 8mm, edge("hook-", stroke: 1pt)) + and + #diagram(spacing: 8mm, edge("hook'-", stroke: 1pt)), for example. + A suffix `'` in the name, such as `"hook'"`, results in a flip. + ], + `false`, + + `scale`, + [ + Overall scaling factor. See also #the-param[edge][mark-scale]. + ], + `100%`, + + `extrude`, + [ + Whether to duplicate the mark and draw it offset at each extrude position. + For example, `(inherit: "head", extrude: (-5, 0, 5))` looks like + #diagram(spacing: 8mm, edge(marks: (none, (inherit: "head", extrude: (-5, 0, 5))), stroke: .7pt)). + + ], + `(0,)`, + + [`tip-origin`\ `tail-origin`], + [ + These two properties control the $x$ coordinate of the point of the mark, relative to $(0, 0)$. If the mark is acting as a tip (#little-mark("->") or #little-mark("<-")) then `tip-origin` applies, and `tail-origin` applies when the mark is a tail (#little-mark("-<") or #little-mark(">-")). + See `mark-debug()`. + ], + `0`, + + [`tip-end`\ `tail-end`], + [ + These control the $x$ coordinate at which the edge's stroke terminates, relative to $(0, 0)$. + See `mark-debug()`. + ], + `0`, + + `cap-offset`, + [ + A function `(mark, y) => x` returning the $x$ coordinate at which the edge's stroke terminates relative to `tip-end` or `tail-end`, as a function of the $y$ coordinate. + This is relevant for #param[edge][extrude]d edges. + See `cap-offset()`. + ], + none, + + ) +} + +The last few properties control the fine behaviours of how marks connect to the target point and to the edge's stroke. +Briefly, a mark has four possibly-distinct center points. +It is easier to show than to tell: + +#context grid( + columns: (1fr, 1fr), + align: center + horizon, + fletcher.mark-debug((inherit: "}>", fill: none), show-offsets: false), + fletcher.mark-demo((inherit: "}>", fill: none)), +) + +See `mark-debug()` and `cap-offset()` for details. + + +=== Detailed example + +As a complete example, here is the implementation of a straight arrowhead in ```plain src/default-marks.typ```: + +#code-example-row(```typ +#import cetz.draw +#let straight = ( + size: 8, + sharpness: 20deg, + tip-origin: mark => 0.5/calc.sin(mark.sharpness), + tail-origin: mark => -mark.size*calc.cos(mark.sharpness), + fill: none, + draw: mark => { + draw.line( + (180deg + mark.sharpness, mark.size), // polar cetz coordinate + (0, 0), + (180deg - mark.sharpness, mark.size), + ) + }, + cap-offset: (mark, y) => calc.tan(mark.sharpness + 90deg)*calc.abs(y), +) + +#set align(center) +#fletcher.mark-debug(straight) +#fletcher.mark-demo(straight) +```) + + + + +== Defining mark shorthands + +While you can pass custom mark objects directly to #the-param[edge][marks], this can get annoying if you use the same mark often. +In these cases, you can define your own mark shorthands. + +Mark shorthands such as `"hook->"` search the state variable `fletcher.MARKS` for defined mark names. +#code-example-row(```typ +#context fletcher.MARKS.get().at(">") +```) +With a bit of care, you can modify the `MARKS` state like so: +#code-example-row(```typ +Original marks: +#diagram(spacing: 2cm, edge("<->", stroke: 1pt)) + +#fletcher.MARKS.update(m => m + ( + "<": (inherit: "stealth", rev: true), + ">": (inherit: "stealth", rev: false), + "multi": ( + inherit: "straight", + draw: mark => fletcher.cetz.draw.line( + (0, +mark.size*calc.sin(mark.sharpness)), + (-mark.size*calc.cos(mark.sharpness), 0), + (0, -mark.size*calc.sin(mark.sharpness)), + ), + ), +)) + +Updated marks: +#diagram(spacing: 2cm, edge("multi->-multi", stroke: 1pt + eastern)) +```) + +Here, we redefined which mark style the `"<"` and `">"` shorthands refer to, and added an entirely new mark style with the shorthand `"multi"`. + +Finally, I will restore the default state so as not to affect the rest of this manual: +#code-example-row(```typ +#fletcher.MARKS.update(fletcher.DEFAULT_MARKS) // restore to built-in mark styles +```) + + + += CeTZ integration + + +Fletcher's drawing capabilities are deliberately restricted to a few simple building blocks. +However, an escape hatch is provided with #the-param[diagram][render] so you can intercept diagram data and draw things using CeTZ directly. + +== Bézier edges + +Here is an example of how you might hack together a Bézier edge using the same functions that `fletcher` uses internally to anchor edges to nodes: + +#code-example-row(```typ +#diagram( + node((0,1), $A$, stroke: 1pt, shape: fletcher.shapes.diamond), + node((2,0), [Bézier], fill: purple.lighten(80%)), + + render: (grid, nodes, edges, options) => { + // cetz is also exported as fletcher.cetz + cetz.canvas({ + // this is the default code to render the diagram + fletcher.draw-diagram(grid, nodes, edges, debug: options.debug) + + // retrieve node data by coordinates + let n1 = fletcher.find-node-at(nodes, (0,1)) + let n2 = fletcher.find-node-at(nodes, (2,0)) + + let out-angle = 45deg + let in-angle = -110deg + + fletcher.get-node-anchor(n1, out-angle, p1 => { + fletcher.get-node-anchor(n2, in-angle, p2 => { + // make some control points + let c1 = (to: p1, rel: (out-angle, 10mm)) + let c2 = (to: p2, rel: (in-angle, 20mm)) + cetz.draw.bezier( + p1, p2, c1, c2, + mark: (end: ">") // cetz-style mark + ) + }) + }) + }) + } +) +```) + + + += Touying integration + +You can create incrementally-revealed diagrams with Touying presentation slides by defining a `touying-reducer`. +You must redefine `diagram` to use this reducer so that Touying primitives like `pause`, `uncover`, `only`, and so on are understood. +For example, here is a simple animated diagram: + +#let touying-src = text(.85em, ```typ +#import "@preview/touying:0.5.5": * +#show: themes.simple.simple-theme.with(aspect-ratio: "16-9") +#let diagram = touying-reducer.with( + reduce: fletcher.diagram, cover: fletcher.hide) + +#slide(repeat: 6, self => { + let (uncover, only, alternatives) = utils.methods(self) + diagram( + node((0, 0), name: )[$A$], + pause, + edge("->"), + node((1, 0), name: )[$B$], + pause, + edge("->"), + node((2, 0), name: )[$C$], + only("4,6", edge(, "~", , bend: 40deg, stroke: red)), + only("5,6", edge(, "~", , bend: 40deg, stroke: green)), + only("6", edge(, "~", , bend: 40deg, stroke: blue)), + ) +}) +```) + +// can't do this automatically with toying :( +#let touying-slides = ( + diagram( + node((0, 0), name: )[$A$], + ), + diagram( + node((0, 0), name: )[$A$], + edge("->"), + node((1, 0), name: )[$B$], + ), + diagram( + node((0, 0), name: )[$A$], + edge("->"), + node((1, 0), name: )[$B$], + edge("->"), + node((2, 0), name: )[$C$], + ), + diagram( + node((0, 0), name: )[$A$], + edge("->"), + node((1, 0), name: )[$B$], + edge("->"), + node((2, 0), name: )[$C$], + edge(, "~", , bend: 40deg, stroke: red), + ), + diagram( + node((0, 0), name: )[$A$], + edge("->"), + node((1, 0), name: )[$B$], + edge("->"), + node((2, 0), name: )[$C$], + edge(, "~", , bend: 40deg, stroke: green), + ), + diagram( + node((0, 0), name: )[$A$], + edge("->"), + node((1, 0), name: )[$B$], + edge("->"), + node((2, 0), name: )[$C$], + edge(, "~", , bend: 40deg, stroke: red), + edge(, "~", , bend: 40deg, stroke: green), + edge(, "~", , bend: 40deg, stroke: blue), + ), +) + +#stack( + dir: rtl, + spacing: 1fr, + table(..touying-slides), + touying-src, +) + +#pagebreak(weak: true) + +#align(center, text(2em)[*Reference*]) +#v(1em) + += Main functions + + +#show-fns("/src/diagram.typ", only: ("diagram",)) +#show-fns("/src/node.typ", only: ("node",)) +#show-fns("/src/edge.typ", only: ("edge",)) + += Behind the scenes + +// == `edge.typ` +// #show-fns("/src/edge.typ", level: 2, outline: true, exclude: "edge") + +== `marks.typ` + +The default marks are defined in the `fletcher.MARKS` dictionary with keys: +#context fletcher.MARKS.get().keys().map(raw).join(last: [, and ])[, ]. + +#show-fns("/src/marks.typ", level: 2, outline: true) + + +== `shapes.typ` + +To use built-in shapes in a diagram, import them with: + +```typ +#import fletcher: shapes +#diagram(node([Hello], stroke: 1pt, shape: shapes.hexagon)) +``` + +or: + +```typ +#import fletcher.shapes: hexagon +#diagram(node([Hello], stroke: 1pt, shape: hexagon)) +``` + +To set a shape parameter, use `shape.with(..)`, for example `hexagon.with(angle: 45deg)`. +Shapes respect the #param[node][stroke], #param[node][fill], #param[node][width], #param[node][height], and #param[node][extrude] options of `edge()`. + + +#show-fns("/src/shapes.typ", level: 2, outline: true) + +== `coords.typ` +#show-fns("/src/coords.typ", level: 2, outline: true) + +== `diagram.typ` +#show-fns("/src/diagram.typ", level: 2, outline: true, exclude: ("diagram",)) + +== `node.typ` + + +#show-fns("/src/node.typ", level: 2, outline: true, exclude: ("node",)) + +== `edge.typ` +#show-fns("/src/edge.typ", level: 2, outline: true, exclude: ("edge",)) + +== `draw.typ` +#show-fns("/src/draw.typ", level: 2, outline: true) + +== `utils.typ` +#show-fns("/src/utils.typ", level: 2, outline: true) diff --git a/packages/preview/fletcher/0.5.6/docs/readme-examples/1-first-isomorphism-theorem-dark.svg b/packages/preview/fletcher/0.5.6/docs/readme-examples/1-first-isomorphism-theorem-dark.svg new file mode 100644 index 0000000000..9a34f14ae3 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/readme-examples/1-first-isomorphism-theorem-dark.svg @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/fletcher/0.5.6/docs/readme-examples/1-first-isomorphism-theorem-light.svg b/packages/preview/fletcher/0.5.6/docs/readme-examples/1-first-isomorphism-theorem-light.svg new file mode 100644 index 0000000000..73abc5e8eb --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/readme-examples/1-first-isomorphism-theorem-light.svg @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/fletcher/0.5.6/docs/readme-examples/1-first-isomorphism-theorem.typ b/packages/preview/fletcher/0.5.6/docs/readme-examples/1-first-isomorphism-theorem.typ new file mode 100644 index 0000000000..7d30fba09b --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/readme-examples/1-first-isomorphism-theorem.typ @@ -0,0 +1,6 @@ +#diagram(cell-size: 15mm,/*darkmode*/ + edge-stroke: white, + crossing-fill: none,/*end*/ $ + G edge(f, ->) edge("d", pi, ->>) & im(f) \ + G slash ker(f) edge("ur", tilde(f), "hook-->") +$) \ No newline at end of file diff --git a/packages/preview/fletcher/0.5.6/docs/readme-examples/2-flowchart-trap-dark.svg b/packages/preview/fletcher/0.5.6/docs/readme-examples/2-flowchart-trap-dark.svg new file mode 100644 index 0000000000..3429fa8c01 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/readme-examples/2-flowchart-trap-dark.svg @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/fletcher/0.5.6/docs/readme-examples/2-flowchart-trap-light.svg b/packages/preview/fletcher/0.5.6/docs/readme-examples/2-flowchart-trap-light.svg new file mode 100644 index 0000000000..ae55272bbc --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/readme-examples/2-flowchart-trap-light.svg @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/fletcher/0.5.6/docs/readme-examples/2-flowchart-trap.typ b/packages/preview/fletcher/0.5.6/docs/readme-examples/2-flowchart-trap.typ new file mode 100644 index 0000000000..05339ab2df --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/readme-examples/2-flowchart-trap.typ @@ -0,0 +1,15 @@ +// https://xkcd.com/1195/ +#import fletcher.shapes: diamond +#set text(font: "Comic Neue", weight: 600) // testing: omit + +#diagram( + node-stroke: 1pt/*darkmode*/ + white/*end*/, + edge-stroke: 1pt/*darkmode*/ + white/*end*/, + crossing-fill: white, // darkmode + node((0,0), [Start], corner-radius: 2pt, extrude: (0, 3)), + edge("-|>"), + node((0,1), align(center)[ + Hey, wait,\ this flowchart\ is a trap! + ], shape: diamond), + edge("d,r,u,l", "-|>", [Yes], label-pos: 0.1) +) \ No newline at end of file diff --git a/packages/preview/fletcher/0.5.6/docs/readme-examples/3-state-machine-dark.svg b/packages/preview/fletcher/0.5.6/docs/readme-examples/3-state-machine-dark.svg new file mode 100644 index 0000000000..3cce356d5a --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/readme-examples/3-state-machine-dark.svg @@ -0,0 +1,650 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/fletcher/0.5.6/docs/readme-examples/3-state-machine-light.svg b/packages/preview/fletcher/0.5.6/docs/readme-examples/3-state-machine-light.svg new file mode 100644 index 0000000000..8dccf3aaa7 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/readme-examples/3-state-machine-light.svg @@ -0,0 +1,650 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/fletcher/0.5.6/docs/readme-examples/3-state-machine.typ b/packages/preview/fletcher/0.5.6/docs/readme-examples/3-state-machine.typ new file mode 100644 index 0000000000..a69e78bf33 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/readme-examples/3-state-machine.typ @@ -0,0 +1,16 @@ +#set text(10pt) +#diagram( + node-stroke: .1em/*darkmode*/ + white/*end*/, + edge-stroke: white, // darkmode + crossing-fill: black , // darkmode + node-fill: gradient.radial(blue.lighten(80%), blue, center: (30%, 20%), radius: 80%), + spacing: 4em, + edge((-1,0), "r", "-|>", `open(path)`, label-pos: 0, label-side: center), + node((0,0), `reading`, radius: 2em), + edge(`read()`, "-|>"), + node((1,0), `eof`, radius: 2em), + edge(`close()`, "-|>"), + node((2,0), `closed`, radius: 2em, extrude: (-2.5, 0)), + edge((0,0), (0,0), `read()`, "--|>", bend: 130deg), + edge((0,0), (2,0), `close()`, "-|>", bend: -40deg), +) \ No newline at end of file diff --git a/packages/preview/fletcher/0.5.6/docs/readme-examples/4-feynman-diagram-dark.svg b/packages/preview/fletcher/0.5.6/docs/readme-examples/4-feynman-diagram-dark.svg new file mode 100644 index 0000000000..147ba16009 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/readme-examples/4-feynman-diagram-dark.svg @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/fletcher/0.5.6/docs/readme-examples/4-feynman-diagram-light.svg b/packages/preview/fletcher/0.5.6/docs/readme-examples/4-feynman-diagram-light.svg new file mode 100644 index 0000000000..75fe490e7b --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/readme-examples/4-feynman-diagram-light.svg @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/fletcher/0.5.6/docs/readme-examples/4-feynman-diagram.typ b/packages/preview/fletcher/0.5.6/docs/readme-examples/4-feynman-diagram.typ new file mode 100644 index 0000000000..4ab6695210 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/readme-examples/4-feynman-diagram.typ @@ -0,0 +1,5 @@ +#diagram(/*darkmode*/edge-stroke: white,/*end*/$ + e^- edge("rd", "-<|-") & & & edge("ld", "-|>-") e^+ \ + & edge(gamma, "wave") \ + e^+ edge("ru", "-|>-") & & & edge("lu", "-<|-") e^- \ +$) \ No newline at end of file diff --git a/packages/preview/fletcher/0.5.6/docs/style.typ b/packages/preview/fletcher/0.5.6/docs/style.typ new file mode 100644 index 0000000000..79e4638dd3 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/docs/style.typ @@ -0,0 +1,169 @@ +#import "@preview/tidy:0.4.1" + +#let function-name-color = tidy.styles.default.function-name-color +#let rainbow-map = tidy.styles.default.rainbow-map +#let gradient-for-color-types = tidy.styles.default.gradient-for-color-types +#let default-type-color = tidy.styles.default.default-type-color +#let colors = tidy.styles.default.colors +#let colors-dark = tidy.styles.default.colors-dark + +#let show-outline(module-doc, style-args: (:)) = box({ + for fn in module-doc.functions [ + - #link(label(fn.name + "()"), raw(fn.name + "()")) + ] + v(2em) +}) + +#let show-type(type, style-args: (:)) = { + let c-type = if type.starts-with("pair of") { + type.slice(8, -1) + } else { type } + let c = colors.at(c-type, default: colors.at("default")) + box(outset: 2pt, fill: c, radius: 2pt, raw(type)) +} + + +#let fn-label(fn-name) = label(fn-name + "()") +#let fn-param-label(fn-name, arg-name) = label(fn-name + "." + arg-name) + + + + +#let show-parameter-list(fn) = { + set text(font: "Cascadia Mono", size: 0.8em, weight: 340) + + text(fn.name, fill: colors.at("signature-func-name", default: rgb("#4b69c6"))) + "(" + + let inline = fn.args.len() <= 2 + if not inline { "\n " } + + let items = fn.args.pairs().map(((arg-name, info)) => { + + if info.at("description", default: "") == "" { + arg-name + } else { + link(fn-param-label(fn.name, arg-name), arg-name) + } + + if "types" in info { + ": " + info.types.map(show-type).join(" ") + } + }) + + items.join( if inline {", "} else { ",\n "}) + if not inline { ",\n" } + ")" + + if fn.return-types != none { + " -> " + fn.return-types.map(show-type).join(" ") + } +} + + + +// Create a parameter description block, containing name, type, description and optionally the default value. +#let show-parameter-block( + fn, name, types, content, + show-default: false, + default: none, + fn-name: none, + is-long: false +) = { + let sep(it) = box(inset: (x: 5pt), text(0.8em, it)) + let type-pills = types.map(show-type).join(sep[or]) + block( + inset: 10pt, + breakable: is-long, + { + let default-multiline = type(default) == str and "\n" in default + block( + outset: 10pt, + radius: 10pt, + stroke: (top: .6pt + gray), + )[ + #text(1em, { + strong(raw(name)) + h(1em) + type-pills + if show-default and not default-multiline { + sep[default] + show-type(default) + } + h(1fr) + text(gray, link(fn-label(fn.name), $arrow.tl$)) + }) + #fn-param-label(fn.name, name) + ] + + content + + if show-default and default-multiline [ + #parbreak() + Default: #raw(default) + ] + } + ) +} + + +#let show-function(fn, style-args) = { + + if style-args.colors == auto { style-args.colors = colors } + + block(breakable: false)[ + #text(1.2em)[ + #heading(raw(fn.name + "()"), level: style-args.first-heading-level + 1) + #fn-label(fn.name) + ] + + #tidy.utilities.eval-docstring(fn.description, style-args) + + #show-parameter-list(fn) + ] + + + for (name, info) in fn.args { + let types = info.at("types", default: ()) + let description = info.at("description", default: "") + if description == "" { continue } + + show-parameter-block( + fn, + name, + types, + tidy.utilities.eval-docstring(description, style-args), + is-long: description.len() > 500, // approximate + show-default: "default" in info and "Default:" not in description, + default: info.at("default", default: none), + ) + } + v(3em, weak: true) +} + + + +#let show-variable( + var, style-args, +) = { + if style-args.colors == auto { style-args.colors = colors } + let type = if "type" not in var { none } + else { show-type(var.type, style-args: style-args) } + + stack(dir: ltr, spacing: 1.2em, + [ + #heading(var.name, level: style-args.first-heading-level + 1) + #label(style-args.label-prefix + var.name) + ], + type + ) + + eval-docstring(var.description, style-args) + v(4.8em, weak: true) +} + + +#let show-reference(label, name, style-args: none) = { + link(label, raw(name)) +} + diff --git a/packages/preview/fletcher/0.5.6/src/coords.typ b/packages/preview/fletcher/0.5.6/src/coords.typ new file mode 100644 index 0000000000..9a7ee5106f --- /dev/null +++ b/packages/preview/fletcher/0.5.6/src/coords.typ @@ -0,0 +1,301 @@ +#import "utils.typ": * +#import "deps.typ": cetz + +/// Convert from elastic to absolute coordinates, $(u, v) |-> (x, y)$. +/// +/// _Elastic_ coordinates are specific to the diagram and adapt to row/column +/// sizes; _absolute_ coordinates are the final, physical lengths which are +/// passed to `cetz`. +/// +/// - grid (dictionary): Representation of the grid layout, including: +/// - `origin` +/// - `centers` +/// - `spacing` +/// - `flip` +/// The `grid` is passed to #the-param[diagram][render]. +/// - uv (array): Elastic coordinate, `(float, float)`. +#let uv-to-xy(grid, uv) = { + let (i, j) = vector.sub(vector-2d(uv), grid.origin) + + let (n-x, n-y) = grid.centers.map(array.len) + if grid.flip.xy { (n-x, n-y) = (n-y, n-x) } + if grid.flip.x { i = (n-x - 1) - i } + if grid.flip.y { j = (n-y - 1) - j } + if grid.flip.xy { (i, j) = (j, i) } + + (i, j).zip(grid.centers, grid.spacing) + .map(((t, c, s)) => interp(c, t, spacing: s)) +} + +/// Convert from absolute to elastic coordinates, $(x, y) |-> (u, v)$. +/// +/// Inverse of `uv-to-xy()`. +#let xy-to-uv(grid, xy) = { + let (i, j) = xy.zip(grid.centers, grid.spacing) + .map(((x, c, s)) => interp-inv(c, x, spacing: s)) + + let (n-x, n-y) = grid.centers.map(array.len) + if grid.flip.xy { (n-x, n-y) = (n-y, n-x) } + if grid.flip.xy { (i, j) = (j, i) } + if grid.flip.x { i = (n-x - 1) - i } + if grid.flip.y { j = (n-y - 1) - j } + + vector.add((i, j), grid.origin) +} + +/// Jacobian of the coordinate map `uv-to-xy()`. +/// +/// Used to convert a "nudge" in $u v$ coordinates to a "nudge" in $x y$ +/// coordinates. This is needed because $u v$ coordinates are non-linear +/// (they're elastic). Uses a balanced finite differences approximation. +/// +/// - grid (dictionary): Representation of the grid layout. +/// The `grid` is passed to #the-param[diagram][render]. +/// - uv (array): The point `(float, float)` in the $u v$-manifold where the +/// shift tangent vector is rooted. +/// - duv (array): The shift tangent vector `(float, float)` in $u v$ coordinates. +#let duv-to-dxy(grid, uv, duv) = { + let duv = vector.scale(duv, 0.5) + vector.sub( + uv-to-xy(grid, vector.add(uv, duv)), + uv-to-xy(grid, vector.sub(uv, duv)), + ) +} + +/// Jacobian of the coordinate map `xy-to-uv()`. +#let dxy-to-duv(grid, xy, dxy) = { + let dxy = vector.scale(dxy, 0.5) + vector.sub( + xy-to-uv(grid, vector.add(xy, dxy)), + xy-to-uv(grid, vector.sub(xy, dxy)), + ) +} + +/// Return a vector rooted at a $x y$ coordinate with a given angle $θ$ in $x +/// y$-space but with a length specified in either $x y$-space or $u v$-space. +#let vector-polar-with-xy-or-uv-length(grid, xy, target-length, θ) = { + if type(target-length) == length { + vector-polar(target-length, θ) + } else { + let unit = vector-polar(1pt, θ) + let det = vector.len(dxy-to-duv(grid, xy, unit)) + vector.scale(unit, target-length/det) + } +} + + + +#let NAN_COORD = (float("nan"),)*2 + +#let default-ctx = ( + prev: (pt: (0, 0)), + + // cetz anchors assume y axis going up. + // see lines ending with the comment + // CETZ Y AXIS + transform: + ((1, 0, 0, 0), + (0,-1, 0, 0), + (0, 0, 1, 0), + (0, 0, 0, 1)), + + nodes: (:), + length: 1cm, + em-size: (width: 11pt, height: 11pt), + style: cetz.styles.default, + groups: (), + debug: false, +) + + +#let resolve-system(coord) = { + if type(coord) == dictionary and ("u", "v").all(k => k in coord) { + return "uv" + } else if type(coord) == label { + return "element" + } + + let cetz-system = cetz.coordinate.resolve-system(coord) + if cetz-system == "xyz" and coord.len() == 2 { + if coord.all(x => type(x) == length) { + "xyz" + } else if coord.all(x => type(x) in (int, float)) { + "uv" + } else { + error("Coordinates must be two numbers (for elastic coordinates) or two lengths (for physical coordinates); got #0.", coord) + } + } else { + cetz-system + } +} + +#let resolve-anchor(ctx, c) = { + // (name: , anchor: or ) + // "name.anchor" + // "name" + if type(c) == label { c = str(c) } + + let (name, anchor) = if type(c) == str { + let (name, ..anchor) = c.split(".") + if anchor.len() == 0 { + anchor = "default" + } + (name, anchor) + } else { + (str(c.name), c.at("anchor", default: "default")) + } + + if name not in ctx.nodes { + error("Node #0 not found. Named nodes are: #..1.", name, ctx.nodes.keys()) + } + + // Resolve length anchors + if type(anchor) == length { + anchor = util.resolve-number(ctx, anchor) + } + + let calculate-anchors = ctx.nodes.at(name).anchors + + (calculate-anchors)(anchor) +} + + + +#let resolve-relative(resolve, ctx, c) = { + // (rel: , update: or , to: ) + let update = c.at("update", default: true) + + let target-system = ctx.target-system + let sub-ctx = ctx + (target-system: auto) + + let (ctx, rel) = resolve(sub-ctx, c.rel, update: false) + + ctx.target-system = target-system + let (ctx, to) = if "to" in c { + resolve(ctx, c.to, update: false) + } else { + (ctx, ctx.prev.pt) + } + + if is-nan-vector(to) { + return (coord: to, update: update) + } + + + let is-xy(coord) = coord.any(x => type(x) == length) + let is-uv(coord) = not is-xy(coord) + + let error-value = (coord: NAN_COORD, update: update) + + if is-xy(rel) and is-uv(to) { + if "grid" not in ctx { return error-value } + to = uv-to-xy(ctx.grid, to) + } else if is-uv(rel) and is-xy(to) { + if "grid" not in ctx { return error-value } + to = xy-to-uv(ctx.grid, to) + } + + c = vector.add(rel, to) + + if ctx.target-system == "xyz" and is-uv(c) { + if "grid" not in ctx { return error-value } + c = uv-to-xy(ctx.grid, c) + } else if ctx.target-system == "uv" and is-xy(c) { + if "grid" not in ctx { return error-value } + c = xy-to-uv(ctx.grid, c) + } + + (coord: c, update: update) +} + + +/// Resolve CeTZ-style coordinate expressions to absolute vectors. +/// +/// This is an drop-in replacement of `cetz.coordinate.resolve()` but extended +/// to handle fletcher's elastic $u v$ coordinates alongside CeTZ' physical $x +/// y$ coordinates. The target coordinate system must be specified in the +/// context object `ctx`. +/// +/// Resolving $u v$ coordinates to or from $x y$ coordinates requires the +/// diagram's `grid`, which defines the non-linear maps `uv-to-xy()` and +/// `xy-to-uv()`. The `grid` may be supplied in the context object `ctx`. +/// +/// If `grid` is not supplied, *coordinate resolution may fail*, in which case +/// the vector #fletcher.NAN_COORD is returned. +/// +/// - ctx (dictionary): CeTZ canvas context object, additionally containing: +/// - `target-system`: the target coordinate system to resolve to, one of +/// `"uv"` or `"xyz"`. +/// - `grid` (optional): the diagram's grid specification, defining the +/// coordinate maps $u v <-> x y$. If not given, coordinates requiring this +/// map resolve to #fletcher.NAN_COORD. +/// +/// - ..coordinates (coordinate): CeTZ-style coordinate expression(s), e.g., +/// `(1, 2)`, `(45deg, 2cm)`, or `(rel: (+1, 0), to: "name")`. +#let resolve(ctx, ..coordinates, update: true) = { + assert(ctx.target-system in (auto, "uv", "xyz")) + + let result = () + for c in coordinates.pos() { + let t = resolve-system(c) + let out = if t == "uv" { + if ctx.target-system in (auto, "uv") { + let (u, v) = c // also works for dictionaries + (u, v) + } else if ctx.target-system == "xyz" { + if "grid" in ctx { uv-to-xy(ctx.grid, c) } + else { NAN_COORD } + } + } else if t == "xyz" { + let c = cetz.coordinate.resolve-xyz(c) + c = vector-2d(c).map(x => x.abs + x.em*ctx.em-size.width) + if ctx.target-system in (auto, "xyz") { + c + } else if ctx.target-system == "uv" { + if "grid" in ctx { xy-to-uv(ctx.grid, c) } + else { NAN_COORD } + } + } else if t == "previous" { + (ctx, c) = resolve(ctx, ctx.prev.pt) + c + } else if t == "polar" { + c = vector-2d(cetz.coordinate.resolve-polar(c)) + resolve(ctx, c).at(1) // ensure uv <-> xyz conversion + } else if t == "barycentric" { + cetz.coordinate.resolve-barycentric(ctx, c) + } else if t in ("element", "anchor") { + resolve-anchor(ctx, c) + } else if t == "tangent" { + cetz.coordinate.resolve-tangent(resolve, ctx, c) + } else if t == "perpendicular" { + cetz.coordinate.resolve-perpendicular(resolve, ctx, c) + } else if t == "relative" { + let result = resolve-relative(resolve, ctx, c) + update = result.update + result.coord + } else if t == "lerp" { + cetz.coordinate.resolve-lerp(resolve, ctx, c) + } else if t == "function" { + cetz.coordinate.resolve-function(resolve, ctx, c) + } else { + error("Failed to resolve coordinate #0.", c) + } + + out = vector-2d(out) + + if update { ctx.prev.pt = out } + result.push(out) + } + + assert(result.all(c => c.len() == 2)) + + return (ctx, ..result) +} + + +#let is-grid-independent-uv-coordinate(coord) = { + let ctx = default-ctx + (target-system: "uv") + (ctx, coord) = resolve(ctx, coord) + not is-nan-vector(coord) +} + diff --git a/packages/preview/fletcher/0.5.6/src/default-marks.typ b/packages/preview/fletcher/0.5.6/src/default-marks.typ new file mode 100644 index 0000000000..aa21c109e8 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/src/default-marks.typ @@ -0,0 +1,387 @@ +#import "deps.typ" +#import deps.cetz.draw + +#let DEFAULT_MARKS = ( + // all numbers are interpreted as multiples of stroke thickness + + head: ( + size: 7, // radius of curvature + sharpness: 24.7deg, // angle at vertex between central line and arrow's edge + delta: 53.5deg, // angle spanned by arc of curved arrow edge + + tip-origin: 0.5, + tail-end: mark => calc.min(..mark.extrude), + tail-origin: mark => { + let dx = calc.cos(mark.sharpness) + calc.cos(mark.sharpness + mark.delta) + mark.tail-end - mark.size*mark.delta/1.8rad*dx + }, + + stroke: (cap: "round"), + + draw: mark => { + for flip in (+1, -1) { + draw.arc( + (0, 0), + radius: mark.size, + start: flip*(90deg + mark.sharpness), + delta: flip*mark.delta, + fill: none, + ) + } + }, + + cap-offset: (mark, y) => { + import calc: sin, sqrt, pow, cos, abs, max + let r = mark.size + let θ = mark.sharpness + r*(sin(θ) - sqrt(max(0, 1 - pow(cos(θ) - abs(y)/r, 2)))) + }, + + ), + + doublehead: ( + inherit: "head", + size: 10.56, + sharpness: 19.4deg, + delta: 43.5deg, + ), + + triplehead: ( + inherit: "head", + size: 13.5, + sharpness: 25.5deg, + delta: 42.6deg, + ), + + harpoon: ( + inherit: "head", + draw: mark => { + draw.arc( + (0, 0), + radius: mark.size, + start: -(90deg + mark.sharpness), + delta: -mark.delta, + fill: none, + ) + }, + ), + + straight: ( + size: 10, + sharpness: 20deg, + + tip-origin: mark => 0.5/calc.sin(mark.sharpness), + tail-origin: mark => -mark.size*calc.cos(mark.sharpness), + + fill: none, + + draw: mark => { + draw.line( + (180deg + mark.sharpness, mark.size), + (0, 0), + (180deg - mark.sharpness, mark.size), + ) + }, + + cap-offset: (mark, y) => calc.tan(mark.sharpness + 90deg)*calc.abs(y), + ), + + solid: ( + inherit: "straight", + + tip-origin: 0, + tip-end: mark => -0.5/calc.sin(mark.sharpness), + tail-end: mark => -0.5/calc.sin(mark.sharpness), + + stroke: none, + fill: auto, + ), + + stealth: ( + size: 6, + stealth: 0.3, + angle: 25deg, + rear-angle: mark => calc.atan2(mark.stealth, calc.tan(mark.angle)), + + tip-origin: mark => 0.5/calc.sin(mark.angle), + tip-end: mark => mark.size*(mark.stealth - 1)*calc.cos(mark.angle), + tail-origin: mark => { + if mark.stealth > 0 { + let wing-angle = (mark.rear-angle - mark.angle)/2 + + let miter-limit = if mark.stroke == none { 0 } + else { stroke(mark.stroke).miter-limit } + + let miter-length = 1/calc.sin(wing-angle) + // stealth arrows with sharp wings look bigger due to long miter lengths + let extra-size = if miter-length < miter-limit { + // so account for extra apparent size + 0.4*miter-length + } else { + // unless over miter limit, since wings get clipped + 0 + } + + -(mark.size + extra-size)*calc.cos(mark.angle) + } else { + // negative stealth looks like a diamond + mark.tip-end - 0.5/calc.sin(mark.rear-angle) + } + }, + + stroke: (miter-limit: 20), + + draw: mark => { + draw.line( + (0,0), + (180deg + mark.angle, mark.size), + (mark.tip-end, 0), + (180deg - mark.angle, mark.size), + close: true, + ) + }, + + cap-offset: (mark, y) => if mark.tip { + -mark.stealth/calc.tan(mark.angle)*calc.abs(y) + } else { + calc.tan(mark.angle + 90deg)*calc.abs(y) + }, + ), + + latex: ( + size: 23, // radius of curvature + sharpness: 10deg, // angle at vertex between central line and arrow's edge + delta: 20deg, // angle spanned by arc of curved arrow edge + + tip-end: mark => mark.size*(calc.sin(mark.sharpness) - calc.sin(mark.sharpness + mark.delta)), + tail-end: mark => mark.tip-end/2, + tail-origin: mark => mark.tip-end, + + fill: auto, + stroke: none, + draw: mark => { + for flip in (+1, -1) { + draw.merge-path({ + draw.arc( + (0, 0), + radius: mark.size, + start: flip*(90deg + mark.sharpness), + delta: flip*mark.delta, + fill: none, + ) + draw.line((), ((), "|-", (0, flip*1e-1))) + }) + } + } + ), + + cone: ( + size: 8, + radius: 6, + angle: 30deg, + + tip-end: mark => -mark.size, + tail-end: mark => mark.tip-end/2, + tail-origin: mark => mark.tip-end, + + stroke: none, + draw: mark => { + for flip in (+1, -1) { + draw.merge-path({ + draw.arc( + (-mark.size, -flip*1e-1), + radius: mark.radius, + start: 0deg, + stop: flip*mark.angle, + ) + draw.line((), (0, 0)) + }) + } + } + ), + + circle: ( + size: 2, + + tip-end: mark => -mark.size, + tail-end: mark => mark.size, + tip-origin: mark => mark.size + 0.5, + tail-origin: mark => -(mark.size + 0.5), + + fill: none, + + draw: mark => draw.circle((0,0), radius: mark.size, fill: mark.fill), + + cap-offset: (mark, y) => { + let r = mark.size + let o = r - calc.sqrt(calc.max(0, r*r - y*y)) + if not mark.tip { o *= -1 } + o + }, + ), + + square: ( + size: 2, + angle: 0deg, + fill: none, + tip-origin: mark => +(mark.size + 0.5)/calc.cos(mark.angle), + tail-origin: mark => -(mark.size + 0.5)/calc.cos(mark.angle), + tip-end: mark => -mark.size/calc.cos(mark.angle), + tail-end: mark => +mark.size/calc.cos(mark.angle), + draw: mark => { + let x = mark.size + draw.rotate(mark.angle) + draw.rect( + (-x, -x), (+x, +x), + ) + } + ), + + diamond: ( + inherit: "stealth", + size: 4, + angle: 45deg, + stealth: -1, + fill: none, + ), + + bar: ( + size: 4.9, + angle: 90deg, + + tail-origin: mark => calc.min(..mark.extrude), + + draw: mark => draw.line( + (mark.angle, -mark.size), + (mark.angle, +mark.size), + ), + cap-offset: (mark, y) => { + let o = y*calc.tan(mark.angle - 90deg) + // if mark.tip { o *= -1 } + -o + }, + ), + + cross: ( + size: 4, + angle: 45deg, + draw: mark => { + draw.line((+mark.angle, -mark.size), (+mark.angle, +mark.size)) + draw.line((-mark.angle, -mark.size), (-mark.angle, +mark.size)) + }, + + cap-offset: (mark, y) => calc.tan(mark.angle + 90deg)*calc.abs(y), + ), + + hook: ( + size: 2.88, + rim: 0.85, + + tip-origin: mark => mark.size + 0.5, + + stroke: (cap: "round"), + + draw: mark => { + draw.arc( + (0,0), + start: -90deg, + stop: +90deg, + radius: mark.size, + fill: none, + ) + draw.line((), (rel: (-mark.rim, 0))) + }, + ), + + hooks: ( + inherit: "hook", + draw: mark => { + for flip in (-1, +1) { + draw.arc( + (0,0), + start: -flip*90deg, + stop: +flip*90deg, + radius: mark.size, + fill: none, + ) + } + }, + ), + + ">": (inherit: "head", rev: false), + "<": (inherit: "head", rev: true), + + ">>": (inherit: "head", extrude: (-2.88, 0), rev: false), + "<<": (inherit: "head", extrude: (-2.88, 0), rev: true), + + ">>>": (inherit: "head", extrude: (-6, -3, 0), rev: false), + "<<<": (inherit: "head", extrude: (-6, -3, 0), rev: true), + + "|>": (inherit: "solid", rev: false), + "<|": (inherit: "solid", rev: true), + + "}>": (inherit: "stealth", rev: false), + "<{": (inherit: "stealth", rev: true), + + "|": (inherit: "bar"), + "||": (inherit: "bar", extrude: (-3, 0)), + "|||": (inherit: "bar", extrude: (-6, -3, 0)), + + "/": (inherit: "bar", angle: +60deg, rev: false), + "\\": (inherit: "bar", angle: -60deg, rev: false), + + "x": (inherit: "cross"), + "X": (inherit: "cross", size: 7), + + "o": (inherit: "circle"), + "O": (inherit: "circle", size: 4), + "*": (inherit: "circle", fill: auto), + "@": (inherit: "circle", size: 4, fill: auto), + + "[]": (inherit: "square"), + "<>": (inherit: "diamond"), + + + + + // crow's foot notation + crowfoot: ( + many-width: 5, + many-length: 8, + one-width: 5, + zero-width: 3.5, + gap: 3, + first-gap: 5, + many: true, + one: true, + zero: true, + tail-origin: mark => -mark.many-length, + zero-fill: white, + fill: none, + draw: mark => { + let x = 0 + if mark.many { + draw.line((0, mark.many-width), (-mark.many-length - .5, 0), (0, -mark.many-width)) + x -= mark.many-length + } + if mark.one { + x -= mark.gap + x = calc.min(x, -mark.first-gap) + draw.line((x, mark.one-width), (x, -mark.one-width)) + } + if mark.zero { + x -= mark.gap + draw.circle((x - mark.zero-width, 0), radius: mark.zero-width, fill: mark.zero-fill) + } + } + ), + "n": (inherit: "crowfoot", zero: false, one: false, many: true), + "n!": (inherit: "crowfoot", zero: false, one: true, many: true), + "n?": (inherit: "crowfoot", zero: true, one: false, many: true), + "1": (inherit: "crowfoot", zero: false, one: true, many: false), + "1!": (inherit: "crowfoot", zero: false, one: true, many: false, extrude: mark => (0, -calc.max(4, mark.gap))), + "1?": (inherit: "crowfoot", zero: true, one: true, many: false), + +) + +#let MARKS = state("fletcher-marks", DEFAULT_MARKS) diff --git a/packages/preview/fletcher/0.5.6/src/deps.typ b/packages/preview/fletcher/0.5.6/src/deps.typ new file mode 100644 index 0000000000..8552d6eba3 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/src/deps.typ @@ -0,0 +1 @@ +#import "@preview/cetz:0.3.3" diff --git a/packages/preview/fletcher/0.5.6/src/diagram.typ b/packages/preview/fletcher/0.5.6/src/diagram.typ new file mode 100644 index 0000000000..f8da7734ca --- /dev/null +++ b/packages/preview/fletcher/0.5.6/src/diagram.typ @@ -0,0 +1,561 @@ +#import "utils.typ": * +#import "node.typ": * +#import "edge.typ": * +#import "draw.typ": draw-diagram +#import "coords.typ": * + + + +/// Interpret #the-param[diagram][axes]. +/// +/// Returns a dictionary with: +/// - `x`: Whether $u$ is reversed +/// - `y`: Whether $v$ is reversed +/// - `xy`: Whether the axes are swapped +/// +/// - axes (array): Pair of directions specifying the interpretation of $(u, v)$ +/// coordinates. For example, `(ltr, ttb)` means $u$ goes $arrow.r$ and $v$ +/// goes $arrow.b$. +/// -> dictionary +#let interpret-axes(axes) = { + let dirs = axes.map(direction.axis) + let flip + if dirs == ("horizontal", "vertical") { + flip = false + } else if dirs == ("vertical", "horizontal") { + flip = true + } else { + error("Axes #0 cannot both be in the same direction. Try `axes: (ltr, ttb)`.", axes) + } + + ( + flip: ( + x: axes.at(0) in (rtl, ttb), + y: axes.at(1) in (rtl, ttb), + xy: flip, + ) + ) +} + +/// Convert an array of rects `(center: (x, y), size: (w, h))` with fractional +/// positions into rects with integral positions. +/// +/// If a rect is centered at a factional position `floor(x) < x < ceil(x)`, it +/// will be replaced by two new rects centered at `floor(x)` and `ceil(x)`. The +/// total width of the original rect is split across the two new rects according +/// two which one is closer. (E.g., if the original rect is at `x = 0.25`, the +/// new rect at `x = 0` has 75% the original width and the rect at `x = 1` has +/// 25%.) The same splitting procedure is done for `y` positions and heights. +/// +/// This is the algorithm used to determine grid layout in diagrams. +/// +/// - rects (array): An array of rects of the form +/// `(center: (x, y), size: (width, height))`. The coordinates `x` and `y` may +/// be floats. +/// -> array +#let expand-fractional-rects(rects) = { + let new-rects + for axis in (0, 1) { + new-rects = () + for rect in rects { + let coord = rect.center.at(axis) + let size = rect.size.at(axis) + + if calc.fract(coord) == 0 { + rect.center.at(axis) = calc.trunc(coord) + new-rects.push(rect) + } else { + rect.center.at(axis) = calc.floor(coord) + rect.size.at(axis) = size*(calc.ceil(coord) - coord) + new-rects.push(rect) + + rect.center.at(axis) = calc.ceil(coord) + rect.size.at(axis) = size*(coord - calc.floor(coord)) + new-rects.push(rect) + } + } + rects = new-rects + } + new-rects +} + + +/// Determine the number and sizes of grid cells needed for a diagram with the +/// given nodes and edges. +/// +/// Returns a dictionary with: +/// - `origin: (u-min, v-min)` Coordinate at the grid corner where elastic/`uv` +/// coordinates are minimised. +/// - `cell-sizes: (x-sizes, y-sizes)` Lengths and widths of each row and +/// column. +/// +/// - flip (dictionary): Describes axis order and orientation. +/// - verts (array): Points that should be contained in the resulting grid. +/// - rects (array): Rectangles (dictionaries of the form `(center, size)` which +/// are used to determine cell sizes. +#let compute-cell-sizes(flip, verts, rects) = { + + if flip.xy { + // if x/y axes are flipped, transpose rectangles + rects = rects.map( ((center, size)) => { + (center: center, size: size.rev()) + }) + } + rects = expand-fractional-rects(rects) + + // all points in diagram that should be spanned by coordinate grid + let points = rects.map(r => r.center) + points += verts + + if points.len() == 0 { points.push((0,0)) } + + let min-max-int(a) = (calc.floor(calc.min(..a)), calc.ceil(calc.max(..a))) + let (x-min, x-max) = min-max-int(points.map(p => p.at(0))) + let (y-min, y-max) = min-max-int(points.map(p => p.at(1))) + let origin = (x-min, y-min) + let bounding-dims = (x-max - x-min + 1, y-max - y-min + 1) + + // Initialise row and column sizes + let cell-sizes = bounding-dims.map(n => (0pt,)*n) + + // Expand cells to fit rects + for rect in rects { + let indices = vector.sub(rect.center, origin) + if flip.x { indices.at(0) = -1 - indices.at(0) } + if flip.y { indices.at(1) = -1 - indices.at(1) } + for axis in (0, 1) { + let i = indices.at(axis) + cell-sizes.at(axis).at(i) = calc.max( + cell-sizes.at(axis).at(i), + rect.size.at(axis), + ) + } + } + + if flip.xy { + cell-sizes = cell-sizes.rev() + } + + (origin: origin, cell-sizes: cell-sizes) +} + +/// Determine the centers of grid cells from their sizes and spacing between +/// them. +/// +/// Returns the a dictionary with: +/// - `centers: (x-centers, y-centers)` Positions of each row and column, +/// measured from the corner of the bounding box. +/// - `bounding-size: (x-size, y-size)` Dimensions of the bounding box. +/// +/// - grid (dictionary): Representation of the grid layout, including: +/// - `cell-sizes: (x-sizes, y-sizes)` Lengths and widths of each row and +/// column. +/// - `spacing: (x-spacing, y-spacing)` Gap to leave between cells. +/// -> dictionary +#let compute-cell-centers(grid) = { + // (x: (c1x, c2x, ...), y: ...) + let centers = array.zip(grid.cell-sizes, grid.spacing) + .map(((sizes, spacing)) => { + array.zip(cumsum(sizes), sizes, range(sizes.len())) + .map(((end, size, i)) => end - size/2 + spacing*i) + }) + + let bounding-size = array.zip(centers, grid.cell-sizes) + .map(((centers, sizes)) => centers.at(-1) + sizes.at(-1)/2) + + ( + centers: centers, + bounding-size: bounding-size, + ) +} + +/// Determine the number, sizes and relative positions of rows and columns in +/// the diagram's coordinate grid. +/// +/// Rows and columns are sized to fit nodes. Coordinates are not required to +/// start at the origin, `(0,0)`. +#let compute-grid(rects, verts, options) = { + let grid = ( + axes: options.axes, + spacing: options.spacing, + ) + + grid += interpret-axes(grid.axes) + grid += compute-cell-sizes(grid.flip, verts, rects) + + // enforce minimum cell size + grid.cell-sizes = grid.cell-sizes.zip(options.cell-size) + .map(((sizes, min-size)) => sizes.map(calc.max.with(min-size))) + + grid += compute-cell-centers(grid) + + assert(grid.centers.at(0).len() == grid.cell-sizes.at(0).len()) + assert(grid.centers.at(1).len() == grid.cell-sizes.at(1).len()) + + grid +} + +#let extract-nodes-and-edges-from-equation(eq) = { + assert(eq.func() == math.equation) + let terms = flatten-sequence-to-array(eq.body) + + let edges = () + let nodes = () + + // convert math matrix into array-of-arrays matrix + let matrix = ((none,),) + let (x, y) = (0, 0) + for child in terms { + if child.func() == metadata { + if child.value.class == "node" { + let node = child.value + node.pos = (raw: (x, y)) + nodes.push(node) + } else if child.value.class == "edge" { + let edge = child.value + edge.vertices.at(0) = map-auto(edge.vertices.at(0), (x, y)) + if edge.label != none { edge.label = $edge.label$ } // why is this needed? + edge.vertices.at(-1) = map-auto(edge.vertices.at(-1), (rel: (1, 0))) + edge.node-index = none + edges.push(edge) + } + } else if repr(child.func()) == "linebreak" { + y += 1 + x = 0 + matrix.push((none,)) + } else if repr(child.func()) == "align-point" { + x += 1 + matrix.at(-1).push(none) + } else { + matrix.at(-1).at(-1) += child + } + } + + // turn matrix into an array of nodes + for (y, row) in matrix.enumerate() { + for (x, item) in row.enumerate() { + if not is-space(item) { + nodes.push(node((x, y), $item$).value) + } + } + } + + + ( + nodes: nodes, + edges: edges, + ) +} + + + +#let interpret-diagram-args(args) = { + if args.named().len() > 0 { + error("Unexpected named argument(s) #..0.", args.named().keys()) + } + + let positional-args = args.pos().flatten().join() + [] // join to ensure sequence + let objects = positional-args.children + + let nodes = () + let edges = () + + for obj in objects { + if obj.func() == metadata { + if obj.value.class == "node" { + let node = obj.value + nodes.push(node) + + } else if obj.value.class == "edge" { + let edge = obj.value + edge.node-index = nodes.len() + edges.push(edge) + } + + } else if obj.func() == math.equation { + let result = extract-nodes-and-edges-from-equation(obj) + nodes += result.nodes + edges += result.edges + + } else { + panic("Unrecognised value passed to diagram:", obj) + } + } + + ( + nodes: nodes, + edges: edges, + ) + +} + + + +/// Draw a diagram containing `node()`s and `edge()`s. +/// +/// - ..args (array): Content to draw in the diagram, including nodes and edges. +/// +/// The results of `node()` and `edge()` can be _joined_, meaning you can +/// specify them as separate arguments, or in a block: +/// +/// ```typ +/// #diagram( +/// // one object per argument +/// node((0, 0), $A$), +/// node((1, 0), $B$), +/// { +/// // multiple objects in a block +/// // can use scripting, loops, etc +/// node((2, 0), $C$) +/// node((3, 0), $D$) +/// }, +/// for x in range(4) { node((x, 1) [#x]) }, +/// ) +/// ``` +/// +/// Nodes and edges can also be specified in math-mode. +/// +/// ```typ +/// #diagram($ +/// A & B \ // two nodes at (0,0) and (1,0) +/// C edge(->) & D \ // an edge from (0,1) to (1,1) +/// node(sqrt(pi), stroke: #1pt) // a node with options +/// $) +/// ``` +/// +/// - debug (bool, 1, 2, 3): Level of detail for drawing debug information. +/// Level `1` or `true` shows a coordinate grid; higher levels show bounding boxes and +/// anchors, etc. +/// +/// - spacing (length, pair of lengths): Gaps between rows and columns. Ensures +/// that nodes at adjacent grid points are at least this far apart (measured as +/// the space between their bounding boxes). +/// +/// Separate horizontal/vertical gutters can be specified with `(x, y)`. A +/// single length `d` is short for `(d, d)`. +/// +/// - cell-size (length, pair of lengths): Minimum size of all rows and columns. +/// A single length `d` is short for `(d, d)`. +/// +/// - node-inset (length, pair of lengths): Default value of +/// #the-param[node][inset]. +/// +/// - node-outset (length, pair of lengths): Default value of +/// #the-param[node][outset]. +/// +/// - node-shape (rect, circle, function): Default value of +/// #the-param[node][shape]. +/// +/// - node-stroke (stroke, none): Default value of #the-param[node][stroke]. +/// +/// The default stroke is folded with the stroke specified for the node. For +/// example, if `node-stroke` is `1pt` and #the-param[node][stroke] is `red`, +/// then the resulting stroke is `1pt + red`. +/// +/// - node-fill (paint): Default value of #the-param[node][fill]. +/// +/// - edge-stroke (stroke): Default value of #the-param[edge][stroke]. By +/// default, this is chosen to match the thickness of mathematical arrows such +/// as $A -> B$ in the current font size. +/// +/// The default stroke is folded with the stroke specified for the edge. For +/// example, if `edge-stroke` is `1pt` and #the-param[edge][stroke] is `red`, +/// then the resulting stroke is `1pt + red`. +/// +/// - node-corner-radius (length, none): Default value of +/// #the-param[node][corner-radius]. +/// +/// - edge-corner-radius (length, none): Default value of +/// #the-param[edge][corner-radius]. +/// +/// - node-defocus (number): Default value of #the-param[node][defocus]. +/// +/// - label-sep (length): Default value of #the-param[edge][label-sep]. +/// +/// - label-size (length): Default value of #the-param[edge][label-size]. +/// +/// - label-wrapper (function): Default value of +/// #the-param[edge][label-wrapper]. +/// +/// - mark-scale (percent): Default value of #the-param[edge][mark-scale]. +/// +/// - crossing-fill (paint): Color to use behind connectors or labels to give +/// the illusion of crossing over other objects. See +/// #the-param[edge][crossing-fill]. +/// +/// - crossing-thickness (number): Default thickness of the occlusion made by +/// crossing connectors. See #param[edge][crossing-thickness]. +/// +/// - axes (pair of directions): The orientation of the diagram's axes. +/// +/// This defines the elastic coordinate system used by nodes and edges. To make +/// the $y$ coordinate increase up the page, use `(ltr, btt)`. For the matrix +/// convention `(row, column)`, use `(ttb, ltr)`. +/// +/// #stack( +/// dir: ltr, +/// spacing: 1fr, +/// fletcher.diagram( +/// axes: (ltr, ttb), +/// debug: 1, +/// node((0,0), $(0,0)$), +/// edge((0,0), (1,0), "->"), +/// node((1,0), $(1,0)$), +/// node((1,1), $(1,1)$), +/// node((0.5,0.5), `axes: (ltr, ttb)`), +/// ), +/// fletcher.diagram( +/// axes: (ltr, btt), +/// debug: 1, +/// node((0,0), $(0,0)$), +/// edge((0,0), (1,0), "->"), +/// node((1,0), $(1,0)$), +/// node((1,1), $(1,1)$), +/// node((0.5,0.5), `axes: (ltr, btt)`), +/// ), +/// fletcher.diagram( +/// axes: (ttb, ltr), +/// debug: 1, +/// node((0,0), $(0,0)$), +/// edge((0,0), (1,0), "->", bend: -20deg), +/// node((1,0), $(1,0)$), +/// node((1,1), $(1,1)$), +/// node((0.5,0.5), `axes: (ttb, ltr)`), +/// ), +/// ) +/// +/// - render (function): After the node sizes and grid layout have been +/// determined, the `render` function is called with the following arguments: +/// - `grid`: a dictionary of the row and column widths and positions; +/// - `nodes`: an array of nodes (dictionaries) with computed attributes +/// (including size and physical coordinates); +/// - `edges`: an array of connectors (dictionaries) in the diagram; and +/// - `options`: other diagram attributes. +/// +/// This callback is exposed so you can access the above data and draw things +/// directly with CeTZ. +#let diagram( + ..args, + debug: false, + axes: (ltr, ttb), + spacing: 3em, + cell-size: 0pt, + edge-stroke: 0.048em, + node-stroke: none, + edge-corner-radius: 2.5pt, + node-corner-radius: none, + node-inset: 6pt, + node-outset: 0pt, + node-shape: auto, + node-fill: none, + node-defocus: 0.2, + label-sep: 0.4em, + label-size: 1em, + label-wrapper: edge => box( + [#edge.label], + inset: .2em, + radius: .2em, + fill: edge.label-fill, + ), + mark-scale: 100%, + crossing-fill: white, + crossing-thickness: 5, + render: (grid, nodes, edges, options) => { + cetz.canvas(draw-diagram(grid, nodes, edges, debug: options.debug)) + }, +) = { + + let spacing = as-pair(spacing).map(as-length) + let cell-size = as-pair(cell-size).map(as-length) + + let options = ( + debug: int(debug), + axes: axes, + spacing: spacing, + cell-size: cell-size, + node-inset: node-inset, + node-outset: node-outset, + node-shape: node-shape, + node-stroke: node-stroke, + node-fill: node-fill, + node-corner-radius: node-corner-radius, + edge-corner-radius: edge-corner-radius, + node-defocus: node-defocus, + label-sep: label-sep, + label-size: label-size, + label-wrapper: label-wrapper, + edge-stroke: as-stroke(edge-stroke), + mark-scale: mark-scale, + crossing-fill: crossing-fill, + crossing-thickness: crossing-thickness, + ) + + let (nodes, edges) = interpret-diagram-args(args) + + box(context { + let options = options + + options.em-size = 1em.to-absolute() + options.spacing = options.spacing.map(length.to-absolute) + options.cell-size = options.cell-size.map(length.to-absolute) + + let nodes = nodes.map(node => { + node = resolve-node-options(node, options) + node = measure-node-size(node) + node + }) + let edges = edges.map(edge => resolve-edge-options(edge, options)) + + // PHASE 1: Resolve uv coordinates where possible + + // try resolving node uv coordinates. this resolves to NaN coords if the + // resolution fails (e.g., if the coords depend on physical lengths) + let (ctx-with-uv-anchors, nodes) = resolve-node-coordinates( + nodes, ctx: (target-system: "uv")) + + + // nodes and edges whose uv coordinates can be resolved without knowing the grid + let rects-affecting-grid = nodes + .filter(node => not is-nan-vector(node.pos.uv)) + .map(node => (center: node.pos.uv, size: node.size)) + + let vertices-affecting-grid = (edges + .map(edge => resolve-edge-vertices(edge, nodes, ctx: ctx-with-uv-anchors + (target-system: "uv"))) + .join() + ()) // coerce none to () + .filter(vert => not is-nan-vector(vert)) + + + // PHASE 2: Determine elastic grid (row/column sizes) and resolve xy coordinates + + // determine diagram's elastic grid layout + let grid = compute-grid(rects-affecting-grid, vertices-affecting-grid, options) + + let ctx-with-xyz-anchors + + // we run multiple passes so that anchors on enclose nodes + // have a chance to resolve + // (a better way would be to resolve coordinates and enclose nodes together) + for i in range(5) { + // now with grid determined, compute final (physical) coordinates for nodes and edges + (ctx-with-xyz-anchors, nodes) = resolve-node-coordinates( + nodes, ctx: (target-system: "xyz", grid: grid)) + + // resolve enclosing nodes + nodes = resolve-node-enclosures(nodes, ctx-with-xyz-anchors) + } + + // resolve edges + edges = edges.map(edge => { + edge.final-vertices = resolve-edge-vertices( + edge, ctx: ctx-with-xyz-anchors + (target-system: "xyz", grid: grid), nodes + ) + + edge = convert-edge-corner-to-poly(edge) + edge = apply-edge-shift(grid, edge) + edge + }) + + + render(grid, nodes, edges, options) + }) +} \ No newline at end of file diff --git a/packages/preview/fletcher/0.5.6/src/draw.typ b/packages/preview/fletcher/0.5.6/src/draw.typ new file mode 100644 index 0000000000..05204eb34b --- /dev/null +++ b/packages/preview/fletcher/0.5.6/src/draw.typ @@ -0,0 +1,894 @@ +#import "utils.typ": * +#import "marks.typ": * +#import "coords.typ": uv-to-xy + +#let DEBUG_COLOR = rgb("f008") +#let DEBUG_COLOR2 = rgb("0f08") + +#let draw-debug(objs) = { + cetz.draw.floating(objs) +} + +#let draw-node-outline(node) = { + cetz.draw.group({ + cetz.draw.translate(node.pos.xyz) + (node.shape)(node, node.outset) + }) +} + +#let draw-node(node, debug: 0) = { + + let result = { + if node.stroke != none or node.fill != none { + cetz.draw.group({ + cetz.draw.translate(node.pos.xyz) + for (i, extrude) in node.extrude.enumerate() { + cetz.draw.set-style( + fill: if i == 0 { node.fill }, + stroke: node.stroke, + ) + (node.shape)(node, extrude) + } + }) + } + + if node.label != none { + let ε = 1e-10pt // temp fix for https://github.com/Jollywatt/typst-fletcher/issues/64 + cetz.draw.content( + node.pos.xyz, + box( + // wrapping label in a box allows user to control its alignment + align(center + horizon, node.label), + stroke: if debug >= 3 { DEBUG_COLOR2 + 0.25pt }, + width: node.size.at(0) - 2*node.inset + ε, + height: node.size.at(1) - 2*node.inset, + ), + anchor: "center", + ) + } + } + + if node.layer != 0 { result = cetz.draw.on-layer(node.layer, result) } + + (node.post)(result) // post-process (e.g., hide) + + // Draw debug stuff + if debug >= 1 { + // dot at node anchor + draw-debug(cetz.draw.circle( + node.pos.xyz, + radius: 0.5pt, + fill: DEBUG_COLOR, + stroke: none, + )) + } + + if debug >= 2 and node.radius != 0pt { + // node bounding rectangle + draw-debug({ + cetz.draw.rect( + ..rect-at(node.pos.xyz, node.size), + stroke: DEBUG_COLOR + .1pt, + ) + + // node anchoring outline (what edges snap to) + cetz.draw.set-style(stroke: DEBUG_COLOR2 + 0.25pt) + draw-node-outline(node) + }) + } + + if debug >= 3 and "enclosed-vertices" in node { + draw-debug(node.enclosed-vertices.map(pos => { + cetz.draw.circle(pos, radius: node.inset, stroke: 0.1pt + blue) + }).join()) + } +} + + +/// Draw an edge label at point along a curve. +/// +/// Label is drawn near the point `curve(edge.label-pos)`, respecting the label +/// options of `edge()` such as #param[edge][label-side] and +/// #param[edge][label-angle]. +/// +/// - edge (dictionary): Edge object. Must include: +/// - `label-pos` +/// - `label-sep` +/// - `label-side` +/// - `label-anchor` +/// - `label-angle` +/// - `label-wrapper` +/// - curve (function): Parametric curve $RR -> RR^2$ describing the shape of +/// the edge in $x y$ coordinates. +#let place-edge-label-on-curve(edge, curve, debug: 0) = { + + let curve-point = curve(edge.label-pos) + let curve-point-ε = curve(edge.label-pos + 1e-3%) + + let θ = wrap-angle-180(angle-between(curve-point, curve-point-ε)) + let θ-normal = θ + if edge.label-side == right { +90deg } else { -90deg } + + if type(edge.label-angle) == alignment { + edge.label-angle = θ - ( + right: 0deg, + top: 90deg, + left: 180deg, + bottom: 270deg, + ).at(repr(edge.label-angle)) + + } else if edge.label-angle == auto { + edge.label-angle = θ + if calc.abs(edge.label-angle) > 90deg { + edge.label-angle += 180deg + } + } + + if edge.label-anchor == auto { + edge.label-anchor = angle-to-anchor(θ-normal - edge.label-angle) + } + + let label-pos = (to: curve-point, rel: (θ-normal, -edge.label-sep)) + + cetz.draw.content( + label-pos, + box( + { + set text(edge.label-size) + (edge.label-wrapper)(edge) + }, + stroke: if debug >= 2 { DEBUG_COLOR2 + 0.25pt }, + ), + angle: edge.label-angle, + anchor: if edge.label-anchor != auto { edge.label-anchor }, + ) + + if debug >= 2 { + draw-debug(cetz.draw.circle( + label-pos, + radius: 0.75pt, + stroke: none, + fill: DEBUG_COLOR2, + )) + } +} + + +// Get the arrow head adjustment for a given extrusion distance. +// +// Returns a pair `(from, to)` of distances. +// If `from < 0pt` and `to > 0pt`, the path length of the edge increases. +#let cap-offsets(edge, y) = { + (0, 1).map(pos => { + let mark = edge.marks.find(mark => calc.abs(mark.pos - pos) < 1e-3) + if mark == none { return 0pt } + + let is-tip = (pos == 0) == mark.rev + let sign = if mark.rev { -1 } else { +1 } + + let x = cap-offset( + mark + (tip: is-tip), + sign*y/edge.stroke.thickness, + ) + + let origin = if is-tip { mark.tip-origin } else { mark.tail-origin } + x -= origin*float(mark.scale) + + sign*x*edge.stroke.thickness + }) +} + +#let with-decorations(edge, path) = { + if edge.decorations == none { return path } + + let has-mark-at(t) = edge.marks.find(mark => calc.abs(mark.pos - t) < 1e-3 ) != none + + let decor = edge.decorations.with(stroke: edge.stroke) + + // TODO: should this be an absolute offset, not 10% the path length? + let ε = 1e-3 // cetz assertions sometimes fail from floating point errors + decor = decor.with( + start: if has-mark-at(0) { 0.1 } else { ε } * 100%, + stop: if has-mark-at(1) { 0.9 } else { 1 - ε } * 100%, + ) + + decor(path) +} + +/// Draw a straight edge. +/// +/// - edge (dictionary): The edge object, a dictionary, containing: +/// - `vertices`: an array of two points, the line's start and end points. +/// - `extrude`: An array of extrusion lengths to apply a multi-stroke effect +/// with. +/// - `stroke`: The stroke style. +/// - `marks`: An array of marks to draw along the edge. +/// - `label`: Content for label. +/// - `label-side`, `label-pos`, `label-sep`, and `label-anchor`. +/// - debug (int): Level of debug details to draw. +#let draw-edge-line(edge, debug: 0) = { + let (from, to) = edge.final-vertices + let θ = angle-between(from, to) + + // Draw line(s), one for each extrusion shift + for shift in edge.extrude { + + let offsets = cap-offsets(edge, shift) + let points = (from, to).zip(offsets) + .map(((point, offset)) => { + // Shift line sideways (for multi-stroke effect) + point = (rel: (θ + 90deg, shift), to: point) + // Shift end points lengthways depending on marks + point = (rel: (θ, offset), to: point) + point + }) + + let obj = cetz.draw.line( + ..points, + stroke: edge.stroke, + ) + + with-decorations(edge, obj) + } + + // Draw marks + let total-path-len = vector-len(vector.sub(from, to)) + let curve(t) = { + // panic(t, total-path-len) + t = relative-to-float(t, len: total-path-len) + vector.lerp(from, to, t) + } + + for mark in edge.marks { + place-mark-on-curve(mark, curve, stroke: edge.stroke, debug: debug >= 3) + } + + // Draw label + if edge.label != none { + + // Choose label anchor based on edge direction, + // preferring to place labels above the edge + if edge.label-side == auto { + edge.label-side = if calc.abs(θ) < 90deg { left } else { right } + } + + place-edge-label-on-curve(edge, curve, debug: debug) + } + +} + + +/// Draw a bent edge. +/// +/// - edge (dictionary): The edge object, a dictionary, containing: +/// - `vertices`: an array of two points, the arc's start and end points. +/// - `bend`: The angle of the arc. +/// - `extrude`: An array of extrusion lengths to apply a multi-stroke effect +/// with. +/// - `stroke`: The stroke style. +/// - `marks`: An array of marks to draw along the edge. +/// - `label`: Content for label. +/// - `label-side`, `label-pos`, `label-sep`, and `label-anchor`. +/// - debug (int): Level of debug details to draw. +#let draw-edge-arc(edge, debug: 0) = { + let (from, to) = edge.final-vertices + + // Determine the arc from the stroke end points and bend angle + let (center, radius, start, stop) = get-arc-connecting-points(from, to, edge.bend) + + let bend-dir = if edge.bend > 0deg { +1 } else { -1 } + + // Draw arc(s), one for each extrusion shift + for shift in edge.extrude { + + // Adjust arc angles to accommodate for cap offsets + let (δ-start, δ-stop) = cap-offsets(edge, shift) + .map(arclen => -bend-dir*arclen/radius*1rad) + + let obj = cetz.draw.arc( + center, + radius: radius + shift, + start: start + δ-start, + stop: stop + δ-stop, + anchor: "origin", + stroke: edge.stroke, + ) + + with-decorations(edge, obj) + } + + // Draw marks + let total-path-len = calc.abs(stop - start)/1rad*radius + let curve(t) = { + t = relative-to-float(t, len: total-path-len) + vector.add(center, vector-polar(radius, lerp(start, stop, t))) + } + for mark in edge.marks { + place-mark-on-curve(mark, curve, stroke: edge.stroke, debug: debug >= 3) + } + + // Draw label + if edge.label != none { + + if edge.label-side == auto { + // Choose label side to be on outside of arc + edge.label-side = if edge.bend > 0deg { left } else { right } + } + + place-edge-label-on-curve(edge, curve, debug: debug) + + } +} + + + +/// Draw a multi-segment edge +/// +/// - edge (dictionary): The edge object, a dictionary, containing: +/// - `vertices`: an array of at least two points to draw segments between. +/// - `corner-radius`: Radius of curvature between segments. +/// - `extrude`: An array of extrusion lengths to apply a multi-stroke effect +/// with. +/// - `stroke`: The stroke style. +/// - `marks`: An array of marks to draw along the edge. +/// - `label`: Content for label. +/// - `label-side`, `label-pos`, `label-sep`, and `label-anchor`. +/// - debug (int): Level of debug details to draw. +#let draw-edge-polyline(edge, debug: 0) = { + + let verts = edge.final-vertices + let n-segments = verts.len() - 1 + + // angles of each segment + let θs = range(n-segments).map(i => { + let (vert, vert-next) = (verts.at(i), verts.at(i + 1)) + assert(vert != vert-next, message: "Adjacent vertices must be distinct.") + angle-between(vert, vert-next) + }) + + + // round corners + let calculate-rounded-corner(i) = { + let pt = verts.at(i) + let Δθ = wrap-angle-180(θs.at(i) - θs.at(i - 1)) + let dir = if Δθ > 0deg { +1 } else { -1 } // +1 if ccw, -1 if cw + + + let θ-normal = θs.at(i - 1) + Δθ/2 + 90deg // direction to center of curvature + + let radius = edge.corner-radius + // radius *= 90deg/calc.max(calc.abs(Δθ), 45deg) // visual adjustment so that tighter bends have smaller radii + radius *= 1 + calc.cos(Δθ) + // skip correcting the corner radius for extruded strokes if there's no stroke at all + if edge.extrude != () { + radius += if dir > 0 { calc.max(..edge.extrude) } else { -calc.min(..edge.extrude) } + } + radius *= dir // ??? makes math easier or something + + if calc.abs(Δθ) > 179deg { + // singular line; skip arc + ( + arc-center: pt, + arc-radius: 0*radius, + start: θs.at(i - 1) - 90deg, + delta: wrap-angle-180(Δθ), + line-shift: 0*radius, // distance from vertex to beginning of arc + ) + } else { + + // distance from vertex to center of curvature + let dist = radius/calc.cos(Δθ/2) + + ( + arc-center: vector.add(pt, vector-polar(dist, θ-normal)), + arc-radius: radius, + start: θs.at(i - 1) - 90deg, + delta: wrap-angle-180(Δθ), + line-shift: radius*calc.tan(Δθ/2), // distance from vertex to beginning of arc + ) + } + + } + + let rounded-corners + if edge.corner-radius != none { + rounded-corners = range(1, θs.len()).map(calculate-rounded-corner) + } + + let lerp-scale(t, i) = { + if type(t) in (int, float) { + let τ = t*n-segments - i + if (0 < τ and τ <= 1 or + i == 0 and τ <= 0 or + i == n-segments - 1 and 1 < τ) { τ } + } else { + t = as-relative(t) + let τ = lerp-scale(float(t.ratio), i) + if τ != none {τ *100% + t.length } + } + } + + let debug-stroke = edge.stroke.thickness/4 + DEBUG_COLOR2 + + // phase keeps track of how to offset dash patterns + // to ensure continuity between segments + let phase = 0pt + let stroke-with-phase(phase) = stroke-to-dict(edge.stroke) + ( + dash: if type(edge.stroke.dash) == dictionary { + (array: edge.stroke.dash.array, phase: phase) + } + ) + + // draw each segment + for i in range(n-segments) { + let (from, to) = (verts.at(i), verts.at(i + 1)) + let marks = () + + let Δphase = 0pt + + if edge.corner-radius == none { + + // add phantom marks to ensure segment joins are clean + if i > 0 { + let Δθ = θs.at(i) - θs.at(i - 1) + marks.push(( + inherit: "bar", + pos: 0, + angle: 90deg - Δθ/2, + hide: true, + )) + } + if i < θs.len() - 1 { + let Δθ = θs.at(i + 1) - θs.at(i) + marks.push(( + inherit: "bar", + pos: 1, + angle: 90deg + Δθ/2, + hide: true, + )) + } + + Δphase += vector-len(vector.sub(from, to)) + + } else { // rounded corners + + if i > 0 { + // offset start of segment to give space for previous arc + let (line-shift,) = rounded-corners.at(i - 1) + from = vector.add(from, vector-polar(line-shift, θs.at(i))) + } + + if i < θs.len() - 1 { + + let (arc-center, arc-radius, start, delta, line-shift) = rounded-corners.at(i) + to = vector.add(to, vector-polar(-line-shift, θs.at(i))) + + Δphase += vector-len(vector.sub(from, to)) + + for d in edge.extrude { + if delta != 0deg { + cetz.draw.arc( + arc-center, + radius: arc-radius - d, + start: start, + delta: delta, + anchor: "origin", + stroke: stroke-with-phase(phase + Δphase), + ) + } + + if debug >= 4 { + cetz.draw.on-layer(1, cetz.draw.circle( + arc-center, + radius: arc-radius - d, + stroke: debug-stroke, + )) + + } + } + + Δphase += delta/1rad*arc-radius + } + } + + marks = marks.map(resolve-mark) + + // distribute original marks across segments + marks += edge.marks.map(mark => { + mark.pos = lerp-scale(mark.pos, i) + mark + }).filter(mark => mark.pos != none) + + let label-pos = lerp-scale(edge.label-pos, i) + let label-options = if label-pos == none { (label: none) } + else { (label-pos: label-pos, label: edge.label) } + + + draw-edge-line( + edge + ( + kind: "line", + final-vertices: (from, to), + marks: marks, + stroke: stroke-with-phase(phase), + ) + label-options, + debug: debug, + ) + + phase += Δphase + + } + + + if debug >= 4 { + cetz.draw.line( + ..verts, + stroke: debug-stroke, + ) + } +} + + + +/// Of all the intersection points within a set of CeTZ objects, find the one +/// which is farthest from a target point and pass it to a callback. +/// +/// If no intersection points are found, use the target point itself. +/// +/// - objects (cetz array, none): Objects to search within for intersections. If +/// `none`, callback is immediately called with `target`. +/// - target (point): Target point to sort intersections by proximity with, and +/// to use as a fallback if no intersections are found. +#let find-farthest-intersection(objects, target, callback) = { + + if objects == none { return callback(target) } + + let node-name = "intersection-finder" + cetz.draw.hide(cetz.draw.intersections(node-name, objects)) + + cetz.draw.get-ctx(ctx => { + + let calculate-anchors = ctx.nodes.at(node-name).anchors + let anchor-names = calculate-anchors(()) + let anchor-points = anchor-names.map(calculate-anchors) + .map(point => { + point.at(1) *= -1 // CETZ Y AXIS + vector-2d(vector.scale(point, 1cm)) + }).sorted(key: point => vector-len(vector.sub(point, target))) + + let anchor = anchor-points.at(-1, default: target) + + callback(anchor) + + }) + +} + +#let find-anchor-pair((from-group, to-group), (from-point, to-point), callback) = { + find-farthest-intersection(from-group, from-point, from-anchor => { + find-farthest-intersection(to-group, to-point, to-anchor => { + callback((from-anchor, to-anchor)) + }) + }) + +} + +/// Get the anchor point around a node outline at a certain angle. +#let get-node-anchor(node, θ, callback) = { + let outline = cetz.draw.group({ + cetz.draw.translate(node.pos.xyz) + (node.shape)(node, node.outset) + }) + let dummy-line = cetz.draw.line( + node.pos.xyz, + (rel: (θ, 10*node.radius)) + ) + + find-farthest-intersection(outline + dummy-line, node.pos.xyz, callback) +} + +/// Return the anchor point for an edge connecting to a node with the "defocus" +/// adjustment. +/// +/// Basically, for very long/wide nodes, don't make edges coming in from all +/// angles go to the exact node center, but "spread them out" a bit. +/// +/// See https://www.desmos.com/calculator/irt0mvixky. +#let defocus-adjustment(node, θ) = { + if node == none { return (0pt, 0pt) } + let μ = calc.pow(node.aspect, node.defocus) + ( + calc.max(0pt, node.size.at(0)/2*(1 - 1/μ))*calc.cos(θ), + calc.max(0pt, node.size.at(1)/2*(1 - μ/1))*calc.sin(θ), + ) + +} + + + +#let draw-anchored-line(edge, nodes, debug: 0) = { + let (from, to) = edge.final-vertices + let θ = angle-between(from, to) + 90deg + + // TODO: do defocus adjustment sensibly + if nodes.at(0).len() == 1 { + from = vector.add(from, defocus-adjustment(nodes.at(0).at(0), θ - 90deg)) + } + if nodes.at(1).len() == 1 { + to = vector.add(to, defocus-adjustment(nodes.at(1).at(0), θ + 90deg)) + + } + + + let dummy-line = cetz.draw.line(from, to) + + let intersection-objects = nodes.map(nodes => { + nodes.map(draw-node-outline).join() + dummy-line + }) + + + find-anchor-pair(intersection-objects, (from, to), anchors => { + let obj = draw-edge-line(edge + ( + final-vertices: anchors, + ), debug: debug) + (edge.post)(obj) // post-process (e.g., hide) + }) + +} + + +#let draw-anchored-arc(edge, nodes, debug: 0) = { + let (from, to) = edge.final-vertices + let θ = angle-between(from, to) + let θs = (θ + edge.bend, θ - edge.bend + 180deg) + + let dummy-lines = (from, to).zip(θs, nodes) + .map(((point, φ, node)) => cetz.draw.line( + point, + vector.add(point, vector-polar(10cm, φ)), // ray emanating from node + )) + + let intersection-objects = nodes.zip(dummy-lines).map(((nodes, dummy-line)) => { + nodes.map(draw-node-outline).join() + dummy-line + }) + + find-anchor-pair(intersection-objects, (from, to), anchors => { + let obj = draw-edge-arc(edge + (final-vertices: anchors), debug: debug) + (edge.post)(obj) // post-process (e.g., hide) + }) +} + + +#let draw-anchored-polyline(edge, nodes, debug: 0) = { + assert(edge.vertices.len() >= 2, message: "Polyline requires at least two vertices") + let verts = edge.final-vertices + let (from, to) = (edge.final-vertices.at(0), edge.final-vertices.at(-1)) + + let end-segments = ( + edge.final-vertices.slice(0, 2), // first two vertices + edge.final-vertices.slice(-2), // last two vertices + ) + + let dummy-lines = end-segments.map(points => cetz.draw.line(..points)) + + let intersection-objects = nodes.zip(dummy-lines).map(((nodes, dummy-line)) => { + nodes.map(draw-node-outline).join() + dummy-line + }) + + find-anchor-pair(intersection-objects, (from, to), anchors => { + let edge = edge + edge.final-vertices.at(0) = anchors.at(0) + edge.final-vertices.at(-1) = anchors.at(1) + let obj = draw-edge-polyline(edge, debug: debug) + (edge.post)(obj) // post-process (e.g., hide) + }) + +} + + +#let draw-edge(edge, ..args) = { + let obj = if edge.kind == "line" { + draw-anchored-line(edge, ..args) + } else if edge.kind == "arc" { + draw-anchored-arc(edge, ..args) + } else if edge.kind == "poly" { + draw-anchored-polyline(edge, ..args) + } else { error("Invalid edge kind #0.", edge.kind) } + + if edge.layer != 0 { obj = cetz.draw.on-layer(edge.layer, obj)} + + obj +} + + + +/// Draw diagram coordinate axes. +/// +/// - grid (dictionary): Dictionary specifying the diagram's grid, containing: +/// - `origin: (u-min, v-min)`, the minimum values of elastic coordinates, +/// - `flip: (x, y, xy)`, the axes orientation (see `interpret-axes()`), +/// - `centers: (x-centers, y-centers)`, the physical offsets of each row and each column, +/// - `cell-sizes: (x-sizes, y-sizes)`, the physical sizes of each row and +/// each column. +#let draw-debug-axes(grid, debug: false, floating: true) = { + + let (x-lims, y-lims) = range(2).map(axis => ( + grid.centers.at(axis).at( 0) - grid.cell-sizes.at(axis).at( 0)/2, + grid.centers.at(axis).at(-1) + grid.cell-sizes.at(axis).at(-1)/2, + )) + + let (u-min, v-min) = grid.origin + + let (u-len, v-len) = grid.centers.map(array.len) + if grid.flip.xy { (u-len, v-len) = (v-len, u-len) } + let v-range = range(v-min, v-min + v-len) + let u-range = range(u-min, u-min + u-len) + + if grid.flip.x { u-range = u-range.rev() } + if grid.flip.y { v-range = v-range.rev() } + if grid.flip.xy { (u-range, v-range) = (v-range, u-range) } + + import cetz.draw + let objs = draw.group({ + let (a, b) = array.zip(x-lims, y-lims) + if a == b { b = vector.add(b, (1e-3pt, 1e-3pt)) } + draw.rect(a, b, stroke: DEBUG_COLOR + .5pt) + + draw.set-style(stroke: ( + paint: DEBUG_COLOR, + thickness: .3pt, + dash: "densely-dotted", + )) + + for axis in range(2) { + let swap(a, b) = if axis != 1 { (a, b) } else { (b, a) } + let x-range = (u-range, v-range).at(axis) + let (min, max) = (y-lims, x-lims).at(axis) + for (i, x) in x-range.enumerate() { + // coordinate line + draw.line( + swap(grid.centers.at(axis).at(i), min), + swap(grid.centers.at(axis).at(i), max), + ) + // size bracket + let size = grid.cell-sizes.at(axis).at(i) + draw.rect( + (to: swap(grid.centers.at(axis).at(i), min), rel: swap(-size/2, 0)), + (to: swap(grid.centers.at(axis).at(i), min), rel: swap(+size/2, -1pt)), + fill: DEBUG_COLOR, + stroke: none, + ) + // coordinate label + draw.content( + (to: swap(grid.centers.at(axis).at(i), min), rel: swap(0, -.2em)), + text(fill: DEBUG_COLOR, size: .7em)[#x], + anchor: if axis == 0 { "north" } else { "east" }, + ) + } + } + + if debug { + let (u-label, v-label) = if grid.flip.xy { ($arrow$, $arrow.t.twohead$) } else { ($u$, $v$) } + + let dir-to-arrow(dir) = { + if dir == ltr { $arrow.r$ } + else if dir == rtl { $arrow.l$ } + else if dir == ttb { $arrow.b$ } + else if dir == btt { $arrow.t$ } + } + + draw.content( + (x-lims.at(0), y-lims.at(0)), + pad(0.2em, text(0.5em, DEBUG_COLOR, $(#grid.axes.map(dir-to-arrow).join($,$))$)), + anchor: "north-east" + ) + } + + }) + + if floating { + cetz.draw.floating(objs) + } else { + objs + } +} + +// Find candidate nodes that an edge should snap to +// +// Returns an array of zero or more nodes. False positives are acceptable. +#let find-snapping-nodes(grid, nodes, key) = { + if type(key) == label { + return nodes.filter(node => node.name == key) + } + + if type(key) == array and key.len() == 2 { + + let xy-pos = key + let candidates = nodes.filter(node => { + if node.snap == false { return false } + point-is-in-rect(xy-pos, ( + center: node.pos.xyz, + size: node.size, + )) + }) + + if candidates.len() > 0 { + // filter out nodes with lower snap priority + let max-snap-priority = calc.max(..candidates.map(node => node.snap)) + candidates = candidates.filter(node => node.snap == max-snap-priority) + } + + return candidates + } + + error("Couldn't find node corresponding to #0 in diagram.", key) +} + + +// return a pair of arrays of nodes to which the edge should snap +#let find-nodes-for-edge(grid, nodes, edge) = { + let select-nodes = find-snapping-nodes.with(grid, nodes) + let first-last(x) = (x.at(0), x.at(-1)) + array.zip( + edge.snap-to, + first-last(edge.vertices), + first-last(edge.final-vertices), + ).map(((given, vertex, xy)) => { + if given == none { return () } // user explicitly disabled snapping + let key = map-auto(given, if type(vertex) == label { vertex } else { xy }) + select-nodes(key) + }) +} + +#let draw-diagram( + grid, + nodes, + edges, + debug: 0, +) = { + + for edge in edges { + let nodes = find-nodes-for-edge(grid, nodes, edge) + draw-edge(edge, nodes, debug: debug) + } + + for node in nodes { + draw-node(node, debug: debug) + } + + if debug >= 1 { + draw-debug-axes(grid, debug: debug >= 2) + } + +} + +/// Make diagram contents invisible, with or without affecting layout. Works by +/// wrapping final drawing objects in `cetz.draw.hide`. +/// +/// #example(``` +/// rect(diagram({ +/// fletcher.hide({ +/// node((0,0), [Can't see me]) +/// edge("->") +/// }) +/// node((1,1), [Can see me]) +/// })) +/// ```) +/// +/// - objects (content, array): Diagram objects to hide. +/// - bounds (bool): If `false`, layout is as if the objects were never there; +/// if `true`, the layout treats the objects is present but invisible. +#let hide(objects, bounds: true) = { + if type(objects) == array { objects = objects.join() } + let seq = objects + [] + seq.children.map(child => { + if child.func() == metadata { + let value = child.value + value.post = cetz.draw.hide.with(bounds: bounds) + metadata(value) + } else { + child + } + }).join() +} diff --git a/packages/preview/fletcher/0.5.6/src/edge.typ b/packages/preview/fletcher/0.5.6/src/edge.typ new file mode 100644 index 0000000000..f27fe2bcbc --- /dev/null +++ b/packages/preview/fletcher/0.5.6/src/edge.typ @@ -0,0 +1,1117 @@ +#import "utils.typ": * +#import "marks.typ": * +#import "coords.typ": vector-polar-with-xy-or-uv-length, resolve, default-ctx + +#let EDGE_FLAGS = ( + "dashed": (dash: "dashed"), + "dotted": (dash: "dotted"), + "double": (extrude: (-2, +2)), + "triple": (extrude: (-4, 0, +4)), + "crossing": (crossing: true), + "wave": (decorations: "wave"), + "zigzag": (decorations: "zigzag"), + "coil": (decorations: "coil"), +) + +#let LINE_ALIASES = ( + "-": (:), + "=": EDGE_FLAGS.double, + "==": EDGE_FLAGS.triple, + "--": EDGE_FLAGS.dashed, + "..": EDGE_FLAGS.dotted, + "~": EDGE_FLAGS.wave, + " ": (extrude: ()), +) + +#let MARK_SYMBOL_ALIASES = ( + (sym.arrow.r): "->", + (sym.arrow.l): "<-", + (sym.arrow.r.l): "<->", + (sym.arrow.long.r): "->", + (sym.arrow.long.l): "<-", + (sym.arrow.long.r.l): "<->", + (sym.arrow.double.r): "=>", + (sym.arrow.double.l): "<=", + (sym.arrow.double.r.l): "<=>", + (sym.arrow.double.long.r): "=>", + (sym.arrow.double.long.l): "<=", + (sym.arrow.double.long.r.l): "<=>", + (sym.arrow.r.tail): ">->", + (sym.arrow.l.tail): "<-<", + (sym.arrow.twohead): "->>", + (sym.arrow.twohead.r): "->>", + (sym.arrow.twohead.l): "<<-", + (sym.arrow.bar): "|->", + (sym.arrow.bar.double): "|=>", + (sym.arrow.hook.r): "hook->", + (sym.arrow.hook.l): "<-hook'", + (sym.arrow.squiggly.r): "~>", + (sym.arrow.squiggly.l): "<~", + (sym.arrow.long.squiggly.r): "~>", + (sym.arrow.long.squiggly.l): "<~", +) + + +#let interpret-marks(marks) = { + marks = marks.enumerate().map(((i, mark)) => { + resolve-mark(mark, defaults: ( + pos: i/calc.max(1, marks.len() - 1), + rev: i == 0, + )) + }).filter(mark => mark != none) // drop empty marks + + marks = marks.map(mark => { + mark.tip = (mark.pos == 0) == mark.rev + if (mark.pos not in (0, 1)) { mark.tip = none } + mark + }) + + marks +} + + + +/// Parse and interpret the marks argument provided to `edge()`. Returns a +/// dictionary of processed `edge()` arguments. +/// +/// - arg (string, array): +/// Can be a string, (e.g. `"->"`, `"<=>"`), etc, or an array of marks. +/// A mark can be a string (e.g., `">"` or `"head"`, `"x"` or `"cross"`) or a dictionary containing the keys: +/// - `kind` (required) the mark name, e.g. `"solid"` or `"bar"` +/// - `pos` the position along the edge to place the mark, from 0 to 1 +/// - `rev` whether to reverse the direction +/// - parameters specific to the kind of mark, e.g., `size` or `sharpness` +/// -> dictiony +#let interpret-marks-arg(arg) = { + if type(arg) == array { return (marks: interpret-marks(arg)) } + + if type(arg) == symbol { + if str(arg) in MARK_SYMBOL_ALIASES { arg = MARK_SYMBOL_ALIASES.at(arg) } + else { error("Unrecognised marks symbol #0.", arg) } + } + + assert(type(arg) == str) + let text = arg + + let mark-names = MARKS.get().keys().sorted(key: i => -i.len()) + let LINES = LINE_ALIASES.keys().sorted(key: i => -i.len()) + + let eat(arg, options) = { + for option in options { + if arg.starts-with(option) { + return (arg.slice(option.len()), option) + } + } + return (arg, none) + } + + let marks = () + let lines = () + + let mark + let line + let flip + + // first mark, [<]-x->> + (text, mark) = eat(text, mark-names) + + // flip modifier, hook['] + (text, flip) = eat(text, ("'",)) + if flip != none { mark += flip } + + marks.push(mark) + + let parse-error(suggestion) = error("Invalid marks shorthand #0. Try #1.", arg, suggestion) + + while true { + // line, <[-]x->> + (text, line) = eat(text, LINES) + if line == none { + let suggestion = arg.slice(0, -text.len()) + "-" + text + parse-error(suggestion) + } + lines.push(line) + + // subsequent mark, <-[x]->> + (text, mark) = eat(text, mark-names) + + // flip modifier, hook['] + (text, flip) = eat(text, ("'",)) + if flip != none { mark += flip } + + marks.push(mark) + + if text == "" { break } + if mark == none { + // text remains that was not recognised as mark + let suggestion = marks.intersperse(lines.at(0)).join() + parse-error(suggestion) + } + } + + + if lines.dedup().len() > 1 { + // different line styles were mixed + let suggestion = marks.intersperse(lines.at(0)).join() + parse-error(suggestion) + } + let line = lines.at(0) + + + // make classic math arrows slightly larger on double/triple stroked lines + if line == "=" { + marks = marks.map(mark => { + if mark == none { return } + ( + ">": (inherit: "doublehead", rev: false), + "<": (inherit: "doublehead", rev: true), + ).at(mark, default: mark) + }) + } else if line == "==" { + marks = marks.map(mark => { + if mark == ">" { (inherit: "triplehead", rev: false) } + else if mark == "<" { (inherit: "triplehead", rev: true) } + else {mark} + }) + } + + return ( + marks: interpret-marks(marks), + ..LINE_ALIASES.at(lines.at(0)) + ) +} + + + +/// Interpret the positional arguments given to an `edge()` +/// +/// Tries to intelligently distinguish the `from`, `to`, `marks`, and `label` +/// arguments based on the argument types. +/// +/// Generally, the following combinations are allowed: +/// +/// ``` +/// edge(.., .., ..) +/// = () or (to) or (from, to) or (from, ..vertices, to) +/// = (marks, label) or (label, marks) or (marks) or (label) or () +/// = any number of options specified as strings +/// ``` +#let interpret-edge-args(args, options) = { + if args.named().len() > 0 { + error("Unexpected named argument(s) #..0.", args.named().keys()) + } + + let new-options = (:) + let pos = args.pos() + + // predicates to detect the kind of a positional argument + let is-coord(arg) = type(arg) in (array, dictionary, label) or arg == auto + let is-rel-coord(arg) = is-coord(arg) or ( + type(arg) == str and arg.match(regex("^[utdblrnsew,]+$")) != none + ) + let is-arrow-symbol(arg) = type(arg) == symbol and str(arg) in MARK_SYMBOL_ALIASES + let is-edge-flag(arg) = type(arg) == str and arg in EDGE_FLAGS + let is-label-side(arg) = type(arg) == alignment + + let maybe-marks(arg) = type(arg) == str and not is-edge-flag(arg) or is-arrow-symbol(arg) + let maybe-label(arg) = type(arg) != str and not is-arrow-symbol(arg) and not is-coord(arg) + + let peek(x, ..predicates) = { + let preds = predicates.pos() + x.len() >= preds.len() and x.zip(preds).all(((arg, pred)) => pred(arg)) + } + + let assert-not-set(key, default, ..value) = { + if options.at(key) == default { return } + error( + "#0 specified twice with positional argument(s) #..pos and named argument #named.", + key, pos: value.pos().map(repr), named: repr(options.at(key)), + ) + } + + let coords = () + let has-first-coord = false + let has-tail-coords = false + + // First argument(s) are coordinates + // (, *) => (, *) + // (*) => (auto, *) + if peek(pos, is-coord) { + coords.push(pos.remove(0)) + has-first-coord = true + } + while peek(pos, is-rel-coord) { + if type(pos.at(0)) == str { + coords += pos.remove(0).split(",") + } else { + coords.push(pos.remove(0)) + } + has-tail-coords = true + } + + // Allow marks argument to be in between two coordinates + // (, , ) + // (, ) => (auto, , ) + if not has-tail-coords and peek(pos, maybe-marks, is-rel-coord) { + new-options.marks = pos.remove(0) + assert-not-set("marks", (), new-options.marks) + + coords.push(pos.remove(0)) + has-tail-coords = true + + if peek(pos, is-rel-coord) { + error("Marks argument #0 must appear after edge vertices (or between them if there are only two).", repr(new-options.marks)) + } + } + if coords.len() > 0 or options.vertices.len() == 0 { + assert-not-set("vertices", (), ..coords) + if not has-tail-coords { coords = (auto, ..coords) } + if not has-first-coord { coords = (auto, ..coords) } + new-options.vertices = coords + } + + + // Allow label side argument anywhere after coordinates + let i = pos.position(is-label-side) + if i != none { + new-options.label-side = pos.remove(i) + assert-not-set("label-side", auto, new-options.label-side) + } + + + // Accept marks and labels after vertices + // (.., , ), +/// node((1,0.6), $B$, name: ), +/// edge(, , "->"), +/// node((rel: (1, 0), to: ), $C$) +/// ) +/// ``` +/// +/// Node names are _labels_ (instead of strings like in CeTZ) to disambiguate +/// them from other positional string arguments given to `edge()`. If a string +/// is given, it is converted. (Since these labels are never inserted into the +/// final document, they cannot interfere with other document labels.) +/// +/// - label (content): Content to display inside the node. +/// +/// If a node is larger than its label, you can wrap the label in `align()` to +/// control the label alignment within the node. +/// +/// ```example +/// #diagram( +/// node((0,0), align(bottom + left)[¡Hola!], +/// width: 3cm, height: 2cm, fill: yellow), +/// ) +/// ``` +/// +/// - inset (length): Padding between the node's content and its outline. +/// +/// In debug mode, the inset is visualised by a thin green outline. +/// +/// ```example +/// #diagram( +/// debug: 3, +/// node-stroke: 1pt, +/// node((0,0), [Hello,]), +/// edge(), +/// node((1,0), [World!], inset: 10pt), +/// ) +/// ``` +/// +/// Defaults to #the-param[diagram][node-inset]. +/// +/// - outset (length): Margin between the node's bounds to the anchor +/// points for connecting edges. +/// +/// This does not affect node layout, only how closely edges connect to the +/// node. +/// +/// In debug mode, the outset is visualised by a thin green outline. +/// +/// ```example +/// #diagram( +/// debug: 3, +/// node-stroke: 1pt, +/// node((0,0), [Hello,]), +/// edge(), +/// node((1,0), [World!], outset: 10pt), +/// ) +/// ``` +/// +/// Defaults to #the-param[diagram][node-outset]. +/// +/// - width (length, auto): Width of the node. If `auto`, the node's width is +/// the width of the node #param[node][label], plus twice the +/// #param[node][inset]. +/// +/// If the width is not `auto`, you can use `align` to control the placement of the node's #param[node][label]. +/// +/// - height (length, auto): Height of the node. If `auto`, the node's height is the height of the node #param[node][label], plus twice the #param[node][inset]. +/// +/// If the height is not `auto`, you can use `align` to control the placement of the node's #param[node][label]. +/// +/// - enclose (array): Positions or names of other nodes to enclose by enlarging +/// this node. +/// +/// If given, causes the node to resize so that its bounding rectangle +/// surrounds the given nodes. The center #param[node][pos] does not affect +/// the node's position if `enclose` is given, but still affects connecting +/// edges. +/// +/// ```example +/// #diagram( +/// node-stroke: 1pt, +/// node((0,0), [ABC], name: ), +/// node((1,1), [XYZ], name: ), +/// node( +/// text(teal)[Node group], stroke: teal, +/// enclose: (, ), name: ), +/// edge(, (3,0.5), stroke: teal), +/// ) +/// ``` +/// +/// - shape (rect, circle, function): Shape of the node's outline. If `auto`, +/// one of `rect` or `circle` is chosen depending on the aspect ratio of the +/// node's label. +/// +/// Other shapes are defined in the `fletcher.shapes` +/// submodule, including +/// #{ +/// dictionary(fletcher.shapes).pairs() +/// .filter(((k, v)) => type(v) != module) +/// .map(((k, v)) => [#raw(k)]) +/// .join(last: [, and ])[, ] +/// }. +/// +/// Custom shapes should be specified as a function `(node, extrude, ..parameters) => (..)` +/// which returns `cetz` objects. +/// - The `node` argument is a dictionary containing the node's attributes, +/// including its dimensions (`node.size`), and other options (such as +/// `node.corner-radius`). +/// - The `extrude` argument is a length which the shape outline should be +/// extruded outwards by. This serves two functions: to support automatic +/// edge anchoring with a non-zero node `outset`, and to create multi-stroke +/// effects using the `extrude` node option. +/// See the +/// #link("https://github.com/Jollywatt/typst-fletcher/blob/master/src/shapes.typ", +/// ```plain src/shapes.typ```) source file for example shape implementations. +/// +/// Defaults to #the-param[diagram][node-shape]. +/// +/// - stroke (stroke): Stroke style for the node outline. +/// +/// Defaults to #the-param[diagram][node-stroke]. +/// +/// - fill (paint): Fill style of the node. The fill is drawn within the node +/// outline as defined by the first #param(full: false)[node][extrude] value. +/// +/// Defaults to #the-param[diagram][node-fill]. +/// +/// - defocus (number): Strength of the "defocus" adjustment for connectors +/// incident with this node. +/// +/// This affects how connectors attach to non-square nodes. If `0`, the +/// adjustment is disabled and connectors are always directed at the node's +/// exact center. +/// +/// #stack( +/// dir: ltr, +/// spacing: 1fr, +/// ..(0.2, 0, -1).enumerate().map(((i, defocus)) => { +/// fletcher.diagram(spacing: 8mm, { +/// node((i, 0), raw("defocus: "+str(defocus)), stroke: black, defocus: defocus) +/// for y in (-1, +1) { +/// edge((i - 1, y), (i, 0)) +/// edge((i, y), (i, 0)) +/// edge((i + 1, y), (i, 0)) +/// } +/// }) +/// }) +/// ) +/// +/// Defaults to #the-param[diagram][node-defocus]. +/// +/// - extrude (array): Draw strokes around the node at the given offsets to +/// obtain a multi-stroke effect. Offsets may be numbers (specifying multiples +/// of the stroke's thickness) or lengths. +/// +/// The node's fill is drawn within the boundary defined by the first offset in +/// the array. +/// +/// #diagram( +/// node-stroke: 1pt, +/// node-fill: red.lighten(70%), +/// node((0,0), `(0,)`), +/// node((1,0), `(0, 2)`, extrude: (0, 2)), +/// node((2,0), `(2, 0)`, extrude: (2, 0)), +/// node((3,0), `(0, -2.5, 2mm)`, extrude: (0, -2.5, 2mm)), +/// ) +/// +/// See also #the-param[edge][extrude]. +/// +/// - corner-radius (length): Radius of rounded corners, if supported by the +/// node #param[node][shape]. +/// +/// Defaults to #the-param[diagram][node-corner-radius]. +/// +/// - layer (number): Layer on which to draw the node. +/// +/// Objects on a higher `layer` are drawn on top of objects on a lower +/// `layer`. Objects on the same layer are drawn in the order they are passed +/// to `diagram()`. +/// +/// Defaults to layer `0` unless the node #param[node][enclose]s +/// points, in which case `layer` defaults to `-1`. +/// +/// - snap (number, false): The snapping priority for edges connecting to this +/// node. A higher priority means edges will automatically snap to this node +/// over other overlapping nodes. If `false`, edges only snap to this node if +/// manually set with #the-param[edge][snap-to]. +/// +/// Setting a lower value is useful if the node #param[node][enclose]s other +/// nodes that you want to snap to first. +/// +/// - post (function): Callback function to intercept `cetz` objects before they +/// are drawn to the canvas. +/// +/// This can be used to hide elements without affecting layout (for use with +/// #link("https://github.com/touying-typ/touying")[Touying], for example). +/// The `hide()` function also helps for this purpose. +/// +#let node( + ..args, + pos: auto, + name: none, + label: none, + inset: auto, + outset: auto, + fill: auto, + stroke: auto, + extrude: (0,), + width: auto, + height: auto, + radius: auto, + enclose: (), + corner-radius: auto, + shape: auto, + defocus: auto, + snap: 0, + layer: auto, + post: x => x, +) = { + if args.named().len() > 0 { error("Unexpected named argument(s) #..0.", args.named().keys()) } + if args.pos().len() > 2 { error("`node()` can have up to two positional arguments; the position and label.") } + + // interpret first two positional arguments + if args.pos().len() == 2 { + (pos, label) = args.pos() + } else if args.pos().len() == 1 { + let arg = args.pos().at(0) + // one positional argument may be the coordinate or the label + if type(arg) in (array, dictionary, label) { + pos = arg + label = none + } else { + pos = if enclose.len() > 0 { auto } else { () } + label = arg + } + } + + let extrude = as-array(extrude).map(as-number-or-length.with( + message: "`extrude` must be a number, length, or an array of those" + )) + + if not (type(snap) in (int, float) or snap == false) { + error("`snap` must be a number specifying priority or `false` to disable; got #0.", repr(snap)) + } + + metadata(( + class: "node", + pos: (raw: pos), + name: pass-none(as-label)(name), + label: label, + inset: inset, + outset: outset, + enclose: as-array(enclose), + size: (width, height), + radius: radius, + shape: shape, + stroke: stroke, + fill: fill, + corner-radius: corner-radius, + defocus: defocus, + extrude: extrude, + layer: layer, + snap: snap, + post: post, + )) +} + + + +#let resolve-node-options(node, options) = { + + node.stroke = map-auto(node.stroke, options.node-stroke) + if node.stroke != none { + let base-stroke = pass-none(stroke-to-dict)(options.node-stroke) + node.stroke = base-stroke + stroke-to-dict(node.stroke) + } + node.stroke = pass-none(stroke)(node.stroke) // guarantee stroke or none + + node.fill = map-auto(node.fill, options.node-fill) + node.corner-radius = map-auto(node.corner-radius, options.node-corner-radius) + node.inset = map-auto(node.inset, options.node-inset).to-absolute() + node.outset = map-auto(node.outset, options.node-outset).to-absolute() + node.defocus = map-auto(node.defocus, options.node-defocus) + + node.size = node.size.map(pass-auto(length.to-absolute)) + node.radius = pass-auto(length.to-absolute)(node.radius) + + node.shape = map-auto(node.shape, options.node-shape) + + if node.shape == auto { + if node.radius != auto { node.shape = "circle" } + if node.size != (auto, auto) { node.shape = "rect" } + } + + let thickness = if node.stroke == none { 1pt } else { + map-auto(node.stroke.thickness, 1pt) + } + + node.extrude = node.extrude.map(d => { + if type(d) == length { d } + else { d*thickness } + }).map(length.to-absolute) + + if type(node.outset) in (int, float) { + node.outset *= thickness + } + + let default-layer = if node.enclose.len() > 0 { -1 } else { 0 } + node.layer = map-auto(node.layer, default-layer) + + node +} + + +/// Measure node labels with the style context and resolve node shapes. +/// +/// Widths and heights that are `auto` are determined by measuring the size of +/// the node's label. +#let measure-node-size(node) = { + + // Width and height explicitly given + if auto not in node.size { + let (width, height) = node.size + node.radius = vector-len((width/2, height/2)) + node.aspect = width/height + + // Radius explicitly given + } else if node.radius != auto { + node.size = (2*node.radius, 2*node.radius) + node.aspect = 1 + + // Width and/or height set to auto + } else { + + let inner-size = node.size.map(pass-auto(i => i - 2*node.inset)) + + // Determine physical size of node content + let (width, height) = measure(box( + node.label, + width: inner-size.at(0), + height: inner-size.at(1), + )) + + // let (width, height) = node.inner-size + let radius = vector-len((width/2, height/2)) // circumcircle + + node.aspect = if width == 0pt or height == 0pt { 1 } else { width/height } + + if node.shape == auto { + let is-roundish = calc.max(node.aspect, 1/node.aspect) < 1.5 + node.shape = if is-roundish { "circle" } else { "rect" } + } + + // Add node inset + if radius != 0pt { radius += node.inset } + if width != 0pt and height != 0pt { + width += 2*node.inset + height += 2*node.inset + } + + // If width/height/radius is auto, set to measured width/height/radius + node.size = node.size.zip((width, height)) + .map(((given, measured)) => map-auto(given, measured)) + node.radius = map-auto(node.radius, radius) + + } + + if node.shape in (circle, "circle") { node.shape = shapes.circle } + if node.shape in (rect, "rect") { node.shape = shapes.rect } + + node +} + + +/// Process the `enclose` options of an array of nodes. +#let resolve-node-enclosures(nodes, ctx) = { + + let nodes = nodes.map(node => { + // not an enclose node, leave as is + if node.enclose.len() == 0 { return node } + + let enclosed-vertices = node.enclose.map(key => { + let near-node = find-node(nodes, key) + + // if near-node == none or near-node.pos.raw == auto { + if near-node == none { + // if enclosed point doesn't resolve to a node + // enclose the point itself + let (_, coord) = resolve(ctx, key) + (coord,) + } else { + // if enclosed point resolves to a node + // enclose its bounding box + let (x, y) = near-node.pos.xyz + if "bounding-center" in near-node { + (x, y) = near-node.bounding-center + } + let (w, h) = near-node.size + ( + (x - w/2, y - h/2), + (x - w/2, y + h/2), + (x + w/2, y - h/2), + (x + w/2, y + h/2), + ) + } + }).join() + + let (center, size) = bounding-rect(enclosed-vertices) + + node.pos.xyz = center + node.bounding-center = center + node.size = vector-max( + size.map(d => d + node.inset*2), + node.size, + ) + node.resolved-enclose = true + node.shape = shapes.rect // TODO: support different node shapes with enclose + + node + }) + + nodes +} + + +#let register-node-anchors(ctx, node) = { + if node.name == none { return ctx } + let node-origin = node.pos.at(ctx.target-system) + let calculate-anchors + + if ctx.target-system == "uv" { + // anchors don't make sense in elastic coordinates + // so just give access to the origin, but make + // everything else indeterminate (NAN_COORD) + calculate-anchors = (a) => { + if a == () { + ("default",) + } else { + if a == "default" { + node-origin + } else { + NAN_COORD + } + } + } + } else if ctx.target-system == "xyz" { + if is-nan-vector(node-origin) { return ctx } + + // do not compute anchors for enclose nodes before they have been resolved + if node.enclose.len() > 0 and "resolved-enclose" not in node { + calculate-anchors = (k) => NAN_COORD + } else { + let cetz-obj = (node.shape)(node, node.outset).at(0) + calculate-anchors = (k) => { + if k == "default" { return node-origin } + let a = ((cetz-obj)(ctx).anchors)(k) + if not is-number-vector(a) { return a } + a.at(1) *= -1 // CETZ Y AXIS + vector.add( + node-origin, // node center + vector-2d(vector.scale(a, ctx.length)), + ) + } + } + } + + ctx.nodes.insert(str(node.name), (anchors: calculate-anchors)) + ctx + +} + +/// Resolve node positions to a target coordinate system in sequence. +/// +/// CeTZ-style coordinate expressions work, with the previous coordinate `()` +/// referring to the resolved position of the previous node. +/// +/// The resolved coordinates are added to each node's `pos` dictionary. +/// +/// - nodes (array): Array of nodes, each a dictionary containing a `pos` entry, +/// which should be a CeTZ-compatible coordinate expression. +/// - ctx (dictionary): CeTZ-style context to be passed to `resolve(ctx, ..)`. +/// This must contain `target-system`, and optionally `grid`. +/// -> array +#let resolve-node-coordinates(nodes, ctx: (:)) = { + let ctx = default-ctx + ctx + let system = ctx.target-system + + // nodes which enclose other points are allowed to have + // position `auto`; they are placed after normal nodes + let auto-placed-nodes = () + + let coord + for (i, node) in nodes.enumerate() { + + if node.pos.raw == auto { + // this node encloses other nodes + if ctx.target-system == "xyz" { + // resolve center from uv coords, if possible + if not is-nan-vector(node.pos.uv) { + (ctx, coord) = resolve(ctx, node.pos.uv) + } + } else { + // otherwise, we must find bounding box center later + auto-placed-nodes.push(i) + coord = NAN_COORD + } + } else { + // this node has a center that may be resolvable + (ctx, coord) = resolve(ctx, node.pos.raw) + } + + node.pos.insert(ctx.target-system, coord) + nodes.at(i) = node + ctx = register-node-anchors(ctx, node) + } + + for i in auto-placed-nodes { + let node = nodes.at(i) + + // the center of enclosing nodes defaults to the center + // of the bounding rect of the points they enclose + let enclosed-points = node.enclose.map(key => { + let node = find-node(nodes, key) + if node == none { + // enclose key doesn't correspond to node + // interpret key as real coordinate + let (_, coord) = resolve(ctx, key) + coord + } else { + node.pos.at(ctx.target-system) + } + }).filter(coord => not is-nan-vector(coord)) + + let coord = if enclosed-points.len() > 0 { + bounding-rect(enclosed-points).center + } else { NAN_COORD } + + nodes.at(i).pos.insert(ctx.target-system, coord) + + } + + (ctx, nodes) +} diff --git a/packages/preview/fletcher/0.5.6/src/shapes.typ b/packages/preview/fletcher/0.5.6/src/shapes.typ new file mode 100644 index 0000000000..0336124248 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/src/shapes.typ @@ -0,0 +1,469 @@ +#import "deps.typ": cetz +#import cetz: draw, vector + +/// The standard rectangle node shape. +/// +/// A string `"rect"` or the element function `rect` given to +/// #the-param[node][shape] are interpreted as this shape. +/// +/// #diagram( +/// node-stroke: green, +/// node-fill: green.lighten(90%), +/// node((0,0), `rect`, shape: fletcher.shapes.rect) +/// ) +/// +#let rect(node, extrude) = { + let r = node.corner-radius + let (w, h) = node.size.map(i => i/2 + extrude) + draw.rect( + (-w, -h), (+w, +h), + radius: if r != none { r + extrude }, + ) +} + +/// The standard circle node shape. +/// +/// A string `"circle"` or the element function `circle` given to +/// #the-param[node][shape] are interpreted as this shape. +/// +/// #diagram( +/// node-stroke: red, +/// node-fill: red.lighten(90%), +/// node((0,0), `circle`, shape: fletcher.shapes.circle) +/// ) +/// +#let circle(node, extrude) = draw.circle((0, 0), radius: node.radius + extrude) + +/// An elliptical node shape. +/// +/// #diagram( +/// node-stroke: orange, +/// node-fill: orange.lighten(90%), +/// node((0,0), `ellipse`, shape: fletcher.shapes.ellipse) +/// ) +/// +/// - scale (number): Scale factor for ellipse radii. +#let ellipse(node, extrude, scale: 1) = { + draw.circle( + (0, 0), + radius: vector.scale(node.size, 0.5).map(x => x*scale + extrude), + ) +} + + +/// A capsule node shape. +/// +/// #diagram( +/// node-stroke: teal, +/// node-fill: teal.lighten(90%), +/// node((0,0), `pill`, shape: fletcher.shapes.pill) +/// ) +/// +#let pill(node, extrude) = { + let size = node.size.map(i => i + 2*extrude) + draw.rect( + vector.scale(size, -0.5), + vector.scale(size, +0.5), + radius: calc.min(..size)/2, + ) +} + + +/// A slanted rectangle node shape. +/// +/// #diagram( +/// node-stroke: olive, +/// node-fill: olive.lighten(90%), +/// node((0,0), `parallelogram`, shape: fletcher.shapes.parallelogram) +/// ) +/// +/// - angle (angle): Angle of the slant, `0deg` is a rectangle. Don't set to +/// `90deg` unless you want your document to be larger than the solar system. +/// +/// - fit (number): Adjusts how comfortably the parallelogram fits the label's bounding box. +/// +/// #for (i, fit) in (0, 0.5, 1).enumerate() { +/// let s = fletcher.shapes.parallelogram.with(fit: fit, angle: 35deg) +/// let l = box( +/// stroke: (dash: "dashed", thickness: 0.5pt), +/// inset: 10pt, +/// raw("fit: " + repr(fit)), +/// ) +/// diagram(node((i, 0), l, +/// inset: 0pt, +/// shape: s, +/// stroke: olive, +/// fill: olive.lighten(90%), +/// )) +/// h(5mm) +/// } +#let parallelogram(node, extrude, flip: false, angle: 20deg, fit: 0.8) = { + let (w, h) = node.size + if flip { (w, h) = (h, w) } + + let (x, y) = (w/2 + extrude*calc.cos(angle), h/2 + extrude) + let δ = h/2*calc.tan(angle) + let μ = extrude*calc.tan(angle) + x += δ*fit + + let verts = ( + (-x - μ, -y), + (+x - δ, -y), + (+x + μ, +y), + (-x + δ, +y), + ) + + if flip { verts = verts.map(((i, j)) => (j, i)) } + + let obj = draw.line(..verts, close: true) + draw.group(obj) // enables cetz border anchors +} + + +/// An isosceles trapezium node shape. +/// +/// #diagram( +/// node-stroke: green, +/// node-fill: green.lighten(90%), +/// node((0,0), `trapezium`, shape: fletcher.shapes.trapezium) +/// ) +/// +/// - angle (angle): Angle of the slant, `0deg` is a rectangle. Don't set to +/// `90deg` unless you want your document to be larger than the solar system. +/// +/// - fit (number): Adjusts how comfortably the trapezium fits the label's bounding box. +/// +/// #for (i, fit) in (0, 0.5, 1).enumerate() { +/// let s = fletcher.shapes.trapezium.with(fit: fit, angle: 35deg) +/// let l = box( +/// stroke: (dash: "dashed", thickness: 0.5pt), +/// inset: 10pt, +/// raw("fit: " + repr(fit)), +/// ) +/// diagram(node((i, 0), l, +/// inset: 0pt, +/// shape: s, +/// stroke: green, +/// fill: green.lighten(90%), +/// )) +/// h(5mm) +/// } +/// +/// - dir (top, bottom, left, right): The side the shorter parallel edge is on. +#let trapezium(node, extrude, dir: top, angle: 20deg, fit: 0.8) = { + assert(dir in (top, bottom, left, right)) + + let flip = dir in (right, left) // flip along diagonal line x = y + let rotate = dir in (bottom, left) // rotate 180deg + + let (w, h) = node.size + if flip { (w, h) = (h, w) } + + let (x, y) = (w/2 + extrude*calc.cos(angle), h/2 + extrude) + let δ = h/2*calc.tan(angle) + let μ = extrude*calc.tan(angle) + x += δ*fit + + let verts = ( + (-x - μ, -y), + (+x + μ, -y), + (+x - δ, +y), + (-x + δ, +y), + ) + + if flip { verts = verts.map(((i, j)) => (j, i)) } + if rotate { verts = verts.map(((i, j)) => (-i, -j)) } + + let obj = draw.line(..verts, close: true) + draw.group(obj) // enables cetz border anchors +} + +/// A rhombus node shape. +/// +/// #diagram( +/// node-stroke: purple, +/// node-fill: purple.lighten(90%), +/// node((0,0), `diamond`, shape: fletcher.shapes.diamond) +/// ) +/// +/// - fit (number): Adjusts how comfortably the diamond fits the label's bounding box. +/// +/// #for (i, fit) in (0, 0.5, 1).enumerate() { +/// let s = fletcher.shapes.diamond.with(fit: fit) +/// let l = box( +/// stroke: (dash: "dashed", thickness: 0.5pt), +/// inset: 10pt, +/// raw("fit: " + repr(fit)), +/// ) +/// diagram(node((i, 0), l, +/// inset: 0pt, +/// shape: s, +/// stroke: purple, +/// fill: purple.lighten(90%), +/// )) +/// h(5mm) +/// } +#let diamond(node, extrude, fit: 0.5) = { + let (w, h) = node.size + let φ = calc.atan2(w/1pt, h/1pt) + let x = w/2*(1 + fit) + extrude/calc.sin(φ) + let y = h/2*(1 + fit) + extrude/calc.cos(φ) + let obj = draw.line( + (-x, 0pt), + (0pt, -y), + (+x, 0pt), + (0pt, +y), + close: true, + ) + draw.group(obj) // enables cetz border anchors +} + +/// An isosceles triangle node shape. +/// +/// One of #param[triangle][angle] or #param[triangle][aspect] may be given, but +/// not both. The triangle's base coincides with the label's base and widens to +/// enclose the label; see https://www.desmos.com/calculator/i4i9svunj4. +/// +/// #diagram( +/// node-stroke: fuchsia, +/// node-fill: fuchsia.lighten(90%), +/// node((0,0), `triangle`, shape: fletcher.shapes.triangle) +/// ) +/// +/// - dir (top, bottom, left, right): Direction the triangle points. +/// - aspect (number, auto): Aspect ratio of triangle, or the ratio of its base +/// to its height. +/// - angle (angle, auto): Angle of the triangle opposite the base. +/// - fit (number): Adjusts how comfortably the triangle fits the label's bounding box. +/// +/// #for (i, fit) in (0, 0.5, 1).enumerate() { +/// let s = fletcher.shapes.triangle.with(fit: fit, angle: 120deg) +/// let l = box( +/// stroke: (dash: "dashed", thickness: 0.5pt), +/// inset: 10pt, +/// raw("fit: " + repr(fit)), +/// ) +/// diagram(node((i, 0), l, +/// inset: 0pt, +/// shape: s, +/// stroke: fuchsia, +/// fill: fuchsia.lighten(90%), +/// )) +/// h(5mm) +/// } +#let triangle(node, extrude, dir: top, angle: auto, aspect: auto, fit: 0.8) = { + assert(dir in (top, bottom, left, right)) + + let flip = dir in (right, left) // flip along diagonal line x = y + let rotate = dir in (bottom, left) // rotate 180deg + + let (w, h) = node.size + if flip { (w, h) = (h, w) } + + if angle == auto and aspect == auto { aspect = w/h } + if angle == auto { angle = 2*calc.atan(aspect/2) } + if aspect == auto { aspect = 2*calc.tan(angle/2) } + + let a = aspect*h/2 + fit*w/2 + let b = (a + fit*w/2)/aspect + + a += extrude*calc.tan(45deg + angle/4) + b += extrude/calc.cos(90deg - angle/2) + + let verts = ( + (-a, -h/2 - extrude), + (+a, -h/2 - extrude), + (0, +b), + ) + + if flip { verts = verts.map(((i, j)) => (j, i)) } + if rotate { verts = verts.map(((i, j)) => (-i, -j)) } + + let obj = draw.line(..verts, close: true) + draw.group(obj) // enables cetz border anchors +} + + +/// A pentagonal house-like node shape. +/// +/// #diagram( +/// node-stroke: eastern, +/// node-fill: eastern.lighten(90%), +/// node((0,0), `house`, shape: fletcher.shapes.house) +/// ) +/// +/// - dir (top, bottom, left, right): Direction of the roof of the house. +/// - angle (angle): The slant of the roof. A plain rectangle is `0deg`, and +/// `90deg` is a sky scraper stretching past Pluto. +#let house(node, extrude, dir: top, angle: 10deg) = { + let flip = dir in (right, left) // flip along diagonal line x = y + let rotate = dir in (bottom, left) // rotate 180deg + + let (w, h) = node.size + if flip { (w, h) = (h, w) } + + let (x, y) = (w/2 + extrude, h/2 + extrude) + let a = h/2 + extrude*calc.tan(45deg - angle/2) + let b = h/2 + w/2*calc.tan(angle) + extrude/calc.cos(angle) + + let verts = ( + (-x, -y), + (-x, a), + (0pt, b), + (+x, a), + (+x, -y), + ) + + if flip { verts = verts.map(((i, j)) => (j, i)) } + if rotate { verts = verts.map(((i, j)) => (-i, -j)) } + + let obj = draw.line(..verts, close: true) + draw.group(obj) // enables cetz border anchors +} + + + + +/// A chevron node shape. +/// +/// #diagram( +/// node-stroke: yellow, +/// node-fill: yellow.lighten(90%), +/// node((0,0), `chevron`, shape: fletcher.shapes.chevron) +/// ) +/// +/// - dir (top, bottom, left, right): Direction the chevron points. +/// - angle (angle): The slant of the arrow. A plain rectangle is `0deg`. +/// - fit (number): Adjusts how comfortably the chevron fits the label's bounding box. +/// +/// #for (i, fit) in (0, 0.5, 1).enumerate() { +/// let s = fletcher.shapes.chevron.with(fit: fit) +/// let l = box( +/// stroke: (dash: "dashed", thickness: 0.5pt), +/// inset: 10pt, +/// raw("fit: " + repr(fit)), +/// ) +/// diagram(node((i, 0), l, +/// inset: 0pt, +/// shape: s, +/// stroke: yellow, +/// fill: yellow.lighten(90%), +/// )) +/// h(5mm) +/// } +#let chevron(node, extrude, dir: right, angle: 30deg, fit: 0.8) = { + let flip = dir in (right, left) // flip along diagonal line x = y + let rotate = dir in (bottom, left) // rotate 180deg + + let (w, h) = node.size + if flip { (w, h) = (h, w) } + + let (x, y) = (w/2 + extrude, h/2 + extrude) + let c = w/2*calc.tan(angle) + let α = extrude*calc.tan(45deg - angle/2) + let β = extrude*calc.tan(45deg + angle/2) + let ɣ = extrude/calc.cos(angle) - c + let δ = c*fit + let y = h/2 + c*fit + + let verts = ( + (-x, +y + α - c), + (0pt, +y + ɣ + c), + (+x, +y + α - c), + + (+x, -y - β), + (0pt, -y - ɣ), + (-x, -y - β), + ) + + if flip { verts = verts.map(((i, j)) => (j, i)) } + if rotate { verts = verts.map(((i, j)) => (-i, -j)) } + + + let obj = draw.line(..verts, close: true) + draw.group(obj) // enables cetz border anchors +} + + + + + +/// An (irregular) hexagon node shape. +/// +/// #diagram( +/// node-stroke: aqua, +/// node-fill: aqua.lighten(90%), +/// node((0,0), `hexagon`, shape: fletcher.shapes.hexagon) +/// ) +/// +/// - angle (angle): Half the exterior angle, `0deg` being a rectangle. +/// - fit (number): Adjusts how comfortably the hexagon fits the label's bounding box. +/// +/// #for (i, fit) in (0, 0.5, 1).enumerate() { +/// let s = fletcher.shapes.hexagon.with(fit: fit) +/// let l = box( +/// stroke: (dash: "dashed", thickness: 0.5pt), +/// inset: 10pt, +/// raw("fit: " + repr(fit)), +/// ) +/// diagram(node((i, 0), l, +/// inset: 0pt, +/// shape: s, +/// stroke: aqua, +/// fill: aqua.lighten(90%), +/// )) +/// h(5mm) +/// } +#let hexagon(node, extrude, angle: 30deg, fit: 0.8) = { + let (w, h) = node.size + let f = h/2*calc.tan(angle)*(1 - fit) + let x = w/2 + extrude*calc.tan(45deg - angle/2) - f + let y = h/2 + extrude + let z = y*calc.tan(angle) + let obj = draw.line( + (+x, -y), + (+x + z, 0pt), + (+x, +y), + + (-x, +y), + (-x - z, 0pt), + (-x, -y), + + close: true, + ) + draw.group(obj) // enables cetz border anchors +} + + +/// A truncated rectangle node shape. +/// +/// #diagram( +/// node-stroke: maroon, +/// node-fill: maroon.lighten(90%), +/// node((0,0), `octagon`, shape: fletcher.shapes.octagon) +/// ) +/// +/// - truncate (number, length): Size of the truncated corners. A number is +/// interpreted as a multiple of the smaller of the node's width or height. +#let octagon(node, extrude, truncate: 0.5) = { + let (w, h) = node.size + let (x, y) = (w/2 + extrude, h/2 + extrude) + + let d + if type(truncate) == length { d = truncate } + else { d = truncate*calc.min(w/2, h/2)} + d += extrude*0.5857864376 // (1 - calc.tan(calc.pi/8)) + + let obj = draw.line( + (-x + d, -y ), + (-x , -y + d), + (-x , +y - d), + (-x + d, +y ), + (+x - d, +y ), + (+x , +y - d), + (+x , -y + d), + (+x - d, -y ), + close: true, + ) + draw.group(obj) // enables cetz border anchors +} diff --git a/packages/preview/fletcher/0.5.6/src/utils.typ b/packages/preview/fletcher/0.5.6/src/utils.typ new file mode 100644 index 0000000000..026f4f6754 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/src/utils.typ @@ -0,0 +1,313 @@ +#import "deps.typ": cetz +#import cetz: vector + +#let error(message, ..args) = { + let pairs = args.pos().enumerate() + args.named().pairs() + let ticks(x) = "`" + if type(x) == str { x } else { repr(x) } + "`" + for (k, v) in pairs { + if type(v) == array { + let replacement = if v.len() > 0 { + v.map(ticks).join(", ") + } else { "()" } + message = message.replace("#.." + str(k), replacement) + } + if type(v) != str { v = repr(v) } + message = message.replace("#" + str(k), ticks(v)) + } + assert(false, message: message) +} + + +// Replace `auto` with a value +#let map-auto(value, fallback) = if value == auto { fallback } else { value } + +// Make a function propagate `auto` +#let pass-auto(f) = x => if x == auto { x } else { f(x) } + +// Make a function propagage `none` +#let pass-none(f) = x => if x == none { x } else { f(x) } + +#let as-bool(obj, message: "Expected boolean") = { + if type(obj) == bool { obj } + else { error(message + "; got #0.", repr(obj)) } +} + +// for when `stroke` is already in namespace +#let as-stroke(x) = stroke(x) + +#let as-label(x) = { + if type(x) == label { x } + else if type(x) == str { label(x) } + else { error("Expected label or string; got #0.", repr(x)) } +} + +#let as-pair(obj) = { + if type(obj) == array { + if obj.len() == 2 { obj } + else { error("Expected a pair (array of length 2); got #0.", repr(obj))} + } else { (obj, obj) } +} + +#let as-array(obj) = if type(obj) == array { obj } else { (obj,) } + +#let as-number-or-length(obj, message: "Expected a number or length") = { + if type(obj) in (int, float, length) { obj } + else { error(message + "; got #0.", repr(obj)) } +} + +#let as-relative(obj, message: "Expected float or relative length") = { + if type(obj) == relative { obj } + else if type(obj) in (int, float) { obj*100% + 0pt } + else if type(obj) in (ratio, length) { obj + 0% + 0pt } + else { error(message + "; got #0.", repr(obj)) } +} + +#let relative-to-float(t, len: float("inf")*1pt) = { + len = len.to-absolute() + if type(t) in (int, float, ratio) { float(t) } + else if type(t) == length { t.to-absolute()/len } + else if type(t) == relative { float(t.ratio) + t.length.to-absolute()/len } + else { error("Cannot convert #0 to float.", t) } +} + + +#let as-length(obj, message: "Expected a length") = { + if type(obj) == length { obj } + else { error(message + "; got #0.", repr(obj)) } +} + +#let as-angle(obj, message: "Expected an angle") = { + if type(obj) == angle { obj } + else { error(message + "; got #0.", repr(obj)) } +} + +#let stroke-to-dict(s) = { + let s = as-stroke(s) + let d = ( + paint: s.paint, + thickness: s.thickness, + cap: s.cap, + join: s.join, + dash: s.dash, + miter-limit: s.miter-limit, + ) + + // remove auto entries to allow folding strokes by joining dicts + for (key, value) in d { + if value == auto { + let _ = d.remove(key) + } + } + + d +} + + +#let min-max(array) = (calc.min(..array), calc.max(..array)) +#let cumsum(array) = { + let sum = array.at(0) + for i in range(1, array.len()) { + sum += array.at(i) + array.at(i) = sum + } + array +} + +#let vector-len((x, y)) = 1pt*calc.sqrt((x/1pt)*(x/1pt) + (y/1pt)*(y/1pt)) +#let vector-set-len(len, v) = vector.scale(v, len/vector-len(v)) +#let vector-unitless(v) = v.map(x => if type(x) == length { x.pt() } else { x }) +#let vector-2d((x, y, ..z)) = (x, y) +#let vector-max(a, b) = array.zip(a, b).map(vals => calc.max(..vals)) + +#let vector-polar(r, θ) = (r*calc.cos(θ), r*calc.sin(θ)) +#let vector-angle(v) = calc.atan2(..vector-unitless(v)) +#let angle-between(from, to) = vector-angle(vector.sub(to, from)) + +// Ensure angle is in range 0deg <= θ < 360deg +#let wrap-angle-360(θ) = calc.rem-euclid(θ/360deg, 1)*360deg + +// Ensure angle is in range -180deg <= θ <= 180deg +#let wrap-angle-180(θ) = (θ/360deg - calc.round(θ/360deg))*360deg + +#let angle-to-anchor(θ) = { + let i = calc.rem(8*θ/1rad/calc.tau, 8) + ( + "east", + "north-east", + "north", + "north-west", + "west", + "south-west", + "south", + "south-east", + ).at(int(calc.round(i))) +} + + +#let is-length-vector(v) = v.all(x => type(x) == length) +#let is-number-vector(v) = v.all(x => type(x) in (int, float)) +#let is-nan-vector(v) = is-number-vector(v) and v.any(x => float(x).is-nan()) + + +#let lerp(a, b, t) = a*(1 - t) + b*t + +/// Linearly interpolate an array with linear behaviour outside bounds +/// +/// - values (array): Array of lengths defining interpolation function. +/// - index (int, float): Index-coordinate to sample. +/// - spacing (length): Gradient for linear extrapolation beyond array bounds. +#let interp(values, index, spacing: 0pt) = { + let max-index = values.len() - 1 + if index < 0 { + values.at(0) + spacing*index + } else if index > max-index { + values.at(-1) + spacing*(index - max-index) + } else { + lerp( + values.at(calc.floor(index)), + values.at(calc.ceil(index)), + calc.fract(index), + ) + } +} + + +/// Inverse of `interp()`. +/// +/// - values (array): Array of lengths defining interpolation function. +/// - value: Value to find the interpolated index of. +/// - spacing (length): Gradient for linear extrapolation beyond array bounds. +#let interp-inv(values, value, spacing: 0pt) = { + let i = 0 + while i < values.len() { + if values.at(i) >= value { break } + i += 1 + } + let (first, last) = (values.at(0), values.at(-1)) + + // avoids division by zero when numerator and denominator both vanish + let div(a, b) = if calc.abs(a) < 1e-3pt { 0 } else { a/b } + + if value < first { + div(value - first, spacing) + } else if value >= last { + values.len() - 1 + div(value - last, spacing) + } else { + let (prev, nearest) = (values.at(i - 1), values.at(i)) + i - 1 + div(value - prev, nearest - prev) + } +} + + +#let rect-at(center, size) = (-1, +1).map(dir => { + vector.add(center, vector.scale(size, dir/2)) +}) + +#let point-is-in-rect(point, (center, size)) = { + point.zip(center, size).all(((x, o, s)) => { + calc.abs(x - o) <= s/2 + }) +} + +#let bounding-rect(points) = { + let (xs, ys) = array.zip(..points) + let p1 = (calc.min(..xs), calc.min(..ys)) + let p2 = (calc.max(..xs), calc.max(..ys)) + ( + center: vector.scale(vector.add(p1, p2), 0.5), + size: vector.sub(p2, p1) + ) +} + + +/// Determine arc between two points with a given bend angle +/// +/// The bend angle is the angle between chord of the arc (line connecting the +/// points) and the tangent to the arc and the first point. +/// +/// Returns a dictionary containing: +/// - `center`: the center of the arc's curvature +/// - `radius` +/// - `start`: the start angle of the arc +/// - `stop`: the end angle of the arc +/// +/// - from (point): 2D vector of initial point. +/// - to (point): 2D vector of final point. +/// - angle (angle): The bend angle between chord of the arc (line connecting the +/// points) and the tangent to the arc and the first point. +/// -> dictionary +/// +/// #diagram(spacing: 2cm, { +/// for (i, θ) in (0deg, 45deg, -90deg).enumerate() { +/// edge((2*i, 0), (2*i + 1, 0), marks: (none, "head"), bend: θ) +/// edge((2*i, 0), (2*i + 1, 0), [#θ], label-side: center, dash: +/// "dotted") +/// } +/// }) +#let get-arc-connecting-points(from, to, angle) = { + // TODO: properly handle trivial arcs + if from == to { to = vector.add(to, (0pt, 1e-4pt)) } + + let mid = vector.scale(vector.add(from, to), 0.5) + let (dx, dy) = vector.sub(to, from) + let perp = (dy, -dx) + + let center = vector.add(mid, vector.scale(perp, 0.5/calc.tan(angle))) + + let radius = vector-len(vector.sub(to, center)) + + let start = angle-between(center, from) + let stop = angle-between(center, to) + + if start < stop and angle > 0deg { start += 360deg } + if start > stop and angle < 0deg { start -= 360deg } + + (center: center, radius: radius, start: start, stop: stop) +} + +/// Return true if a content element is a space or sequence of spaces +#let is-space(el) = { + if el == none { return true } + if repr(el.func()) == "space" { return true } + if repr(el.func()) == "sequence" { return el.children.all(is-space) } + return false +} + +#let is-sequence(it) = { + type(it) == content and repr(it.func()) == "sequence" +} + +#let flatten-sequence-to-array(it) = { + if is-sequence(it) { + it.children.map(flatten-sequence-to-array).join() + () + } else { (it,) } +} + + +// find a node near a given uv coordinate +#let find-node-at(nodes, uv, snap: true) = { + nodes.filter(node => { + if is-nan-vector(node.pos.uv) { return false } + + if snap { + // node must be within a one-unit block around pos + vector.sub(node.pos.uv, uv).all(Δ => calc.abs(Δ) < 0.1) + } else { + node.pos.uv == uv + } + }) + .sorted(key: node => vector.len(vector.sub(node.pos.uv, uv))) + .at(0, default: none) +} + +#let find-node(nodes, key, snap: true) = { + if type(key) == label { + let node = nodes.find(node => node.name == key) + assert(node != none, message: "Couldn't find node with name " + repr(key)) + node + } else if type(key) == array and is-number-vector(key) { + find-node-at(nodes, key, snap: snap) + } else { + none + } +} diff --git a/packages/preview/fletcher/0.5.6/typst.toml b/packages/preview/fletcher/0.5.6/typst.toml new file mode 100644 index 0000000000..499a9bf6a7 --- /dev/null +++ b/packages/preview/fletcher/0.5.6/typst.toml @@ -0,0 +1,25 @@ +[package] +name = "fletcher" +version = "0.5.6" +compiler = "0.13.0" +entrypoint = "src/exports.typ" +authors = ["Joseph Wilson (Jollywatt)"] +license = "MIT" +description = "Draw diagrams with nodes and arrows." +repository = "https://github.com/Jollywatt/typst-fletcher" +categories = ["visualization", "components"] +keywords = [ + "commutative", + "commuting", + "commute", + "diagram", + "category", + "flowchart", + "DAG", + "graph", + "finite state", + "network", + "node", + "arrow", +] +exclude = ["docs/", "tests/"]