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 AiB
<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 AiB
<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) CGWS Browser should distinguish between chancery and roundhand Unicode and render the appropriate glyph. #271 𝒜︀ℬ︀𝒞︁𝒟︁
<math>
  <mrow>
    <mi>𝒜&#xFE00;</mi>
    <mi>ℬ&#xFE00;</mi>
    <mi>𝒞&#xFE01;</mi>
    <mi>𝒟&#xFE01;</mi>
  </mrow>
</math>
Showing STIX TWO font.
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;.
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 CW Fails to stretch if form="infix" ϕ|2t2|ψ
<math>
  <mrow>
    <mo fence="true" form="prefix" stretchy="true">⟨</mo>
    <mi>ϕ</mi>
    <mtext width="0.1667em"></mtext>
    <mo fence="true" form="infix" lspace="0.05em" rspace="0.05em">|</mo>
    <mtext width="0.1667em"></mtext>
    <mfrac>
      <msup>
        <mi>∂</mi>
        <mn>2</mn>
      </msup>
      <mrow>
        <mi>∂</mi>
        <msup>
          <mi>t</mi>
          <mn>2</mn>
        </msup>
      </mrow>
    </mfrac>
    <mtext width="0.1667em"></mtext>
    <mo fence="true" form="infix" lspace="0.05em" rspace="0.05em">|</mo>
    <mtext width="0.1667em"></mtext>
    <mi>ψ</mi>
    <mo fence="true" form="postfix" stretchy="true">⟩</mo>
  </mrow>
</math>
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
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}MM[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>
48