0.7.5-rc3
Pre-release
Pre-release
·
202 commits
to main
since this release
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 portablelatexml-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 portablelatexml-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.exeis 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
.rhaibinding can parse and manipulate XML/(X)HTML —
document.insertXMLsplices a parsed subtree,ParseXMLexposes the parser
on its own, namespaces resolve by URI, and malformed markup is rejected
outright rather than silently salvaged. .rhaibindings 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
.rhaibinding no longer costs the whole document — each
binding kind degrades to a neutral result and reports a cleanError:. - Default HTML styling re-synced to vanilla
LaTeXML.css— justified text,
\underline/\overlineand verbatim no-wrap are back;.htminfers 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
standalonedocument 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/\subincludefromno longer drop their file in silence.- The cortex worker builds without the
runtime-bindingsfeature — 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 onlyCan't find TeX file X
(fixed in kpathsea 0.3.4
plus a subprocess fallback here). - Every conversion log records the file-resolution backend —
in-process,
subprocess kpsewhich, orunavailable. - ar5iv corpus fixes (2026-07 issue sprint) —
xcolordvipsnamesas a
global class option,\sidecaptionvpos, verbatim\newtcblistingbodies,
agujournal2019end-matter,blkarray(recovering papers that hit
OOM/timeout),scrartcl\titlehead, and frontmatter bindings for
fairmeta,selfevolagentandopenmoss. - A deferred package-load miss no longer poisons a later raw load.
- Perl
.ltxmlbindings 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 anX.sty.rhairuntime binding on$TEXINPUTS— a
.rhaibeside your document still overrides a compiled binding; one in a
texmf tree only fills a gap.cprotectis now supported —\cprotect\section{\verb|…|}and
\cprotect\footnote{\begin{verbatim}…\end{verbatim}}produce the verbatim
title/footnote, with\cMakeRobustand\cprotEnv. Perl LaTeXML has no
binding for this package.- The
.rhaibinding interface has a reference, generated from the live
engine intocargo docso it cannot drift from what is registered. - Bibliographies stop losing reference content —
.bibfield 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.bblprovides — 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
\bibvalues digest as live TeX —\MR{…}came out as literal
characters andpagesrendered empty. - MathReview / ZentralBlatt links are synthesized —
mrnumber/zblno
produced no link at all — and an entry carrying bothdateandyearno
longer emits a duplicate date. - A biblatex
.bblcarrying two\datalistblocks 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
\citekey 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 thanlist(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
\refto that section. latexmlmathno 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\sisetupdefault set. \lstinputlistingconverts the requested snippet —lastline=Nused 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-memoryis the single memory knob,0disables limiting entirely,
and no environment variable can countermand it.- Environments report their true source extent — the locator spans through
the matching\endinstead 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
fieldsstore) 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