GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Fix spacing in r"$\max f$". by anntzer · Pull Request #30715 · matplotlib/matplotlib

Conversation

@anntzer

@anntzer anntzer commented Nov 1, 2025

Copy link
Copy Markdown
Contributor

First commit (main implementation):

Previously, in a mathtext string like r"$\sin x$", a thin space would
(correctly) be added between "sin" and "x", but that space would be
missing in expressions like r"$\max f$". The difference arose because
of the slightly different handling of subscripts and superscripts
after the \sin and \max operators: \sin^n puts the superscript as
a normal exponent, but \max_x puts the subscript centered below the
operator name ("overunder symbol). The previous code for inserting the
thin space did not handle the "overunder" case; fix that. The new
behavior is tested by the change in test_operator_space, as well as by
mathtext1_dejavusans_06.

The change in mathtext_foo_29 arises because the extra thin space now
inserted after \limsup slightly shifts the centering of the whole
string. Ideally that thin space should be suppressed if there's no
token after the operator, but that's not something currently implemented
either for e.g. \sin (compare e.g. the right-alignments in
text(.5, .9, r"$\sin$", ha="right"); text(.5, .8, r"$\mathrm{sin}$", ha="right"); axvline(.5)
where the extra thin space after \sin is visible), so this patch just
makes things more consistent.

Second commit (cleanup):

Rename _in_subscript_or_superscript to the more descriptive
_needs_space_after_subsuper; simplify its setting in operatorname();
avoid the need to introduce an extra explicitly-typed spaced_nucleus
variable.

(See previous work in #17890 and #23243.)
@QuLogic This PR also changes a few baseline images so maybe it could get folded into the text-overhaul branch (for now I labeled it as such), but the changes are limited and standalone so it could also go in as a normal PR if that makes things simpler for you, I don't mind either way.

PR summary

PR checklist

  • "closes #0000" is in the body of the PR description to link the related issue
  • new and changed code is tested
  • Plotting related features are demonstrated in an example
  • New Features and API Changes are noted with a directive and release note
  • Documentation complies with general and docstring guidelines

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@anntzer anntzer added this to the v3.11.0 milestone Nov 1, 2025
@anntzer anntzer added the topic: text/mathtext label Nov 1, 2025
timhoffm
timhoffm reviewed Nov 2, 2025
View reviewed changes

@timhoffm timhoffm left a comment

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, still some tests are failing.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread lib/matplotlib/_mathtext.py Outdated
Comment on lines 2496 to 2502
result = Hlist([
vlt,
*([self._make_space(self._space_widths[r'\,'])]
if self._needs_space_after_subsuper else []),
])
self._needs_space_after_subsuper = False
return [result]

@timhoffm timhoffm Nov 2, 2025

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Optional alternative spelling. Choose whichever you like.

Suggested change
result = Hlist([
vlt,
*([self._make_space(self._space_widths[r'\,'])]
if self._needs_space_after_subsuper else []),
])
self._needs_space_after_subsuper = False
return [result]
spacing_nodes = (
[self._make_space(self._space_widths[r'\,'])]
if self._needs_space_after_subsuper else []
)
self._needs_space_after_subsuper = False
return [Hlist([vlt, *spacing_nodes])]

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
oscargus
oscargus approved these changes Nov 2, 2025
View reviewed changes

@oscargus oscargus left a comment •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Possibly update *_29 to include a text after? f(x)? To establish that there should be a space etc.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@anntzer
anntzer changed the base branch from text-overhaul to main November 2, 2025 21:16
@anntzer
anntzer force-pushed the opspace branch from feecd7c to 2ae07a5 Compare November 2, 2025 21:20
@anntzer

anntzer commented Nov 2, 2025 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor Author

Testing for the space is already provided by mathtext1_dejavusans_06 (after the max).
I'm a bit confused as to why the tests are failing given that they fail for some of the baselines that had been updated just for this purpose. Maybe resetting the target branch to main instead of text-overhaul will help? Let's try... Edit: indeed, that worked.
Also included a variant of @timhoffm's proposed change.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

timhoffm
timhoffm approved these changes Nov 2, 2025
View reviewed changes

@timhoffm timhoffm left a comment

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll leave this open, so that you can decide yourself on which branch this should go.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@anntzer

anntzer commented Nov 3, 2025

Copy link
Copy Markdown
Contributor Author

Mostly that's a decision for @QuLogic, I'd say.

timhoffm reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

anntzer added 2 commits November 6, 2025 05:22
@anntzer @QuLogic
Fix spacing in r"$\max f$".
4a99a83
Previously, in a mathtext string like `r"$\sin x$"`, a thin space would
(correctly) be added between "sin" and "x", but that space would be
missing in expressions like `r"$\max f$"`.  The difference arose because
of the slightly different handling of subscripts and superscripts
after the `\sin` and `\max` operators: `\sin^n` puts the superscript as
a normal exponent, but `\max_x` puts the subscript centered below the
operator name ("overunder symbol).  The previous code for inserting the
thin space did not handle the "overunder" case; fix that.  The new
behavior is tested by the change in test_operator_space, as well as by
mathtext1_dejavusans_06.

The change in mathtext_foo_29 arises because the extra thin space now
inserted after `\limsup` slightly shifts the centering of the whole
string.  Ideally that thin space should be suppressed if there's no
token after the operator, but that's not something currently implemented
either for e.g. `\sin` (compare e.g. the right-alignments in
`text(.5, .9, r"$\sin$", ha="right"); text(.5, .8, r"$\mathrm{sin}$", ha="right"); axvline(.5)`
where the extra thin space after `\sin` is visible), so this patch just
makes things more consistent.
@anntzer @QuLogic
Tweak sub/superscript spacing implementation.
17428e3
Rename _in_subscript_or_superscript to the more descriptive
_needs_space_after_subsuper; simplify its setting in operatorname();
avoid the need to introduce an extra explicitly-typed spaced_nucleus
variable.
@QuLogic

QuLogic commented Nov 6, 2025

Copy link
Copy Markdown
Member

There shouldn't be any reason why it can't go on the text-overhaul branch...

anntzer reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@QuLogic
QuLogic changed the base branch from main to text-overhaul November 6, 2025 10:29
@QuLogic
QuLogic force-pushed the opspace branch 2 times, most recently from 905fd51 to 17428e3 Compare November 6, 2025 17:26
@QuLogic
QuLogic merged commit e952f23 into matplotlib:text-overhaul Nov 6, 2025
30 of 31 checks passed

Uh oh!

There was an error while loading. Please reload this page.

@anntzer
anntzer deleted the opspace branch November 6, 2025 19:25
wavebyrd pushed a commit to wavebyrd/matplotlib that referenced this pull request Mar 13, 2026
@QuLogic
Merge pull request matplotlib#30715 from anntzer/opspace
db12464
Fix spacing in r"$\max f$".
QuLogic added a commit to QuLogic/matplotlib that referenced this pull request Apr 10, 2026
@QuLogic
Update test images for font/text overhaul
12d2a4d
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
Font and text overhaul #30161
Merged
4 tasks done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@timhoffm timhoffm timhoffm approved these changes
@oscargus oscargus oscargus approved these changes

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

topic: text/mathtext

Projects

None yet

Milestone

v3.11.0

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

4 participants

@anntzer @QuLogic @timhoffm @oscargus
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.