# Zotero library for the manuscript's references `Evolution of sex for AI.ris` — all 80 references from `paper/pnas/main.md`, with metadata fetched from the publisher of record rather than retyped. **To import:** Zotero → File → Import… → choose this file → keep "Place imported collections and items into new collection" ticked. The collection takes its name from the file, so rename the file first if you want a different folder name. ## How it was built `build_zotero_library.py` (run from the repo root) parses the numbered reference list, resolves a DOI for each entry, and fetches authoritative metadata by content negotiation against doi.org, which serves both Crossref and DataCite records. Each Zotero item carries its manuscript reference number in the Extra/Notes field, so an item can be traced back to its citation. - **77 of 80 resolved from a DOI.** 53 DOIs were already printed in the manuscript; the rest were found by Crossref title search, accepted only when the returned title actually matched (a plain relevance score is not enough — Crossref answers confidently for pre-DOI works). - **2 needed a hand-verified DOI:** ref 17 (Brinkmann et al., *Machine culture*), where the search returned a different paper with a near-identical title, and ref 64 (Schwarz et al., *Progress & Compress*), a PMLR paper with no Crossref DOI, cited by its arXiv DOI instead. - **3 genuinely predate DOIs** and are written out by hand in the script: Jenkin 1867, Fisher 1930 (book), Templeton 1986 (book chapter). `resolution-report.tsv` records the outcome and source for every entry. `references.csl.json` is the same library as CSL-JSON, for any tool that prefers it. ## Notes on the records arXiv DOIs come back from DataCite uppercased and with no venue; the script restores the canonical `10.48550/arXiv.NNNN` casing and sets the publication to *arXiv* with the identifier in the archive field, so those items do not import as untitled journal articles. Publisher abstracts arrive wrapped in JATS markup with HTML entities and hard line breaks, all of which are stripped — RIS is line-oriented, and an unescaped abstract silently corrupts the record that follows it. Re-run the script after any change to the reference list; it is a pure function of `main.md`.