citum-engine
citum-engine is the Rust citation and bibliography processor for Citum. Use
it when your application already has, or can load, Citum styles, reference data,
and citation occurrences, and needs formatted citations or bibliographies as
plain text, HTML, Djot, LaTeX, or Typst.
The engine is intentionally narrower than the full Citum application stack. It does not manage registries, fetch remote styles, or persist user data. Those responsibilities belong in adapters such as a CLI, server, editor integration, or application-specific resolver.
Installation
[]
= "0.53"
# Optional, but recommended when loading bibliography files.
= "0.53"
Default features include icu, which enables ICU-backed collation and locale
support used by sorting and rendering. Optional features:
| Feature | Purpose |
|---|---|
ffi |
Enables the C ABI module. |
schema |
Enables JSON Schema generation support for API-facing types. |
Which API to Use
Most integrations should start with the document-level API:
format_documentresolves a local style fromStyleInput::PathorStyleInput::Yaml, then formats ordered citation occurrences and a bibliography.format_document_with_styletakes an already resolvedStyleas its first argument, plus the sameFormatDocumentRequestshape. Use this when your application has its own style resolver, registry, cache, or embedded style bundle.
Use Processor directly when you need lower-level control over individual
citations, bibliography rendering, output-format generics, locales, or parsed
document pipelines.
The Processor::process_document path is an advanced document parser pipeline
for Djot and a common subset of Pandoc-style Markdown citation syntax. If your
application already parses a document into citation occurrences, prefer
format_document or format_document_with_style.
Quick Start
This example uses the document-level API with a local Citum style file and
citum-io for bibliography loading. citum-io::load_bibliography supports
Citum YAML, Citum JSON, Citum CBOR, and CSL-JSON bibliography files.
use ;
use load_bibliography;
use Path;
If your application resolves styles before calling the engine, parse or load the
style into citum_schema::Style and call format_document_with_style(style, request) instead. StyleInput::Id and StyleInput::Uri are accepted in request
types for adapter compatibility, but format_document cannot resolve them by
itself. format_document_with_style still requires FormatDocumentRequest.style
to be populated; callers usually keep the original StyleInput there for
serialization or diagnostics, while the function renders with the explicit
Style argument.
Inputs and Outputs
The document-level API expects:
| Input | Type | Notes |
|---|---|---|
| Style | StyleInput; optionally a separate resolved Style |
format_document resolves local path or inline YAML values from request.style. format_document_with_style uses its explicit Style argument, but the request still includes a style field. |
| References | Bibliography |
An IndexMap keyed by reference ID, containing Citum input references. |
| Citations | Vec<CitationOccurrence> |
Ordered as they appear in the document so note positions and repeated citations can be processed. |
| Output format | OutputFormatKind |
plain, html, djot, latex, or typst. |
The result contains formatted citations, a formatted bibliography, per-entry bibliography metadata, and structured warnings. Missing references and forward-compatible unknown values are reported as warnings where rendering can continue.
Boundaries
- The engine does not fetch remote styles, access registries, or resolve style
IDs and URIs. Resolve those before calling
format_document_with_style, or use another Citum adapter that provides a resolver chain. format_documentuses the built-inen-USlocale. A non-en-USlocale tag currently produces a warning and falls back unless the caller uses lower-level APIs with a resolved locale.- Markdown document parsing supports the common Pandoc-style citation subset listed below. It does not implement all Djot document features.
- Inline markup inside bibliographic fields such as
title,annotation, andnoteis Djot-based and independent from the document input format.
Document Syntax
The engine supports two document input formats for the process_document
pipeline. These are independent from the document output format and from
reference-field inline markup.
Djot
The Djot adapter supports citation parsing plus:
- YAML frontmatter for bibliography groups and integral-name overrides
- manual footnotes for note-style placement into authored
[^label]:blocks - inline bibliography blocks with
:::bibliography - Djot-to-HTML finalization via
jotdown
Citation Syntax
| Syntax | Description | Example (APA) |
|---|---|---|
[@key] |
Basic parenthetical citation | (Smith, 2023) |
[@key1; @key2] |
Multiple citations | (Smith, 2023; Jones, 2022) |
[prefix ; @key1; @key2] |
Global prefix | (see Smith, 2023; Jones, 2022) |
[@key1; @key2 ; suffix] |
Global suffix | (Smith, 2023; Jones, 2022 for more) |
[prefix ; @key1; @key2 ; suffix] |
Both global affixes | (see Smith, 2023; Jones, 2022 for more) |
Global affixes must be separated from cite keys by a semicolon (;).
Narrative Citations
Narrative citations are integrated into the text flow using the + mode
modifier. For numeric styles, these render as Author [1].
| Syntax | Description | Example |
|---|---|---|
[+@key] |
Explicit narrative | Smith (2023) |
Modifiers
Modifiers appear immediately before the @ symbol.
| Modifier | Type | Description | Syntax | Result |
|---|---|---|---|---|
- |
Visibility | Suppress author | [-@key] |
(2023) |
+ |
Mode | Integral / narrative | [+@key] |
Smith (2023) |
! |
Visibility | Hidden / nocite | [!@key] |
Bibliography only |
Locators
Locators follow a comma after the cite key. Bare locator values default to
page.
| Type | Syntax | Result |
|---|---|---|
| Page | [@key, 45] or [@key, p. 45] |
(Smith, 2023, p. 45) |
| Chapter | [@key, ch. 5] |
(Smith, 2023, ch. 5) |
| Structured | [@key, chapter: 2, page: 10] |
(Smith, 2023, chap. 2, p. 10) |
Complex Examples
[+@smith2023]renders asSmith (2023).[see ; -@smith2023, p. 45; @jones2022]renders as(see 2023, p. 45; Jones, 2022).[compare ; @kuhn1962; @watson1953 ; for discussion]renders as(compare Kuhn, 1962; Watson & Crick, 1953 for discussion).
Markdown (Pandoc-style)
The Markdown adapter supports inline prose citations using a common subset of Pandoc-style citation markers. Frontmatter, manual footnotes, and inline bibliography blocks are not supported by this adapter.
HTML output is not post-processed by the Markdown adapter. Callers receive citation-substituted Markdown and are responsible for any later CommonMark to HTML conversion.
Citation Syntax
| Syntax | Description |
|---|---|
[@key] |
Parenthetical citation |
[@key1; @key2] |
Multi-cite cluster |
[-@key] |
Suppress-author citation |
@key |
Textual / narrative / integral citation |
@key [p. 45] |
Textual citation with bracketed locator |
[@key, p. 45] |
Parenthetical citation with locator |
Djot and Pandoc-style Markdown both use @key as the citation token and [...]
for grouping. The Markdown adapter intentionally supports the common subset;
Djot-specific modifiers such as + and ! are not part of Pandoc syntax and
are not supported there.
Related Crates
citum-schemaprovides the shared style and reference data model.citum-cliprovides thecitumcommand-line interface.citum-serverandcitum-bindingsare adapter surfaces that build on the engine API.
License
Dual-licensed under MIT or Apache-2.0 at your option.