Skip to content

mathtext: Fetch quad width & axis height from font metrics#31110

Merged
QuLogic merged 2 commits intomatplotlib:text-overhaulfrom
QuLogic:space-axisheight-metrics
Mar 1, 2026
Merged

mathtext: Fetch quad width & axis height from font metrics#31110
QuLogic merged 2 commits intomatplotlib:text-overhaulfrom
QuLogic:space-axisheight-metrics

Conversation

@QuLogic
Copy link
Copy Markdown
Member

@QuLogic QuLogic commented Feb 7, 2026

PR summary

As a followup to #31046 that @anntzer requested, this fetches the quad width and axis height from the font metrics, either the TFM or the TeX table in FontForge.

For Computer Modern and STIX, the axis height metric is very close to the previous calculation and there are minuscule changes. The quad width is a bit bigger than the old 'm' calculation, but it does appear closer to usetex=True output.

For DejaVu however, I'm not super happy with the embedded metrics. In #22852, @tfpf originally intended to calculate the axis height so that fraction bars aligned with the minus sign. This is not the case with the metric embedded in the font, and it's a pixel or two lower. Additionally, the quad space is completely bogus since it's -2048, so I didn't even bother adding it. I have left the axis height metric in for review here, but we may want to revert that for this font, especially since this is our default.

Note, I have based this PR on the text-overhaul-figures branch so that the subsequent commits only show the relevant changes, but that does inflate the "Files changed" count.

PR checklist

@QuLogic QuLogic added this to the v3.11.0 milestone Feb 7, 2026
@github-project-automation github-project-automation bot moved this to Waiting for other PR in Font and text overhaul Feb 7, 2026
@QuLogic QuLogic moved this from Waiting for other PR to Ready for Review in Font and text overhaul Feb 7, 2026
@anntzer
Copy link
Copy Markdown
Contributor

anntzer commented Feb 7, 2026

Re: DejaVu's font constants: I think you can't actually believe the values that fontforge gives you, because they appear to be nonstandard tables that I believe are "autofilled" by fontforge -- see https://fontforge.org/docs/techref/non-standard.html; also opening e.g. DejaVuSans.ttf with fontTools shows that there isn't actually a "TeX " table in that file (if I got that correctly).
I suspect that fontforge just has its own algorithm for filling in these values, although I couldn't actually find them from a quick skim over their source tree. I guess that for fonts like DejaVu Sans with no math metrics it makes sense to just fall back to our own guesses (use "m" and "x" metrics; align fraction bar midway of equal sign).

@llohse
Copy link
Copy Markdown
Contributor

llohse commented Feb 10, 2026

Doesn't it make sense to also add underline thickness and x-height while you are at it? For the LaTeX fonts and STIX, these should be very reliable, as LaTeX uses them.
For OpenType math, they can be easily converted from the MATH table.

This only leaves DejaVu, for which one can measure the values once, and all other "custom" fonts, for which one can fall back to the old behavior.

@QuLogic
Copy link
Copy Markdown
Member Author

QuLogic commented Feb 18, 2026

Probably we should do those as well, but maybe that should wait for the refactoring in #31121 as it makes it easier to fetch from the constants where necessary.

@tacaswell
Copy link
Copy Markdown
Member

It looks like 3 more images need to be updated.

This mostly has a minimal change to results as the axis height is fairly
closely aligned with the minus sign as previously implemented.
These are mostly wider than the previous calculation of the 'm' width.
The values are invalid in the DejaVu fonts (-2048), so those still use
the old method.
@QuLogic QuLogic force-pushed the space-axisheight-metrics branch from 0744ec9 to 383028b Compare February 27, 2026 20:27
@QuLogic
Copy link
Copy Markdown
Member Author

QuLogic commented Feb 27, 2026

I checked the test images and it looks like i just missed updating them; they are similar differences in that the quad width spacing is a little different for CM fonts.

