diff --git a/packages/preview/alexandria/0.1.2/.gitignore b/packages/preview/alexandria/0.1.2/.gitignore
new file mode 100644
index 0000000000..2f7896d1d1
--- /dev/null
+++ b/packages/preview/alexandria/0.1.2/.gitignore
@@ -0,0 +1 @@
+target/
diff --git a/packages/preview/alexandria/0.1.2/CHANGELOG.md b/packages/preview/alexandria/0.1.2/CHANGELOG.md
new file mode 100644
index 0000000000..c2bb8dd2d7
--- /dev/null
+++ b/packages/preview/alexandria/0.1.2/CHANGELOG.md
@@ -0,0 +1,62 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [Unreleased]
+
+
+Migration guide from v0.1.x
+
+
+
+
+
+### Added
+
+### Changed
+
+### Deprecated
+
+### Removed
+
+### Fixed
+
+### Security
+
+## [0.1.2] - 2025-03-08
+
+### Added
+- support for `bytes` as a bib or csl file parameter, to be up-to-date with Typst 0.13's `bibliography()` API
+
+## [0.1.1] - 2025-02-12
+
+### Added
+- `load-bibliography` that stores bib data for later retrieval
+- `get-bibliography` that retrieves the data
+- `render-bibliography` that renders the bib data
+- add details (type, title, author, ...) to data available for bibliography users
+- add support for custom CSL styles loaded from files
+
+### Fixed
+- fixed a deprecation warning when running Typst 0.13
+- split bibliographyx into load, get and render parts
+
+## [0.1.0] - 2025-02-06
+
+### Added
+
+- plugin for rendering references and citations
+- Typst wrapper for
+ - collecting citations
+ - calling the plugin
+ - processing its results (rendering structured data into styled content)
+- Tests for IEEE and APA references in English and German (APA tests are deactivated to to something that's probably a Typst bug)
+
+
+[Unreleased]: https://github.com/SillyFreak/typst-alexandria/compare/v0.1.2...HEAD
+[0.1.2]: https://github.com/SillyFreak/typst-alexandria/releases/tag/v0.1.2
+[0.1.1]: https://github.com/SillyFreak/typst-alexandria/releases/tag/v0.1.1
+[0.1.0]: https://github.com/SillyFreak/typst-alexandria/releases/tag/v0.1.0
diff --git a/packages/preview/alexandria/0.1.2/LICENSE b/packages/preview/alexandria/0.1.2/LICENSE
new file mode 100644
index 0000000000..52b4250d96
--- /dev/null
+++ b/packages/preview/alexandria/0.1.2/LICENSE
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright (c) 2024 Clemens Koza
+
+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/alexandria/0.1.2/README.md b/packages/preview/alexandria/0.1.2/README.md
new file mode 100644
index 0000000000..be7933e08f
--- /dev/null
+++ b/packages/preview/alexandria/0.1.2/README.md
@@ -0,0 +1,38 @@
+# Alexandria
+
+This package provides an alternative to the built-in bibliography to allow a single document to have multiple bibliographies.
+
+This package currently has a few limitations, such as not being able to collapse citations yet, but more general support is planned soon.
+
+## Getting Started
+
+To add this package to your project, use this:
+
+```typ
+#import "@preview/alexandria:0.1.2": *
+
+#show: alexandria(prefix: "x-", read: path => read(path))
+
+...
+
+#bibliographyx(
+ "bibliography.bib",
+ // title: auto is not yet supported so it needs to be specified
+ title: "Bibliography",
+)
+```
+
+
+
+
+
+
+## Usage
+
+See the [manual](docs/manual.pdf) for details.
+
+## License
+
+Parts of the Rust plugin that interfaces with the [Hayagriva](https://github.com/typst/hayagriva) citation library are based on [typst-library's `bibliography.rs`](https://github.com/typst/typst/blob/26e65bfef5b1da7f6c72e1409237cf03fb5d6069/crates/typst-library/src/model/bibliography.rs). Likewise, the example bibliographies are taken or adapted from [typst-dev-assets' `works.bib`](https://github.com/typst/typst-dev-assets/blob/1dba4bea22e5e19597fbf5f321b047ff7626e2d0/files/bib/works.bib). Both are licensed from Typst's authors under the Apache License 2.0.
+
+The example CSL style [`ieee.csl`](https://github.com/citation-style-language/styles/blob/fd6cb3e81762055d107839c3c288c359985f81c8/ieee.csl) is taken from the [CSL project](https://citationstyles.org/) who provide it under the [Creative Commons Attribution-ShareAlike 3.0 Unported license](https://creativecommons.org/licenses/by-sa/3.0/).
diff --git a/packages/preview/alexandria/0.1.2/docs/manual.pdf b/packages/preview/alexandria/0.1.2/docs/manual.pdf
new file mode 100644
index 0000000000..826d87bdbc
Binary files /dev/null and b/packages/preview/alexandria/0.1.2/docs/manual.pdf differ
diff --git a/packages/preview/alexandria/0.1.2/gallery/example.pdf b/packages/preview/alexandria/0.1.2/gallery/example.pdf
new file mode 100644
index 0000000000..35baed0751
Binary files /dev/null and b/packages/preview/alexandria/0.1.2/gallery/example.pdf differ
diff --git a/packages/preview/alexandria/0.1.2/src/alexandria.wasm b/packages/preview/alexandria/0.1.2/src/alexandria.wasm
new file mode 100755
index 0000000000..6e6446fd09
Binary files /dev/null and b/packages/preview/alexandria/0.1.2/src/alexandria.wasm differ
diff --git a/packages/preview/alexandria/0.1.2/src/hayagriva.typ b/packages/preview/alexandria/0.1.2/src/hayagriva.typ
new file mode 100644
index 0000000000..cfc03cadd0
--- /dev/null
+++ b/packages/preview/alexandria/0.1.2/src/hayagriva.typ
@@ -0,0 +1,59 @@
+#let _p = plugin("alexandria.wasm")
+
+#let names = {
+ // Typst 0.13: `cbor.decode` is deprecated, directly pass bytes to `cbor` instead
+ let decode = if sys.version < version(0, 13, 0) { cbor.decode } else { cbor }
+
+ decode(_p.names())
+}
+
+#let read(
+ sources,
+ full,
+ style,
+ locale,
+ citations,
+) = {
+ // Typst 0.13: `cbor.decode` is deprecated, directly pass bytes to `cbor` instead
+ let decode = if sys.version < version(0, 13, 0) { cbor.decode } else { cbor }
+
+ let config = cbor.encode((sources: sources, full: full, style: style, locale: locale, citations: citations))
+ decode(_p.read(config))
+}
+
+#let render(body) = {
+ if type(body) == array {
+ body.map(render).join()
+ } else if "text" in body {
+ let body = body.text
+ set text(style: "italic") if body.font-style == "italic"
+ // TODO this is an absolute weight and not an offset
+ set text(weight: "bold") if body.font-weight == "bold"
+ set text(weight: "light") if body.font-weight == "light"
+ show: it => {
+ if body.font-variant == "small-caps" {
+ it = smallcaps(it)
+ }
+ if body.text-decoration == "underline" {
+ it = underline(it)
+ }
+ if body.vertical-align == "sup" {
+ it = h(0pt, weak: true) + super(it)
+ } else if body.vertical-align == "sub" {
+ it = h(0pt, weak: true) + sub(it)
+ }
+ it
+ }
+ body.text
+ } else if "elem" in body {
+ let body = body.elem
+ // TODO handle body.display when present
+ render(body.children)
+ } else if "link" in body {
+ let body = body.link
+ link(body.url, render(body.text))
+ } else {
+ set text(red)
+ repr(body)
+ }
+}
diff --git a/packages/preview/alexandria/0.1.2/src/internal.typ b/packages/preview/alexandria/0.1.2/src/internal.typ
new file mode 100644
index 0000000000..e4e099ee76
--- /dev/null
+++ b/packages/preview/alexandria/0.1.2/src/internal.typ
@@ -0,0 +1,13 @@
+#let locale() = {
+ let locale = text.lang
+ if text.region != none { locale += "-" + text.region }
+ locale
+}
+
+#let csl-to-string(csl) = {
+ if type(csl) in (str, bytes) { return csl }
+
+ let csl = repr(csl).slice(1, -1)
+ assert.ne(csl, "..", message: "only named CSL styles can be converted to strings")
+ csl
+}
diff --git a/packages/preview/alexandria/0.1.2/src/lib.typ b/packages/preview/alexandria/0.1.2/src/lib.typ
new file mode 100644
index 0000000000..e99a425d53
--- /dev/null
+++ b/packages/preview/alexandria/0.1.2/src/lib.typ
@@ -0,0 +1,289 @@
+#import "hayagriva.typ"
+
+
+#let citation(prefix, key, form: "normal", style: auto) = {
+ import "state.typ": *
+ import "internal.typ": *
+
+ assert(str(key).starts-with(prefix), message: "Can only refer to an entry with the given prefix.")
+
+ let index = get-citation-index(prefix)
+ context add-citation(prefix, (
+ key: str(key).slice(prefix.len()),
+ form: form,
+ ..if style != auto { (style: csl-to-string(style)) },
+ locale: locale(),
+ ))
+ context link(key, hayagriva.render(get-citation(prefix, index)))
+}
+
+/// This configuration function should be called as a show rule at the beginning of the document.
+/// The function makes sure that `ref()` and `cite()` commands can refer to Alexandria's custom
+/// bibliography entries and stores configuration for use by @@load-bibliography().
+///
+/// ```typ
+/// #show: alexandria(prefix: "x-", read: path => read(path))
+/// ```
+///
+/// The `read` parameter kann be skipped, in which case file paths can not be used for bibliography
+/// files and custom styles. This means you will need to pass `bytes` values to @@bibliographyx()
+/// and @@load-bibliography() instead of paths.
+///
+/// -> function
+#let alexandria(
+ /// a prefix that identifies labels referring to Alexandria bibliographies. Bibliography entries
+ /// will automatically get that prefix prepended.
+ /// -> string
+ prefix: none,
+ /// pass ```typc path => read(path)``` into this parameter so that Alexandria can read your
+ /// bibliography files.
+ /// -> function
+ read: none,
+) = body => {
+ let read-value = read
+ import "state.typ": *
+
+ assert.ne(prefix, none, message: "usage without a prefix is not yet supported")
+ // assert.ne(read-value, none, message: "read is required; provide a function `path => read(path)`")
+
+ let match(key) = prefix == none or str(key).starts-with(prefix)
+
+ set-read(read-value)
+ register-prefix(prefix)
+
+ show ref: it => {
+ if not match(it.target) {
+ return it
+ }
+
+ citation(prefix, it.target, form: cite.form, style: cite.style)
+ }
+
+ show cite: it => {
+ if not match(it.key) {
+ return it
+ }
+
+ context citation(prefix, it.key, form: it.form, style: it.style)
+ }
+
+ body
+}
+
+/// Loads an additional bibliography. This reads the relevant bibliography file(s) and stores the
+/// extracted data in a state for later retrieval via @@get-bibliography(), but does not render
+/// anything yet. For simple use cases, @@bibliographyx() can be used directly.
+///
+/// Even though this only loads the bibliography, this function already requires knowledge of the
+/// citations that appear in the document, both to know which references to include (for non-`full`
+/// bibliographies) and in what styles, forms and languages these citations should be rendered.
+///
+/// The interface is similar to the built-in
+/// #link("https://typst.app/docs/reference/model/bibliography/")[`bibliography()`], but not all
+/// features are supported (yet). In particular, the default values reflect `bibliography()`, but
+/// some of these are not supported yet and need to be set manually. Also, the title parameter (only
+/// needed for rendering) is skipped.
+///
+/// -> content
+#let load-bibliography(
+ /// The path to or binary file contents of the bibliography file(s).
+ /// -> string | bytes | array
+ path,
+ /// The prefix for which reference labels should be provided and citations should be processed.
+ /// -> string | auto
+ prefix: auto,
+ /// Whether to render the full bibliography or only the references that are used in the document.
+ /// -> boolean
+ full: false,
+ /// The style of the bibliography. Either a #link("https://typst.app/docs/reference/model/bibliography/#parameters-style")[built-in style],
+ /// a file name that is read by the `read()` function registered via @@alexandria(), or binary
+ /// file contents of a csl file.
+ /// -> string | bytes
+ style: "ieee",
+) = {
+ import "state.typ": *
+ import "internal.typ": *
+
+ let path = path
+ if type(path) != array {
+ path = (path,)
+ }
+
+ context {
+ let prefix = prefix
+ if prefix == auto {
+ prefix = get-only-prefix()
+ assert.ne(prefix, none, message: "when using multiple custom bibliographies, you must specify the prefix for each")
+ }
+
+ let sources = path.map(path => read(path))
+
+ let style = csl-to-string(style)
+ if style in hayagriva.names {
+ style = (built-in: style)
+ } else {
+ style = (custom: read(style).data)
+ }
+
+ let locale = locale()
+ set-bibliography(prefix, citations => hayagriva.read(
+ sources,
+ full,
+ style,
+ locale,
+ citations,
+ ))
+ }
+}
+
+/// Returns a previously loaded bibliography. This is used implicitly by @@bibliographyx() and
+/// Alexandria citations to retrieve rendered data, and can be used directly for more complex use
+/// cases. Usually, the returned data will be ultimately rendered using @@render-bibliography().
+///
+/// The result is a dictionary with the following keys:
+/// - `prefix`: the string prefix used by Alexandria to identify this bibliography (and passed to
+/// this function), used as a prefix for all labels rendered by Alexandria.
+/// - `references`: an array of reference dictionaries which can be rendered into a bibliography.
+/// The array is sorted by the appearance of references according to the style used.
+/// - `citations`: an array of citations dictionaries which can be rendered into the various
+/// citations in the document. The array is sorted by the appearance of citations in the document.
+/// - `hanging-indent`: a boolean indicating whether the citation style uses a hanging indent for
+/// its entries.
+///
+/// The `references` in turn each contain
+/// - `key`: the reference key without prefix.
+/// - `reference`: a representation of the Typst content that should be rendered; this is processed
+/// by @@render-bibliography() to produce the actual context.
+/// - optionally `prefix`: this is _not_ the Alexandria prefix but another Typst content
+/// representation for styles that require it. For example, in IEEE style this would represent
+/// "[1]" and so on.
+/// - `details`: a dictionary containing several fields of structured data about the reference.
+/// Among these are `type`, `title`, `author`, `date`, etc. A full list can be found in the
+/// #link("https://github.com/typst/hayagriva/blob/main/docs/file-format.md")[Hayagriva docs].
+///
+/// The `citations` are representations of the Typst content that should be rendered at their
+/// respective citation sites.
+///
+/// This function is contextual.
+///
+/// -> dict
+#let get-bibliography(
+ /// The prefix for which the bibliography should be retrieved.
+ /// -> string
+ prefix,
+) = {
+ import "state.typ": *
+
+ get-bibliography(prefix)
+}
+
+/// Renders the provided bibliography data (as returned by @@get-bibliography();) with the given
+/// title. For simple use cases, @@bibliographyx() can be used directly, which also handles the data
+/// retrieval.
+///
+/// You will usually only need to call this directly if you _don't_ pass the exact return value of
+/// @@get-bibliography() as an argument. Instead, you'll want to preprocess that data, e.g. by
+/// filtering out some `references` entries that should appear elsewhere in the document. Note that
+/// generally, you'll need to ultimately render all references, or you'll get unresolved citations.
+///
+/// -> content
+#let render-bibliography(
+ /// The bibliography data
+ /// -> dict
+ bib,
+ /// The title of the bibliography. Note that `auto` is currently not supported.
+ /// -> none | content | auto
+ title: auto,
+) = {
+ assert.ne(title, auto, message: "automatic title is not yet supported")
+
+ if title != none {
+ [= #title]
+ }
+
+ set par(hanging-indent: 1.5em) if bib.hanging-indent
+
+ if bib.references.any(e => e.prefix != none) {
+ grid(
+ columns: 2,
+ // rows: (),
+ column-gutter: 0.65em,
+ // row-gutter: 13.2pt,
+ row-gutter: par.spacing,
+ // fill: none,
+ // align: auto,
+ // stroke: (:),
+ // inset: (:),
+ ..for e in bib.references {
+ (
+ {
+ [#metadata(none)#label(bib.prefix + e.key)]
+ if e.prefix != none {
+ hayagriva.render(e.prefix)
+ }
+ },
+ hayagriva.render(e.reference),
+ )
+ },
+ )
+ } else {
+ let gutter = v(par.spacing, weak: true)
+ for (i, e) in bib.references.enumerate() {
+ if i != 0 { gutter }
+ [#metadata(none)#label(bib.prefix + e.key)]
+ hayagriva.render(e.reference)
+ }
+ }
+}
+
+/// Renders an additional bibliography. The interface is similar to the built-in
+/// #link("https://typst.app/docs/reference/model/bibliography/")[`bibliography()`], but not all
+/// features are supported (yet). In particular, the default values reflect `bibliography()`, but
+/// some of these are not supported yet and need to be set manually.
+///
+/// ```typ
+/// #bibliographyx(
+/// "bibliography.bib",
+/// title: "Bibliography",
+/// full: true,
+/// style: "ieee",
+/// )
+/// ```
+///
+/// This function is based on @@load-bibliography(), @@get-bibliography(), and
+/// @@render-bibliography() and simply reproduces the rendering of the built-in bibliography without
+/// modification.
+///
+/// -> content
+#let bibliographyx(
+ /// The path to or binary file contents of the bibliography file(s).
+ /// -> string | bytes | array
+ path,
+ /// The prefix for which reference labels should be provided and citations should be processed.
+ /// -> string | auto
+ prefix: auto,
+ /// The title of the bibliography. Note that `auto` is currently not supported.
+ /// -> none | content | auto
+ title: auto,
+ /// Whether to render the full bibliography or only the references that are used in the document.
+ /// -> boolean
+ full: false,
+ /// The style of the bibliography.
+ /// -> string | bytes
+ style: "ieee",
+) = {
+ import "state.typ": *
+
+ load-bibliography(path, prefix: prefix, full: full, style: style)
+
+ context {
+ let prefix = prefix
+ if prefix == auto {
+ prefix = get-only-prefix()
+ assert.ne(prefix, none, message: "when using multiple custom bibliographies, you must specify the prefix for each")
+ }
+
+ let bib = get-bibliography(prefix)
+ render-bibliography(bib, title: title)
+ }
+}
diff --git a/packages/preview/alexandria/0.1.2/src/state.typ b/packages/preview/alexandria/0.1.2/src/state.typ
new file mode 100644
index 0000000000..cfafb4640e
--- /dev/null
+++ b/packages/preview/alexandria/0.1.2/src/state.typ
@@ -0,0 +1,69 @@
+#let config = state("__alexandria-config", (
+ citations: (:),
+ read: none,
+))
+#let bibliographies = state("__alexandria-bibliographies", (:))
+
+#let set-read(read) = config.update(x => {
+ x.read = read
+ x
+})
+
+#let read(data) = {
+ if type(data) == bytes {
+ (path: none, data: str(data))
+ } else if type(data) == str {
+ let read = config.get().read
+ assert.ne(read, none, message: "Alexandria is not configured. Make sure to use `#show: alexandria(...)`")
+ (path: data, data: read(data))
+ } else {
+ panic("parameter must be a path string or data bytes")
+ }
+}
+
+#let register-prefix(..prefixes) = {
+ assert.eq(prefixes.named().len(), 0)
+ let prefixes = prefixes.pos()
+
+ config.update(x => {
+ for prefix in prefixes {
+ x.citations.insert(prefix, ())
+ }
+ x
+ })
+
+ bibliographies.update(x => {
+ for prefix in prefixes {
+ x.insert(prefix, none)
+ }
+ x
+ })
+}
+
+#let get-citation-index(prefix) = config.get().citations.at(prefix).len()
+
+#let add-citation(prefix, citation) = config.update(x => {
+ x.citations.at(prefix).push(citation)
+ x
+})
+
+#let get-only-prefix() = {
+ let citations = config.get().citations
+ if citations.len() != 1 {
+ return none
+ }
+ citations.keys().first()
+}
+
+#let set-bibliography(prefix, hayagriva) = {
+ let citations = config.final().citations.at(prefix)
+ bibliographies.update(x => {
+ if x.at(prefix) == none {
+ x.at(prefix) = (prefix: prefix, ..hayagriva(citations))
+ }
+ x
+ })
+}
+
+#let get-bibliography(prefix) = bibliographies.final().at(prefix)
+#let get-citation(prefix, index) = get-bibliography(prefix).citations.at(index)
diff --git a/packages/preview/alexandria/0.1.2/thumbnail-dark.svg b/packages/preview/alexandria/0.1.2/thumbnail-dark.svg
new file mode 100644
index 0000000000..13bff6ef7d
--- /dev/null
+++ b/packages/preview/alexandria/0.1.2/thumbnail-dark.svg
@@ -0,0 +1,2279 @@
+
diff --git a/packages/preview/alexandria/0.1.2/thumbnail-light.svg b/packages/preview/alexandria/0.1.2/thumbnail-light.svg
new file mode 100644
index 0000000000..52a622dbe5
--- /dev/null
+++ b/packages/preview/alexandria/0.1.2/thumbnail-light.svg
@@ -0,0 +1,2279 @@
+
diff --git a/packages/preview/alexandria/0.1.2/typst.toml b/packages/preview/alexandria/0.1.2/typst.toml
new file mode 100644
index 0000000000..8bc2d18671
--- /dev/null
+++ b/packages/preview/alexandria/0.1.2/typst.toml
@@ -0,0 +1,38 @@
+# for a description of available keys, see https://github.com/typst/packages/?tab=readme-ov-file#package-format
+
+[package]
+name = "alexandria"
+version = "0.1.2"
+entrypoint = "src/lib.typ"
+authors = [
+ "Clemens Koza "
+]
+license = "MIT"
+description = "Use multiple bibliographies in a single Typst document "
+# homepage = ""
+repository = "https://github.com/SillyFreak/typst-alexandria"
+keywords = ["bibliography"]
+categories = ["model", "thesis"]
+disciplines = []
+compiler = "0.12.0"
+exclude = [
+ ".github",
+ "docs",
+ "gallery",
+ "scripts",
+ "tests",
+ ".typstignore",
+ "Justfile",
+ "thumbnail-dark.svg",
+ "thumbnail-light.svg",
+ # not included: Rust files & dirs that are not submitted in a publishing PR anyway:
+ # plugin, target, Cargo.lock, Cargo.toml
+]
+
+# [template]
+# path = "template"
+# entrypoint = "main.typ"
+# thumbnail = "thumbnail.png"
+
+# [tool.mytool]
+# foo = "bar"