Releases: dginev/latexml-oxide
Release list
0.7.5
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-memoryknob (#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
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 portablelatexml-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 portablelatexml-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.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)
-
A conversion always writes
<jobname>.latexml.log— Perllatexmlc
parity: with--logunset the log lands in the working directory
(latexml.logfor literal input), replacing any stale copy, and still
ends with the canonicalStatus:conversion:Nverdict line. rc5's first
artifacts wrote no log at all unless--logwas passed. -
A memory Fatal now says what to do — the cooperative-fuse message
names the 75% fuse and the--max-memoryceiling 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 withInfo: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; andScan: 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 → .htmlrun 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--dbfileheritage,
WAL-concurrent,sqlite3-CLI-inspectable). -
A book-scale document converts
.tex → .htmlin 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_namespacesin the libxml
binding leaked itsxmlGetNsListarray 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),--logfiles and archivestatus
members end with the canonicalStatus: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,105Warning: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-memoryunset 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 (absentXML_PARSE_HUGE) silently corrupted any parse past
~1.4 GB (hundreds of thousands of phantomID already definederrors 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 → .htmlflow spills the handoff to
disk beside the destination and streams it. -
Split pages inherit
xml:langfrom 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
.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. -
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
Verbatimlines each
keep their own row, indentation and spacing (the binding's per-line
ltx_verbatimclass had been dropped in porting), and the bundled CSS
replaces vanilla'snowrap— which collapsed a plain{verbatim}block
to a single line — with trueprewhitespace (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
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. -
Dingbat and symbol fonts selected by family render their glyphs instead
of the OT1 slot's text character —bbding's\XSolidBrushwas silently
coming out as%and\Checkmarkas!, 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) — `...
0.7.5-rc3
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 https...
0.7.5-rc2
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 portablelatexml-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 portablelatexml-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.exeis 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 toDefPrimitive/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
.rhaibinding 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 bbecameab). 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 asxhtml:*are honoured, so attributes likeclass
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. .rhaibindings 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 asxml:idback by its qualified name now works.- A failing
.rhaibinding no longer costs the whole document. An error
raised anywhere in a script body — athrow, 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 cleanError:, 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.htmdestination 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 aLaTeXML.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 —prevback to the parent for a first child, the
relation-typedchapter/section/subsectionsibling and ancestor links, and
full-breadcrumbtitle=attributes on all of them (previously the relation-typed
links andprev-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
standalonedocument class's options are no longer mis-loaded as packages. - A package loaded in a subfile's preamble keeps its definitions. A
standaloneor\import-ed child used to end an otherwise complete conversion
with\ifpgf@external@grabshipoutundefined: 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/\subincludefromno 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-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 about it: a failed
Kpaths::new()was discarded, so every lookup returnedNonewhile 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 unresolvablekpsewhich: missing from the
process'sPATH(as opposed to the user's interactive shell), a stale
KPSEWHICH, not executable, or akpsewhich.exebeside a Linux binary under
WSL. Fixed in kpathsea 0.3.4
(a linkedKpaths::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, orunavailable. 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):
xcolornow honors a
dvipsnamesglobal class option;\sidecaptionvposbound as a layout no-op;
\newtcblistingbodies close as verbatim;agujournal2019end-matter
(rotating + acronyms/notation);blkarraysupport, recovering papers that
previously hit OOM/timeout;scrartcl\titleheadfrontmatter capture; and
frontmatter bindings forfairmeta,selfevolagentandopenmossclasses. - A deferred package-load miss no longer poisons a later raw load.
- Perl
.ltxmlbindings are never read as TeX. When raw-loading a style
package that also ships a Perl LaTeXML binding (e.g. sTeX'sstex.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
standalonebinding also regained standalone.sty's realxkeyval+
currfile → filehookdependencies, so the package-file hooks
(\AtEndOfPackageFile, …) and\define@keyexist — enough for raw sTeX 3.x
to load cleanly. \usepackage{X}now finds anX.sty.rhairuntime 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.rhaiand.cls.rhai). A.rhaibeside
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.cprotectis now supported —\cprotect\section{\verb|…\tensor…|}and
\cprotect\footnote{\begin{verbatim}…\end{verbatim}}produce the verbatim
title/footnote instead ...
0.7.5-rc1
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 portablelatexml-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 portablelatexml-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.exeis 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
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 portablelatexml-oxide-0.7.4-x86_64-unknown-linux-gnu.tar.gz - Linux (aarch64 / arm64) —
latexml-oxide_0.7.4-1_arm64.deb, or the portablelatexml-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.exeis self-contained, no installer)
Changelog
[0.7.4] (Windows target; third-party license notices; crates.io)
- Installable from crates.io —
cargo install latexmlbuilds the CLI from
source, andlatexmlis 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; seeTHIRD-PARTY-NOTICES
anddocs/release/LICENSE_INVENTORY.md. - Three
--helpoptions are now functional (--inputencoding,
--sourcedirectory,--sitedirectory). All three were declared for Perl
CLI parity but silently ignored — parsed, then dropped. Now:
--inputencodingseeds the Mouth's byte decoder (PerlPERL_INPUT_ENCODING,
Core.pm L60-61);--sourcedirectoryand--sitedirectoryfeed 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
--helpis parsed but never consumed, closing theDebug-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
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:
aarch64for Apple Silicon (M1/M2/M3…),
x86_64for Intel.uname -mprintsarm64orx86_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,
\toctitleregister. - 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. - Docs —
OXIDIZED_DESIGNsplit; 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
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
multlinecentering\shoveleft/\shoveright+\if@fleqn(#2835), the "Framing" package
set (#2829),\lxDeclarereplace=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, fvextrabreaklines, 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:
.bibfield values interpreted through the real TeX
engine; absolute DOI/URL links. (Field-interpretation coverage is a first
stage toward Perl's full set — seedocs/SYNC_STATUS.md.) - Box-sizing & verbatim (tcolorbox arc, OXIDIZED_DESIGN #42–#47): TeX
vpack\prevdepthdiscipline, NFSS family codes, foreignObject em basis,
fvextra line-breaking. - Performance: eliminated several O(n²) XSLT hotspots (sectioning,
head-keywords, maketitle), memoizedkpsewhichlookups, arenapin!sweep. - Distribution hardening: guarded NULL-over-FFI SIGSEGV classes in the
rust-libxml fork; thecortex_worker --harnessfleet (one-conversion-per-
process with layered memory guards).
Reliability & distribution:
- Upgraded to
libxml0.3.14. ItsNode::node_ptr_mutnow guards mutable
access withRefCell::try_borrow_mutinstead of anRc::strong_count
heuristic (KWARC/rust-libxml#203). The old heuristic counted liveNode
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),
emittingCan not mutably reference a shared Nodeerrors. Those conversions
now complete cleanly. The two internalset_node_rc_guardworkarounds
(latexml_core::Document::new,latexml_post::PostDocument::new) are
removed; node-mutation safety relies solely on the upstreamtry_borrow_mut
check. - Added the
maxperf-cortexbuild profile (inheritsmaxperfbut keeps
panic = "unwind") for the long-livedcortex_workerfleet, which needs
catch_unwindfor 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
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. Requireslibxml 0.3.13/libxslt 0.1.4(opt-inLIBXML2_STATIC
/LIBXSLT_STATICbuild.rs branches);release.ymlsource-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.debno 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
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
maxperfbinary runs with noresources/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.
- Debian
- macOS (Apple Silicon) support (#245). Full test suite green on arm64;
the distributed binary uses the subprocess-kpsewhichbackend (no
libkpathsea ABI dependency, works on MacTeX). The release ships an
aarch64-apple-darwintarball 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 NAMECLI 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)
andtoken-locatorsprecision (#237) toward live source↔preview. - Post-processing: faithful MakeIndex port — see/seeonly, styles,
anchors, placement (#244); CLI--css/--javascriptresources 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).ProcessOptionskeysets (#235). - Toolchain & quality: migrated the workspace to Rust edition 2024 and
centralized lint enforcement (#252) — cleanclippy -D warnings,
tree-widestyle_edition = "2024"formatting, a[workspace.lints]
policy, and a CIlintgate (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