Anyway, I've done the usual commit to the text-overhaul-figures branch and rebased this without image changes before merging.

@QuLogic QuLogic merged commit d4bace4 into matplotlib:text-overhaul Mar 1, 2026
33 of 48 checks passed
@github-project-automation github-project-automation bot moved this from Ready for Review to Done in Font and text overhaul Mar 1, 2026
@QuLogic QuLogic deleted the space-axisheight-metrics branch March 1, 2026 18:19
wavebyrd pushed a commit to wavebyrd/matplotlib that referenced this pull request Mar 13, 2026
…rics

mathtext: Fetch quad width & axis height from font metrics
QuLogic added a commit to QuLogic/matplotlib that referenced this pull request Apr 10, 2026
This includes images changes for the following pull requests / commits:

* [Fix center of rotation with
  rotation_mode='anchor'](matplotlib#29199)
  (c44db77)
* [Remove ttconv backwards-compatibility
  code](matplotlib#30145)
  (8caff88)
* [Remove kerning_factor from
  tests](matplotlib#29816)
  (7b4d725)
* [Set text hinting to
  defaults](matplotlib#29816)
  (8255ae2)
* [Update FreeType to
  2.13.3](matplotlib#29816)
  (89c054d)
* [Implement text shaping with
  libraqm](matplotlib#30000)
  (b0ded3a,
  9813523)
* [Add language parameter to Text
  objects](matplotlib#29794)
  (7ce8eae)
* [Fix auto-sized glyphs with BaKoMa
  fonts](matplotlib#29936)
  (3ba2c13)
* [pdf: Improve text with characters outside embedded font
  limits](matplotlib#30512)
  (b70fb88,
  6cedcf7)
* [Prepare `CharacterTracker` for advanced font
  features](matplotlib#30608)
  (8274e17,
  70dc388,
  df670cf,
  ed5e074)
* [Add font feature API to
  Text](matplotlib#29695)
  (972a688)
* [Fix spacing in r"$\max
  f$"](matplotlib#30715)
  (4a99a83)
* [Implement libraqm for vector
  outputs](matplotlib#30607)
  (bd17cd4)
* [Drop the FT2Font intermediate
  buffer](matplotlib#30059)
  (9d7d7b4)
* [Rasterize dvi files without
  dvipng](matplotlib#30039)
  (7627118)
* [Update bundled FreeType and HarfBuzz
  libraries](matplotlib#30938)
  (a161658,
  9619bcc)
* [Fix positioning of wide mathtext
  accents](matplotlib#31069)
  (c2fa7ba)
* [Refactor RendererAgg.draw_{mathtext,text,tex} to use same base
  algorithm](matplotlib#31085)
  (931bcf3)
* [Implement TeX's fraction and script
  alignment](matplotlib#31046)
  (94ff452,
  4bfa0f9,
  1cd8510)
* [Fix confusion between text height and ascent in metrics
  calculations](matplotlib#31107)
  (60f2310)
* [mathtext: Fetch quad width & axis height from font
  metrics](matplotlib#31110)
  (692df3f,
  383028b)
* [mathtext: add mathnormal and distinguish between normal and italic
  family](matplotlib#31121)
  (a6913f3)
* [ENH: Ignore empty text for
  tightbbox](matplotlib#31285)
  (d772043)
* [Drop axis_artist tickdir image compat, due to text-overhaul
  merge](matplotlib#31281)
  (2057583)
* [text: Use font metrics to determine line
  heights](matplotlib#31291)
  (3ab6a27,
  d961462,
  97f4943)
* [ps/pdf: Override font height metrics to support AFM
  files](matplotlib#31371)
  (e0913d4)
* [TST: Cleanup back-compat code in tests touched by text
  overhaul](matplotlib#31295)
  (7c33379)
* [TST: Set tests touched by text overhaul to mpl20
  style](matplotlib#31300)
  (41c4d8d)
@QuLogic QuLogic mentioned this pull request Apr 10, 2026
4 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants