All three of the main browser rendering engines now support MathML. Unfortunately, they each have multiple shortcomings in math rendering. The MathML Core specification also has some issues.
The table below is an attempt to show all the current major rendering issues in one place. It describes issues, gives an example of the relevant MathML source code and shows screenshots of all three browser renderings as compared to LaTeX output.
The first eleven rows of this table come fromΒ Murray Sargentβs list of problems in MathML Core issue #229. I have paraphrased some of Murray's descriptions in my own words, but they are the same issues.
The math font in use is Latin Modern, unless noted otherwise.
These renderings differ from Temml output because Temml contains workarounds for most of these problems.
This table is a work in progress. I intend to keep it updated and I welcome suggestions for its improvement. MathML Core issue #320 would be a good forum for discussion of this table.
Key for Status Column
C: Chromium (Chrome, Edge, etc.) issues
G: Gecko (Firefox) issues
W: WebKit (Safari) issues
S: MathML Core Specification issues
F: Font issues
*: No workaround exists in Temml
By Ron Kok. Last updated 9 Apr 2026.
| Name |
|
Description | Issue | LaTeX | Chromium | Gecko | WebKit | Your browser | MathML | Comment | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Display mode | resolved | <math display="block"> often didn't center the equation |
||||||||
| 2 | Supsub | CGWS* | Superscript and subscript vertical alignment should not vary with character height or descender depth. | ![]() |
![]() |
|
This issue contributes to radical height problems. See item 25. | ||||
| 3 | Fraction padding | resolved? | Adjacent fractions should be separated by a small space. | ![]() |
![]() |
|
Per TeXbook p. 150, fractions (except \cfrac) should get a 1.2 pt gap on either side. Chromium applies a 1px padding. | ||||
| 4 | Operator spacing | CWS | π sin π needs a space before and after sin |
![]() |
![]() |
|
|||||
| 5 | Short Parens | W* | |x| displays the delimiters too high | ![]() |
![]() |
|
Shown with stretchy="true".Now fixed in Chromium (2025). Rendering has been good all along where stretchy="false". |
||||
| 6 | Radical alignment | C | βπ displays the square root too low | ![]() |
![]() |
![]() |
|
||||
| 7 | Matrix parens | CGWS | Parentheses around matrices are too large | ![]() |
![]() |
|
|||||
| 8 | Unicode spaces | resolved? | Unicode spaces have incorrect widths. | ![]() |
![]() |
![]() |
|
I have been unable to reproduce Murray's problem. The spaces shown are U+200A (hair space), U+2009 (thin space), and U+2002 (en space). Also, U+2061 (apply function) has no advance distance. | |||
| 9 | Wide hat & tilde | C | \widehat and \widetilde do not stretch | ![]() |
![]() |
|
|||||
| 10 | Integral | resolved | Integration symbol should be large in display mode | ![]() |
![]() |
![]() |
|
Now fixed in Chromium (2025) | |||
| 11 | Fraction vinculum | resolved | Fraction vinculum was too wide in display mode | ![]() |
![]() |
|
|||||
| 12 | Misaligned delimiter | C | Delimiters in the base of a <msubsup> are misaligned |
#215 | ![]() |
![]() |
|
||||
| 13 | Primes | CWS | Prime vertical alignment is too high.. | #160 | ![]() |
![]() |
|
The browser should use an alternate glyph for β², β³, etc. All math fonts have alternate glyphs. |
|||
| 14 | Accents (A) | W | Accents placed too high | ![]() |
![]() |
|
|||||
| 15 | Accents (B) | CWS | Accents omit italic correction | ![]() |
![]() |
|
|||||
| 16 | Accents (C) | CS | <mover> attribute accent=true sets accent a little too low. |
#301 | ![]() |
![]() |
|
The other accents in this table work in Chromium because I did not use <mover> attribute accent=true. Instead, I set an explicit math-depth on the accent element. |
|||
| 17 | \vec | CWS | The glyph that best matches TeX is a combining character, which renders too far left. | #311 | ![]() |
![]() |
|
Shows character U+20D7 | |||
| 18 | Hat | CW* | Circumflex accent is not flattened in most math fonts. | #254 | ![]() |
![]() |
|
STIX TWO | |||
![]() |
![]() |
Latin Modern is okay | |||||||||
| 19 | Soft linebreaks | CWS* | Not supported | #127 | Gecko, when <semantics> and <annotation> are not used, treats the end of a top-level <mrow> as a soft line-break. Itβs very handy. |
||||||
| 20 | Extensible arrows (A) | GW | Ignores CSS min-width |
#64 | ![]() |
![]() |
|
Shown with style="min-width:4.0em" |
|||
| 21 | Extensible arrows (B) | CGW | Ignores CSS text-align |
#120 | ![]() |
![]() |
|
Shown with style="text-align: center" |
|||
| 22 | Extensible arrows (C) | CSW* | Note placed too high in any font other than Latin Modern. | #121 | ![]() |
![]() |
|
STIX TWO | |||
![]() |
![]() |
Latin Modern | |||||||||
| 23 | Matrix Padding | CS | Default padding should be zero on both sides of a matrix. | ![]() |
![]() |
|
|||||
| 24 | Inconsistent cell height | G* | Cell height defined by differing criteria. | ![]() |
![]() |
|
Chromium and WebKit set cell height by applying CSS padding to the ink. Gecko pads the line box. Math is shown with explicitly set 0.5ex top and bottom padding. |
||||
| 25 | Radical height | CGWS* | Radicals are often too tall when the radicand has a (sub|super)script | ![]() |
![]() |
|
A nicely sized surd is not available because (sub|super)scripts are not at the height expected by the font designer. Item 2 and lack of cramping both contribute. | ||||
| 26 | Radical Degree | CW* | Degree placed too far left or right | #317 | ![]() |
![]() |
|
Showing Latin Modern. It looks better with Cambria Math. | |||
| 27 | Size 4 radicals | C* | Vinculum and surd are mis-aligned | ![]() |
![]() |
|
|||||
| 28 | End space | CG | Spaces written at the end of a <mtext> are trimmed |
![]() |
![]() |
|
Shown with 2 spaces in a <mtext>.This behavior conforms to MathML 2.0 section 2.4.6, but it seems weird. LaTeX \text{β¦} and HTML <span> don't do this. |
||||
| 29 | \raise, \raisebox | CWS | Attribute voffset moves the ink but does not increase computed height |
#203 | ![]() |
![]() |
|
Shown with "a" raised by 0.25em. | |||
| 30 | \mathrm{N} | G | Improperly sets operator spacing on an <mi mathvariant="normal">. |
1816217 | ![]() |
![]() |
|
||||
| 31 | Script (1) | F | Fonts should handle script characters as per Unicode 14+. Characters in the range U+1D49C - U+1D4B5, Mathematical Script, can be either chancery glyphs () or roundhand glyphs (). Chancery character codes are appended by &FE00; and roundhand character codes are appended by &FE01;. |
#271 | ![]() |
![]() |
![]() |
|
Showing STIX TWO font, bad. |
||
![]() |
![]() |
![]() |
Showing New Computer Modern Math font, good. | ||||||||
| 32 | Script (2) | F | Some math fonts do not contain roundhand glyphs. | ![]() |
![]() |
|
Showing Latin Modern, which does not contain roundhand glyphs. | ||||
| 33 | ScriptΒscriptstyle | CW | Elements over-shrink in a deeply nested fraction or (sub|super)script. | ![]() |
![]() |
|
Elements should not shrink beyond scriptscriptstyle. | ||||
| 34 | Stretchy \middle | resolved? | Fails to stretch if form="infix" |
![]() |
![]() |
|
It renders well. My earlier work contained an error. However, the operator dictionary stills says that "|", "β", and "/" are not stretchy, which is probably worth revising. | ||||
| 35 | Hyphen-minus | CS | U+002D hyphen-minus in a <mo> should render as U+2212, minus sign. |
#70 | ![]() |
![]() |
|
||||
| 36 | Overlap | W | Elements are not rendered if CSS width = 0 |
![]() |
![]() |
|
|||||
| 37 | Negative kern | W | Negative left margin not recognized on <mpadded> |
#132 | WebKit does recognize negative left margin on a <mrow>. |
||||||
| 38 | \boxed | CS | <menclose> not supported |
#245 | ![]() |
![]() |
![]() |
|
|||
| 39 | \cancel | ![]() |
![]() |
![]() |
|
||||||
| 40 | \bcancel | ![]() |
![]() |
|
|||||||
| 41 | \xcancel | ![]() |
![]() |
|
|||||||
| 42 | \sout | ![]() |
![]() |
|
|||||||
| 43 | \angl, \angln | ![]() |
![]() |
![]() |
|
||||||
| 44 | Long division | ![]() |
![]() |
|
|||||||
| 45 | \cancelto | CWS | Not supported | #245 | ![]() |
![]() |
|
||||
| 46 | \phase | CWS | Not supported | #245 | ![]() |
![]() |
![]() |
![]() |
|
||
| 47 | Paren padding | C* | Most stretchy delimiters add exessive padding | ![]() |
![]() |
![]() |
|
| and β are okay. | |||
| 48 | Super Op | W* | Operator spacing kept around a superscript | ![]() |
![]() |
![]() |
|
||||
| 49 | Misaligned sized fence | C | Misalignment when subscripting a "sized" fence | ![]() |
![]() |
![]() |
|
Possibly related to item 12. | |||
| 50 | Spacing anomaly | C | Spacing is squashed in table row with empty elements | ![]() |
![]() |
![]() |
|
||||
| 51 | Stretched / | C* | Excessive padding on stretched / | #323 | ![]() |
![]() |
![]() |
|
|||
| 52 | Extensible arrows (D) | C* | Do not stretch in certain fonts | #40856326 | ![]() |
![]() |
![]() |
|
Showing STIX TWO | ||
| 53 | |