Skip to content

v0.271.0

Choose a tag to compare

@tannevaled tannevaled released this 07 Nov 08:41
· 38 commits to main since this release
46935a2

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 — \splitmaxdepth and \boxmaxdepth are \maxdimen, not zero (ltplain.dtx:872-873).
  • #706 — \vspace* restores \prevdepth, worth one \baselineskip every time (latex.ltx:6586).
  • #707 — the \vsize fallback counted itself.

Headings and contents

  • #708 — \let\sectionmark\@gobble copied an undefined meaning, because \@gobble lives 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: \'e survives 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