Skip to content

footnotes loose references ​

Type: section

Signature: section().footnotes(schema, { enforceReferences: false }).min(...)

What It Is ​

footnotes(..., { enforceReferences: false }) extracts and validates only footnote definitions declared in the section. Inline references like [^id] are not matched against definitions in this mode, so unresolved citations do not produce structural footnote-reference errors. The method still validates each extracted footnote item with the provided schema.

When to Use ​

Use this mode for ingestion and drafting workflows where you want to catalog footnote definitions even when references are incomplete. It is useful for migration pipelines, partial content generation, and internal note repositories that accept temporary mismatches. Switch to enforced mode when reference integrity must block parsing.

section().footnotes(schema, { enforceReferences: false }).min(...) ​

Input Markdown ​

md
## 9. ADVANCED BLOCK

Text with note[^1].

[^a]: Footnote content.

Schema ​

ts
import { md } from '@markschema/mdshape'

const schema = md.document({
  footnotes: md
    .section('9. ADVANCED BLOCK')
    .footnotes(md.object({ id: md.string(), text: md.string() }), { enforceReferences: false })
    .min(1),
})

Result ​

Success ​

json
{
  "success": true,
  "data": {
    "footnotes": [
      {
        "id": "a",
        "text": "Footnote content."
      }
    ]
  }
}

Error ​

Failure trigger: this example error is unrelated to references; it fails when section 9. ADVANCED BLOCK is missing.

json
{
  "success": false,
  "error": {
    "issues": [
      {
        "code": "missing_section",
        "message": "Missing section \"9. ADVANCED BLOCK\"",
        "path": [
          "footnotes"
        ],
        "line": 1,
        "position": {
          "start": {
            "line": 1,
            "column": 1
          }
        }
      }
    ]
  }
}