MathML Rendering Status

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. a2b2a2g3
<math>
  <mrow>
    <msup>
      <mi>a</mi>
      <mn>2</mn>
    </msup>
    <msup>
      <mi>b</mi>
      <mn>2</mn>
    </msup>
    <mtext width="0.1667em"></mtext>
    <msub>
      <mi>a</mi>
      <mn>2</mn>
    </msub>
    <msub>
      <mi>g</mi>
      <mn>3</mn>
    </msub>
  </mrow>
</math>
This issue contributes to radical height problems. See item 25.
3 Fraction padding resolved? Adjacent fractions should be separated by a small space. abab
<math>
  <mrow>
    <mstyle displaystyle="true" scriptlevel="0">
      <mfrac>
        <mi>a</mi>
        <mi>b</mi>
      </mfrac>
    </mstyle>
    <mstyle displaystyle="true" scriptlevel="0">
      <mfrac>
        <mi>a</mi>
        <mi>b</mi>
      </mfrac>
    </mstyle>
  </mrow>
</math>
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 asin⁑θ
<math>
   <mi>a</mi>
   <mi>sin</mi>
   <mo>&af;</mo>
   <mi>ΞΈ</mi>
</math>
5 Short Parens W* |x| displays the delimiters too high |x|
<math>
  <mrow>
    <mo fence="true" form="prefix" stretchy="true">|</mo>
    <mi>x</mi>
    <mo fence="true" form="postfix" stretchy="true">|</mo>
  </mrow>
</math>
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 Ο€
<math>
  <msqrt>
    <mi>Ο€</mi>
  </msqrt>
</math>
7 Matrix parens CGWS Parentheses around matrices are too large (abcd)
<math>
  <mrow>
    <mo fence="true" form="prefix" stretchy="true">(</mo>
    <mtable>
      <mtr>
        <mtd>
          <mi>a</mi>
        </mtd>
        <mtd>
          <mi>b</mi>
        </mtd>
      </mtr>
      <mtr>
        <mtd>
          <mi>c</mi>
        </mtd>
        <mtd>
          <mi>d</mi>
        </mtd>
      </mtr>
    </mtable>
    <mo fence="true" form="postfix" stretchy="true">)</mo>
  </mrow>
</math>
8 Unicode spaces resolved? Unicode spaces have incorrect widths. Bβ€ŠB B B
<math>
  <mtext>Bβ€ŠB B B</mtext>
</math>
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 axcˆaxc~
<math>
  <mrow>
    <mover>
      <mrow>
        <mi>a</mi>
        <mi>x</mi>
        <mi>c</mi>
      </mrow>
      <mo stretchy="true" style="math-depth:0">Λ†</mo>
    </mover>
    <mspace width="0.2778em"></mspace>
    <mover>
      <mrow>
        <mi>a</mi>
        <mi>x</mi>
        <mi>c</mi>
      </mrow>
      <mo stretchy="true" style="math-depth:0">~</mo>
    </mover>
  </mrow>
</math>
10 Integral resolved Integration symbol should be large in display mode ∫xdx
<math display="block" style="display:block math;">
  <mrow>
    <mo>∫</mo>
    <mtext width="0.1667em"></mtext>
    <mi>x</mi>
    <mi>d</mi>
    <mi>x</mi>
  </mrow>
</math>
Now fixed in Chromium (2025)
11 Fraction vinculum resolved Fraction vinculum was too wide in display mode Ξ±3Ξ²3+Ξ³3
<math display="block" style="display:block math;">
  <mfrac>
    <msup>
      <mi>Ξ±</mi>
      <mn>3</mn>
    </msup>
    <mrow>
      <msup>
        <mi>Ξ²</mi>
        <mn>3</mn>
      </msup>
      <mo>+</mo>
      <msup>
        <mi>Ξ³</mi>
        <mn>3</mn>
      </msup>
    </mrow>
  </mfrac>
</math>
12 Misaligned delimiter C Delimiters in the base of a <msubsup> are misaligned #215 [2x]01
<math>
  <mo>[</mo>
  <mn>2</mn>
  <mi>x</mi>
  <msubsup>
    <mo>]</mo>
    <mn>0</mn>
    <mn>1</mn>
  </msubsup>
</math>
13 Primes CWS Prime vertical alignment is too high.. #160 fcβ€²
<math>
  <msubsup>
    <mi>f</mi>
    <mi>c</mi>
    <mo>β€²</mo>
  </msubsup>
