Skip to content

Releases: dginev/latexml-oxide

0.7.5

Choose a tag to compare

@github-actions github-actions released this 07 Aug 04:25
f340797

latexml-oxide 0.7.5 — a single self-contained binary that converts LaTeX into accessible HTML / XML / MathML (a Rust port of LaTeXML).

Highlights

  • Runtime Rhai binding API — add or override package/macro bindings at runtime, no recompile (#333, #336, #351).
  • Bibliography content recovery — hundreds of previously-empty bibliographies now render.
  • Book-scale documents on commodity RAM — a streaming XML core (#448) plus streaming/parallel post rendering (#477, #490), governed by a single --max-memory knob (#363).
  • Wider math coverage and a default-CSS re-sync with upstream LaTeXML.
  • arXiv fidelity fixes — bare title-page date (#519), parbox/mbox math nested in math (#518), sn-jnl author affiliations (#521), and more.

Install

Download the asset for your platform below (each has a matching .sha256; the binary is self-contained). Per-platform guide: README install. Also available via brew install dginev/tap/latexml-oxide, cargo install latexml, or docker pull ghcr.io/dginev/latexml-oxide:0.7.5.

Full changelog: CHANGELOG.md · All merged PRs: 0.7.4…0.7.5

0.7.5-rc5

0.7.5-rc5 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 03 Aug 13:48
3b17da7

Installation

latexml-oxide ships as a single self-contained executable. It also calls a few external tools when they are on your PATH:

  • a TeX distribution (TeX Live, MacTeX, or MiKTeX) — for the packages, classes, and fonts your documents load.
  • graphics tools (ImageMagick, Ghostscript, MuPDF, Poppler, dvipng, dvisvgm) — to convert figures.

Per-platform install instructions are in the README Installation guide.

Download the asset for your platform (each has a matching .sha256 to verify file integrity):

  • Linux (x86-64) — latexml-oxide_0.7.5-rc5-1_amd64.deb, or the portable latexml-oxide-0.7.5-rc5-x86_64-unknown-linux-gnu.tar.gz
  • Linux (aarch64 / arm64) — latexml-oxide_0.7.5-rc5-1_arm64.deb, or the portable latexml-oxide-0.7.5-rc5-aarch64-unknown-linux-gnu.tar.gz
  • macOS (Apple Silicon) — latexml-oxide-0.7.5-rc5-aarch64-apple-darwin.tar.gz
  • macOS (Intel) — latexml-oxide-0.7.5-rc5-x86_64-apple-darwin.tar.gz
  • Windows (x86-64) — latexml-oxide-0.7.5-rc5-x86_64-pc-windows-msvc.zip (unzip; latexml_oxide.exe is self-contained, no installer)

Changelog

[0.7.5] (Rhai binding API; bibliography content recovery; wider math coverage; large-document memory; default-CSS sync; ar5iv corpus fixes)

  • A conversion always writes <jobname>.latexml.log — Perl latexmlc
    parity: with --log unset the log lands in the working directory
    (latexml.log for literal input), replacing any stale copy, and still
    ends with the canonical Status:conversion:N verdict line. rc5's first
    artifacts wrote no log at all unless --log was passed.

  • A memory Fatal now says what to do — the cooperative-fuse message
    names the 75% fuse and the --max-memory ceiling it derives from, and
    advises raising it: hitting the fuse is a known need of large documents
    (peak scales with macro expansion and math density, not source bytes),
    not an anomaly. The run then ends with Info:memory:peak — the
    kernel-tracked peak RSS, the honest lower bound on what THIS document
    needs — in stderr and just above the log's status tail. Clean runs stay
    quiet.

  • Large-document logs got humane — disk staging is by design, so the
    alarming "spilled" wording is gone ("459,579 segment(s) staged to disk");
    the [N] math-progress markers count conversion-wide instead of
    restarting at [1] in every streamed fragment; and Scan: DBStatus:
    backs off exponentially (logs when the object count passes a power of
    two), ~20 lines where a book-scale split wrote 115k+.

  • Page rendering runs in parallel worker processes — after the
    document-wide scan, N workers (LATEXML_RENDER_JOBS, self-clamped to the
    machine's actual memory headroom) render page ranges concurrently,
    byte-identical to the serial path. Measured on the 131 MB witness:
    post-processing 37:31 → 12:17 (3.05×) at 8 workers on a fresh parent;
    the full single-invocation .tex → .html run 1:24 → 1:00:34 with the
    self-sized fleet on a 31 GB laptop, exit 0, all 115,519 pages. The
    ObjectDB behind it gained a SQLite store (Perl --dbfile heritage,
    WAL-concurrent, sqlite3-CLI-inspectable).

  • A book-scale document converts .tex → .html in ONE invocation on a
    31 GB laptop
    — the 131 MB witness end-to-end in 1:17 at a 22.95 GiB peak:
    115,519 pages, exit 0, zero errors. The render loop is now memory-flat
    (~3 KB/page, was ~150 KB/page): Node::get_namespaces in the libxml
    binding leaked its xmlGetNsList array on every call since the crate's
    beginning — fixed upstream in libxml 0.3.21, which this build requires.

  • The run's LAST line is the combined core+post verdict — a core Fatal
    stays the final word even after thousands of per-page post lines
    (Conversion failed: …, exit 1), --log files and archive status
    members end with the canonical Status:conversion:N (the max of the core
    and post phases), so downstream frameworks derive severity from one line.

  • The final tally counts every printed diagnostic, losslessly — the
    same 131 MB run used to log 12,105 Warning: lines and report
    "2 warnings": raw log-crate emissions (chief among them the math
    parser's) bypassed the counters entirely. All diagnostics now flow
    through ONE Perl-shaped vehicle (count + emit + caps + taxonomy), raw
    log-crate diagnostics are lint-banned in the workspace, Fatal: lines
    are never suppressed at any verbosity, and what a reader greps from the
    log is what the verdict reports.

  • --max-memory unset now follows actual machine headroom — 90% of
    AVAILABLE RAM at startup (cgroup-capped, 64 GiB max) instead of half of
    total, so an idle machine converts large documents by default while a busy
    one still self-limits; hand-tuning the ceiling is no longer needed.

  • Book-scale split documents render on commodity RAM — post-processing no
    longer parses the whole document as one DOM before splitting: past 1 GiB of
    core XML, a streaming front-end spills each page as the file streams by and
    scans them one at a time, byte-identical to the whole-DOM split. First
    witness across the line: a 131 MB book's 2.68 GB core XML → 115,519 pages /
    11 GB of HTML in 37½ minutes at 17.4 GB peak on a 31 GB laptop — previously
    an out-of-memory kill with zero pages written.

  • Multi-gigabyte post-processing inputs parse trustworthily — libxml2's
    hard limits (absent XML_PARSE_HUGE) silently corrupted any parse past
    ~1.4 GB (hundreds of thousands of phantom ID already defined errors for
    ids that occur exactly once) and killed it outright at ~1.7 GB. All
    post-processing parses now lift those limits.

  • A 2 GiB-plus core→post handoff no longer dies on libxml2's i32 buffer
    ceiling
    — the single-invocation .tex → .html flow spills the handoff to
    disk beside the destination and streams it.

  • Split pages inherit xml:lang from their ancestors, as Perl does — the
    copy had been silently skipped (namespaced-attribute read).

  • The runtime (Rhai) binding API reaches feature-parity with the compile-time
    macros
    — definition lookup and digest/construct hooks, the same flexary
    option bags, definitions registered from a running body, external commands,
    and the full diagnostics surface.

  • A .rhai binding can parse and manipulate XML/(X)HTML
    document.insertXML splices a parsed subtree, ParseXML exposes the parser
    on its own, namespaces resolve by URI, and malformed markup is rejected
    outright rather than silently salvaged.

  • .rhai bindings reach the same document XML surface the compile-time
    bindings do
    — XPath query, element insertion, and structural editing, each
    under its Perl name.

  • A failing .rhai binding no longer costs the whole document — each
    binding kind degrades to a neutral result and reports a clean Error:.

  • Default HTML styling re-synced to vanilla LaTeXML.css — justified text,
    \underline/\overline and verbatim no-wrap are back; .htm infers HTML5.

  • Adjacent display equations are vertically separated — the bundled CSS
    now carries TeX's display skips (1em, collapsing with paragraph margins),
    so back-to-back \[…\] displays no longer render touching (issue 473).

  • Verbatim renders true to the source — fancyvrb Verbatim lines each
    keep their own row, indentation and spacing (the binding's per-line
    ltx_verbatim class had been dropped in porting), and the bundled CSS
    replaces vanilla's nowrap — which collapsed a plain {verbatim} block
    to a single line — with true pre whitespace (issue 431).

  • A stale or empty stylesheet in the output directory is overwritten instead
    of leaving the page unstyled.

  • Split output (--splitat) styles every page and carries the document date
    — a shared post-processing XPath defect had been dropping relative-path
    lookups (also repairing split navigation and cross-reference/glossary
    resolution).

  • Split-page navigation links reach Perl parity — the full <link rel=…>
    head set with relation types and full-breadcrumb titles.

  • The generator identifier spells out the product name and version, matching
    Perl.

  • A standalone document class's options are no longer mis-loaded as packages.

  • A package loaded in a subfile's preamble keeps its definitions — the group
    around the child's preamble used to discard them.

  • Named scopes are tracked correctly again — a deactivated scope could never
    be re-activated, and a second deactivation popped the same bindings twice.

  • \includefrom/\subincludefrom no longer drop their file in silence.

  • The cortex worker builds without the runtime-bindings feature — a
    Rhai-free conversion binary for the fleet.

  • File resolution can no longer die silently — a conversion could run with no
    kpathsea backend at all and say nothing, reporting only Can't find TeX file X
    (fixed in kpathsea 0.3.4
    plus a subprocess fallback here).

  • Every conversion log records the file-resolution backendin-process,
    subprocess kpsewhich, or unavailable.

  • Dingbat and symbol fonts selected by family render their glyphs instead
    of the OT1 slot's text character — bbding's \XSolidBrush was silently
    coming out as % and \Checkmark as !, inverting whole comparison-table
    columns at zero reported errors. An unrecognized font family, series or
    shape is also now announced once per document rather than once per font
    switch.

  • ar5iv corpus fixes (2026-07 issue sprint) — `...

Read more

0.7.5-rc3

0.7.5-rc3 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 26 Jul 17:30
ca971ca

Installation

latexml-oxide ships as a single self-contained executable. It also calls a few external tools when they are on your PATH:

  • a TeX distribution (TeX Live, MacTeX, or MiKTeX) — for the packages, classes, and fonts your documents load.
  • graphics tools (ImageMagick, Ghostscript, MuPDF, Poppler, dvipng, dvisvgm) — to convert figures.

Per-platform install instructions are in the README Installation guide.

Download the asset for your platform (each has a matching .sha256 to verify file integrity):

  • Linux (x86-64) — latexml-oxide_0.7.5-rc3-1_amd64.deb, or the portable latexml-oxide-0.7.5-rc3-x86_64-unknown-linux-gnu.tar.gz
  • Linux (aarch64 / arm64) — latexml-oxide_0.7.5-rc3-1_arm64.deb, or the portable latexml-oxide-0.7.5-rc3-aarch64-unknown-linux-gnu.tar.gz
  • macOS (Apple Silicon) — latexml-oxide-0.7.5-rc3-aarch64-apple-darwin.tar.gz
  • macOS (Intel) — latexml-oxide-0.7.5-rc3-x86_64-apple-darwin.tar.gz
  • Windows (x86-64) — latexml-oxide-0.7.5-rc3-x86_64-pc-windows-msvc.zip (unzip; latexml_oxide.exe is self-contained, no installer)

Changelog

[0.7.5] (Rhai binding API; bibliography content recovery; wider math coverage; large-document memory; default-CSS sync; ar5iv corpus fixes)

  • The runtime (Rhai) binding API reaches feature-parity with the compile-time
    macros
    — definition lookup and digest/construct hooks, the same flexary
    option bags, definitions registered from a running body, external commands,
    and the full diagnostics surface.
  • A .rhai binding can parse and manipulate XML/(X)HTML
    document.insertXML splices a parsed subtree, ParseXML exposes the parser
    on its own, namespaces resolve by URI, and malformed markup is rejected
    outright rather than silently salvaged.
  • .rhai bindings reach the same document XML surface the compile-time
    bindings do
    — XPath query, element insertion, and structural editing, each
    under its Perl name.
  • A failing .rhai binding no longer costs the whole document — each
    binding kind degrades to a neutral result and reports a clean Error:.
  • Default HTML styling re-synced to vanilla LaTeXML.css — justified text,
    \underline/\overline and verbatim no-wrap are back; .htm infers HTML5.
  • A stale or empty stylesheet in the output directory is overwritten instead
    of leaving the page unstyled.
  • Split output (--splitat) styles every page and carries the document date
    — a shared post-processing XPath defect had been dropping relative-path
    lookups (also repairing split navigation and cross-reference/glossary
    resolution).
  • Split-page navigation links reach Perl parity — the full <link rel=…>
    head set with relation types and full-breadcrumb titles.
  • The generator identifier spells out the product name and version, matching
    Perl.
  • A standalone document class's options are no longer mis-loaded as packages.
  • A package loaded in a subfile's preamble keeps its definitions — the group
    around the child's preamble used to discard them.
  • Named scopes are tracked correctly again — a deactivated scope could never
    be re-activated, and a second deactivation popped the same bindings twice.
  • \includefrom/\subincludefrom no longer drop their file in silence.
  • The cortex worker builds without the runtime-bindings feature — a
    Rhai-free conversion binary for the fleet.
  • File resolution can no longer die silently — a conversion could run with no
    kpathsea backend at all and say nothing, reporting only Can't find TeX file X
    (fixed in kpathsea 0.3.4
    plus a subprocess fallback here).
  • Every conversion log records the file-resolution backendin-process,
    subprocess kpsewhich, or unavailable.
  • ar5iv corpus fixes (2026-07 issue sprint) — xcolor dvipsnames as a
    global class option, \sidecaptionvpos, verbatim \newtcblisting bodies,
    agujournal2019 end-matter, blkarray (recovering papers that hit
    OOM/timeout), scrartcl \titlehead, and frontmatter bindings for
    fairmeta, selfevolagent and openmoss.
  • A deferred package-load miss no longer poisons a later raw load.
  • Perl .ltxml bindings are never read as TeX — file resolution used to hand
    back the .ltxml (Perl source) and tokenize it, so raw-loading a package that
    ships one (e.g. sTeX) emitted spurious errors; a missing binding now falls
    through to the raw .sty, matching pdflatex.
  • \usepackage{X} finds an X.sty.rhai runtime binding on $TEXINPUTS — a
    .rhai beside your document still overrides a compiled binding; one in a
    texmf tree only fills a gap.
  • cprotect is now supported\cprotect\section{\verb|…|} and
    \cprotect\footnote{\begin{verbatim}…\end{verbatim}} produce the verbatim
    title/footnote, with \cMakeRobust and \cprotEnv. Perl LaTeXML has no
    binding for this package.
  • The .rhai binding interface has a reference, generated from the live
    engine into cargo doc so it cannot drift from what is registered.
  • Bibliographies stop losing reference content.bib field markup
    (\url, \href, \emph) survived only as dead literal text, and eleven
    field kinds (howpublished, institution, address, edition, series,
    type, …) were emitted by no branch at all. Recovering that content means
    the fields are now interpreted, so they must also be given what a
    .bst-generated .bbl provides — the \providecommand{\url}… block, and
    a percent that stays literal (BibTeX has no comments, and % is routine in
    an encoded URL). Measured over a 30,079-document arXiv sample: 62 more
    documents convert cleanly, 44 fewer carry errors.
  • amsrefs \bib values digest as live TeX\MR{…} came out as literal
    characters and pages rendered empty.
  • MathReview / ZentralBlatt links are synthesizedmrnumber/zblno
    produced no link at all — and an entry carrying both date and year no
    longer emits a duplicate date.
  • A biblatex .bbl carrying two \datalist blocks no longer hangs the
    conversion
    on a self-referential \let.
  • A biber \missing{key} is a named warning, not an undefined-command error.
  • A font-encoding text symbol inside a \cite key or package option no
    longer hangs the conversion
    — an accented character reached the encoding
    dispatch while the font encoding was the stay-ASCII one, and the fallback
    could not terminate under pure expansion.
  • The author-year citation label uses the short author form — a
    collaboration paper's label ran to 5104 characters and displaced the entry.
  • More math parses — fences split by TeX's null delimiter, bare operators
    used as operands (f(\cdot), (+)), and mixed relation/term comma lists.
  • $50,000$ reads as one number rather than list(50, 000) — US default;
    the European $1.234,56$ reading is unchanged.
  • Math in a section title survives into the table of contents and into any
    \ref to that section.
  • latexmlmath no longer empties a single-structure formula
    (\frac{1}{2}, \sqrt{2}).
  • siunitx complex numbers are faithful to Perl — the port had flattened away
    the imaginary-unit enrichment and mantissa brackets — plus the v3 command
    surface and the full \sisetup default set.
  • \lstinputlisting converts the requested snippetlastline=N used to
    unbalance the listing and swallow the rest of the document, and CRLF sources
    bled comment styling down the file.
  • Very large documents use far less memory — peak RSS 9.05 → 5.99 GB on a
    232K-line book, wall time unchanged.
  • --max-memory is the single memory knob, 0 disables limiting entirely,
    and no environment variable can countermand it.
  • Environments report their true source extent — the locator spans through
    the matching \end instead of collapsing to the \begin.

What's Changed

  • chore(deps): Update base64 requirement from 0.22 to 0.23 by @dependabot[bot] in #357
  • fix #356: keep section-title math in the table of contents by @dginev in #359
  • fix #358: declare 'name' key in the Frontmatter keyset by @dginev in #360
  • ci: re-audit cc at 1.4.0 to unblock the vendored-native gate by @dginev in #364
  • ci: run one lint script in both CI and the pre-push hook by @dginev in #366
  • feat(memory): make --max-memory the single memory knob; 0 disables entirely by @dginev in #363
  • perf(#361): shrink the digested-box footprint — 9.05 → 6.43 GB peak RSS on a very large document by @dginev in #362
  • docs: correct the test-suite verification stamp and its graphics caveat by @dginev in #365
  • fix: pin LC_ALL=C in the xml:id lint so its verdict stops depending on locale by @dginev in #369
  • fix(memory): make --max-memory win over LATEXML_RSS_CAP_BYTES, and resync the #361 doc by @dginev in #368
  • perf(#361): box Whatsit's never-filled reversion-cache slots — 6.41 → 5.99 GB, wall flat by @dginev in #370
  • Whatsit audit: port the missing environment locator range, and settle the reversion-cache question by @dginev in https...
Read more

0.7.5-rc2

0.7.5-rc2 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 24 Jul 06:45
f8f561d

Installation

latexml-oxide ships as a single self-contained executable. It also calls a few external tools when they are on your PATH:

  • a TeX distribution (TeX Live, MacTeX, or MiKTeX) — for the packages, classes, and fonts your documents load.
  • graphics tools (ImageMagick, Ghostscript, MuPDF, Poppler, dvipng, dvisvgm) — to convert figures.

Per-platform install instructions are in the README Installation guide.

Download the asset for your platform (each has a matching .sha256 to verify file integrity):

  • Linux (x86-64) — latexml-oxide_0.7.5-rc2-1_amd64.deb, or the portable latexml-oxide-0.7.5-rc2-x86_64-unknown-linux-gnu.tar.gz
  • Linux (aarch64 / arm64) — latexml-oxide_0.7.5-rc2-1_arm64.deb, or the portable latexml-oxide-0.7.5-rc2-aarch64-unknown-linux-gnu.tar.gz
  • macOS (Apple Silicon) — latexml-oxide-0.7.5-rc2-aarch64-apple-darwin.tar.gz
  • macOS (Intel) — latexml-oxide-0.7.5-rc2-x86_64-apple-darwin.tar.gz
  • Windows (x86-64) — latexml-oxide-0.7.5-rc2-x86_64-pc-windows-msvc.zip (unzip; latexml_oxide.exe is self-contained, no installer)

Changelog

[0.7.5] (Rhai binding-API parity + default-CSS sync; ar5iv corpus fixes; file-resolution robustness)

  • Runtime (Rhai) binding API brought to feature-parity with the compile-time
    macros.
    A binding can now fetch an already-installed definition and push
    before/after digest and construct hooks onto it (LookupDefinition), pass the
    same flexary, unordered option bags to DefPrimitive/DefMath/DefConstructor
    (beforeDigest/afterDigest/afterDigestBody), register new definitions from
    inside a running body, shell out to external commands, read the engine version,
    and use the full diagnostics surface (Info/Fatal/Note/progress).
    List-valued state lookups no longer panic or leak their internal representation.
  • A .rhai binding can now parse and manipulate XML/(X)HTML.
    document.insertXML(markup) splices a parsed subtree into the document at the
    current point — the runtime half of BookML's \bmlRawHTML<ltx:rawhtml>
    where previously only escaped text could be inserted. ParseXML(markup) exposes
    the parser on its own, returning nodes a script can inspect, walk and edit
    before inserting them; a chunk may be a fragment of several siblings. Parsed
    nodes are safe to hold because each owns its document. Malformed markup is
    rejected outright rather than quietly salvaged — libxml's recovery mode
    silently deletes author content (<b>a</b> <i>b</i> became <b>a</b>,
    a&nbsp;b became ab). Inserted markup also keeps its own namespace:
    namespaces resolve by URI through the registered prefix map
    (RegisterNamespace) instead of being assumed to be LaTeXML's, and wildcard
    schema entries such as xhtml:* are honoured, so attributes like class
    survive onto the final page. A malformed chunk degrades only its own binding:
    the rest of the document still converts, and the reported error names the
    likely cause and quotes the offending snippet.
  • .rhai bindings now reach the same document XML surface the compile-time
    bindings do
    — XPath query (findnodes/findnode), element insertion
    (insertElement), and structural editing (addClass, generateID,
    removeNode, replaceNode, renameNode, wrapNodes, unwrapNodes,
    appendClone, openElementAt/closeElementAt), each under its Perl name, so
    the runtime and compile-time binding layers do not drift apart. Reading a
    namespaced attribute such as xml:id back by its qualified name now works.
  • A failing .rhai binding no longer costs the whole document. An error
    raised anywhere in a script body — a throw, a typo'd method name, an
    operation-limit breach — used to abort the entire conversion; a single
    throwing macro produced an empty document. Each binding kind now degrades to a
    neutral result (an empty expansion, a skipped constructor, a false
    conditional, …), reports a clean Error:, and the rest of the document
    converts. A binding that fails repeatedly still ends the run at the usual
    error ceiling, and a script that fails to compile still simply does not
    install.
  • Default HTML styling re-synced to vanilla LaTeXML.css — restores justified
    text, \underline/\overline, and verbatim no-wrap that had drifted from
    upstream; the .htm destination extension now infers HTML5 like .html.
  • A stale or empty stylesheet already in the output directory is now overwritten
    instead of being left in place — previously a LaTeXML.css/ltx-article.css
    left by an earlier run could be truncated to empty, leaving the page unstyled.
  • Split output (--splitat) now styles every page. Each auto-generated split
    child (e.g. Ch1.html) again loads the default stylesheets and carries the
    document date, matching Perl — a shared post-processing XPath defect had been
    dropping resources, processing instructions, and other relative-path lookups
    (also repairing split navigation and cross-reference/glossary resolution).
  • Split-page navigation links reach Perl parity. Each page now emits the full
    <link rel=…> head set — prev back to the parent for a first child, the
    relation-typed chapter/section/subsection sibling and ancestor links, and
    full-breadcrumb title= attributes on all of them (previously the relation-typed
    links and prev-for-first-child were missing and the titles were empty).
  • Generator identifier now spells out the full product name ("LaTeXML oxide")
    and stamps the version into the XSLT output to match Perl.
  • A standalone document class's options are no longer mis-loaded as packages.
  • A package loaded in a subfile's preamble keeps its definitions. A
    standalone or \import-ed child used to end an otherwise complete conversion
    with \ifpgf@external@grabshipout undefined: the group around the child's
    preamble discarded what the package defined, while the document hooks reading it
    survived. The child's own definitions stay scoped to the child.
  • Named scopes are tracked correctly again. A scope that had been deactivated
    still read as active, so it could never be re-activated — a counter- or
    label-derived reference-number scope reused after a counter reset kept the
    stale one — and a second deactivation popped the same bindings twice.
  • \includefrom/\subincludefrom no longer drop their file in silence — the
    included content used to vanish with no error or warning at all.
  • The cortex worker builds without the runtime-bindings feature — a
    Rhai-free conversion binary for the fleet.
  • File resolution can no longer die silently. A conversion could run with
    no kpathsea backend at all and say nothing about it: a failed
    Kpaths::new() was discarded, so every lookup returned None while embedded
    bindings and dumps kept the conversion working. The only symptom was
    Can't find TeX file X — indistinguishable from a file that is genuinely
    absent. The trigger was an unresolvable kpsewhich: missing from the
    process's PATH (as opposed to the user's interactive shell), a stale
    KPSEWHICH, not executable, or a kpsewhich.exe beside a Linux binary under
    WSL. Fixed in kpathsea 0.3.4
    (a linked Kpaths::new() degrades its program-name anchor instead of failing)
    plus a subprocess fallback here.
  • Every conversion log now records the file-resolution backend
    in-process, subprocess kpsewhich, or unavailable. A dead or degraded
    resolver used to be invisible and had to be inferred; it is now one line in an
    ordinary log, with no special flags. A host TeX installation remains optional,
    so an absent one warns rather than errors.
  • ar5iv corpus fixes (from the 2026-07 issue sprint): xcolor now honors a
    dvipsnames global class option; \sidecaptionvpos bound as a layout no-op;
    \newtcblisting bodies close as verbatim; agujournal2019 end-matter
    (rotating + acronyms/notation); blkarray support, recovering papers that
    previously hit OOM/timeout; scrartcl \titlehead frontmatter capture; and
    frontmatter bindings for fairmeta, selfevolagent and openmoss classes.
  • A deferred package-load miss no longer poisons a later raw load.
  • Perl .ltxml bindings are never read as TeX. When raw-loading a style
    package that also ships a Perl LaTeXML binding (e.g. sTeX's stex.sty.ltxml),
    file resolution used to hand back the .ltxml — Perl source — and the loader
    tokenized it as TeX, emitting spurious errors. latexml-oxide can't run Perl
    bindings; binding availability is decided by its own dispatcher, so a missing
    binding now falls through to the raw .sty, matching pdflatex. The
    standalone binding also regained standalone.sty's real xkeyval +
    currfile → filehook dependencies, so the package-file hooks
    (\AtEndOfPackageFile, …) and \define@key exist — enough for raw sTeX 3.x
    to load cleanly.
  • \usepackage{X} now finds an X.sty.rhai runtime binding on $TEXINPUTS.
    Previously only \input{file} resolved via TEXINPUTS while a Rhai package
    binding placed in a texmf tree needed an explicit --path; the discovery now
    consults kpsewhich too (covers .sty.rhai and .cls.rhai). A .rhai beside
    your document keeps overriding a compiled binding; one that merely sits in a
    texmf tree only fills a gap, so a stray copy there can no longer displace an
    engine binding.
  • cprotect is now supported\cprotect\section{\verb|…\tensor…|} and
    \cprotect\footnote{\begin{verbatim}…\end{verbatim}} produce the verbatim
    title/footnote instead ...
Read more

0.7.5-rc1

0.7.5-rc1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 20 Jul 01:24

Installation

latexml-oxide ships as a single self-contained executable. It also calls a few external tools when they are on your PATH:

  • a TeX distribution (TeX Live, MacTeX, or MiKTeX) — for the packages, classes, and fonts your documents load.
  • graphics tools (ImageMagick, Ghostscript, MuPDF, Poppler, dvipng, dvisvgm) — to convert figures.

Per-platform install instructions are in the README Installation guide.

Download the asset for your platform (each has a matching .sha256 to verify file integrity):

  • Linux (x86-64) — latexml-oxide_0.7.5-rc1-1_amd64.deb, or the portable latexml-oxide-0.7.5-rc1-x86_64-unknown-linux-gnu.tar.gz
  • Linux (aarch64 / arm64) — latexml-oxide_0.7.5-rc1-1_arm64.deb, or the portable latexml-oxide-0.7.5-rc1-aarch64-unknown-linux-gnu.tar.gz
  • macOS (Apple Silicon) — latexml-oxide-0.7.5-rc1-aarch64-apple-darwin.tar.gz
  • macOS (Intel) — latexml-oxide-0.7.5-rc1-x86_64-apple-darwin.tar.gz
  • Windows (x86-64) — latexml-oxide-0.7.5-rc1-x86_64-pc-windows-msvc.zip (unzip; latexml_oxide.exe is self-contained, no installer)

See CHANGELOG.md for release notes.

What's Changed

  • docs(skills): add resolve-issue — public-issue → PR workflow by @dginev in #298
  • fix #292: resolve urn:x-LaTeXML:XSLT: imports in a user --stylesheet by @dginev in #296
  • fix #293: don't require the class name in standalone's \documentclass intercept by @dginev in #295
  • fix #291: respect \setcounter{tocdepth} in the table of contents by @dginev in #294
  • fix #301: exemption-audit test skips absent corpus in the packaged crate by @dginev in #302
  • fix #299: dump staleness check compares TeXLive years, not kpathsea patch strings by @dginev in #300
  • ar5iv issue sprint: xcolor global dvipsnames, sidecap, \ifmmode coverage + diagnostic plan by @dginev in #306
  • fix: never leave file resolution silently dead; report the kpathsea backend by @dginev in #308

Full Changelog: 0.7.4...0.7.5-rc1

0.7.4

Choose a tag to compare

@github-actions github-actions released this 17 Jul 13:38

Installation

latexml-oxide ships as a single self-contained executable. It also calls a few external tools when they are on your PATH:

  • a TeX distribution (TeX Live, MacTeX, or MiKTeX) — for the packages, classes, and fonts your documents load.
  • graphics tools (ImageMagick, Ghostscript, MuPDF, Poppler, dvipng, dvisvgm) — to convert figures.

Per-platform install instructions are in the README Installation guide.

Download the asset for your platform (each has a matching .sha256 to verify file integrity):

  • Linux (x86-64) — latexml-oxide_0.7.4-1_amd64.deb, or the portable latexml-oxide-0.7.4-x86_64-unknown-linux-gnu.tar.gz
  • Linux (aarch64 / arm64) — latexml-oxide_0.7.4-1_arm64.deb, or the portable latexml-oxide-0.7.4-aarch64-unknown-linux-gnu.tar.gz
  • macOS (Apple Silicon) — latexml-oxide-0.7.4-aarch64-apple-darwin.tar.gz
  • macOS (Intel) — latexml-oxide-0.7.4-x86_64-apple-darwin.tar.gz
  • Windows (x86-64) — latexml-oxide-0.7.4-x86_64-pc-windows-msvc.zip (unzip; latexml_oxide.exe is self-contained, no installer)

Changelog

[0.7.4] (Windows target; third-party license notices; crates.io)

  • Installable from crates.iocargo install latexml builds the CLI from
    source, and latexml is usable as a library via the batteries-included
    latexml::api (convert_to_xml / convert_to_html). The forked dependencies
    are published alongside it (marpa-asf, libmarpa-asf-sys, pericortex).
    Caveat: a from-source install has no precompiled kernel dumps (generated at
    release time, too large for a crate), so it rebuilds kernel state at every
    startup. One-time fix — the "build the formats once" step TeX does with
    fmtutil: cd ~/.cargo && latexml_oxide --init=plain.tex && latexml_oxide --init=latex.ltx. See the README.
  • New target: Windows (x86_64-pc-windows-msvc) — a single fully-static
    latexml_oxide.exe (no VC++ redistributable), shipped as a .zip.
  • Third-party notices now complete and identical in every download.
    Attributed the third-party material a manifest-level audit cannot see, because
    the manifest describes the wrapper rather than what ships: libmarpa (MIT,
    with LGPL-3.0/LGPL-2.1 parts), mimalloc (MIT, Microsoft — its crate's own
    LICENSE names a different holder), libkpathsea (LGPL-2.1, statically linked
    into every released binary), the W3C/Mozilla SVG schema, rustdoc's Ayu
    palette, and unidecode's table (generated from Sean M. Burke's
    Text::Unidecode) — and ship the verbatim copyleft texts the static LGPL links
    oblige, plus the exact source commits to relink from. Previously only the
    x86_64-Linux tarball carried the full file; the .debs carried sections 1–4,
    and the Windows download and container images carried nothing at all.
    latexml-oxide's own source remains CC0-1.0; see THIRD-PARTY-NOTICES
    and docs/release/LICENSE_INVENTORY.md.
  • Three --help options are now functional (--inputencoding,
    --sourcedirectory, --sitedirectory). All three were declared for Perl
    CLI parity but silently ignored — parsed, then dropped. Now:
    --inputencoding seeds the Mouth's byte decoder (Perl PERL_INPUT_ENCODING,
    Core.pm L60-61); --sourcedirectory and --sitedirectory feed the
    post-processor's resource resolution and site-relative resource URLs (Perl
    sourceDirectory/siteDirectory, LaTeXML.pm L429-430). A new source-scan
    test (98_cli_options_consumed) fails the build if any option shown in
    --help is parsed but never consumed, closing the Debug-masks-dead_code
    blind spot that let these three slip through.

What's Changed

  • chore(deps): Update imagesize requirement from 0.14 to 0.15 by @dependabot[bot] in #277
  • Release preparation, July 10 by @dginev in #276
  • Windows (x86_64-pc-windows-msvc) support by @dginev in #278
  • macOS: ad-hoc signing, auto-publish, Homebrew-primary onboarding by @dginev in #279
  • docs(release): F1 closed — pericortex relicensed CC0-1.0 by @dginev in #280
  • Release infra: 0.7.4-rc1 draft mode + Windows single-.exe leg by @dginev in #281
  • Fix --whatsin=math: port \ensuremathfollows/\ensuremathpreceeds (automath) by @dginev in #283
  • Windows release: self-contained, fast, robust .exe across all TeX configs (supersedes #285) by @dginev in #286
  • release: kpathsea 0.3.3 (fix Windows LNK2005), slim release notes, docs → 0.7.4-rc3 by @dginev in #287
  • Stop silently losing references and document tails by @dginev in #288
  • Attribute the vendored native libs, and ship complete notices with every download by @dginev in #289
  • release: 0.7.4-rc4 — crates.io publishable, Perl-faithful latexmlmath, CLI parity by @dginev in #290

Full Changelog: 0.7.3...0.7.4

0.7.3

Choose a tag to compare

@github-actions github-actions released this 08 Jul 19:31
5329ae4

Install

Debian / Ubuntu (.deb)

curl -LO https://github.com/dginev/latexml-oxide/releases/download/0.7.3/latexml-oxide_0.7.3-1_amd64.deb
sudo apt install ./latexml-oxide_0.7.3-1_amd64.deb

Portable tarball (x86_64 Linux)

curl -LO https://github.com/dginev/latexml-oxide/releases/download/0.7.3/latexml-oxide-0.7.3-x86_64-unknown-linux-gnu.tar.gz
tar xzf latexml-oxide-0.7.3-x86_64-unknown-linux-gnu.tar.gz
sudo cp latexml-oxide-0.7.3-x86_64-unknown-linux-gnu/latexml_oxide /usr/local/bin/

The binary bundles libxml2/libxslt/kpathsea, so tarball users only need a TeX
Live installation (read from your texmf tree) plus graphics tools:

sudo apt install texlive-latex-base texlive-latex-extra texlive-science imagemagick

macOS (Apple Silicon)

curl -LO https://github.com/dginev/latexml-oxide/releases/download/0.7.3/latexml-oxide-0.7.3-aarch64-apple-darwin.tar.gz
tar xzf latexml-oxide-0.7.3-aarch64-apple-darwin.tar.gz
sudo cp latexml-oxide-0.7.3-aarch64-apple-darwin/latexml_oxide /usr/local/bin/

The binary bundles libxml2/libxslt, so macOS users only need a TeX distribution:

# TeX Live — either Homebrew's:
brew install texlive
# …or MacTeX / BasicTeX, served via the subprocess-kpsewhich fallback.

macOS (Intel)

For Intel Macs (built with a macOS 10.13 deployment target, so it runs on
older Intel machines up to the latest Sonoma):

curl -LO https://github.com/dginev/latexml-oxide/releases/download/0.7.3/latexml-oxide-0.7.3-x86_64-apple-darwin.tar.gz
tar xzf latexml-oxide-0.7.3-x86_64-apple-darwin.tar.gz
sudo cp latexml-oxide-0.7.3-x86_64-apple-darwin/latexml_oxide /usr/local/bin/

Pick the tarball matching your Mac: aarch64 for Apple Silicon (M1/M2/M3…),
x86_64 for Intel. uname -m prints arm64 or x86_64.

Changelog

[0.7.3] (Intel-macOS asset + PDF-fidelity pass)

  • New target: Intel macOS (x86_64-apple-darwin). Releases now publish as
    a reviewable draft.
  • Upstream sync #2845–#2847 — lozenge/diamond codepoints, \toctitle register.
  • Fixed \AtBeginDocument{\RequirePackage …} wrongly erroring — traced to
    upstream bug #2846 (KNOWN_PERL_ERRORS.md #43).
  • Bibliography — author-year labels show the full author list; cross-document
    XPath fix.
  • Frontmatter & fonts — title / author-affiliation fidelity; T1 encoding for
    acmart / elsarticle / moderncv; llncs theorem body fonts.
  • DocsOXIDIZED_DESIGN split; 2026-07 session logs archived.

What's Changed

  • Harden post-processing for very large split index databases (614 MB → 40 201 pages) by @dginev in #274
  • 0.7.3: Intel-macOS asset + PDF-fidelity pass by @dginev in #275

Full Changelog: 0.7.2...0.7.3

First public use of latexml-oxide in ar5iv 2606

Choose a tag to compare

@github-actions github-actions released this 05 Jul 15:51

Install

Debian / Ubuntu (.deb)

curl -LO https://github.com/dginev/latexml-oxide/releases/download/0.7.2/latexml-oxide_0.7.2-1_amd64.deb
sudo apt install ./latexml-oxide_0.7.2-1_amd64.deb

Portable tarball (x86_64 Linux)

curl -LO https://github.com/dginev/latexml-oxide/releases/download/0.7.2/latexml-oxide-0.7.2-x86_64-unknown-linux-gnu.tar.gz
tar xzf latexml-oxide-0.7.2-x86_64-unknown-linux-gnu.tar.gz
sudo cp latexml-oxide-0.7.2-x86_64-unknown-linux-gnu/latexml_oxide /usr/local/bin/

The binary bundles libxml2/libxslt/kpathsea, so tarball users only need a TeX
Live installation (read from your texmf tree) plus graphics tools:

sudo apt install texlive-latex-base texlive-latex-extra texlive-science imagemagick

macOS (Apple Silicon)

curl -LO https://github.com/dginev/latexml-oxide/releases/download/0.7.2/latexml-oxide-0.7.2-aarch64-apple-darwin.tar.gz
tar xzf latexml-oxide-0.7.2-aarch64-apple-darwin.tar.gz
sudo cp latexml-oxide-0.7.2-aarch64-apple-darwin/latexml_oxide /usr/local/bin/

The binary bundles libxml2/libxslt, so macOS users only need a TeX distribution:

# TeX Live — either Homebrew's:
brew install texlive
# …or MacTeX / BasicTeX, served via the subprocess-kpsewhich fallback.

Apple Silicon (arm64) only. Intel Macs are not yet a published target.

Changelog

[0.7.2] (first public ar5iv 2606 run: upstream sync, MathML-post audit, live-run parity + stability)

The release used for the first public latexml-oxide conversion of an arXiv
monthly (ar5iv 2606). Highlights across the cycle (see the git log and
GitHub's auto-generated per-PR notes for the full detail):

  • Upstream LaTeXML sync (PRs #2767 → #2837): amsmath multline centering
    • \shoveleft/\shoveright + \if@fleqn (#2835), the "Framing" package
      set (#2829), \lxDeclare replace= and wildcard declarations, paralist,
      and more.
  • MathML post-processing faithfulness audit (docs/MATHML_POST_LINE_AUDIT.md):
    operator-dictionary + atom-pair spacing tables regenerated from the Perl
    source, faithful spacewalk / \cfrac / n-th-root argument order, and
    inherited color/style context threading.
  • Live-run parity, mined from full-arXiv conversions: natbib autoload
    loop, fvextra breaklines, tabularray colspec, runaway-guard tuning, and
    graceful degradation of former panics (graphics worker thread, XML-node
    allocation) into reported errors rather than crashes.
  • Frontmatter & figure fidelity: font-wrapped author/affiliation
    splitting, and a width-based figure-panel arrangement so subfigure grids
    follow the PDF/Perl row layout.
  • Bibliography: .bib field values interpreted through the real TeX
    engine; absolute DOI/URL links. (Field-interpretation coverage is a first
    stage toward Perl's full set — see docs/SYNC_STATUS.md.)
  • Box-sizing & verbatim (tcolorbox arc, OXIDIZED_DESIGN #42#47): TeX
    vpack \prevdepth discipline, NFSS family codes, foreignObject em basis,
    fvextra line-breaking.
  • Performance: eliminated several O(n²) XSLT hotspots (sectioning,
    head-keywords, maketitle), memoized kpsewhich lookups, arena pin! sweep.
  • Distribution hardening: guarded NULL-over-FFI SIGSEGV classes in the
    rust-libxml fork; the cortex_worker --harness fleet (one-conversion-per-
    process with layered memory guards).

Reliability & distribution:

  • Upgraded to libxml 0.3.14. Its Node::node_ptr_mut now guards mutable
    access with RefCell::try_borrow_mut instead of an Rc::strong_count
    heuristic (KWARC/rust-libxml#203). The old heuristic counted live Node
    clones — which are normal bookkeeping, not an aliasing conflict — and so
    spuriously rejected mutations on documents with heavily shared node
    structures (dcpic commutative diagrams, large arrays, id-heavy trees),
    emitting Can not mutably reference a shared Node errors. Those conversions
    now complete cleanly. The two internal set_node_rc_guard workarounds
    (latexml_core::Document::new, latexml_post::PostDocument::new) are
    removed; node-mutation safety relies solely on the upstream try_borrow_mut
    check.
  • Added the maxperf-cortex build profile (inherits maxperf but keeps
    panic = "unwind") for the long-lived cortex_worker fleet, which needs
    catch_unwind for per-paper panic isolation.

What's Changed

  • feat(bindings): runtime .rhai discovery + faithful local test fixtures by @dginev in #262
  • feat(cortex): self-supervising harness with controlled over-commit + memory governor by @dginev in #264
  • sandbox-testing-patches: Warning: severity fix, RSS-fuse correction, docs cleanup + PGO task by @dginev in #265
  • Exact TeX fixed-point unit conversion by @dginev in #263
  • chore(deps): update tikv-jemallocator requirement from 0.6 to 0.7 by @dependabot[bot] in #266
  • sandbox-testing batch: IEEEtran keywords fix, stable worker naming, mathml/logger/RSS-fuse fixes + docs by @dginev in #267
  • chore(deps): Update phf requirement from 0.13.1 to 0.14.0 by @dependabot[bot] in #268
  • Further stability & coverage (box-model hang, array p/m/b, math comma-list, post-log capture, numeric-safety, Miri) by @dginev in #269
  • Post-processing signal-fidelity: silence ~200.7k spurious Rust-only warnings (faithful to Perl) by @dginev in #270
  • Upstream sync: 11 brucemiller/LaTeXML PRs (#2783 → #2833), incl. #2798 Leavehorizontal by @dginev in #271
  • ar5iv 2606 prep: parity fixes, MathML-post audit, perf + stability for the July-5 rebuild by @dginev in #273

Full Changelog: 0.7.1...0.7.2

0.7.1

Choose a tag to compare

@github-actions github-actions released this 12 Jun 03:32
a06a046

Install

Debian / Ubuntu (.deb)

curl -LO https://github.com/dginev/latexml-oxide/releases/download/0.7.1/latexml-oxide_0.7.1-1_amd64.deb
sudo apt install ./latexml-oxide_0.7.1-1_amd64.deb

Portable tarball (x86_64 Linux)

curl -LO https://github.com/dginev/latexml-oxide/releases/download/0.7.1/latexml-oxide-0.7.1-x86_64-unknown-linux-gnu.tar.gz
tar xzf latexml-oxide-0.7.1-x86_64-unknown-linux-gnu.tar.gz
sudo cp latexml-oxide-0.7.1-x86_64-unknown-linux-gnu/latexml_oxide /usr/local/bin/

The binary bundles libxml2/libxslt/kpathsea, so tarball users only need a TeX
Live installation (read from your texmf tree) plus graphics tools:

sudo apt install texlive-latex-base texlive-latex-extra texlive-science imagemagick

macOS (Apple Silicon)

curl -LO https://github.com/dginev/latexml-oxide/releases/download/0.7.1/latexml-oxide-0.7.1-aarch64-apple-darwin.tar.gz
tar xzf latexml-oxide-0.7.1-aarch64-apple-darwin.tar.gz
sudo cp latexml-oxide-0.7.1-aarch64-apple-darwin/latexml_oxide /usr/local/bin/

The binary bundles libxml2/libxslt, so macOS users only need a TeX distribution:

# TeX Live — either Homebrew's:
brew install texlive
# …or MacTeX / BasicTeX, served via the subprocess-kpsewhich fallback.

Apple Silicon (arm64) only. Intel Macs are not yet a published target.

Changelog

[0.7.1] (portable binary: SONAME-independent, self-contained C libraries)

  • Self-contained C libraries — the release binary now statically links
    libxml2 + libxslt + libexslt (PIC, source-built) on top of libkpathsea, so
    it runs on any glibc-2.35+ Linux regardless of the host's libxml2 SONAME.
    libxml2 2.14 bumped the SONAME .so.2.so.16; a dynamically-linked
    binary loads on only one side of that split, whereas this binary has no
    libxml2/libxslt runtime dependency at all — only the glibc family remains
    dynamic. Requires libxml 0.3.13 / libxslt 0.1.4 (opt-in LIBXML2_STATIC
    / LIBXSLT_STATIC build.rs branches); release.yml source-builds the static
    archives on both the Linux and macOS legs, gated by a CI step that asserts
    the binary carries no dynamic libxml2/libxslt/kpathsea. The .deb no longer
    declares a libxml2 SONAME dependency, so it installs on any libxml2 era.

What's Changed

  • v0.7.1: portable binary — static-link libxml2/libxslt/kpathsea by @dginev in #260
  • build(release): deterministic, minimal static libxml2/libxslt config by @dginev in #261

Full Changelog: 0.7.0...0.7.1

0.7.0

Choose a tag to compare

@github-actions github-actions released this 11 Jun 17:38
b4e55e5

Install

Debian / Ubuntu (.deb)

curl -LO https://github.com/dginev/latexml-oxide/releases/download/0.7.0/latexml-oxide_0.7.0-1_amd64.deb
sudo apt install ./latexml-oxide_0.7.0-1_amd64.deb

Portable tarball (x86_64 Linux)

curl -LO https://github.com/dginev/latexml-oxide/releases/download/0.7.0/latexml-oxide-0.7.0-x86_64-unknown-linux-gnu.tar.gz
tar xzf latexml-oxide-0.7.0-x86_64-unknown-linux-gnu.tar.gz
sudo cp latexml-oxide-0.7.0-x86_64-unknown-linux-gnu/latexml_oxide /usr/local/bin/

Tarball users also need the runtime apt deps:

sudo apt install libxml2 libxslt1.1 libkpathsea6 texlive-latex-base texlive-latex-extra texlive-science

macOS (Apple Silicon)

curl -LO https://github.com/dginev/latexml-oxide/releases/download/0.7.0/latexml-oxide-0.7.0-aarch64-apple-darwin.tar.gz
tar xzf latexml-oxide-0.7.0-aarch64-apple-darwin.tar.gz
sudo cp latexml-oxide-0.7.0-aarch64-apple-darwin/latexml_oxide /usr/local/bin/

macOS users also need the runtime libraries and a TeX distribution:

brew install libxml2 libxslt
# plus TeX Live — either Homebrew's (ships libkpathsea, fastest path):
brew install texlive
# …or MacTeX / BasicTeX, served via the subprocess-kpsewhich fallback.

Apple Silicon (arm64) only. Intel Macs are not yet a published target.

Changelog

[0.7.0] (single-binary release: portability, runtime bindings, edition 2024)

  • Self-contained, redistributable binary (#236). Engine dumps, the
    RelaxNG schema, and XSLT/CSS/JS are embedded and served from memory; the
    maxperf binary runs with no resources/ tree. A tag-driven release
    workflow builds the publish-grade artifact and attaches a portable tarball
    • Debian .deb (each with a SHA-256 sidecar) as GitHub Release assets.
  • macOS (Apple Silicon) support (#245). Full test suite green on arm64;
    the distributed binary uses the subprocess-kpsewhich backend (no
    libkpathsea ABI dependency, works on MacTeX). The release ships an
    aarch64-apple-darwin tarball alongside the Linux artifacts.
  • Runtime (Rhai) script bindings shipped in the release artifact
    (#171, #248). A shared winnow template AST backs both the compile-time
    native binding front-end and an optional runtime contributed-bindings
    front-end embedded via Rhai — customize bindings without recompiling.
    Runtime opt-in, so default conversions are unaffected.
  • Frontmatter refactor: faithful port of upstream LaTeXML PR #2767
    (#241), with a --debug NAME CLI and a deep-recursion pre-clear guard
    that surpasses the Perl original on pathological inputs.
  • Persistent server mode latexml_oxide --server (#243) for
    editor/preview integration, plus opt-in source locators (--source-map)
    and token-locators precision (#237) toward live source↔preview.
  • Post-processing: faithful MakeIndex port — see/seeonly, styles,
    anchors, placement (#244); CLI --css/--javascript resources copied and
    followed (#250); html_feedback regression fixes (#240).
  • Engine parity at scale: error-free conversion sweeps over the arXiv
    "warning" corpus scaled to 1.5M → 2M articles (#238, #242) and a third
    500K canvas at ≥99.0% success (#249). ProcessOptions keysets (#235).
  • Toolchain & quality: migrated the workspace to Rust edition 2024 and
    centralized lint enforcement (#252) — clean clippy -D warnings,
    tree-wide style_edition = "2024" formatting, a [workspace.lints]
    policy, and a CI lint gate (rustfmt + clippy + cargo-deny advisories/
    licenses + cargo-machete) plus an auto-installed pre-push hook. Three
    unmaintained/vulnerable transitive dependencies (tempdir, ansi_term) were
    dropped at the source, so the dependency audit is clean.

What's Changed

  • Update indexmap requirement from =2.13.1 to =2.14.0 by @dependabot[bot] in #234
  • feat: ProcessOptions keysets => [...] + raise ar5iv pushback/iflimit by @dginev in #235
  • single-binary distribution: embed owned assets + release-asset workflow by @dginev in #236
  • Update sha2 requirement from 0.10 to 0.11 by @dependabot[bot] in #233
  • feat(source-map): opt-in source locators + token-locators precision by @dginev in #237
  • [parity] 1,500,000 arXiv articles by @dginev in #238
  • feat(whatsout): full --whatsin/--whatsout port + fix(test-mem): per-test thread-local engine leak by @dginev in #239
  • [parity] 2,000,000 arXiv articles by @dginev in #242
  • Fix/regression reports html feedback by @dginev in #240
  • Persistent LSP server: latexml_oxide --server for editor/preview integration by @dginev in #243
  • fix(post): faithful MakeIndex port — see/seeonly, ref styles, anchors, placement by @dginev in #244
  • Add macOS portability by @dginev in #245
  • fix(biblatex): parse keyval .bbl name format; complete \endentry fields by @dginev in #246
  • Third 500K arXiv-warning canvas (≥99.0% success rate) by @dginev in #249
  • Shared winnow template AST (#171) + feature-complete Rhai binding front-end by @dginev in #248
  • Frontmatter refactor: translate upstream LaTeXML PR #2767 by @dginev in #241
  • fix(post): copy & follow CLI --css/--javascript resources to the destination by @dginev in #250
  • chore: migrate the workspace to Rust edition 2024 by @dginev in #251
  • chore: clean clippy, apply edition-2024 formatting, centralize lint enforcement by @dginev in #252
  • release: prepare 0.7.0 (runtime-bindings, .deb deps, pinned nightly, docs) by @dginev in #254
  • chore(deps): update winnow requirement from 0.7 to 1.0 by @dependabot[bot] in #253
  • ci: cache engine dumps (skip ~8-min make-formats when engine unchanged) by @dginev in #255
  • release: auto-append the merged-PR list to release notes by @dginev in #256
  • refactor: drop kpathsea from the latexml_codegen proc-macro build by @dginev in #258
  • release: statically link libkpathsea (in-process, self-contained) on both legs by @dginev in #257
  • fix(release): build cargo-deb from source (glibc 2.35 compat) by @dginev in #259

Full Changelog: 0.6.1...0.7.0