a

ankify

@preview

Generate and sync Anki flashcards from your Typst documents.

v0.1.0
MIT

Package Information

Last Updated
Minimum Typst Version
0.14.0
Authors
N. V. Lang
Categories
integrationscriptingutility

1. Get the package

Download the package using the TPIX CLI:

tpix get @preview/ankify:0.1.0

2. Import in your Typst file

Add this to your .typ file:

#import "@preview/ankify:0.1.0": *

Version History

0.1.00.14.0
9040148d4da3...

Warning: ankify is in alpha and under active development. Expect bugs,
rough edges, and breaking changes between releases.

ankify lets you mark up Anki flashcards inline as
you write Typst. Its companion ankify command-line tool then renders each
card and syncs it to Anki. Take your notes once, in Typst, and get
spaced-repetition flashcards out of them with very little extra effort.

Important — this Typst package only records flashcards, as document
metadata; on its own it produces no visible output. The
ankify CLI does the actual rendering and
syncing — you need both.

Usage

#import "@preview/ankify:0.1.0": note, configure

#configure(defaults: (deck: "My Course"))

#note(
  "pythagoras",
  data: (Front: "What is the Pythagorean theorem?", Back: [$a^2 + b^2 = c^2$]),
)

Then run ankify notes.typ with the CLI to push the cards to Anki.

The helper pattern

note() produces no visible output, so it shines when called from a helper
that also typesets the item — then every use of that helper becomes a card:

#let definition(label, term, body) = {
  note(label, data: (Front: [Define: #term], Back: body))
  block(inset: 8pt, stroke: 0.5pt)[*Definition (#term).* #body]
}

#definition("def-continuity", "continuity")[
  A function $f$ is continuous at $a$ if $lim_(x -> a) f(x) = f(a)$.
]

Write your notes as usual; each definition(...) both typesets the definition
and yields a flashcard.

API

note(label, ..)

Parameter Meaning Default
label (positional) Unique identifier; the card's sync key.
data Dictionary of Anki field name → content or string.
deck Target Anki deck. "Default"
model Anki note type. "Basic"
tags Array of tag strings. ()
format "svg", "png", or "plain" — how the fields render. "svg"
other Extra metadata passed through to AnkiConnect. none
render Function transforming each field before it is rendered (advanced). identity

A field's value may be a string, Typst content, or a (value, format)
dictionary that overrides the format for that one field. svg cards are
rendered as scalable, theme-aware images; plain fields are sent as text.

configure(..)

Optional document-wide settings — call it once near the top of the document:

#configure(
  scale: 1.5,
  defaults: (deck: "My Course", tags: ("lecture",), format: "svg"),
)

scale enlarges every rendered card image; defaults supplies the fallback
deck, model, tags, and format used by every note() that does not set
its own.

basic and cloze

Shorthands for the two most common card shapes:

#basic("fr-capital", "Capital of France?", "Paris")
#cloze("jp-capital", "The capital of Japan is {{c1::Tokyo}}.")

The full workflow

Installing the CLI, setting up the AnkiConnect
add-on, and the incremental sync workflow are all described in the
project README.

License

MIT — see LICENSE.

Trademarks

Anki is a trademark of Ankitects Pty Ltd. ankify is an independent project,
not affiliated with, endorsed by, or sponsored by Ankitects Pty Ltd.