</math>
The browser should use an alternate glyph for β€², β€³, etc. All math fonts have alternate glyphs.
14 Accents (A) W Accents placed too high yβ€Ύ
<math>
  <mover>
    <mi>y</mi>
    <mo stretchy="false" style="math-depth:0;">β€Ύ</mo>
  </mover>
</math>
15 Accents (B) CWS Accents omit italic correction Fβ€Ύ
<math>
  <mover>
    <mi>F</mi>
    <mo stretchy="false" style="math-depth:0">β€Ύ</mo>
  </mover>
</math>
16 Accents (C) CS <mover> attribute accent=true sets accent a little too low. #301 xβ€Ύ
<math>
  <mover accent="true">
    <mi>x</mi>
    <mo stretchy="false">β€Ύ</mo>
  </mover>
</math>
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 M⃗
<math>
  <mover>
    <mi>M</mi>
    <mo stretchy="false" style="math-depth:0;">βƒ—</mo>
  </mover>
</math>
Shows character U+20D7
18 Hat CW* Circumflex accent is not flattened in most math fonts. #254 ΞΈ^
<math>
  <mover>
    <mi>ΞΈ</mi>
    <mo stretchy="false" style="math-depth:0;">^</mo>
  </mover>
</math>
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 A→iB
<math>
  <mrow>
    <mi mathvariant="normal">A</mi>
    <mrow>
      <mtext width="0.2778em"></mtext>
      <mover accent="false">
        <mo stretchy="true" lspace="0" rspace="0">β†’</mo>
        <mrow style="min-width:4.0em; text-align: center">
          <mtext width="0.4286em"></mtext>
          <mi mathvariant="normal">i</mi>
          <mtext width="0.4286em"></mtext>
        </mrow>
      </mover>
      <mtext width="0.2778em"></mtext>
    </mrow>
    <mi mathvariant="normal">B</mi>
  </mrow>
</math>
Shown with style="min-width:4.0em"
21 Extensible arrows (B) CGW Ignores CSS text-align #120 A→iB
<math>
  <mrow>
    <mi mathvariant="normal">A</mi>
    <mrow>
      <mtext width="0.2778em"></mtext>
      <mover accent="false">
        <mo stretchy="true" lspace="0" rspace="0">β†’</mo>
        <mrow style="min-width:4.0em; text-align: center">
          <mtext width="0.4286em"></mtext>
          <mi mathvariant="normal">i</mi>
          <mtext width="0.4286em"></mtext>
        </mrow>
      </mover>
      <mtext width="0.2778em"></mtext>
    </mrow>
    <mi mathvariant="normal">B</mi>
  </mrow>
</math>
Shown with style="text-align: center"
22 Extensible arrows (C) CSW* Note placed too high in any font other than Latin Modern. #121 β†’note
<math>
  <mover accent="false">
    <mo stretchy="true" lspace="0" rspace="0">β†’</mo>
     <mrow>
      <mtext width="0.4286em"></mtext>
      <mtext>note</mtext>
      <mtext width="0.4286em"></mtext>
    </mrow>
  </mover>
</math>
STIX TWO
β†’note Latin Modern
23 Matrix Padding CS Default padding should be zero on both sides of a matrix. |abcd|
<math>
  <mrow>
    <mo fence="true" form="prefix" stretchy="true">|</mo>
    <mtable>
      <mtr>
        <mtd>
          <mi>a</mi>
        </mtd>
        <mtd>
          <mi>b</mi>
        </mtd>
      </mtr>
      <mtr>
        <mtd>
          <mi>c</mi>
        </mtd>
        <mtd>
          <mi>d</mi>
        </mtd>
      </mtr>
    </mtable>
    <mo fence="true" form="postfix" stretchy="true">|</mo>
  </mrow>
</math>
24 Inconsistent cell height G* Cell height defined by differing criteria. |abcd|
<math>
  <mrow>
    <mo fence="true" form="prefix" stretchy="true">|</mo>
    <mtable>
      <mtr>
        <mtd style="padding:0.5ex 5.9776pt 0.5ex 0em;">
          <mi>a</mi>
        </mtd>
        <mtd style="padding:0.5ex 0em 0.5ex 5.9776pt;">
          <mi>b</mi>
        </mtd>
      </mtr>
      <mtr>
        <mtd style="padding:0.5ex 5.9776pt 0.5ex 0em;">
          <mi>c</mi>
        </mtd>
        <mtd style="padding: 0.5ex 0em 0.5ex 5.9776pt;">
          <mi>d</mi>
        </mtd>
      </mtr>
    </mtable>
    <mo fence="true" form="postfix" stretchy="true">|</mo>
  </mrow>
