[idea:rookery-bibtex]alpha-package2026-08-20

@rookery/bibtex

Reads a .bib file and mints one idea per reference, keyed and titled from the entry itself, so a work is a note like any other and anything that cites it says so with a backlink.

Write a citation by hand where you have something to say about the work, and sweep the rest of the bibliography with all().

#import "@rookery/core:0.1.0": rookery
#import "@rookery/bibtex:0.1.0": bibtex
#show: rookery

/* Typst cannot call a dictionary key directly, so bind the factory's
   functions once rather than writing #(refs.citation)(..) at every call. */
#let refs = bibtex(read("references.bib"))
#let citation = refs.citation
#let citations-as-ideas = refs.all

/* The BibTeX key names the note, written as a ref, a bare label or a string.
   The title comes off the entry as "Badiou, Ethics (2002)", and the note is
   tagged `citation` alongside whatever tags: you add. */
#citation(<badiou2002>, tags: "essay")[
  Read against Handelman, since it treats the same refusal of mathematics as
  a question of ethics rather than of method.

  /* The entry's own fields, as a definition list. */
  #refs.fields("badiou2002")
]

/* Every entry no hand-written citation has claimed, in key order. Call this
   once, from one vertebra — a register page the bar never lists, which the
   pages a reader browses transclude by tag. */
#citations-as-ideas()

Reading a reference manager’s export

Zotero writes rows that belong to the library rather than to the work, and a library holds far more than a project cites. Narrow and trim at the factory, once.

#let refs = bibtex(
  read("references.bib"),
  /* Parse these keys alone, so a fourteen-hundred-entry export costs what
     the project actually cites and mints as many notes. */
  only: ("badiou2002", "handelman2019"),
  /* Turn Zotero's own keywords into rookery tags, then hide the raw row
     they came from. */
  keywords: "all",
  show-fields: ("keywords": false, "urldate": false, "file": false),
)