Skip to content

0.7.5-rc3

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 26 Jul 17:30
· 202 commits to main since this release
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 #371
  • fix: faithful siunitx complex numbers + the v3 command/option surface by @dginev in #372
  • feat(math): parse fences split by TeX's null delimiter instead of giving up by @dginev in #373
  • fix: digest amsrefs \bib field values as live TeX (arXiv/html_feedback#6776) by @dginev in #374
  • docs: rank the SYNC_STATUS worklist and split out the standing families by @dginev in #375
  • fix(bibtex): revive MR/Zbl synthesis and the date guard (dead fields store) by @dginev in #376
  • fix(latexmlmath): attach the parsed tree so a single-structure formula is not emptied by @dginev in #377
  • docs: retire the TL2026 dump-gate residual — re-confirmed 0/0 on main by @dginev in #378
  • fix(bibliography): break the self-referential \let that hangs multi-\datalist .bbl files by @dginev in #379
  • fix(listings): convert the requested snippet, not a broken one by @dginev in #380
  • fix: take arXiv 2605.17646 to zero errors (biblatex \missing, leading-relop comma list) by @dginev in #381
  • feat(math): parse bare operators used as operands, and mixed relation/term comma lists by @dginev in #382
  • fix(bibliography): stop losing .bib field content in the References by @dginev in #383
  • feat(math): read a comma between digit groups as a thousands separator (US default) by @dginev in #384
  • fix: use the short author form for the author-year citation label by @dginev in #385
  • release: 0.7.5-rc3 — the missing changelog window, condensed to topic lines by @dginev in #387
  • docs: refresh the rc3 verification stamps and the issue audit by @dginev in #388
  • ci(rustdoc): stop the gh-pages deploy racing itself by @dginev in #389
  • fix(fontenc): break the text-symbol loop in a Semiverbatim argument by @dginev in #390
  • fix(bibliography): give the .bib field digest the fallbacks a .bbl provides by @dginev in #391
  • docs(R5): the MakeBibliography re-port is the fix, with the 2026-07-26 numbers by @dginev in #392
  • docs: un-close issue 386, and record the 2026-07-26 findings by @dginev in #393
  • docs(changelog): state what the bibliography recovery cost, with measurements by @dginev in #394

Full Changelog: 0.7.5-rc2...0.7.5-rc3