</math>
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.
25Radical height CGWS* Radicals are often too tall when the radicand has a (sub|super)script fc2
<math>
  <msqrt>
    <msubsup>
      <mi>f</mi>
      <mi>c</mi>
      <mn class="tml-lrg-pad">2</mn>
    </msubsup>
  </msqrt>
</math>
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 223
<math>
  <mroot>
    <mn>22</mn>
    <mn>3</mn>
  </mroot>
</math>
Showing Latin Modern. It looks better with Cambria Math.
27 Size 4 radicals C* Vinculum and surd are mis-aligned
<math>
  <msqrt>
    <mpadded width="2em" height="6em"></mpadded>
  </msqrt>
</math>
28 End space CG Spaces written at the end of a <mtext> are trimmed BB MM
<math>
  <mi>BB</mi>
  <mtext>  </mtext>
  <mi>MM</mi>
</math>
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 a
<math>
  <msqrt>
    <mpadded voffset="0.25em">
      <mi>a</mi>
    </mpadded>
  </msqrt>
</math>
Shown with "a" raised by 0.25em.
30 \mathrm{N} G Improperly sets operator spacing on an <mi mathvariant="normal">. 1816217 aNa
<math>
  <mi>a</mi>
  <mi mathvariant="normal">N</mi>
  <mi>a</mi>
</math>
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 π’œ︀ℬ︀π’ž︁π’Ÿ︁
<math>
  <mrow>
    <mi>π’œ&#xFE00;</mi>
    <mi>ℬ&#xFE00;</mi>
    <mi>π’ž&#xFE01;</mi>
    <mi>π’Ÿ&#xFE01;</mi>
  </mrow>
</math>
Showing STIX TWO font, bad.
π’œ︀ℬ︀π’ž︁π’Ÿ︁ Showing New Computer Modern Math font, good.
32 Script (2) F Some math fonts do not contain roundhand glyphs. π’œ︁ℬ︁π’ž︁
<math>
  <mrow>
    <mi>π’œ&#xFE01;</mi>
    <mi>ℬ&#xFE01;</mi>
    <mi>π’ž&#xFE01;</mi>
  </mrow>
</math>
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. MMMM
<math>
  <msup>
    <mi>M</mi>
    <msup>
      <mi>M</mi>
      <msup>
        <mi>M</mi>
        <mi>M</mi>
      </msup>
    </msup>
  </msup>
</math>
Elements should not shrink beyond scriptscriptstyle.
34 Stretchy \middle resolved? Fails to stretch if form="infix" βŸ¨Ο•|βˆ‚2βˆ‚t2|ψ⟩
<math>
          <mrow>
            <mo fence="true" form="prefix" stretchy="true">⟨</mo>
            <mi>Ο•</mi>
            <mspace width="0.1667em"></mspace>
            <mo stretchy="true" form="infix" lspace="0.05em" rspace="0.05em">|</mo>
            <mspace width="0.1667em"></mspace>
            <mfrac>
              <msup>
                <mi>βˆ‚</mi>
                <mn>2</mn>
              </msup>
              <mrow>
                <mi>βˆ‚</mi>
                <msup>
                  <mi>t</mi>
                  <mn class="tml-med-pad">2</mn>
                </msup>
              </mrow>
            </mfrac>
            <mspace width="0.1667em"></mspace>
            <mo stretchy="true" form="infix" lspace="0.05em" rspace="0.05em">|</mo>
            <mspace width="0.1667em"></mspace>
            <mi>ψ</mi>
            <mo fence="true" form="postfix" stretchy="true">⟩</mo>
          </mrow>
        </math>
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 -2
<math>
  <mo>-</mo>
  <mn>2</mn>
</math>
36 Overlap W Elements are not rendered if CSS width = 0 /=
<math>
  <mrow>
    <mpadded width="0px">
      <mrow>
        <mtext width="0.1667em"></mtext>
        <mi>/</mi>
      </mrow>
    </mpadded>
    <mo lspace="0em" rspace="0em">=</mo>
  </mrow>
</math>
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 e=mc2
<math>
  <menclose notation='box'>
    <mi>e</mi>
    <mo>=</mo>
    <mi>m</mi>
    <msup>
      <mi>c</mi>
      <mn>2</mn>
    </msup>
  </menclose>
</math>
39 \cancel 5
<math>
  <menclose notation='updiagonalstrike'>
    <mn>5</mn>
  </menclose>
