0.7.3 • Published 4 months ago

astro-typst v0.7.3

Weekly downloads
-
License
MIT
Repository
github
Last release
4 months ago

astro-typst

An Astro Integration that lets you render Typst within Astro.

Features

  • Import packages in Typst Universe
  • import / include / read files or resources
  • Use system fonts
  • Selectable, clickable text layer
  • Set scale
  • Static SVGs without JavaScript
  • Static HTML output without JavaScript
  • Responsive SVGs
  • Add font files or blobs
  • Content collections

Installation

npm install astro-typst
# or
pnpm add astro-typst
# or
yarn add astro-typst

Usage

As an integration

// astro.config.mjs
import { typst } from 'astro-typst';

... // other imports

export default defineConfig({
    integrations: [/** other integrations */ ..., typst()],
});

Then you can use .typ files just like anything else in Astro: render directly by router, or import in another file.

As a component

To use the component, you need to manually install a dependency to avoid SSR errors:

npm install @myriaddreamin/typst-ts-node-compiler
# or
pnpm add @myriaddreamin/typst-ts-node-compiler
# or
yarn add @myriaddreamin/typst-ts-node-compiler

and add this to your /astro.config.(t|j)s/:

export default defineConfig({
  ...,
  vite: {
    ssr: {
-      external: [...],
+      external: [..., "@myriaddreamin/typst-ts-node-compiler"],
    },
    ...,
  },
  ...,
});

Then, you can pass either one of code | src | input to the component:

---
import { Typst } from "astro-typst/src/components";
const code = `
#set page(margin: 1em)
#let typst  = {
  text(font: "Linux Libertine", weight: "semibold", fill: eastern)[typst]
}
#show "Typst": typst

== Typst: Compose paper faster

$ cases(
dot(x) = A x + B u = mat(delim: "[", 0, 0, dots.h.c, 0, - a_n; 1, 0, dots.h.c, 0, - a_(n - 1); 0, 1, dots.h.c, 0, - a_(n - 2); dots.v, dots.v, dots.down, dots.v, dots.v; 0, 0, dots.h.c, 1, - a_1) x + mat(delim: "[", b_n; b_(n - 1); b_(n - 2); dots.v; b_1) u,

y = C x = mat(delim: "[", 0, 0, dots.h.c, 1) x
) $

#set text(font: ("Garamond", "Noto Serif CJK SC"))

#import "@preview/tablem:0.1.0": tablem

#tablem[
  | *English* | *German* | *Chinese* | *Japanese* |
  | --------- | -------- | --------- | ---------- |
  | Cat       | Katze    | 猫        | 猫         |
  | Fish      | Fisch    | 鱼        | 魚         |
]
`;
---

<Typst code={code} />

<!-- or HTML output: -->

<Typst code={code} target="html" />

In content collections

See demo.

Frontmatter

metadata exposes a value to the query system without producing visible content.

Attach a label frontmatter to the metadata declaration:

#let desc = [$oo$ fun with `math`]
#metadata(
  (
    title: "Test page",
    author: "Neko",
    desc: desc,
    date:  datetime(
      year: 2024,
      month: 8,
      day: 7,
    ),
  )
)<frontmatter>

yields

{
  "title": "Test page",
  "author": "Neko",
  "desc": {
    "children": [
      {
        "block": false,
        "body": {
          "func": "text",
          "text": "∞"
        },
        "func": "equation"
      },
      { "func": "space" },
      { "func": "text", "text": "fun with" },
      { "func": "space" },
      {
        "block": false,
        "func": "raw",
        "text": "math"
      }
    ],
    "func": "sequence"
  },
  "date": "datetime(year: 2024, month: 8, day: 7)"
}

Development

Playground

Change isDebug to true in integration.ts.

pnpm tsc -w
# in another terminal
pnpm dev

Build package

pnpm compile
0.7.2

4 months ago

0.7.3

4 months ago

0.7.0

4 months ago

0.7.0-beta.1

8 months ago

0.5.4-rc1

10 months ago

0.5.4-rc2

10 months ago

0.5.4-rc3

10 months ago

0.5.4

10 months ago

0.5.3

10 months ago

0.5.6

10 months ago

0.5.5

10 months ago

0.5.0

10 months ago

0.6.0

10 months ago

0.4.0

11 months ago

0.3.4

11 months ago

0.3.3

11 months ago

0.3.2

11 months ago

0.3.1

11 months ago

0.3.0

11 months ago

0.2.6

12 months ago

0.2.5

12 months ago

0.2.4

12 months ago

0.2.3

12 months ago

0.2.2

12 months ago

0.2.1

12 months ago

0.2.0

12 months ago