Repository navigation
v0.271.0
Twelve changes since v0.270.0. The theme is font sizes: the whole LaTeX size ladder now agrees with tectonic, and a class's base size is the one its .clo states.
⛔ Breaking
NewOpenTypeFont(fontBytes []byte, sizePt float64) — the size argument was an int. A font size is a dimension: size10.clo states ten sizes and three of them are not whole (\Large 14.4, \LARGE 17.28, \huge 20.74), so an integer truncated them on the way in. Callers passing a literal need no change; callers passing an int variable need a float64(...).
Font sizes now match the oracle
#718 — the face carried its size as an int, so \Large landed on 14 instead of 14.4: 2.8% narrow on every section heading in every document. Reading each line's Tf out of the PDF of a 10pt article:
| before | after | tectonic |
|
|---|---|---|---|
\Large |
13.95 | 14.35 | 14.35 |
\LARGE |
17 | 17.22 | 17.22 |
\huge |
21 | 20.66 | 20.66 |
\Huge |
25 | 24.79 | 24.79 |
All ten entries agree now; the six that already did are unchanged. Built on go-opentype/opentype v0.17.1's NewFaceAt, added for this caller.
#719 — an [11pt] class set its body at 11pt. size11.clo states \normalsize as \@xipt, which is 10.95; the kernel constant was already right and the class base table contradicted it. Its whole ladder was 0.46% large. All six sizes, and the folio, now match tectonic.
#714 — \rm, \bf, \it, \tt, \sf change the family, not the size, but each was bound to a face built once at the document's base size, so selecting one undid any size switch before it. LaTeX's own \section is {\normalfont\Large\bfseries} — size first, series last — so every section heading in every document came out at body size.
Kerning
#715 — brings in go-opentype v0.18.0, where GPOS kern lookups accumulate instead of stopping at the first that covers a pair. Libertinus Serif files A/V with 0 in its first kern lookup and −112 in a later one, so every AV in that family was 1.12pt too wide at 10pt: \hbox{AV} measured 13.47pt against XeTeX's 12.35pt, and now measures 12.35pt.
Packages can talk to themselves across passes
#712 — \@auxout was \def\@auxout{-1}, a number no \openout ever opens, so everything a package wrote to the .aux went nowhere. It is a real stream now, carried from one pass to the next beside the label tables.
What that unlocks: the genuine natbib.sty runs. On \citep/\citet in authoryear mode it now produces, word for word, what tectonic produces, with no undefined commands skipped. See #703 for what remains — reaching the package file, not running it.
Page breaking and vertical spacing
- #701 — a forced break does not get to choose on a page that is already overfull.
- #702 —
\splitmaxdepthand\boxmaxdepthare\maxdimen, not zero (ltplain.dtx:872-873). - #706 —
\vspace*restores\prevdepth, worth one\baselineskipevery time (latex.ltx:6586). - #707 — the
\vsizefallback counted itself.
Headings and contents
- #708 —
\let\sectionmark\@gobblecopied an undefined meaning, because\@gobblelives in a later layer, so every numbered heading set its own title twice. - #710 — a contents entry keeps the macros its title was written with:
\'esurvives into the contents list instead of arriving as two glyphs.
Corpus
154 arXiv papers against tectonic: Σ|·| 272, bias −12, 47 exact.
Worth stating plainly for anyone reading that number against the work above: most of this release is invisible to it. The page metric compares page counts, and a kern or a heading a third of a point wider only costs a page when it tips one. hashdiff put the real reach of #718 at 124 of 154 papers rendering differently, every one at the same page count. The argument for these changes is the oracle comparison, not Σ. See #716.
🤖 Generated with Claude Code