</math>
40 \bcancel 5
<math>
  <menclose notation='downdiagonalstrike'>
    <mn>5</mn>
  </menclose>
</math>
41 \xcancel 5
<math>
  <menclose notation='updiagonalstrike downdiagonalstrike'>
    <mn>5</mn>
  </menclose>
</math>
42 \sout ABC
43 \angl, \angln an
44 Long division 22100
<math>
  <mn>22</mn>
  <menclose>
    <mn>100</mn>
  </menclose>
</math>
45 \cancelto CWS Not supported #245 x+10
46 \phase CWS Not supported #245 30∘
47 Paren padding C* Most stretchy delimiters add exessive padding (M)|M|{M}⟨MβŸ©β€–Mβ€–[M]
<math>
  <mtable>
    <mtr>
      <mtd style="padding-left:0pt;padding-right:0pt;">
        <mrow>
          <mrow>
            <mo fence="true" form="prefix" stretchy="true">(</mo>
            <mi>M</mi>
            <mo fence="true" form="postfix" stretchy="true">)</mo>
          </mrow>
          <mrow>
            <mo fence="true" form="prefix" stretchy="true">|</mo>
            <mi>M</mi>
            <mo fence="true" form="postfix" stretchy="true">|</mo>
          </mrow>
          <mrow>
            <mo fence="true" form="prefix" stretchy="true">{</mo>
            <mi>M</mi>
            <mo fence="true" form="postfix" stretchy="true">}</mo>
          </mrow>
        </mrow>
      </mtd>
    </mtr>
    <mtr>
      <mtd style="padding-left:0pt;padding-right:0pt;">
        <mrow>
          <mrow>
            <mo fence="true" form="prefix" stretchy="true">⟨</mo>
            <mi>M</mi>
            <mo fence="true" form="postfix" stretchy="true">⟩</mo>
          </mrow>
          <mrow>
            <mo fence="true" form="prefix" stretchy="true">β€–</mo>
            <mi>M</mi>
            <mo fence="true" form="postfix" stretchy="true">β€–</mo>
          </mrow>
          <mrow>
            <mo fence="true" form="prefix" stretchy="true">[</mo>
            <mi>M</mi>
            <mo fence="true" form="postfix" stretchy="true">]</mo>
          </mrow>
        </mrow>
      </mtd>
    </mtr>
  </mtable>
</math>
| and β€– are okay.
48 Super Op W* Operator spacing kept around a superscript xβˆ—
<math>
  <msup>
    <mi>x</mi>
    <mo>βˆ—</mo>
  </msup>
</math>
49 Misaligned sized fence C Misalignment when subscripting a "sized" fence β€–xβ€–2
Possibly related to item 12.
50 Spacing anomaly C Spacing is squashed in table row with empty elements =x
<math>
  <mtable displaystyle="true" scriptlevel="0" style="width: 100%">
    <mtr>
      <mtd style="text-align: right;justify-items: end;padding-right: 0;">
        <mo lspace="0">=</mo>
        <mrow></mrow>
      </mtd>
      <mtd style="text-align: left;justify-items: start;padding-left: 0;">
        <mi>x</mi>
      </mtd>
    </mtr>
  </mtable>
</math>
51 Stretched / C* Excessive padding on stretched / #323 ab/ab
<math>
  <mrow>
    <mo fence="true" form="prefix" stretchy="true"></mo>
    <mstyle displaystyle="true" scriptlevel="0">
      <mfrac>
        <mi>a</mi>
        <mi>b</mi>
      </mfrac>
    </mstyle>
    <mo stretchy="true" form="infix">/</mo>
    <mstyle displaystyle="true" scriptlevel="0">
      <mfrac>
        <mi>a</mi>
        <mi>b</mi>
      </mfrac>
    </mstyle>
    <mo fence="true" form="postfix" stretchy="true"></mo>
  </mrow>
</math>
52 Extensible arrows (D) C* Do not stretch in certain fonts #40856326 β†’abcde
<math>
  <mrow>
    <mspace width="0.2778em"></mspace>
    <mover accent="false">
      <mo stretchy="true" lspace="0" rspace="0">β†’</mo>
      <mover>
        <mrow>
          <mspace width="0.4286em"></mspace>
          <mtext>abcde</mtext>
          <mspace width="0.4286em"></mspace>
        </mrow>
        <mspace width="3.5000em"></mspace>
      </mover>
    </mover>
    <mspace width="0.2778em"></mspace>
  </mrow>
</math>
Showing STIX TWO
53