From 0bb60ba6146e09eeebc60f3484763ac20a1a877e Mon Sep 17 00:00:00 2001 From: ryuryu-ymj <33318253+ryuryu-ymj@users.noreply.github.com> Date: Tue, 28 Jan 2025 18:10:44 +0900 Subject: [PATCH] mannot:0.2.1 --- packages/preview/mannot/0.2.1/LICENSE | 21 + packages/preview/mannot/0.2.1/README.md | 112 ++++ .../mannot/0.2.1/docs/doc-template.typ | 31 + packages/preview/mannot/0.2.1/docs/doc.pdf | Bin 0 -> 149787 bytes packages/preview/mannot/0.2.1/docs/doc.typ | 145 +++++ .../preview/mannot/0.2.1/docs/tidy-style.typ | 56 ++ .../mannot/0.2.1/examples/showcase.svg | 588 ++++++++++++++++++ .../mannot/0.2.1/examples/showcase.typ | 19 + .../preview/mannot/0.2.1/examples/usage1.svg | 188 ++++++ .../preview/mannot/0.2.1/examples/usage1.typ | 10 + .../preview/mannot/0.2.1/examples/usage2.svg | 188 ++++++ .../preview/mannot/0.2.1/examples/usage2.typ | 12 + .../preview/mannot/0.2.1/examples/usage3.svg | 154 +++++ .../preview/mannot/0.2.1/examples/usage3.typ | 10 + .../preview/mannot/0.2.1/examples/usage4.svg | 271 ++++++++ .../preview/mannot/0.2.1/examples/usage4.typ | 16 + .../preview/mannot/0.2.1/examples/usage5.svg | 467 ++++++++++++++ .../preview/mannot/0.2.1/examples/usage5.typ | 19 + packages/preview/mannot/0.2.1/src/annot.typ | 299 +++++++++ packages/preview/mannot/0.2.1/src/lib.typ | 2 + packages/preview/mannot/0.2.1/src/mark.typ | 450 ++++++++++++++ packages/preview/mannot/0.2.1/src/util.typ | 11 + packages/preview/mannot/0.2.1/typst.toml | 12 + 23 files changed, 3081 insertions(+) create mode 100644 packages/preview/mannot/0.2.1/LICENSE create mode 100644 packages/preview/mannot/0.2.1/README.md create mode 100644 packages/preview/mannot/0.2.1/docs/doc-template.typ create mode 100644 packages/preview/mannot/0.2.1/docs/doc.pdf create mode 100644 packages/preview/mannot/0.2.1/docs/doc.typ create mode 100644 packages/preview/mannot/0.2.1/docs/tidy-style.typ create mode 100644 packages/preview/mannot/0.2.1/examples/showcase.svg create mode 100644 packages/preview/mannot/0.2.1/examples/showcase.typ create mode 100644 packages/preview/mannot/0.2.1/examples/usage1.svg create mode 100644 packages/preview/mannot/0.2.1/examples/usage1.typ create mode 100644 packages/preview/mannot/0.2.1/examples/usage2.svg create mode 100644 packages/preview/mannot/0.2.1/examples/usage2.typ create mode 100644 packages/preview/mannot/0.2.1/examples/usage3.svg create mode 100644 packages/preview/mannot/0.2.1/examples/usage3.typ create mode 100644 packages/preview/mannot/0.2.1/examples/usage4.svg create mode 100644 packages/preview/mannot/0.2.1/examples/usage4.typ create mode 100644 packages/preview/mannot/0.2.1/examples/usage5.svg create mode 100644 packages/preview/mannot/0.2.1/examples/usage5.typ create mode 100644 packages/preview/mannot/0.2.1/src/annot.typ create mode 100644 packages/preview/mannot/0.2.1/src/lib.typ create mode 100644 packages/preview/mannot/0.2.1/src/mark.typ create mode 100644 packages/preview/mannot/0.2.1/src/util.typ create mode 100644 packages/preview/mannot/0.2.1/typst.toml diff --git a/packages/preview/mannot/0.2.1/LICENSE b/packages/preview/mannot/0.2.1/LICENSE new file mode 100644 index 0000000000..72330967fa --- /dev/null +++ b/packages/preview/mannot/0.2.1/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 ryuryu-ymj + +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. diff --git a/packages/preview/mannot/0.2.1/README.md b/packages/preview/mannot/0.2.1/README.md new file mode 100644 index 0000000000..f9628fcbe1 --- /dev/null +++ b/packages/preview/mannot/0.2.1/README.md @@ -0,0 +1,112 @@ +# Mannot + + + + +A package for marking and annotating in math blocks in [Typst](https://typst.app/). + +A full documentation is [here](docs/doc.pdf). + +## Example +```typst +$ + markul(p_i, tag: #

) + = markrect( + exp(- marktc(beta, tag: #) marktc(E_i, tag: #, color: #green)), + tag: #, color: #blue, + ) / mark(sum_j exp(- beta E_j), tag: #) + + #annot(

, pos: left)[Probability of \ state $i$] + #annot(, pos: top + left, yshift: 2em)[Inverse temperature] + #annot(, pos: top + right, yshift: 1em)[Energy] + #annot(, pos: top + left)[Boltzmann factor] + #annot()[Partition function] +$ +``` + +![Example1](examples/showcase.svg) + +## Usage +Import the package `mannot` on the top of your document: +```typst +#import "@preview/mannot:0.2.1": * +``` + +To define the target of an annotation within a math block, +use the following marking functions: +- `mark`: marks the content with highlighting; +- `markrect`: marks the content with a rectangular box; +- `markul`: marks the content with an underline; +- `marktc`: marks the content and changes the text color. +```typst +$ + mark(x, tag: #) + markrect(2y, tag: #) + + markul(z+1, tag: #) + marktc(C, tag: #) +$ +``` +![Usage1](examples/usage1.svg) + +You can customize the marking color and other styles: +```typst +$ + mark(x, tag: #, color: #purple) + + markrect(2y, tag: #, color: #red, padding: #.2em) + + markul(z+1, tag: #, stroke: #.1em) + + marktc(C, tag: #, color: #olive) +$ +``` +![Usage2](examples/usage2.svg) + +You can also use marking functions solely for styling parts of a math block, +without tags: +```typst +$ + mark(x^2 +, color: #blue, radius: #20%) + f(markul(x^2 + 1, color: #red, stroke: #.1em)) +$ +``` +![Usage3](examples/usage3.svg) + +Once you have marked content with a tag, +you can annotate it using the `annot` function within the same math block: +```typst +$ + mark(x, tag: #, color: #purple) + + markrect(2y, tag: #, color: #red, padding: #.2em) + + markul(z+1, tag: #, stroke: #.1em) + + marktc(C, tag: #, color: #olive) + + #annot()[annotation] + #annot()[another annotation] +$ +``` +![Usage4](examples/usage4.svg) + +You can customize the position of the annotation and its vertical distance from the marked content, +using the `pos` and `yshift` parameters of the `annot` function: +```typst +#v(3em) +$ + mark(x, tag: #, color: #purple) + + markrect(2y, tag: #, color: #red, padding: #.2em) + + markul(z+1, tag: #, stroke: #.1em) + + marktc(C, tag: #, color: #olive) + + #annot(, pos: left)[Set pos \ to left.] + #annot(, pos: top, yshift: 1em)[Set pos to top, and yshift to 1em.] + #annot(, pos: right, yshift: 1em)[Set pos to right,\ and yshift to 1em.] + #annot(, pos: top + left, yshift: 3em)[Set pos to top+left,\ and yshift to 3em.] +$ +#v(2em) +``` +![Usage5](examples/usage5.svg) + + +## Changelogs +* v0.2.1: + - fix underlay/overlay layout in marking functions when setting other math font +* v0.2.0: + - remove the `mannot-init` function; + - support placing underlay under the math content when marking; + - add marking functions: `markrect`, `markul`, `marktc`. +* v0.1.0: first release. diff --git a/packages/preview/mannot/0.2.1/docs/doc-template.typ b/packages/preview/mannot/0.2.1/docs/doc-template.typ new file mode 100644 index 0000000000..37617459dd --- /dev/null +++ b/packages/preview/mannot/0.2.1/docs/doc-template.typ @@ -0,0 +1,31 @@ +#import "/src/lib.typ": * + +#let entrypoint = toml("/typst.toml").package.entrypoint +#let usage = "#import \"/" + entrypoint + "\": *\n" + +#let example(source) = { + grid( + columns: (2fr, 1fr), + rows: auto, + align: center + horizon, + gutter: 5pt, + { + set text(0.9em) + // raw(block: true, lang: "typst", source) + source + }, + rect( + width: 100%, + inset: 10pt, + eval(usage + source.text, mode: "markup"), + ), + ) +} + +#let example-vstack(source) = { + eval(usage + source.text, mode: "markup") + { + set text(0.9em) + source + } +} diff --git a/packages/preview/mannot/0.2.1/docs/doc.pdf b/packages/preview/mannot/0.2.1/docs/doc.pdf new file mode 100644 index 0000000000000000000000000000000000000000..616df572a017abd5a419a78abb2d1ecf7263b2d7 GIT binary patch literal 149787 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 Gs{aEZEB)R8 literal 0 HcmV?d00001 diff --git a/packages/preview/mannot/0.2.1/docs/doc.typ b/packages/preview/mannot/0.2.1/docs/doc.typ new file mode 100644 index 0000000000..4e429d9220 --- /dev/null +++ b/packages/preview/mannot/0.2.1/docs/doc.typ @@ -0,0 +1,145 @@ +#import "@preview/tidy:0.4.0" +#import "@preview/codly:1.0.0": * +#import "/src/lib.typ": * +#import "doc-template.typ": * + +#show link: underline + +#show: codly-init.with() +#codly(lang-format: none) + +// #set text(font: "Noto Serif", size: 10pt) +// #show raw.where(block: false): set text(font: "Noto Sans Mono") + +#let package-info = toml("/typst.toml") +#let name = package-info.package.name +#let version = package-info.package.version + +#text(2em, weight: "bold", name) +#h(1em) +#text(1.2em, "v" + version) + + +A package for marking and annotating in math blocks in Typst. + +#outline(depth: 1, indent: auto) + + += Example +#example-vstack(```typst +#set text(12pt) +#v(2em) +$ + markul(p_i, tag: #

) + = markrect( + exp(- marktc(beta, tag: #) marktc(E_i, tag: #, color: #green)), + tag: #, color: #blue, + ) / mark(sum_j exp(- beta E_j), tag: #) + + #annot(

, pos: left)[Probability of \ state $i$] + #annot(, pos: top + left, yshift: 2em)[Inverse temperature] + #annot(, pos: top + right, yshift: 1em)[Energy] + #annot(, pos: top + left)[Boltzmann factor] + #annot()[Partition function] +$ +```) + + += Usage +Import the package #raw(name) on the top of your document: +#let usage-code = "#import \"@preview/" + name + ":" + version + "\": *" +#raw(block: true, lang: "typst", usage-code) + +To define the target of an annotation within a math block, +use the following marking functions: +- `mark`: marks the content with highlighting; +- `markrect`: marks the content with a rectangular box; +- `markul`: marks the content with an underline; +- `marktc`: marks the content and changes the text color. +#example(```typst +$ +mark(x, tag: #) + markrect(2y, tag: #) ++ markul(z+1, tag: #) + marktc(C, tag: #) +$ +```) + +You can customize the marking color and other styles: +#example(```typst +$ +mark(x, tag: #, color: #purple) ++ markrect(2y, tag: #, color: #red, padding: #2pt) ++ markul(z+1, tag: #, stroke: #1pt) ++ marktc(C, tag: #, color: #olive) +$ +```) + +You can also use marking functions solely for styling parts of a math block, +without tags: +#example(```typst +$ +mark(x^2 +, color: #blue, radius: #20%) +f(markul(x^2 + 1, color: #red, stroke: #2pt)) +$ +```) + +Once you have marked content with a tag, +you can annotate it using the `annot` function within the same math block: +#example(```typst +$ +mark(x, tag: #, color: #purple) ++ markrect(2y, tag: #, color: #red, padding: #2pt) ++ markul(z+1, tag: #, stroke: #1pt) ++ marktc(C, tag: #, color: #olive) + +#annot()[annotation] +#annot()[another annotation] +$ +```) + +You can customize the position of the annotation and its vertical distance from the marked content, +using the `pos` and `yshift` parameters of the `annot` function: +#example(```typst +#v(3em) +$ +mark(x, tag: #, color: #purple) ++ markrect(2y, tag: #, color: #red, padding: #2pt) ++ markul(z+1, tag: #, stroke: #1pt) ++ marktc(C, tag: #, color: #olive) + +#annot(, pos: left)[Set pos \ to left.] +#annot(, pos: top, yshift: 1em)[ + Set pos to top, and yshift to 1em. +] +#annot(, pos: right, yshift: 1em)[ + Set pos to right,\ and yshift to 1em. +] +#annot(, pos: top + left, yshift: 3em)[ + Set pos to top+left,\ and yshift to 3em. +] +$ +#v(2em) +```) + + += Limitations +If you mark a inline math element containing linebreaks, +its layout will be broken: +#example(```typst +$mark(x + x + x + x + x + x + x + x)$ +```) + + += API +#{ + import "/src/lib.typ" + import "tidy-style.typ" + + let docs = ( + tidy.parse-module( + read("/src/mark.typ") + read("/src/annot.typ"), + scope: (lib: lib), + preamble: "import lib: *\n", + ) + ) + tidy.show-module(docs, show-outline: true, sort-functions: none, style: tidy-style) +} diff --git a/packages/preview/mannot/0.2.1/docs/tidy-style.typ b/packages/preview/mannot/0.2.1/docs/tidy-style.typ new file mode 100644 index 0000000000..9194c7b9aa --- /dev/null +++ b/packages/preview/mannot/0.2.1/docs/tidy-style.typ @@ -0,0 +1,56 @@ +#import "@preview/tidy:0.4.0" +#import tidy.utilities: * +#import tidy.styles.default: * + + +#let show-example( + code, + scope: (:), + preamble: "", + mode: auto, + inherited-scope: (:), + col-spacing: 5pt, + preview-inset: 10pt, + ..options, +) = { + let displayed-code = code.text.split("\n").filter(x => not x.starts-with(">>>")).join("\n") + let executed-code = code.text.split("\n").map(x => x.trim(">>>", at: start)).join("\n") + + let lang = if code.has("lang") { code.lang } else { auto } + if mode == auto { + if lang == "typ" { mode = "markup" } else if lang == "typc" { mode = "code" } else if lang == "typm" { + mode = "math" + } else if lang == auto { mode = "markup" } + } + if lang == auto { + if mode == "markup" { lang = "typ" } + if mode == "code" { lang = "typc" } + if mode == "math" { lang = "typm" } + } + if mode != "code" { + preamble = "#" + preamble + } + assert( + lang in ("typ", "typc", "typm"), + message: "Previewing code only supports the languages \"typ\", \"typc\", and \"typm\"", + ) + + grid( + columns: (2fr, 1fr), + rows: auto, + align: horizon, + gutter: col-spacing, + { + set text(0.9em) + raw(displayed-code, lang: lang, block: true) + }, + rect( + width: 100%, + inset: preview-inset, + { + set text(font: "Noto Serif") + eval(preamble + executed-code, mode: mode, scope: scope + inherited-scope) + }, + ), + ) +} diff --git a/packages/preview/mannot/0.2.1/examples/showcase.svg b/packages/preview/mannot/0.2.1/examples/showcase.svg new file mode 100644 index 0000000000..fba29df143 --- /dev/null +++ b/packages/preview/mannot/0.2.1/examples/showcase.svg @@ -0,0 +1,588 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/mannot/0.2.1/examples/showcase.typ b/packages/preview/mannot/0.2.1/examples/showcase.typ new file mode 100644 index 0000000000..df14c1597d --- /dev/null +++ b/packages/preview/mannot/0.2.1/examples/showcase.typ @@ -0,0 +1,19 @@ +#import "/src/lib.typ": * + +#set page(width: auto, height: auto, margin: (left: 3cm, top: 2cm, rest: 1cm), fill: white) +#set text(24pt) + + +$ + markul(p_i, tag: #

) + = markrect( + exp(- marktc(beta, tag: #) marktc(E_i, tag: #, color: #green)), + tag: #, color: #blue, + ) / mark(sum_j exp(- beta E_j), tag: #) + + #annot(

, pos: left)[Probability of \ state $i$] + #annot(, pos: top + left, yshift: 2em)[Inverse temperature] + #annot(, pos: top + right, yshift: 1em)[Energy] + #annot(, pos: top + left)[Boltzmann factor] + #annot()[Partition function] +$ diff --git a/packages/preview/mannot/0.2.1/examples/usage1.svg b/packages/preview/mannot/0.2.1/examples/usage1.svg new file mode 100644 index 0000000000..d870d99d2c --- /dev/null +++ b/packages/preview/mannot/0.2.1/examples/usage1.svg @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/mannot/0.2.1/examples/usage1.typ b/packages/preview/mannot/0.2.1/examples/usage1.typ new file mode 100644 index 0000000000..20accfe1a6 --- /dev/null +++ b/packages/preview/mannot/0.2.1/examples/usage1.typ @@ -0,0 +1,10 @@ +#import "/src/lib.typ": * + +#set page(width: auto, height: auto, margin: (x: 2cm, y: .5cm), fill: white) +#set text(24pt) + + +$ + mark(x, tag: #) + markrect(2y, tag: #) + + markul(z+1, tag: #) + marktc(C, tag: #) +$ diff --git a/packages/preview/mannot/0.2.1/examples/usage2.svg b/packages/preview/mannot/0.2.1/examples/usage2.svg new file mode 100644 index 0000000000..4e7528d1f2 --- /dev/null +++ b/packages/preview/mannot/0.2.1/examples/usage2.svg @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/mannot/0.2.1/examples/usage2.typ b/packages/preview/mannot/0.2.1/examples/usage2.typ new file mode 100644 index 0000000000..95bc980104 --- /dev/null +++ b/packages/preview/mannot/0.2.1/examples/usage2.typ @@ -0,0 +1,12 @@ +#import "/src/lib.typ": * + +#set page(width: auto, height: auto, margin: (x: 2cm, y: .5cm), fill: white) +#set text(24pt) + + +$ + mark(x, tag: #, color: #purple) + + markrect(2y, tag: #, color: #red, padding: #.2em) + + markul(z+1, tag: #, stroke: #.1em) + + marktc(C, tag: #, color: #olive) +$ diff --git a/packages/preview/mannot/0.2.1/examples/usage3.svg b/packages/preview/mannot/0.2.1/examples/usage3.svg new file mode 100644 index 0000000000..cdd5cdfa67 --- /dev/null +++ b/packages/preview/mannot/0.2.1/examples/usage3.svg @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/mannot/0.2.1/examples/usage3.typ b/packages/preview/mannot/0.2.1/examples/usage3.typ new file mode 100644 index 0000000000..2f5a20c403 --- /dev/null +++ b/packages/preview/mannot/0.2.1/examples/usage3.typ @@ -0,0 +1,10 @@ +#import "/src/lib.typ": * + +#set page(width: auto, height: auto, margin: (x: 2cm, y: 1cm), fill: white) +#set text(24pt) + + +$ + mark(x^2 +, color: #blue, radius: #20%) + f(markul(x^2 + 1, color: #red, stroke: #.1em)) +$ diff --git a/packages/preview/mannot/0.2.1/examples/usage4.svg b/packages/preview/mannot/0.2.1/examples/usage4.svg new file mode 100644 index 0000000000..345e1046eb --- /dev/null +++ b/packages/preview/mannot/0.2.1/examples/usage4.svg @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/mannot/0.2.1/examples/usage4.typ b/packages/preview/mannot/0.2.1/examples/usage4.typ new file mode 100644 index 0000000000..9670f46042 --- /dev/null +++ b/packages/preview/mannot/0.2.1/examples/usage4.typ @@ -0,0 +1,16 @@ +#import "/src/lib.typ": * + +#set page(width: auto, height: auto, margin: (x: 4cm, y: 1cm), fill: white) +#set text(24pt) + + +$ + mark(x, tag: #, color: #purple) + + markrect(2y, tag: #, color: #red, padding: #.2em) + + markul(z+1, tag: #, stroke: #.1em) + + marktc(C, tag: #, color: #olive) + + #annot()[annotation] + #annot()[another annotation] +$ + diff --git a/packages/preview/mannot/0.2.1/examples/usage5.svg b/packages/preview/mannot/0.2.1/examples/usage5.svg new file mode 100644 index 0000000000..fa7f1d3539 --- /dev/null +++ b/packages/preview/mannot/0.2.1/examples/usage5.svg @@ -0,0 +1,467 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/mannot/0.2.1/examples/usage5.typ b/packages/preview/mannot/0.2.1/examples/usage5.typ new file mode 100644 index 0000000000..0aaa8e7010 --- /dev/null +++ b/packages/preview/mannot/0.2.1/examples/usage5.typ @@ -0,0 +1,19 @@ +#import "/src/lib.typ": * + +#set page(width: auto, height: auto, margin: (x: 2cm, y: .5cm), fill: white) +#set text(24pt) + + +#v(3em) +$ + mark(x, tag: #, color: #purple) + + markrect(2y, tag: #, color: #red, padding: #.2em) + + markul(z+1, tag: #, stroke: #.1em) + + marktc(C, tag: #, color: #olive) + + #annot(, pos: left)[Set pos \ to left.] + #annot(, pos: top, yshift: 1em)[Set pos to top, and yshift to 1em.] + #annot(, pos: right, yshift: 1em)[Set pos to right,\ and yshift to 1em.] + #annot(, pos: top + left, yshift: 3em)[Set pos to top+left,\ and yshift to 3em.] +$ +#v(2em) diff --git a/packages/preview/mannot/0.2.1/src/annot.typ b/packages/preview/mannot/0.2.1/src/annot.typ new file mode 100644 index 0000000000..fb0c66bd95 --- /dev/null +++ b/packages/preview/mannot/0.2.1/src/annot.typ @@ -0,0 +1,299 @@ +#import "util.typ": copy-stroke + +#let _place-path-arrow( + stroke: 1pt, + tail-length: 5pt, + tail-angle: 30deg, + ..vertices, +) = { + place(path(stroke: stroke, ..vertices)) + + let stroke = copy-stroke(stroke, (dash: "solid")) + + context { + let vertices = vertices.pos() + let tail-length = tail-length.to-absolute() + + let p1 = vertices.last() + let p1x = p1.at(0).to-absolute() + let p1y = p1.at(1).to-absolute() + let p2 = vertices.at(vertices.len() - 2) + let p2x = p2.at(0).to-absolute() + let p2y = p2.at(1).to-absolute() + + let p12x = p2x - p1x + let p12y = p2y - p1y + let p12len = 1pt * calc.sqrt(p12x.pt() * p12x.pt() + p12y.pt() * p12y.pt()) + p12x = p12x / p12len * tail-length + p12y = p12y / p12len * tail-length + + let angle = 30deg + let sin = calc.sin(angle) + let cos = calc.cos(angle) + let t1x = p1x + p12x * cos - p12y * sin + let t1y = p1y + p12x * sin + p12y * cos + let t2x = p1x + p12x * cos + p12y * sin + let t2y = p1y - p12x * sin + p12y * cos + + place(path(stroke: stroke, (t1x, t1y), (p1x, p1y), (t2x, t2y))) + } +} + + +/// Places a custom annotation on previously marked content within a math block. +/// +/// This function creates a custom annotation by applying an overlay to content +/// that was previously marked with a specific tag using `core-mark`. +/// It must be used within the same math block as the marked content. +/// +/// Use this function as a foundation for defining custom annotation functions. +/// +/// *Example* +/// #example(```typ +/// #let myannot(tag, annotation) = { +/// let overlay(width, height, color) = { +/// set text(white, .8em) +/// let annot-block = box(fill: color, inset: .4em, annotation) +/// place(annot-block, dy: height) +/// } +/// return core-annot(tag, overlay) +/// } +/// +/// $ +/// mark(x, tag: #) +/// #myannot()[This is x.] +/// $ +/// ```, preview-inset: 20pt) +/// +/// -> content +#let core-annot( + /// The tag associated with the content to annotate. + /// This tag must match a tag previously used in a `core-mark` call. + /// -> label + tag, + /// The function to create the custom annotation overlay. + /// This function receives the width, height, and color of the marked content (including padding) + /// and should return content to be placed *over* the marked content. + /// The signature is `overlay(width, height, color)`. + /// -> function + overlay, +) = { + context { + let info = query(selector(tag).before(here())).last() + info = info.value + + let hpos = here().position() + let dx = info.x - hpos.x + let dy = info.y - hpos.y + let width = info.width + let height = info.height + let color = info.color + sym.wj + box(place(dx: dx, dy: dy, overlay(width, height, color))) + sym.wj + } +} + + +/// Places an annotation on previously marked content within a math block. +/// +/// This function must be used within the same math block as the marked content. +/// +/// *Example* +/// ```example +/// $ +/// mark(x, tag: #) +/// #annot()[Annotation] +/// $ +/// ``` +/// +/// #example(```typ +/// $ +/// markrect(integral x dif x, tag: #, color: #blue) +/// + markul(y, tag: #, color: #red) +/// +/// #annot(, pos: left)[Left] +/// #annot(, pos: top + left)[Top left] +/// #annot(, pos: left, yshift: 2em)[Left arrow] +/// #annot(, pos: top + right, yshift: 1em)[Top right arrow] +/// $ +/// ```, preview-inset: 20pt) +/// +/// -> content +#let annot( + /// The tag associated with the content to annotate. + /// This tag must match a tag previously used in marking. + /// -> label + tag, + /// The content of the annotation. -> content + annotation, + /// The position of the annotation relative to the marked content. + /// Possible values are (`top` or `bottom`) + (`left`, `center` or `right`). + /// -> alignment + pos: center + bottom, + /// The vertical offset between the annotation and the marked content. + /// -> length + yshift: .2em, + /// Properties for the annotation text. + /// If the `fill` property is not specified, it defaults to the marking's color. + /// -> dictionary + text-props: (size: .6em, bottom-edge: "descender"), + /// Properties for the annotation paragraph. + /// -> dictionary + par-props: (leading: .3em), + /// The alignment of the annotation text within its box. + /// -> auto | alignment + alignment: auto, + /// Whether to display an arrow connecting the annotation to the marked content. + /// If set to `auto`, an arrow is shown when `yshift` is greater than `0.4em`. + /// -> auto | bool + show-arrow: auto, + /// The stroke style for the arrow. + /// If the `paint` property is not specified, it defaults to the marking's color. + /// -> auto | none | color | length | dictionary | stroke + arrow-stroke: .08em, + /// The spacing between the arrow and the annotation box. + /// -> length + arrow-padding: .2em, +) = { + assert( + pos.x == left or pos.x == center or pos.x == right or pos.x == none, + message: "The field `x` of the argument `alignment` of the function + `annot` must be `left`, `center`, `right` or `none`.", + ) + assert( + pos.y == top or pos.y == bottom or pos.y == none, + message: "The field `y` of the argument `alignment` of the function + `annot` must be `top`, `bottom` or `none`.", + ) + let pos = ( + if pos.x == none { + center + } else { + pos.x + } + + if pos.y == none { + bottom + } else { + pos.y + } + ) + if alignment == auto { + alignment = pos.x.inv() + } + + + context { + let text-props = text-props + let annot-tsize = text-props.remove("size", default: 1em).to-absolute() + set text(size: annot-tsize) + + context { + let annot-content = { + show: par.with(..par-props) + show: align.with(alignment) + text(..text-props, annotation) + } + let annot-size = measure(annot-content) + + let overlay(width, height, color) = text( + size: annot-tsize, + { + let annot-content = text(annot-content) + if text-props.at("fill", default: auto) == auto { + annot-content = text(color, annot-content) + } + + let draw-arrow = show-arrow + if draw-arrow == auto { + draw-arrow = if yshift > .4em { + true + } else { + false + } + } + + if not draw-arrow { + // Place annotation. + + let dx = ( + width / 2 + + if pos.x == center { + -annot-size.width / 2 + } else if pos.x == left { + -annot-size.width + } + ) + let dy = if pos.y == bottom { + height + yshift + } else { + -annot-size.height - yshift + } + + place(annot-content, dx: dx, dy: dy) + } else { + // Place arrow and annotation. + + let arrow-stroke = stroke(arrow-stroke) + if arrow-stroke.paint == auto { + arrow-stroke = copy-stroke(arrow-stroke, (paint: color)) + } + + let p3x = width / 2 + let p3y = if pos.y == bottom { + height + arrow-stroke.thickness + } else { + -arrow-stroke.thickness + } + + let p2x = p3x + let p2y = if pos.y == bottom { + if pos.x == center { + p3y + yshift + } else { + p3y + annot-size.height + arrow-padding * 2 + yshift + } + } else { + p3y - yshift + } + + let p1x = if pos.x == right { + p2x + annot-size.width + arrow-padding + } else if pos.x == left { + p2x - annot-size.width - arrow-padding + } + let p1y = p2y + + if arrow-stroke.thickness > 0pt { + // Place the arrow. + if pos.x == center { + _place-path-arrow(stroke: arrow-stroke, tail-length: .3em, (p2x, p2y), (p3x, p3y)) + } else { + _place-path-arrow(stroke: arrow-stroke, tail-length: .3em, (p1x, p1y), (p2x, p2y), (p3x, p3y)) + } + } + + // Place the annotation. + if pos.x == right { + place(annot-content, dx: p2x + arrow-padding, dy: p2y - annot-size.height - arrow-padding) + } else if pos.x == left { + place( + annot-content, + dx: p2x - annot-size.width - arrow-padding, + dy: p2y - annot-size.height - arrow-padding, + ) + } else { + if pos.y == bottom { + place(annot-content, dx: p2x - annot-size.width / 2, dy: p2y + arrow-padding) + } else { + place(annot-content, dx: p2x - annot-size.width / 2, dy: p2y - annot-size.height - arrow-padding) + } + } + } + }, + ) + + return core-annot(tag, overlay) + } + } +} diff --git a/packages/preview/mannot/0.2.1/src/lib.typ b/packages/preview/mannot/0.2.1/src/lib.typ new file mode 100644 index 0000000000..44753f7f67 --- /dev/null +++ b/packages/preview/mannot/0.2.1/src/lib.typ @@ -0,0 +1,2 @@ +#import "mark.typ": core-mark, mark, markrect, markul, marktc +#import "annot.typ": core-annot, annot diff --git a/packages/preview/mannot/0.2.1/src/mark.typ b/packages/preview/mannot/0.2.1/src/mark.typ new file mode 100644 index 0000000000..ed49d222b4 --- /dev/null +++ b/packages/preview/mannot/0.2.1/src/mark.typ @@ -0,0 +1,450 @@ +#import "util.typ": copy-stroke + +#let _mark-cnt = counter("_mannot-mark-cnt") + +#let _sequence-func = (math.text("x") + math.text("y")).func() +#let _align-point-func = $&$.body.func() + +#let _remove-leading-h(body) = { + if type(body) == content { + if body.func() == math.equation { + return _remove-leading-h(body.body) + } else if body.func() == _sequence-func { + let children = body.children + if children.len() == 0 { + return (none, none) + } + let rest + let remove + let leadingCount = 0 + for c in children { + if c == [ ] { + leadingCount += 1 + continue + } + let (crest, cremove) = _remove-leading-h(c) + rest = crest + remove += cremove + if rest != none { + break + } + leadingCount += 1 + } + children = children.slice(leadingCount) + children.first() = rest + let rest = _sequence-func(children) + return (rest, remove) + } else if body.func() == h { + return (none, body) + } + } + return (body, none) +} + +#let _remove-trailing-h(body) = { + if type(body) == content { + if body.func() == math.equation { + return _remove-trailing-h(body.body) + } else if body.func() == _sequence-func { + let children = body.children + if children.len() == 0 { + return (none, none) + } + let rest + let remove + let trailingCount = 0 + for c in children.rev() { + if c == [ ] { + trailingCount += 1 + continue + } + let (crest, cremove) = _remove-leading-h(c) + rest = crest + remove += cremove + if rest != none { + break + } + trailingCount += 1 + } + children = children.slice(0, children.len() - trailingCount) + children.last() = rest + let rest = _sequence-func(children) + return (rest, remove) + } else if body.func() == h { + return (none, body) + } + } + return (body, none) +} + +#let _label-each-child(body, label) = { + if type(body) == content { + if body.func() == math.equation { + let body = _label-each-child(body.body, label) + return body + } else if body.func() == _sequence-func { + // If `content` is the sequence of contents, + // then put `label` on each child. + let children = body + .children + .filter(c => c != [ ]) + .map(c => { + _label-each-child(c, label) + }) + return body.func()(children) + } else if (body.func() == _align-point-func or body.func() == h or body.func() == v) { + // Do not put `label` on layout contents such as align-point(), + // h(), or v(), in order to avoid broken layout. + return body + } + } + return math.attach(math.limits(body), t: pad([#none#label], -1em), b: pad([#none#label], -1em)) +} + +/// Marks content within a math block with a custom underlay or overlay. +/// +/// This function measures the position and size of the marked content, +/// applies a custom underlay or overlay, and generates metadata associated with a given tag. +/// The metadata includes the original content, its position (`x`, `y`), dimensions (`width`, `height`), +/// and the color used for the marking. This metadata can be later used for annotations. +/// +/// Use this function as a foundation for defining custom marking functions. +/// +/// *Example:* +/// ```example +/// #let mymark(body, tag: none) = { +/// let overlay(width, height, color) = { +/// rect(width: width, height: height, stroke: color) +/// } +/// return core-mark(body, tag: tag, color: red, overlay: overlay, padding: (y: .1em)) +/// } +/// +/// $ +/// mymark(x, tag: #) +/// +/// #context { +/// let info = query().last() +/// sym.wj +/// box(place(repr(info.value), dx: -4em)) +/// } +/// $ +/// #v(10em) +/// ``` +/// +/// -> content +#let core-mark( + /// The content to be marked within a math block. -> content + body, + /// An optional tag to associate with the metadata. + /// This tag can be used to query the marked element. + /// -> none | label + tag: none, + /// The color used for marking. -> color + color: black, + /// An optional function to create a custom underlay. + /// This function receives the marked content's width and height (including padding) + /// and marking color, and should return content to be placed *under* the marked content. + /// The signature is `underlay(width, height, color)`. + /// -> none | function + underlay: none, + /// An optional function to create a custom overlay. + /// This function receives the marked content's width and height (including padding) + /// and marking color, and should return content to be placed *over* the marked content. + /// The signature is `overlay(width, height, color)`. + /// -> none | function + overlay: none, + /// The spacing between the marked content and the edge of the underlay/overlay. + /// This can be specified as a single `length` value, which applies to all sides, + /// or as a `dictionary` of `length` with keys `left`, `right`, `top`, `bottom`, `x`, `y`, or `rest`. + /// -> none | length | dictionary + padding: (:), +) = { + // Extract leading/trailing horizontal spaces from body. + let (body, leading-h) = _remove-leading-h(body) + let (body, trailing-h) = _remove-trailing-h(body) + leading-h + + _mark-cnt.step() + + context { + let cnt-get = _mark-cnt.get().first() + let y-lab = label("_mannot-mark-y-" + str(cnt-get)) + let dy-lab = label("_mannot-mark-dy-" + str(cnt-get)) + let info-lab + if type(tag) == label { + info-lab = tag + } else { + info-lab = label("_mannot-mark-info-" + str(cnt-get)) + } + + // Place `underlay(width, height, color)` under the `body`. + if underlay != none { + sym.wj + context { + let infos = query(selector(info-lab).after(here())) + if infos.len() > 0 { + let info = infos.first().value + + let hpos = here().position() + let dx = info.x - hpos.x + let dy = info.y - hpos.y + let width = info.width + let height = info.height + let color = info.color + box(place(dx: dx, dy: dy, underlay(width, height, color))) + } + } + } + + let start = here().position() + let labeled-body = _label-each-child(body, y-lab) + sym.wj + labeled-body + sym.wj + math.attach( + math.display(math.limits([#none#dy-lab])), + t: pad(-1em, [#none#dy-lab]), + b: pad(-1em, [#none#dy-lab]), + ) + + + context { + let end = here().position() + + let ys = query(y-lab).map(e => e.location().position().y) + let min-y = calc.min(..ys) + let max-y = calc.max(..ys) + + let dys = query(dy-lab).map(e => e.location().position().y) + let top-dy = dys.at(0) - dys.at(1) + let top = min-y + top-dy + let bottom-dy = dys.at(0) - dys.at(2) + let bottom = max-y + bottom-dy + + let padding = if padding == none { + (left: 0pt, right: 0pt, top: 0pt, bottom: 0pt) + } else if type(padding) == length { + let padding = padding.to-absolute() + (left: padding, right: padding, top: padding, bottom: padding) + } else if type(padding) == dictionary { + let rest = padding.at("rest", default: 0pt).to-absolute() + let x = padding.at("x", default: rest).to-absolute() + let left = padding.at("left", default: x).to-absolute() + let right = padding.at("right", default: x).to-absolute() + let y = padding.at("y", default: rest).to-absolute() + let top = padding.at("top", default: y).to-absolute() + let bottom = padding.at("bottom", default: y).to-absolute() + (left: left, right: right, top: top, bottom: bottom) + } + + let x = start.x - padding.left + let y = top - padding.top + let width = end.x + padding.right - x + let height = bottom - top + padding.top + padding.bottom + + let info = (body: body, x: x, y: y, width: width, height: height, color: color) + sym.wj + [#metadata(info)#info-lab] + + // Place `overlay(width, height, color)` over the `body`. + if overlay != none { + let hpos = here().position() + let dx = x - hpos.x + let dy = y - hpos.y + sym.wj + box(place(dx: dx, dy: dy, overlay(width, height, color))) + } + } + } + + sym.wj + trailing-h +} + + +/// Marks content within a math block with highlighting. +/// +/// If you mark content with a tag, you can annotate it using the `annot` function. +/// +/// *Example* +/// ```example +/// $ mark(x) $ +/// ``` +/// +/// -> content +#let mark( + /// The content to be highlighted within a math block. -> content + body, + /// An optional tag used to identify the marked content for later annotations. + /// -> none | label + tag: none, + /// The color used for the highlight and later annotations. + /// If both `color` and `fill` are set to `auto`, `color` defaults to `orange`. + /// Otherwise, if only `color` is `auto`, it defaults to `black`. + /// -> auto | color + color: auto, + /// The fill style for the highlight rectangle. + /// If set to `auto`, `fill` will be set to `color.transparentize(60%)`. + /// -> auto | none | color | gradient | pattern + fill: auto, + /// The stroke style for the highlight rectangle. + /// -> none | auto | length | color | gradient | stroke | pattern | dictionary + stroke: none, + /// The corner radius of the highlight rectangle. -> relative | dictionary + radius: (:), + /// The spacing between the marked content and the edge of the highlight rectangle. + /// This can be specified as a single `length` value which applies to all sides, + /// or as a `dictionary` of `length` with keys `left`, `right`, `top`, `bottom`, `x`, `y`, or `rest`. + /// -> none | length | dictionary + padding: (y: .1em), +) = { + if fill == auto { + if color == auto { + color = orange + } + fill = color.transparentize(60%) + } else if color == auto { + color = black + } + + let underlay = if fill == none and stroke == none { none } else { + (width, height, _) => { + rect( + width: width, + height: height, + fill: fill, + stroke: stroke, + radius: radius, + ) + } + } + + return core-mark(body, tag: tag, color: color, underlay: underlay, padding: padding) +} + + +/// Marks content within a math block with a rectangle. +/// +/// If you mark content with a tag, you can annotate it using the `annot` function. +/// +/// *Example* +/// ```example +/// $ markrect(x + y) $ +/// ``` +/// +/// -> content +#let markrect( + /// The content to be marked within a math block. -> content + body, + /// An optional tag used to identify the content for later annotations. + /// -> none | label + tag: none, + /// The color used for the rectangle stroke and later annotations. + /// -> color + color: black, + /// The fill style for the rectangle. + /// -> none | color | gradient | pattern + fill: none, + /// The stroke style for the rectangle. + /// If its `paint` is set to `auto`, it will be set to the `color`. + /// -> none | length | color | gradient | stroke | pattern | dictionary + stroke: .05em, + /// The corner radius of the rectangle. -> relative | dictionary + radius: (:), + /// The spacing between the marked content and the edge of the rectangle. + /// This can be specified as a single `length` value which applies to all sides, + /// or as a `dictionary` of `length` with keys `left`, `right`, `top`, `bottom`, `x`, `y`, or `rest`. + /// -> none | length | dictionary + padding: (y: .1em), +) = { + if stroke != none { + stroke = std.stroke(stroke) + if stroke.paint == auto { + stroke = copy-stroke(stroke, (paint: color)) + } + } + + let underlay = if fill == none and stroke == none { none } else { + (width, height, _) => { + rect( + width: width, + height: height, + fill: fill, + stroke: stroke, + radius: radius, + ) + } + } + + return core-mark(body, tag: tag, color: color, underlay: underlay, padding: padding) +} + + +/// Marks content within a math block with an underline. +/// +/// If you mark content with a tag, you can annotate it using the `annot` function. +/// +/// *Example* +/// ```example +/// $ markul(x + y) $ +/// ``` +/// +/// -> content +#let markul( + /// The content to be underlined within a math block. -> content + body, + /// An optional tag used to identify the underlined content for later annotations. + /// -> none | label + tag: none, + /// The color used for the underline. -> color + color: black, + /// The stroke style for the underline. + /// -> none | length | color | gradient | stroke | pattern | dictionary + stroke: .05em, + /// The spacing between the marked content and the underline. + /// -> none | length + padding: .15em, +) = { + if stroke != none { + stroke = std.stroke(stroke) + if stroke.paint == auto { + stroke = copy-stroke(stroke, (paint: color)) + } + } + if type(padding) == length { + padding = (bottom: padding) + } + + let overlay = if stroke == none { none } else { + (width, height, _) => { + line(start: (0pt, height), end: (width, height), stroke: stroke) + } + } + + return core-mark(body, tag: tag, color: color, overlay: overlay, padding: padding) +} + + +/// Marks content within a math block and changes its text color. +/// +/// If you mark content with a tag, you can annotate it using the `annot` function. +/// +/// *Example* +/// ```example +/// $ marktc(x + y) $ +/// ``` +/// +/// -> content +#let marktc( + /// The content to be underlined within a math block. -> content + body, + /// An optional tag used to identify the underlined content for later annotations. + /// -> none | label + tag: none, + /// The color used for the underline. -> color + color: red, +) = { + body = text(fill: color, body) + + return core-mark(body, tag: tag, color: color, padding: .15em) +} diff --git a/packages/preview/mannot/0.2.1/src/util.typ b/packages/preview/mannot/0.2.1/src/util.typ new file mode 100644 index 0000000000..69e5b03d3c --- /dev/null +++ b/packages/preview/mannot/0.2.1/src/util.typ @@ -0,0 +1,11 @@ +#let copy-stroke(_stroke, args) = { + let s = stroke(_stroke) + return stroke(( + paint: args.at("paint", default: s.paint), + thickness: args.at("thickness", default: s.thickness), + cap: args.at("cap", default: s.cap), + join: args.at("join", default: s.join), + dash: args.at("dash", default: s.dash), + miter-limit: args.at("miter-limit", default: s.miter-limit), + )) +} diff --git a/packages/preview/mannot/0.2.1/typst.toml b/packages/preview/mannot/0.2.1/typst.toml new file mode 100644 index 0000000000..99b3eca4d4 --- /dev/null +++ b/packages/preview/mannot/0.2.1/typst.toml @@ -0,0 +1,12 @@ +[package] +name = "mannot" +version = "0.2.1" +entrypoint = "src/lib.typ" +authors = ["ryuryu-ymj"] +license = "MIT" +description = "A package for marking and annotating in math blocks." +repository = "https://github.com/ryuryu-ymj/mannot" +keywords = ["mark", "highlight", "annotation", "math"] +categories = ["visualization", "layout"] +compiler = "0.12.0" +exclude = ["docs/*", "tests/*", "examples/*"]