MathML Core

W3C Editor's Draft

More details about this document
This version:
https://w3c.github.io/mathml-core/
Latest published version:
https://www.w3.org/TR/mathml-core/
Latest editor's draft:
https://w3c.github.io/mathml-core/
History:
https://www.w3.org/standards/history/mathml-core/
Commit history
Test suite:
https://github.com/web-platform-tests/wpt/tree/master/mathml/
Implementation report:
https://wpt.fyi/results/?label=master&label=experimental&aligned&q=math%20%20not%28path%3A%2Fjs%29
Editors:
David Carlisle (NAG)
Frédéric Wang (Igalia)
Former editors:
Patrick Ion (Mathematical Reviews, American Mathematical Society)
Robert Miner (deceased) (Design Science, Inc.)
Feedback:
GitHub w3c/mathml-core (pull requests, new issue, open issues)

Abstract

This specification defines a core subset of Mathematical Markup Language, or MathML, that is suitable for browser implementation. MathML is a markup language for describing mathematical notation and capturing both its structure and content. The goal of MathML is to enable mathematics to be served, received, and processed on the World Wide Web, just as HTML has enabled this functionality for text.

Status of This Document

This section describes the status of this document at the time of its publication. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at https://www.w3.org/TR/.

This document was published by the Math Working Group as an Editor's Draft.

Publication as an Editor's Draft does not imply endorsement by W3C and its Members.

This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.

This document was produced by a group operating under the W3C Patent Policy. W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.

This document is governed by the 03 November 2023 W3C Process Document.

1. Introduction

This section is non-normative.

The [MATHML3] specification has several shortcomings that make it hard to implement consistently across web rendering engines or to extend with user-defined constructions, e.g.:

This MathML Core specification intends to address these issues by being as accurate as possible on the visual rendering of mathematical formulas using additional rules from the TeXBook’s Appendix G [TEXBOOK] and from the Open Font Format [OPEN-FONT-FORMAT], [OPEN-TYPE-MATH-ILLUMINATED]. It also relies on modern browser implementations and web technologies [HTML] [SVG] [CSS2] [DOM], clarifying interactions with them when needed or introducing new low-level primitives to improve the web platform layering.

Parts of MathML3 that do not fit well in this framework or are less fundamental have been omitted. Instead, they are described in a separate and larger [MATHML4] specification. The details of which math feature will be included in future versions of MathML Core or implemented as polyfills is still open. This question and other potential improvements are tracked on GitHub.

By increasing the level of implementation details, focusing on a workable subset, following a browser-driven design and relying on automated web platform tests, this specification is expected to greatly improve MathML interoperability. Moreover, effort on MathML layering will enable users to implement the rest of the MathML 4 specification, or more generally to extend MathML Core, using modern web technologies such as shadow trees, custom elements or APIs from [HOUDINI].

2. MathML Fundamentals

2.1 Elements and attributes

The term MathML element refers to any element in the MathML namespace. The MathML elements defined in this specification are called the MathML Core elements and are listed below. Any MathML element that is not listed below is called an Unknown MathML element.

  1. annotation
  2. annotation-xml
  3. maction
  4. math
  5. merror
  6. mfrac
  7. mi
  8. mmultiscripts
  9. mn
  10. mo
  11. mover
  12. mpadded
  13. mphantom
  14. mprescripts
  15. mroot
  16. mrow
  17. ms
  18. mspace
  19. msqrt
  20. mstyle
  21. msub
  22. msubsup
  23. msup
  24. mtable
  25. mtd
  26. mtext
  27. mtr
  28. munder
  29. munderover
  30. semantics

The grouping elements are maction, math, merror, mphantom, mprescripts, mrow, mstyle, semantics and unknown MathML elements.

The scripted elements are mmultiscripts, mover, msub, msubsup, msup, munder and munderover.

The radical elements are mroot and msqrt.

The attributes defined in this specification have no namespace and are called MathML attributes:

2.1.1 The Top-Level <math> Element

MathML specifies a single top-level or root math element, which encapsulates each instance of MathML markup within a document. All other MathML content must be contained in a <math> element.

The <math> element accepts the attributes described in 2.1.3 Global Attributes as well as the following attributes:

The display attribute, if present, must be an ASCII case-insensitive match to block or inline. The user agent stylesheet described in A. User Agent Stylesheet contains rules for this attribute that affect the default values for the display (block math or inline math) and math-style (normal or compact) properties. If the display attribute is absent or has an invalid value, the User Agent stylesheet treats it the same as inline.

This specification does not define any observable behavior that is specific to the alttext attribute.

Note
The alttext attribute may be used as alternative text by some legacy systems that do not implement math layout.

If the <math> element does not have its computed display property equal to block math or inline math then it is laid out according to the CSS specification where the corresponding value is described. Otherwise the layout algorithm of the mrow element is used to produce a math content box. That math content box is used as the content for the layout of the element, as described by CSS for display: block (if the computed value is block math) or display: inline (if the computed value is inline math). Additionally, if the computed display property is equal to block math then that math content box is rendered horizontally centered within the content box.

Note
TEX's display mode $$...$$ and inline mode $...$ correspond to display="block" and display="inline" respectively.

In the following example, a math formula is rendered in display mode on a new line and taking full width, with the math content centered within the container:

<div style="width: 15em;">
  This mathematical formula with a big summation and the number pi
  <math display="block" style="border: 1px dotted black;">
    <mrow>
      <munderover>
        <mo></mo>
        <mrow><mi>n</mi><mo>=</mo><mn>1</mn></mrow>
        <mrow><mo>+</mo><mn></mn></mrow>
      </munderover>
      <mfrac>
        <mn>1</mn>
        <msup><mi>n</mi><mn>2</mn></msup>
      </mfrac>
    </mrow>
    <mo>=</mo>
    <mfrac>
      <msup><mi>π</mi><mn>2</mn></msup>
      <mn>6</mn>
    </mfrac>
  </math>
  is easy to prove.
</div>
math example (display)

As a comparison, the same formula would look as follows in inline mode. The formula is embedded in the paragraph of text without forced line breaking. The baselines specified by the layout algorithm of the mrow are used for vertical alignment. Note that the middle of sum and equal symbols or fractions are all aligned, but not with the alphabetical baseline of the surrounding text.

math example (inline)

Because good mathematical rendering requires use of mathematical fonts, the user agent stylesheet should set the font-family to the math value on the <math> element instead of inheriting it. Additionally, several CSS properties that can be set on a parent container such as font-style, font-weight, direction or text-indent etc are not expected to apply to the math formula and so the user agent stylesheet has rules to reset them by default.

math {
  direction: ltr;
  text-indent: 0;
  letter-spacing: normal;
  line-height: normal;
  word-spacing: normal;
  font-family: math;
  font-size: inherit;
  font-style: normal;
  font-weight: normal;
  display: inline math;
  math-shift: normal;
  math-style: compact;
  math-depth: 0;
}
math[display="block" i] {
  display: block math;
  math-style: normal;
}
math[display="inline" i] {
  display: inline math;
  math-style: compact;
}

2.1.2 Types for MathML Attribute Values

In addition to CSS data types, some MathML attributes rely on the following MathML-specific types:

unsigned-integer
An <integer> value as defined in [CSS-VALUES-4], whose first character is neither U+002D HYPHEN-MINUS character (-) nor U+002B PLUS SIGN (+).
boolean
A string that is an ASCII case-insensitive match to true or false.

2.1.3 Global Attributes

The following attributes are common to and may be specified on all MathML elements:

2.1.4 Attributes common to HTML and MathML elements

The id, class, style, data-*, autofocus and nonce and tabindex attributes have the same syntax and semantics as defined for id, class, style, data-*, autofocus, nonce and tabindex attributes on HTML elements.

The dir attribute, if present, must be an ASCII case-insensitive match to ltr or rtl. In that case, the user agent is expected to treat the attribute as a presentational hint setting the element's direction property to the corresponding value. More precisely, an ASCII case-insensitive match to rtl is mapped to rtl while an ASCII case-insensitive match to ltr is mapped to ltr.

Note
The dir attribute is used to set the directionality of math formulas, which is often rtl in Arabic speaking world. However, languages written from right to left often embed math written from left to right and so the user agent stylesheet resets the direction property accordingly on the math elements.

In the following example, the dir attribute is used to render "𞸎 plus 𞸑 raised to the power of (٢ over, 𞸟 plus ١)" from right-to-left.

<math dir="rtl">
  <mrow>
    <mi>𞸎</mi>
    <mo>+</mo>
    <msup>
      <mi>𞸑</mi>
      <mfrac>
        <mn>٢</mn>
        <mrow>
          <mi>𞸟</mi>
          <mo>+</mo>
          <mn>١</mn>
        </mrow>
      </mfrac>
    </msup>
  </mrow>
</math>
dir example

All MathML elements support event handler content attributes, as described in event handler content attributes in HTML.

All event handler content attributes noted by HTML as being supported by all HTMLElements are supported by all MathML elements as well, as defined in the MathMLElement IDL.

2.1.5 Legacy MathML Style Attributes

The mathcolor and mathbackground attributes, if present, must have a value that is a <color>. In that case, the user agent is expected to treat these attributes as a presentational hint setting the element's color and background-color properties to the corresponding values. The mathcolor attribute describes the foreground fill color of MathML text, bars etc while the mathbackground attribute describes the background color of an element.

The mathsize attribute, if present, must have a value that is a valid <length-percentage>. In that case, the user agent is expected to treat the attribute as a presentational hint setting the element's font-size property to the corresponding value. The mathsize property indicates the desired height of glyphs in math formulas but also scales other parts (spacing, shifts, line thickness of bars etc) accordingly.

Note
The above attributes are implemented for compatibility with full MathML. Authors whose only target is MathML Core are encouraged to use CSS for styling.

2.1.6 The displaystyle and scriptlevel attributes

The displaystyle attribute, if present, must have a value that is a boolean. In that case, the user agent is expected to treat the attribute as a presentational hint setting the element's math-style property to the corresponding value. More precisely, an ASCII case-insensitive match to true is mapped to normal while an ASCII case-insensitive match to false is mapped to compact. This attribute indicates whether formulas should try to minimize the logical height (value is false) or not (value is true) e.g. by changing the size of content or the layout of scripts.

The scriptlevel attribute, if present, must have value +<U>, -<U> or <U> where <U> is an unsigned-integer. In that case the user agent is expected to treat the scriptlevel attribute as a presentational hint setting the element's math-depth property to the corresponding value. More precisely, +<U>, -<U> and <U> are respectively mapped to add(<U>) add(<-U>) and <U>.

displaystyle and scriptlevel values are automatically adjusted within MathML elements. To fully implement these attributes, additional CSS properties must be specified in the user agent stylesheet as described in A. User Agent Stylesheet. In particular, for all MathML elements a default font-size: math is specified to ensure that scriptlevel changes are taken into account.

In this example, an munder element is used to attach a script "A" to a base "∑". By default, the summation symbol is rendered with the font-size inherited from its parent and the A as a scaled down subscript. If displaystyle is true, the summation symbol is drawn bigger and the "A" becomes an underscript. If scriptlevel is reset to 0 on the "A", then it will use the same font-size as the top-level math root.

<math>
  <munder>
    <mo></mo>
    <mi>A</mi>
  </munder>
  <munder displaystyle="true">
    <mo></mo>
    <mi>A</mi>
  </munder>
  <munder>
    <mo></mo>
    <mi scriptlevel="0">A</mi>
  </munder>
</math>
displaystyle-scriptlevel example
Note
TEX's \displaystyle, \textstyle, \scriptstyle, and \scriptscriptstyle correspond to displaystyle and scriptlevel as true and 0, false and 0, false and 1, and false and 2, respectively.

2.1.7 Attributes Reserved as Valid

The attributes intent and arg are reserved as valid attributes.

This specification does not define any observable behavior that is specific to the intent and arg attributes.

Note
These attributes are described in [MATHML4] and future versions of this specification may or may not define them. Authors should be aware that they are currently in development and subject to change.

2.2 Integration in the Web Platform

2.2.1 HTML and SVG

MathML can be mixed with HTML and SVG as described in the relevant specifications [HTML] [SVG].

When evaluating the SVG requiredExtensions attribute, user agents must claim support for the language extension identified by the MathML namespace.

In this example, inline MathML and SVG elements are used inside an HTML document. SVG elements <switch> and <foreignObject> (with proper <requiredExtensions>) are used to embed a MathML formula with a text fallback, inside a diagram. HTML input element is used within the mtext to include an interactive input field inside a mathematical formula. See also 3.7 Semantics and Presentation for an example of SVG and HTML inside an annotation-xml element.

<svg style="font-size: 20px" width="400px" height="220px" viewBox="0 0 200 110">
  <g transform="translate(10,80)">
    <path d="M 0 0 L 150 0 A 75 75 0 0 0 0 0
             M 30 0 L 30 -60 M 30 -10 L 40 -10 L 40 0"
          fill="none" stroke="black"></path>
    <text transform="translate(10,20)">1</text>
    <switch transform="translate(35,-40)">
      <foreignObject width="200" height="50"
                     requiredExtensions="http://www.w3.org/1998/Math/MathML">
        <math>
          <msqrt>
            <mn>2</mn>
            <mi>r</mi>
            <mo></mo>
            <mn>1</mn>
          </msqrt>
        </math>
      </foreignObject>
      <text>\sqrt{2r - 1}</text>
    </switch>
  </g>
</svg>

<p>
  Fill the blank:
  <math>
    <msqrt>
      <mn>2</mn>
      <mtext><input onchange="..." size="2" type="text"></mtext>
      <mo></mo>
      <mn>1</mn>
    </msqrt>
    <mo>=</mo>
    <mn>3</mn>
  </math>
</p>
html-svg example

2.2.2 CSS styling

User agents must support various CSS features mentioned in this specification, including new ones described in 4. CSS Extensions for Math Layout. They must follow the computation rule for display: contents.

In this example, the MathML formula inherits the CSS color of its parent and uses the font-family specified via the style attribute.

<div style="width: 15em; color: blue">
  This mathematical formula with a big summation and the number pi
  <math display="block" style="font-family: STIX Two Math">
    <mrow>
      <munderover>
        <mo></mo>
        <mrow><mi>n</mi><mo>=</mo><mn>1</mn></mrow>
        <mrow><mo>+</mo><mn></mn></mrow>
      </munderover>
      <mfrac>
        <mn>1</mn>
        <msup><mi>n</mi><mn>2</mn></msup>
      </mfrac>
    </mrow>
    <mo>=</mo>
    <mfrac>
      <msup><mi>π</mi><mn>2</mn></msup>
      <mn>6</mn>
    </mfrac>
  </math>
  is easy to prove.
</div>
style example

All documents containing MathML Core elements must include CSS rules described in A. User Agent Stylesheet as part of user-agent level style sheet defaults. In particular, this adds !important rules to force writing mode to horizontal-lr on all MathML elements.

The float property does not create floating of elements whose parent's computed display value is block math or inline math, and does not take them out-of-flow.

The ::first-line and ::first-letter pseudo-elements do not apply to elements whose computed display value is block math or inline math, and such elements do not contribute a first formatted line or first letter to their ancestors.

The following CSS features are not supported and must be ignored:

  • Line breaking inside math formulas: white-space is treated as nowrap on all MathML elements.
  • Alignment properties: align-content, justify-content, align-self, justify-self have no effects on MathML elements.
Note
These features might be handled in future versions of this document. For now, authors are discouraged from setting a different value for these properties as that might lead to backward incompatibility issues.

2.2.3 DOM and JavaScript

User agents supporting Web application APIs must ensure that they keep the visual rendering of MathML synchronized with the [DOM] tree, in particular perform necessary updates when MathML attributes are modified dynamically.

All the nodes representing MathML elements in the DOM must implement, and expose to scripts, the following MathMLElement interface.

WebIDL[Exposed=Window]
interface MathMLElement : Element { };
MathMLElement includes GlobalEventHandlers;
MathMLElement includes HTMLOrForeignElement;

The GlobalEventHandlers and HTMLOrForeignElement interfaces are defined in [HTML].

In the following example, a MathML formula is used to render the fraction "α over 2". When clicking the red α, it is changed into a blue β.

<script>
  function ModifyMath(mi) {
      mi.style.color = 'blue';
      mi.textContent = 'β';
  }
</script>
<math>
  <mrow>
    <mfrac>
      <mi style="color: red" onclick="ModifyMath(this)">α</mi>
      <mn>2</mn>
    </mfrac>
  </mrow>
</math>
dom-idl example
Issue
Rename HTMLOrSVGElement and define MathMLElement in [HTML].

2.2.4 Text layout

Because math fonts generally contain very tall glyphs such as big integrals, using typographic metrics is important to avoid excessive line spacing of text. As a consequence, user agents must take into account the USE_TYPO_METRICS flag from the OS/2 table [OPEN-FONT-FORMAT] when performing text layout.

2.2.5 Focus

MathML provides the ability for authors to allow for interactivity in supporting interactive user agents using the same concepts, approach and guidance to Focus as described in HTML, with modifications or clarifications regarding application for MathML as described in this section.

When an element is focused, all applicable CSS focus-related pseudo-classes as defined in Selectors Level 3 apply, as defined in that specification.

The contents of embedded math elements (including HTML elements inside token elements) contribute to the sequential focus order of the containing owner HTML document (combined sequential focus order).

3. Presentation Markup

3.1 Visual formatting model

3.1.1 Box Model

The default display property is described in A. User Agent Stylesheet:

  • For the <math> root, it is equal to inline math or block math according to the value of the display attribute.
  • For Tabular MathML elements mtable, mtr, mtd it is respectively equal to inline-table, table-row and table-cell.
  • For all but the first children of the maction and semantics elements, it is equal to none.
  • For all the other MathML elements it is equal to block math.

In order to specify math layout in different writing modes, this specification uses concepts from [CSS-WRITING-MODES-4]:

Note
Unless specified otherwise, the figures in this specification use a writing mode of horizontal-lr and ltr. See Figure 4, Figure 5 and Figure 6 for examples of other writing modes that are sometimes used for math layout.

Boxes used for MathML elements rely on several parameters in order to perform layout in a way that is compatible with CSS but also to take into account very accurate positions and spacing within math formulas:

  1. Inline metrics. min-content inline size, max-content inline size and inline size from CSS. See Figure 1.
    Figure 1 Generic Box Model for MathML elements
  2. Block metrics. The block size, first baseline set and last baseline set. The following baselines are defined for MathML boxes:

    1. The alphabetic baseline which typically aligns with the bottom of uppercase Latin glyphs. The algebraic distance from the alphabetic baseline to the line-over edge of the box is called the line-ascent. The algebraic distance from the line-under edge to the alphabetic baseline of the box is called the line-descent.
    2. The mathematical baseline, also called math axis, which typically aligns with the fraction bar, middle of fences and binary operators. It is shifted away from the alphabetic baseline by AxisHeight towards the line-over.
    3. The ink-over baseline, indicating the line-over theorical limit of the math content drawn, excluding any extra space. If not specified, it is aligned with the line-over edge. The algebraic distance from the alphabetic baseline to the ink-over baseline is called the ink line-ascent.
    4. The ink-under baseline, indicating the line-under theorical limit of the math content drawn, excluding any extra space. If not specified, it is aligned with the line-under edge. The algebraic distance from the ink-under baseline to the alphabetic baseline is called the ink line-descent.
    Note
    For math layout, it is very important to rely on the ink extent when positioning text. This is not the case for more complex notations (e.g. square root). Although ink-ascent and ink-descent are defined for all MathML elements they are really only used for the token elements. In other cases, they just match normal ascent and descent.
    Unless specified otherwise, the last baseline set is equal to the first baseline set for MathML boxes.
  3. An optional italic correction which provides a measure of how much the text of a box is slanted along the inline axis. See Figure 2.
    Figure 2 Examples of italic correction for italic f and large integral
    If it is requested during calculation of min-content inline size and max-content inline size or during layout then 0 is used as a fallback value.
  4. An optional top accent attachment which provides a reference offset on the inline axis of a box that should be used when positioning that box as an accent. See Figure 3.
    Figure 3 Example of top accent attachment for a circumflex accent
    If it is requested during calculation of min-content inline size (respectively max-content inline size) then half the min-content inline size (respectively max-content inline size) is used as a fallback value. If it is requested during layout then half the inline size of the box is used as a fallback value.

Given a MathML box, the following offsets are defined:

  • The inline offset of a child box is the offset between the inline-start edge of the parent box and the inline-start edge of the child box.
  • The block offset of a child box is the offset between the block-start edge of the parent box and the block-start edge of the child box.
  • The line-left offset of a child box is the offset between the line-left edge of the parent box and the line-left edge of the child box.
Figure 4 Box model for writing mode horizontal-tb and rtl that may be used in e.g. Arabic math.
Figure 5 Box model for writing mode vertical-lr and ltr that may be used in e.g. Mongolian math.
Figure 6 Box model for writing mode vertical-rl and ltr that may be used in e.g. Japanese math.
Note
The position of child boxes and graphical items inside a MathML box are expressed using the inline offset and block offset. For convenience, the layout algorithms may describe offsets using flow-relative directions, line-relative directions or the alphabetic baseline. It is always possible to pass from one description to the other because position of child boxes is always performed after the metrics of the box and of its child boxes are calculated.

Here are examples of offsets obtained from line-relative metrics:

Issue 78: Ink ascent/descent opentype/texneeds-tests
Improve definition of ink ascent/descent?

3.1.2 Layout Algorithms

Each MathML element has an associated math content box, which is calculated as described in this chapter's layout algorithms using the following structure:

  1. Calculation of min-content inline size and max-content inline size of the math content.
  2. Box layout:
    1. Layout of in-flow child boxes.
    2. Calculation of inline size, ink line-ascent, ink line-descent, line-ascent and line-ascent of the math content.
    3. Calculation of offsets of child boxes within the math content box as well as sizes and offsets of extra graphical items (bars, radical symbol, etc).
    4. Layout and positioning of absolutely-positioned and fixed-positioned boxes, as described in [CSS-POSITION-3].

The following extra steps must be performed:

Note
Per the description above, margin-collapsing does not apply to MathML elements.

During box layout, optional inline stretch size constraint and block stretch size constraint parameters may be used on embellished operators. The former indicates a target size that a core operator stretched along the inline axis should cover. The latter indicates an ink line-ascent and ink line-descent that a core operator stretched along the block axis should cover. Unless specified otherwise, these parameters are ignored during box layout and child boxes are laid out without any stretch size constraint.

Issue 76: Define what inline percentages resolve against. css/html5need specification updateneeds-tests
Define what inline percentages resolve against
Issue 77: Define what block percentages resolve against. css/html5need specification updateneeds-tests
Define what block percentages resolve against

3.1.3 Anonymous <mrow> boxes

An anonymous box is a box without any associated element in the DOM tree and which is generated for layout purpose only. The properties of anonymous boxes are inherited from the enclosing non-anonymous box while non-inherited properties have their initial value. An anonymous <mrow> box is an anonymous box with display equal to block math and which is laid out as described in section 3.3.1.2 Layout of <mrow>.

If a MathML element generates an anonymous <mrow> box then it wraps its children in an anonymous <mrow> box. I.e., its subtree in the visual formatting model is made of an anonymous <mrow> box which itself contains the boxes associated to the children of this MathML element.

In the following example, the math and mrow elements are laid out as described in section 3.3.1.2 Layout of <mrow>. In particular, the <math> element adds proper spacing around its <mo>≠</mo> child and the <mrow> element stretches its <mo>|</mo> children vertically.

The mtd element has display: table-cell and the msqrt element displays a radical symbol around its children. However, they also place their children in a way that is similar to what is described in section 3.3.1.2 Layout of <mrow>: the <msqrt> element adds proper spacing around its <mo>+</mo> child while the <mtd> element stretches its <mo> children vertically. In order to make this possible, each of these two elements generates an anonymous <mrow> box.

<math>
  <mrow>
    <mo>|</mo>
    <mtable>
      <mtr>
        <mtd>
          <mi>x</mi>
        </mtd>
        <mtd>
          <mo>(</mo>
          <mfrac linethickness="0">
            <mn>5</mn>
            <mn>3</mn>
          </mfrac>
          <mo>)</mo>
        </mtd>
      </mtr>
      <mtr>
        <mtd>
          <msqrt>
            <mn>7</mn>
            <mo>+</mo>
            <mn>2</mn>
          </msqrt>
        </mtd>
        <mtd>
          <mi>y</mi>
        </mtd>
      </mtr>
    </mtable>
    <mo>|</mo>
  </mrow>
  <mo></mo>
  <mn>0</mn>
</math>
math example (display)

3.1.4 Stacking contexts

MathML elements can overlap due to various spacing rules. They can as well contain extra graphical items (bars, radical symbol, etc). A MathML element with computed style display: block math or display: inline math generates a new stacking context. The painting order of in-flow children of such a MathML element is exactly the same as block elements. The extra graphical items are painted after text and background (right after step 7.2.4 for display: inline math and right after step 7.2 for display: block math).

3.2 Token Elements

Token elements in presentation markup are broadly intended to represent the smallest units of mathematical notation which carry meaning. Tokens are roughly analogous to words in text. However, because of the precise, symbolic nature of mathematical notation, the various categories and properties of token elements figure prominently in MathML markup. By contrast, in textual data, individual words rarely need to be marked up or styled specially.

Note
In practice, most MathML token elements just contain simple text for variables, numbers, operators etc and don't need sophisticated layout. However, it can contain text with line breaks or arbitrary HTML5 phrasing elements.

3.2.1 Text <mtext>

The mtext element is used to represent arbitrary text that should be rendered as itself. In general, the <mtext> element is intended to denote commentary text.

The <mtext> element accepts the attributes described in 2.1.3 Global Attributes.

In the following example, mtext is used to put conditional words in a definition:

<math>
  <mi>y</mi>
  <mo>=</mo>
  <mrow>
    <msup>
      <mi>x</mi>
      <mn>2</mn>
    </msup>
    <mtext>&nbsp;if&nbsp;</mtext>
    <mrow>
      <mi>x</mi>
      <mo></mo>
      <mn>1</mn>
    </mrow>
    <mtext>&nbsp;and&nbsp;</mtext>
    <mn>2</mn>
    <mtext>&nbsp;otherwise.</mtext>
  </mrow>
</math>
mtext example
3.2.1.1 Layout of <mtext>

If the element does not have its computed display property equal to block math or inline math then it is laid out according to the CSS specification where the corresponding value is described. Otherwise, the layout below is performed.

If the <mtext> element contains only text content without forced line break or soft wrap opportunity then, the anonymous child node generated for that text is laid out as defined in the relevant CSS specification and:

Otherwise, the mtext element is laid out as a block box and corresponding min-content inline size, max-content inline size, inline size, block size, first baseline set and last baseline set are used for the math content box.

3.2.2 Identifier <mi>

The mi element represents a symbolic name or arbitrary text that should be rendered as an identifier. Identifiers can include variables, function names, and symbolic constants.

The <mi> element accepts the attributes described in 2.1.3 Global Attributes as well as the following attribute:

The layout algorithm is the same as the mtext element. The user agent stylesheet must contain the following property in order to implement automatic italic via the text-transform value introduced in 4.2 The math-auto transform:

mi {
  text-transform: math-auto;
}

The mathvariant attribute, if present, must be an ASCII case-insensitive match of normal. In that case, the user agent is expected to treat the attribute as a presentational hint setting the element's text-transform property to none. Otherwise it has no effects.

Note

In [MathML3], the mathvariant attribute was used to define logical classes of token elements, each class providing a collection of typographically-related symbolic tokens with specific meaning within a given mathematical expression.

In MathML Core, this attribute is only used to cancel automatic italic of the mi element. For other use cases, the proper Mathematical Alphanumeric Symbols [UNICODE] should be used instead. See also section C. Mathematical Alphanumeric Symbols.

In the following example, mi is used to render variables and function names. Note that per 4.2 The math-auto transform the default style text-transform: math-auto has no effect on the first <mi> ("cos" is made of three characters), makes the second <mi> render as math italic ("c" is made of a single character U+0063 Latin Small Letter C which is mapped to U+1D450 Mathematical Italic Small C per the italic table), has no effect on the third <mi> (overridden by mathvariant="normal", setting text-transform to none) or on the fourth <mi> (no mapping defined for U+221E Infinity in the italic table).

<math>
  <mi>cos</mi>
  <mo>,</mo>
  <mi>c</mi>
  <mo>,</mo>
  <mi mathvariant="normal">c</mi>
  <mo>,</mo>
  <mi></mi>
</math>
mi example

3.2.3 Number <mn>

The mn element represents a "numeric literal" or other data that should be rendered as a numeric literal. Generally speaking, a numeric literal is a sequence of digits, perhaps including a decimal point, representing an unsigned integer or real number.

The <mn> element accepts the attributes described in 2.1.3 Global Attributes. Its layout algorithm is the same as the mtext element.

In the following example, mn is used to write a decimal number.

<math>
  <mn>3.141592653589793</mn>
</math>
mn example

3.2.4 Operator, Fence, Separator or Accent <mo>

The mo element represents an operator or anything that should be rendered as an operator. In general, the notational conventions for mathematical operators are quite complicated, and therefore MathML provides a relatively sophisticated mechanism for specifying the rendering behavior of an <mo> element.

As a consequence, in MathML the list of things that should "render as an operator" includes a number of notations that are not mathematical operators in the ordinary sense. Besides ordinary operators with infix, prefix, or postfix forms, these include fence characters such as braces, parentheses, and "absolute value" bars; separators such as comma and semicolon; and mathematical accents such as a bar or tilde over a symbol. This chapter uses the term "operator" to refer to operators in this broad sense.

The <mo> element accepts the attributes described in 2.1.3 Global Attributes as well as the following attributes:

This specification does not define any observable behavior that is specific to the fence and separator attributes.

Note
Authors may use the fence and separator to describe specific semantics of operators. The default values may be determined from the Operators_fence and Operators_separator tables, or equivalently the human-readable version of the operator dictionary.

In the following example, the mo element is used for the binary operator +. Default spacing is symmetric around that operator. A tighter spacing is used if you rely on the form attribute to force it to be treated as a prefix operator. Spacing can also be specified explicitly using the lspace and rspace attributes.

<math>
  <mn>1</mn>
  <mo>+</mo>
  <mn>2</mn>
  <mo form="prefix">+</mo>
  <mn>3</mn>
  <mo lspace="2em">+</mo>
  <mn>4</mn>
  <mo rspace="3em">+</mo>
  <mn>5</mn>
</math>
mo example 1

Another use case is for big operators such as summation. When displaystyle is true, such an operator is drawn larger but one can change that with the largeop attribute. When displaystyle is false, underscripts are actually rendered as subscripts but one can change that with the movablelimits attribute.

<math>
  <mrow displaystyle="true">
  <munder>
    <mo></mo>
    <mn>5</mn>
  </munder>
  <munder>
    <mo largeop="false"></mo>
    <mn>6</mn>
  </munder>
  </mrow>
  <mrow>
    <munder>
      <mo></mo>
      <mn>5</mn>
    </munder>
    <munder>
      <mo movablelimits="false"></mo>
      <mn>7</mn>
    </munder>
  </mrow>
</math>
mo example 2

Operators are also used for stretchy symbols such as fences, accents, arrows etc. In the following example, the vertical arrow stretches to the height of the mspace element. One can override default stretch behavior with the stretchy attribute e.g. to force an unstretched arrow. The symmetric attribute allows to indicate whether the operator should stretch symmetrically above and below the math axis (fraction bar). Finally the minsize and maxsize attributes add additional constraints over the stretch size.

<math>
  <mfrac>
    <mspace height="50px" depth="50px" width="10px" style="background: blue"/>
    <mspace height="25px" depth="25px" width="10px" style="background: green"/>
  </mfrac>
  <mo></mo>
  <mo stretchy="false"></mo>
  <mo symmetric="true"></mo>
  <mo minsize="250px"></mo>
  <mo maxsize="50px"></mo>
</math>
mo example 3

Note that the default properties of operators are dictionary-based, as explained in 3.2.4.2 Dictionary-based attributes. For example a binary operator typically has default symmetric spacing around it while a fence is generally stretchy by default.

3.2.4.1 Embellished operators

A MathML Core element is an embellished operator if it is:

  1. An mo element;
  2. a scripted element or an mfrac, whose first in-flow child exists and is an embellished operator;
  3. a grouping element or mpadded, whose in-flow children consist (in any order) of one embellished operator and zero or more space-like elements.

The core operator of an embellished operator is the <mo> element defined recursively as follows:

  1. The core operator of an mo element; is the element itself.
  2. The core operator of an embellished scripted element or mfrac element is the core operator of its first in-flow child.
  3. The core operator of an embellished grouping element or mpadded is the core operator of its unique embellished operator in-flow child.

The stretch axis of an embellished operator is inline if its core operator contains only text content made of a single character c, and that character has inline intrinsic stretch axis. Otherwise, the stretch axis of the embellished operator is block.

The same definitions apply for boxes in the visual formatting model where an anonymous <mrow> box is treated as a grouping element.

3.2.4.2 Dictionary-based attributes

The form property of an embellished operator is either infix, prefix or postfix. The corresponding form attribute on the mo element, if present, must be an ASCII case-insensitive match to one of these values.

The algorithm for determining the form of an embellished operator is as follows:

  1. If the form attribute is present and valid on the core operator, then its ASCII lowercased value is used.
  2. If the embellished operator is the first in-flow child of a grouping element, mpadded or msqrt with more than one in-flow child (ignoring all space-like children) then it has form prefix.
  3. Or, if the embellished operator is the last in-flow child of a grouping element, mpadded or msqrt with more than one in-flow child (ignoring all space-like children) then it has form postfix.
  4. Or, if the embellished operator is an in-flow child of a scripted element, other than the first in-flow child, then it has form postfix.
  5. Otherwise, the embellished operator has form infix.

The stretchy, symmetric, largeop, movablelimits properties of an embellished operator are either false or true. In the latter case, it is said that the embellished operator has the property. The corresponding stretchy, symmetric, largeop, movablelimits attributes on the mo element, if present, must be a boolean.

The lspace, rspace, minsize properties of an embellished operator are <length-percentage>. The maxsize property of an embellished operator is either a <length-percentage> or ∞. The lspace, rspace, minsize and maxsize attributes on the mo element, if present, must be a <length-percentage>.

The algorithm for determining the properties of an embellished operator is as follows:

  1. If the corresponding stretchy, symmetric, largeop, movablelimits, lspace, rspace, maxsize or minsize attribute is present and valid on the core operator, then the ASCII lowercased value of this property is used.
  2. Otherwise, run the algorithm for determining the form of an embellished operator.
  3. If the core operator contains only text content Content, then set Category to the result of the algorithm to determine the category of an operator (Content, Form) where Form is the form calculated at the previous step.
  4. If Category is Default and the form of embellished operator was not explicitly specified as an attribute on its core operator:
    1. Set Category to the result of the algorithm to determine the category of an operator (Content, Form) where Form is infix.
    2. If Category is Default, then run the algorithm again with Form set to postfix.
    3. If Category is Default, then run the algorithm again with Form set to prefix.
  5. Run the algorithm to set the properties of an operator from its category Category.

When used during layout, the values of stretchy, symmetric, largeop, movablelimits, lspace, rspace, minsize are obtained by the algorithm for determining the properties of an embellished operator with the following extra resolutions:

  • Percentage values for lspace, rspace are interpreted relative to the value read from the dictionary or to the fallback value above.
  • Interpretation of percentage values for minsize and maxsize are described in 3.2.4.3 Layout of operators.
  • Font-relative lengths for lspace, rspace, minsize and maxsize rely on the font style of the core operator, not the one of the embellished operator.
3.2.4.3 Layout of operators

If the <mo> element does not have its computed display property equal to block math or inline math then it is laid out according to the CSS specification where the corresponding value is described. Otherwise, the layout below is performed.

The text of the operator must only be painted if the visibility of the <mo> element is visible. In that case, it must be painted with the color of the <mo> element.

Operators are laid out as follows:

  1. If the content of the <mo> element is not made of a single character c then fall back to the layout algorithm of 3.2.1.1 Layout of <mtext>.
  2. If the operator has the stretchy property:
  3. If the operator has the largeop property and if math-style on the <mo> element is normal, then:
    1. Use the MathVariants table to try and find a glyph of height at least DisplayOperatorMinHeight. If none is found, fall back to the largest non-base glyph. If none is found, fall back to the layout algorithm of 3.2.1.1 Layout of <mtext>.

    2. The min-content inline size, max-content inline size, inline size and block metrics of the math content are given by the glyph found.
    3. Paint the glyph.
    Figure 8 Base and displaystyle sizes of the summation symbol
  4. Otherwise fall back to the layout algorithm of 3.2.1.1 Layout of <mtext>.

If the algorithm to shape a stretchy glyph has been used for one of the step above, then the italic correction of the math content is set to the value returned by that algorithm.

3.2.5 Space <mspace>

The mspace empty element represents a blank space of any desired size, as set by its attributes.

The <mspace> element accepts the attributes described in 2.1.3 Global Attributes as well as the following attributes:

The width, height, depth, if present, must have a value that is a valid <length-percentage>.

  • If the width attribute is present, valid and not a percentage then that attribute is used as a presentational hint setting the element's width property to the corresponding value.
  • If the height attribute is absent, invalid or a percentage then the requested line-ascent is 0. Otherwise the requested line-ascent is the resolved value of the height attribute, clamping negative values to 0.
  • If both the height and depth attributes are present, valid and not a percentage then they are used as a presentational hint setting the element's height property to the concatenation of the strings "calc(", the height attribute value, " + ", the depth attribute value, and ")". If only one of these attributes is present, valid and not a percentage then it is treated as a presentational hint setting the element's height property to the corresponding value.

In the following example, mspace is used to force spacing within the formula (a 1px blue border is added to easily visualize the space):

<math>
  <mn>1</mn>
  <mspace width="1em"
          style="border-top: 1px solid blue"/> 
  <mfrac>
    <mrow>
      <mn>2</mn>
      <mspace depth="1em"
              style="border-left: 1px solid blue"/>
    </mrow>
    <mrow>
      <mn>3</mn>
      <mspace height="2em"
              style="border-left: 1px solid blue"/>
    </mrow>
  </mfrac>
</math>
mspace example

If the <mspace> element does not have its computed display property equal to block math or inline math then it is laid out according to the CSS specification where the corresponding value is described. Otherwise, the <mspace> element is laid out as shown on Figure 9. The min-content inline size, max-content inline size and inline size of the math content are equal to the resolved value of the width property. The block size of the math content is equal to the resolved value of the height property. The line-ascent of the math content is equal to the requested line-ascent determined above.

Figure 9 Box model for the <mspace> element
Note
The terminology height/depth comes from [MATHML3], itself inspired from [TEXBOOK].
3.2.5.1 Definition of space-like elements

A number of MathML presentation elements are "space-like" in the sense that they typically render as whitespace, and do not affect the mathematical meaning of the expressions in which they appear. As a consequence, these elements often function in somewhat exceptional ways in other MathML expressions.

A MathML Core element is a space-like element if it is:

  1. an mtext or mspace;
  2. or a grouping element or mpadded all of whose in-flow children are space-like.

The same definitions apply for boxes in the visual formatting model where an anonymous <mrow> box is treated as a grouping element.

Note
Note that an mphantom is not automatically defined to be space-like, unless its content is space-like. This is because operator spacing is affected by whether adjacent elements are space-like. Since the <mphantom> element is primarily intended as an aid in aligning expressions, operators adjacent to an <mphantom> should behave as if they were adjacent to the contents of the <mphantom>, rather than to an equivalently sized area of whitespace.

3.2.6 String Literal <ms>

ms element is used to represent "string literals" in expressions meant to be interpreted by computer algebra systems or other systems containing "programming languages".

The <ms> element accepts the attributes described in 2.1.3 Global Attributes. Its layout algorithm is the same as the mtext element.

In the following example, ms is used to write a literal string of characters:

<math>
  <mi>s</mi>
  <mo>=</mo>
  <ms>"hello world"</ms>
</math>
ms example
Note
In MathML3, it was possible to use the lquote and rquote attributes to respectively specify the strings to use as opening and closing quotes. These are no longer supported and the quotes must instead be specified as part of the text of the <ms> element. One can add CSS rules to legacy documents in order to preserve visual rendering. For example, in left-to-right direction:
ms:before, ms:after {
  content: "\0022";
}
ms[lquote]:before {
  content: attr(lquote);
}
ms[rquote]:after {
  content: attr(rquote);
}

3.3 General Layout Schemata

Besides tokens there are several families of MathML presentation elements. One family of elements deals with various "scripting" notations, such as subscript and superscript. Another family is concerned with matrices and tables. The remainder of the elements, discussed in this section, describe other basic notations such as fractions and radicals, or deal with general functions such as setting style properties and error handling.

3.3.1 Group Sub-Expressions <mrow>

The mrow element is used to group together any number of sub-expressions, usually consisting of one or more <mo> elements acting as "operators" on one or more other expressions that are their "operands".

In the following example, mrow is used to group a sum "1 + 2/3" as a fraction numerator (first child of mfrac) and to construct a fenced expression (first child of msup) that is raised to the power of 5. Note that mrow alone does not add visual fences around its grouped content, one has to explicitly specify them using the mo element.

Within the mrow elements, one can see that vertical alignment of children (according to the alphabetic baseline or the mathematical baseline) is properly performed, fences are vertically stretched and spacing around the binary + operator automatically calculated.

<math>
  <msup>
    <mrow>
      <mo>(</mo>
      <mfrac>
        <mrow>
          <mn>1</mn>
          <mo>+</mo>
          <mfrac>
            <mn>2</mn>
            <mn>3</mn>
          </mfrac>
        </mrow>
        <mn>4</mn>
      </mfrac>
      <mo>)</mo>
    </mrow>
    <mn>5</mn>
  </msup>
</math>
mrow example

The <mrow> element accepts the attributes described in 2.1.3 Global Attributes. An <mrow> element with in-flow children child1, child2, …, childN is laid out as shown on Figure 10. The child boxes are put in a row one after the other with all their alphabetic baselines aligned.

Figure 10 Box model for the <mrow> element
Note
Because the box model ensures alignment of alphabetic baselines, fraction bars or symmetric stretchy operators will also be aligned along the math axis in the typical case when AxisHeight is the same for all in-flow children.
3.3.1.1 Algorithm for stretching operators along the block axis
Figure 11 Symmetric and non-symmetric stretching of operators along the block axis

The algorithm for stretching operators along the block axis consists in the following steps:

  1. If there is a block stretch size constraint or an inline stretch size constraint then the element being laid out is an embellished operator. Lay out the one in-flow child that is an embellished operator with the same stretch size constraint and all the other in-flow children without any stretch size constraint and stop.
  2. Otherwise, split the list of in-flow children into a first list LToStretch containing embellished operators with a stretchy property and block stretch axis; and a second list LNotToStretch.
  3. Perform layout without any stretch size constraint on all the items of LNotToStretch. If LToStretch is empty then stop. If LNotToStretch is empty, perform layout with block stretch size constraint (0, 0) for all the items of LToStretch.
  4. Calculate the unconstrained target sizes Uascent and Udescent as respectively the maximum ink ascent and maximum ink descent of the margin boxes of in-flow children that have been laid out in the previous step.
  5. Lay out or relayout all the elements of LToStretch with block stretch size constraint (Uascent, Udescent).
3.3.1.2 Layout of <mrow>

If the box is not an anonymous <mrow> box and the associated element does not have its computed display property equal to block math or inline math then it is laid out according to the CSS specification where the corresponding value is described. Otherwise, the layout below is performed.

A child box is slanted if it is not an embellished operator and has nonzero italic correction.

Note
Large operators may have nonzero italic correction but that one is used when attaching scripts. More generally, all embellished operators are treated as non-slanted since the spacing around them is calculated as specified by lspace and rspace.

The min-content inline size (respectively max-content inline size) are calculated using the following algorithm:

  1. Set add-space to true if the box corresponds to a math element or is not an embellished operator; and to false otherwise.
  2. Set inline-offset to 0.
  3. Set previous-italic-correction to 0.
  4. For each in-flow child:
    1. If the child is not slanted, then increment inline-offset by previous-italic-correction.
    2. If the child is an embellished operator and add-space is true then increment inline-offset by its lspace property.
    3. Increment inline-offset by the min-content inline size (respectively max-content inline size) of the child's margin box.
    4. If the child is slanted then set previous-italic-correction to its italic correction. Otherwise set it to 0.
    5. If the child is an embellished operator and add-space is true then increment inline-offset by its rspace property.
  5. Increment inline-offset by previous-italic-correction.
  6. Return inline-offset.

The in-flow children are laid out using the algorithm for stretching operators along the block axis.

The inline size of the math content is calculated like the min-content inline size and max-content inline size of the math content, using the inline size of the in-flow children's margin boxes instead.

The ink line-ascent (respectively line-ascent) of the math content is the maximum of the ink line-ascents (respectively line-ascents) of all the in-flow children's margin boxes. Similarly, the ink line-descent (respectively line-descent) of the math content is the maximum of the ink line-descents (respectively ink line-ascents) of all the in-flow children's margin boxes.

The in-flow children are positioned using the following algorithm:

  1. Set add-space to true if the box corresponds to a math element or is not an embellished operator; and to false otherwise.
  2. Set inline-offset to 0.
  3. Set previous-italic-correction to 0.
  4. For each in-flow child:
    1. If the child is not slanted, then increment inline-offset by previous-italic-correction.
    2. If the child is an embellished operator and add-space is true then increment inline-offset by its lspace property.
    3. Set the inline offset of the child to inline-offset and its block offset such that the alphabetic baseline of the child is aligned with the alphabetic baseline.
    4. Increment inline-offset by the inline size of the child's margin box.
    5. If the child is slanted then set previous-italic-correction to its italic correction. Otherwise set it to 0.
    6. If the child is an embellished operator and add-space is true then increment inline-offset by its rspace property.

The italic correction of the math content is set to the italic correction of the last in-flow child, which is the final value of previous-italic-correction.

3.3.2 Fractions <mfrac>

The mfrac element is used for fractions. It can also be used to mark up fraction-like objects such as binomial coefficients and Legendre symbols.

If the <mfrac> element does not have its computed display property equal to block math or inline math then it is laid out according to the CSS specification where the corresponding value is described. Otherwise, the layout below is performed.

The <mfrac> element accepts the attributes described in 2.1.3 Global Attributes as well as the following attribute:

The linethickness attribute indicates the fraction line thickness to use for the fraction bar. If present, it must have a value that is a valid <length-percentage>. If the attribute is absent or has an invalid value, FractionRuleThickness is used as the default value. A percentage is interpreted relative to that default value. A negative value is interpreted as 0.

The following example contains four fractions with different linethickness values. The bars are always aligned with the middle of plus and minus signs. The numerator and denominator are horizontally centered. The fractions that are not in displaystyle use smaller gaps and font-size.

<math>
  <mn>0</mn>
  <mo>+</mo>
  <mfrac displaystyle="true">
    <mn>1</mn>
    <mn>2</mn>
  </mfrac>
  <mo></mo>
  <mfrac>
    <mn>1</mn>
    <mn>2</mn>
  </mfrac>
  <mo>+</mo>
  <mfrac linethickness="200%">
    <mn>1</mn>
    <mn>234</mn>
  </mfrac>
  <mo></mo>
  <mrow>
    <mo>(</mo>
    <mfrac linethickness="0">
      <mn>123</mn>
      <mn>4</mn>
    </mfrac>
    <mo>)</mo>
  </mrow>
</math>
mfrac example

The <mfrac> element sets displaystyle to false, or if it was already false increments scriptlevel by 1, within its children. It sets math-shift to compact within its second child. To avoid visual confusion between the fraction bar and another adjacent items (e.g. minus sign or another fraction's bar), a default 1-pixel space is added around the element. The user agent stylesheet must contain the following rules:

mfrac {
  padding-inline: 1px;
}
mfrac > * {
  math-depth: auto-add;
  math-style: compact;
}
mfrac > :nth-child(2) {
  math-shift: compact;
}

If the <mfrac> element has less or more than two in-flow children, its layout algorithm is the same as the mrow element. Otherwise, the first in-flow child is called numerator, the second in-flow child is called denominator and the layout algorithm is explained below.

Note
In practice, an <mfrac> element has two children that are in-flow. Hence the CSS rules basically perform scriptlevel, displaystyle and math-shift changes for the numerator and denominator.
3.3.2.1 Fraction with nonzero line thickness

If the fraction line thickness is nonzero, the <mfrac> element is laid out as shown on Figure 12. The fraction bar must only be painted if the visibility of the <mfrac> element is visible. In that case, the fraction bar must be painted with the color of the <mfrac> element.

Figure 12 Box model for the <mfrac> element

The min-content inline size (respectively max-content inline size) of content is the maximum between the min-content inline size (respectively max-content inline size) of the numerator's margin box and the min-content inline size (respectively max-content inline size) of the denominator's margin box.

If there is an inline stretch size constraint or a block stretch size constraint then the numerator is also laid out with the same stretch size constraint, otherwise it is laid out without any stretch size constraint. The denominator is always laid out without any stretch size constraint.

The inline size of the math content is the maximum between the inline size of the numerator's margin box and the inline size of the denominator's margin box.

NumeratorShift is the maximum between:

DenominatorShift is the maximum between:

The line-ascent of the math content is the maximum between:

The line-descent of the math content is the maximum between:

The inline offset of the numerator (respectively denominator) is half the inline size of the math content − half the inline size of the numerator's margin box (respectively denominator's margin box).

The alphabetic baseline of the numerator (respectively denominator) is shifted away from the alphabetic baseline by a distance of NumeratorShift (respectively DenominatorShift) towards the line-over (respectively line-under).

The math content box is placed within the content box so that their block-start edges are aligned and the middles of these edges are at the same position.

The inline size of the fraction bar is the inline size of the content box and its inline-start edge is the aligned with the one the content box. The center of the fraction bar is shifted away from the alphabetic baseline of the math content box by a distance of AxisHeight towards the line-over. Its block size is the fraction line thickness.

3.3.2.2 Fraction with zero line thickness

If the fraction line thickness is zero, the <mfrac> element is instead laid out as shown on Figure 13.

Figure 13 Box model for the <mfrac> element without bar

The min-content inline size, max-content inline size and inline size of the math content are calculated the same as in 3.3.2.1 Fraction with nonzero line thickness.

If there is an inline stretch size constraint or a block stretch size constraint then the numerator is also laid out with the same stretch size constraint and otherwise it is laid out without any stretch size constraint. The denominator is always laid out without any stretch size constraint.

If the math-style is compact then TopShift and BottomShift are respectively set to StackTopShiftUp and StackBottomShiftDown. Otherwise math-style is normal and they are respectively set to StackTopDisplayStyleShiftUp and StackBottomDisplayStyleShiftDown.

The Gap is defined to be (BottomShift − the ink line-ascent of the denominator's margin box) + (TopShift − the ink line-descent of the numerator's margin box). If math-style is compact then GapMin is StackGapMin, otherwise math-style is normal and it is StackDisplayStyleGapMin. If Δ = GapMinGap is positive then TopShift and BottomShift are respectively increased by Δ/2 and Δ − Δ/2.

The line-ascent of the math content is the maximum between:

The line-descent of the math content is the maximum between:

The inline offsets of the numerator and denominator are calculated the same as in 3.3.2.1 Fraction with nonzero line thickness.

The alphabetic baseline of the numerator (respectively denominator) is shifted away from the alphabetic baseline by a distance of TopShift (respectively − BottomShift) towards the line-over (respectively line-under).

The math content box is placed within the content box so that their block-start edges are aligned and the middles of these edges are at the same position.

3.3.3 Radicals <msqrt>, <mroot>

The radical elements construct an expression with a root symbol √ with a line over the content. The msqrt element is used for square roots, while the mroot element is used to draw radicals with indices, e.g. a cube root.

The <msqrt> and <mroot> elements accept the attributes described in 2.1.3 Global Attributes.

The following example contains a square root written with msqrt and a cube root written with mroot. Note that msqrt has several children and the square root applies to all of them. mroot has exactly two children: it is a root of index the second child (the number 3), applied to the first child (the square root). Also note these elements only change the font-size within the mroot index, but it is scaled down more than within the numerator and denumerator of the fraction.

<math>
  <mroot>
    <msqrt>
      <mfrac>
        <mn>1</mn>
        <mn>2</mn>
      </mfrac>
      <mo>+</mo>
      <mn>4</mn>
    </msqrt>
    <mn>3</mn>
  </mroot>
  <mo>+</mo>
  <mn>0</mn>
</math>
msqrt-mroot example

The <msqrt> and <mroot> elements sets math-shift to compact. The <mroot> element increments scriptlevel by 2, and sets displaystyle to "false" in all but its first child. The user agent stylesheet must contain the following rule in order to implement that behavior:

mroot > :not(:first-child) {
  math-depth: add(2);
  math-style: compact;
}
mroot, msqrt {
  math-shift: compact;
}

If the <msqrt> or <mroot> element do not have their computed display property equal to block math or inline math then they are laid out according to the CSS specification where the corresponding value is described. Otherwise, the layout below is performed.

If the <mroot> has less or more than two in-flow children, its layout algorithm is the same as the mrow element. Otherwise, the first in-flow child is called mroot base and the second in-flow child is called mroot index and its layout algorithm is explained below.

Note
In practice, an <mroot> element has two children that are in-flow. Hence the CSS rules basically perform scriptlevel and displaystyle changes for the index.

The <msqrt> element generates an anonymous <mrow> box called the msqrt base.

3.3.3.1 Radical symbol

The radical symbol must only be painted if the visibility of the <msqrt> or <mroot> element is visible. In that case, the radical symbol must be painted with the color of that element.

The radical glyph is the glyph obtained for the character U+221A SQUARE ROOT.

The radical gap is given by RadicalVerticalGap if the math-style is compact and RadicalDisplayStyleVerticalGap if the math-style is normal.

The radical target size for the stretchy radical glyph is the sum of RadicalRuleThickness, radical gap and the ink height of the base.

The box metrics of the radical glyph and painting of the surd are given by the algorithm to shape a stretchy glyph to block dimension the target size for the radical glyph.

3.3.3.2 Square root

The <msqrt> element is laid out as shown on Figure 14.

Figure 14 Box model for the <msqrt> element

The min-content inline size (respectively max-content inline size) of the math content is the sum of the preferred inline size of a glyph stretched along the block axis for the radical glyph and of the min-content inline size (respectively max-content inline size) of the msqrt base's margin box.

The inline size of the math content is the sum of the advance width of the box metrics of the radical glyph and of the inline size of the msqrt base's margin's box.

The line-ascent of the math content is the maximum between:

The line-descent of the math content is the maximum between:

The inline size of the overbar is the inline size of the msqrt base's margin's box. The inline offsets of the msqrt base and overbar are also the same and equal to the width of the box metrics of the radical glyph.

The alphabetic baseline of the msqrt base is aligned with the alphabetic baseline. The block size of the overbar is RadicalRuleThickness. Its vertical center is shifted away from the alphabetic baseline by a distance towards the line-over equal to the line-ascent of the math content, minus the RadicalExtraAscender, minus half the RadicalRuleThickness.

Finally, the painting of the surd is performed:

3.3.3.3 Root with index

The <mroot> element is laid out as shown on Figure 15. The mroot index is first ignored and the mroot base and radical glyph are laid out as shown on figure Figure 14 using the same algorithm as in 3.3.3.2 Square root in order to produce a margin box B (represented in green).

Figure 15 Box model for the <mroot> element

The min-content inline size (respectively max-content inline size) of the math content is the sum of max(0, RadicalKernBeforeDegree), the mroot index's min-content inline size (respectively max-content inline size) of the mroot index's margin box, max(−min-content inline size, RadicalKernAfterDegree) (respectively max(−max-content inline size of the mroot index's margin box, RadicalKernAfterDegree)) and of the min-content inline size (respectively max-content inline size) of B.

Using the same clamping, AdjustedRadicalKernBeforeDegree and AdjustedRadicalKernAfterDegree are respectively defined as max(0, RadicalKernBeforeDegree) and is max(−inline size of the index's margin box, RadicalKernAfterDegree).

The inline size of the math content is the sum of AdjustedRadicalKernBeforeDegree, the inline size of the index's margin box, AdjustedRadicalKernAfterDegree and of the inline size of B.

The line-ascent of the math content is the maximum between:

The line-descent of the math content is the maximum between:

The inline offset of the index is AdjustedRadicalKernBeforeDegree. The inline-offset of the mroot base is the same + the inline size of the index's margin box.

The alphabetic baseline of B is aligned with the alphabetic baseline. The alphabetic baseline of the index is shifted away from the line-under edge by a distance of RadicalDegreeBottomRaisePercent × the block size of B + the line-descent of the index's margin box.

Note
In general, the kerning before the root index is positive while the kerning after it is negative, which means that the root element will have some inline-start space and that the root index will overlap the surd.

3.3.4 Style Change <mstyle>

Historically, the mstyle element was introduced to make style changes that affect the rendering of its contents.

The <mstyle> element accepts the attributes described in 2.1.3 Global Attributes. Its layout algorithm is the same as the mrow element.

Note
<mstyle> is implemented for compatibility with full MathML. Authors whose only target is MathML Core are encouraged to use CSS for styling.

In the following example, mstyle is used to set the scriptlevel and displaystyle. Observe this is respectively affecting the font-size and placement of subscripts of their descendants. In MathML Core, one could just have used mrow elements instead.

<math>
  <munder>
    <mo movablelimits="true">*</mo>
    <mi>A</mi>
  </munder>
  <mstyle scriptlevel="1">
    <mstyle displaystyle="true">
      <munder>
        <mo movablelimits="true">*</mo>
        <mi>B</mi>
      </munder>
      <munder>
        <mo movablelimits="true">*</mo>
        <mi>C</mi>
      </munder>
    </mstyle>
    <munder>
      <mo movablelimits="true">*</mo>
      <mi>D</mi>
    </munder>
  </mstyle>
</math>
mstyle example

3.3.5 Error Message <merror>

The merror element displays its contents as an ”error message”. The intent of this element is to provide a standard way for programs that generate MathML from other input to report syntax errors in their input.

In the following example, merror is used to indicate a parsing error for some LaTeX-like input:

<math>
  <mfrac>
    <merror>
      <mtext>Syntax error: \frac{1}</mtext>
    </merror>
    <mn>3</mn>
  </mfrac>
</math>
merror example

The <merror> element accepts the attributes described in 2.1.3 Global Attributes. Its layout algorithm is the same as the mrow element. The user agent stylesheet must contain the following rule in order to visually highlight the error message:

merror {
  border: 1px solid red;
  background-color: lightYellow;
}

3.3.6 Adjust Space Around Content <mpadded>

The mpadded element renders the same as its in-flow child content, but with the size and relative positioning point of its content modified according to <mpadded>’s attributes.

The <mpadded> element accepts the attributes described in 2.1.3 Global Attributes as well as the following attributes:

The width, height, depth, lspace and voffset if present, must have a value that is a valid <length-percentage>.

In the following example, mpadded is used to tweak spacing around a fraction (a blue background is used to visualize it). Without attributes, it behaves like an mrow but the attributes allow to specify the size of the box (width, height, depth) and position of the fraction within that box (lspace and voffset).

<math>
  <mrow>
    <mn>1</mn>
    <mpadded style="background: lightblue;">
      <mfrac>
        <mn>23456</mn>
        <mn>78</mn>
      </mfrac>
    </mpadded>
    <mn>9</mn>
  </mrow>
  <mo>+</mo>
  <mrow>
    <mn>1</mn>
    <mpadded lspace="2em" voffset="-1em" height="1em" depth="3em" width="7em"
             style="background: lightblue;">
      <mfrac>
        <mn>23456</mn>
        <mn>78</mn>
      </mfrac>
    </mpadded>
    <mn>9</mn>
  </mrow>
</math>
mpadded example
3.3.6.1 Inner box and requested parameters

The mpadded element generates an anonymous <mrow> box called the mpadded inner box with parameters called inner inline size, inner line-ascent and inner line-descent.

The requested <mpadded> parameters are determined as follows:

  • The requested width is the resolved value of the width property. If the width attribute is present, valid and not a percentage then that attribute is used as a presentational hint setting the element's width property to the corresponding value.
  • If the height attribute is absent, invalid or a percentage then the requested height is the inner line-ascent. Otherwise the requested height is the resolved value of the height attribute, clamping negative values to 0.
  • If the depth attribute is absent, invalid or a percentage then the requested depth is the inner line-ascent. Otherwise the requested depth is the resolved value of the depth attribute, clamping negative values to 0.
  • If the lspace attribute is absent, invalid or a percentage then the requested lspace is 0. Otherwise the requested lspace is the resolved value of the lspace attribute, clamping negative values to 0.
  • If the voffset attribute is absent, invalid or a percentage then the requested voffset is 0. Otherwise the requested voffset is the resolved value of the voffset attribute.
    Note
    Negative voffset values are not clamped to 0.
3.3.6.2 Layout of <mpadded>

If the <mpadded> element does not have its computed display property equal to block math or inline math then it is laid out according to the CSS specification where the corresponding value is described. Otherwise, it is laid out as shown on Figure 16.

Figure 16 Box model for the <mpadded> element

The min-content inline size (respectively max-content inline size) of the math content is the requested width calculated in 3.3.6.1 Inner box and requested parameters but using the min-content inline size (respectively max-content inline size) of the mpadded inner box instead of the "inner inline size".

The inline size of the math content is the requested width calculated in 3.3.6.1 Inner box and requested parameters.

The line-ascent of the math content is the requested height. The line-descent of the math content is the requested depth.

The mpadded inner box is placed so that its alphabetic baseline is shifted away from the alphabetic baseline by the requested voffset towards the line-over.

3.3.7 Making Sub-Expressions Invisible <mphantom>

Historically, the mphantom element was introduced to render its content invisibly, but with the same metrics size and other dimensions, including alphabetic baseline position that its contents would have if they were rendered normally.

In the following example, mphantom is used to ensure alignment of corresponding parts of the numerator and denominator of a fraction:

<math>
  <mfrac>
    <mrow>
      <mi>x</mi>
      <mo>+</mo>
      <mi>y</mi>
      <mo>+</mo>
      <mi>z</mi>
    </mrow>
    <mrow>
      <mi>x</mi>
      <mphantom>
        <mo form="infix">+</mo>
        <mi>y</mi>
      </mphantom>
      <mo>+</mo>
      <mi>z</mi>
    </mrow>
  </mfrac>
</math>
mphantom example

The <mphantom> element accepts the attributes described in 2.1.3 Global Attributes. Its layout algorithm is the same as the mrow element. The user agent stylesheet must contain the following rule in order to hide the content:

mphantom {
  visibility: hidden;
}
Note
<mphantom> is implemented for compatibility with full MathML. Authors whose only target is MathML Core are encouraged to use CSS for styling.

3.4 Script and Limit Schemata

The elements described in this section position one or more scripts around a base. Attaching various kinds of scripts and embellishments to symbols is a very common notational device in mathematics. For purely visual layout, a single general-purpose element could suffice for positioning scripts and embellishments in any of the traditional script locations around a given base. However, in order to capture the abstract structure of common notation better, MathML provides several more specialized scripting elements.

In addition to sub-/superscript elements, MathML has overscript and underscript elements that place scripts above and below the base. These elements can be used to place limits on large operators, or for placing accents and lines above or below the base.

3.4.1 Subscripts and Superscripts <msub>, <msup>, <msubsup>

The msub, msup and msubsup elements are used to attach subscript and superscript to a MathML expression. They accept the attributes described in 2.1.3 Global Attributes.

The following example shows basic use of subscripts and superscripts. The font-size is automatically scaled down within the scripts.

<math>
  <msub>
    <mn>1</mn>
    <mn>2</mn>
  </msub>
  <mo>+</mo>
  <msup>
    <mn>3</mn>
    <mn>4</mn>
  </msup>
  <mo>+</mo>
  <msubsup>
    <mn>5</mn>
    <mn>6</mn>
    <mn>7</mn>
  </msubsup>
</math>
msub-msup-msubsup example

If the <msub>, <msup> or <msubsup> elements do not have their computed display property equal to block math or inline math then they are laid out according to the CSS specification where the corresponding value is described. Otherwise, the layout below is performed.

3.4.1.1 Children of <msub>, <msup>, <msubsup>

If the <msub> element has less or more than two in-flow children, its layout algorithm is the same as the mrow element. Otherwise, the first in-flow child is called the msub base, the second in-flow child is called the msub subscript and the layout algorithm is explained in 3.4.1.2 Base with subscript.

If the <msup> element has less or more than two in-flow children, its layout algorithm is the same as the mrow element. Otherwise, the first in-flow child is called the msup base, the second in-flow child is called the msup superscript and the layout algorithm is explained in 3.4.1.3 Base with superscript.

If the <msubsup> element has less or more than three in-flow children, its layout algorithm is the same as the mrow element. Otherwise, the first in-flow child is called the msubsup base, the second in-flow child is called the msubsup subscript, its third in-flow child is called the msubsup superscript and the layout algorithm is explained in 3.4.1.4 Base with subscript and superscript.

3.4.1.2 Base with subscript

The <msub> element is laid out as shown on Figure 17. LargeOpItalicCorrection is the italic correction of the msub base if it is an embellished operator with the largeop property and 0 otherwise.

Figure 17 Box model for the <msub> element

The min-content inline size (respectively max-content inline size) of the math content is the min-content inline size (respectively max-content inline size) of the msub base's margin boxLargeOpItalicCorrection + min-content inline size (respectively max-content inline size) of the msub subscript's margin box + SpaceAfterScript.

If there is an inline stretch size constraint or a block stretch size constraint then the msub base is also laid out with the same stretch size constraint and otherwise it is laid out without any stretch size constraint. The scripts are always laid out without any stretch size constraint.

The inline size of the math content is the inline size of the msub base's margin boxLargeOpItalicCorrection + the inline size of the msub subscript's margin box + SpaceAfterScript.

SubShift is the maximum between:

The line-ascent of the math content is the maximum between:

The line-descent of the math content is the maximum between:

The inline offset of the msub base is 0 and the inline offset of the msub subscript is the inline size of the msub base's margin boxLargeOpItalicCorrection.

The msub base is placed so that its alphabetic baseline matches the alphabetic baseline. The msub subscript is placed so that its alphabetic baseline is shifted away from the alphabetic baseline by SubShift towards the line-under.

3.4.1.3 Base with superscript

The <msup> element is laid out as shown on Figure 18. ItalicCorrection is the italic correction of the msup base if it is not an embellished operator with the largeop property and 0 otherwise.

Figure 18 Box model for the <msup> element

The min-content inline size (respectively max-content inline size) of the math content is the min-content inline size (respectively max-content inline size) of the msup base's margin box + ItalicCorrection + the min-content inline size (respectively max-content inline size) of the msup superscript's margin box + SpaceAfterScript.

If there is an inline stretch size constraint or a block stretch size constraint then the msup base is also laid out with the same stretch size constraint and otherwise it is laid out without any stretch size constraint. The scripts are always laid out without any stretch size constraint.

The inline size of the math content is the inline size of the msup base's margin box + ItalicCorrection + the inline size of the msup superscript's margin box + SpaceAfterScript.

SuperShift is the maximum between:

The line-ascent of the math content is the maximum between:

The line-descent of the math content is the maximum between:

The inline offset of the msup base is 0 and the inline offset of msup superscript is the inline size of the msup base's margin box + ItalicCorrection.

The msup base is placed so that its alphabetic baseline matches the alphabetic baseline. The msup superscript is placed so that its alphabetic baseline is shifted away from the alphabetic baseline by SuperShift towards the line-over.

3.4.1.4 Base with subscript and superscript

The <msubsup> element is laid out as shown on Figure 18. LargeOpItalicCorrection and SubShift are set as in 3.4.1.2 Base with subscript. ItalicCorrection and SuperShift are set as in 3.4.1.3 Base with superscript.

Figure 19 Box model for the <msubsup> element

The min-content inline size (respectively max-content inline size and inline size) of the math content is the maximum between the min-content inline size (respectively max-content inline size and inline size) of the math content calculated in 3.4.1.2 Base with subscript and 3.4.1.3 Base with superscript.

If there is an inline stretch size constraint or a block stretch size constraint then the msubsup base is also laid out with the same stretch size constraint and otherwise it is laid out without any stretch size constraint. The scripts are always laid out without any stretch size constraint.

If there is an inline stretch size constraint or a block stretch size constraint then the msubsup base is also laid out with the same stretch size constraint and otherwise it is laid out without any stretch size constraint. The scripts are always laid out without any stretch size constraint.

SubSuperGap is the gap between the two scripts along the block axis and is defined by (SubShift − the ink line-ascent of the msubsup subscript's margin box) + (SuperShift − the ink line-descent of the msubsup superscript's margin box). If SubSuperGap is not at least SubSuperscriptGapMin then the following steps are performed to ensure that the condition holds:

  1. Let Δ be SuperscriptBottomMaxWithSubscript − (SuperShift − the ink line-descent of the msubsup superscript's margin box). If Δ > 0 then set Δ to the minimum between Δ set SubSuperscriptGapMinSubSuperGap and increase SuperShift (and so SubSuperGap too) by Δ.
  2. Let Δ be SubSuperscriptGapMinSubSuperGap. If Δ > 0 then increase SubscriptShift (and so SubSuperGap too) by Δ.

The ink line-ascent (respectively line-ascent, ink line-descent, line-descent) of the math content is set to the maximum of the ink line-ascent (respectively line-ascent, ink line-descent, line-descent) of the math content calculated in 3.4.1.2 Base with subscript and 3.4.1.3 Base with superscript but using the adjusted values SubShift and SuperShift above.

The inline offset and block offset of the msubsup base and scripts are performed the same as described in 3.4.1.2 Base with subscript and 3.4.1.3 Base with superscript.

Note

Even when the msubsup subscript (respectively msubsup superscript) is an empty box, <msubsup> does not generally render the same as 3.4.1.3 Base with superscript (respectively 3.4.1.2 Base with subscript) because of the additional constraint on SubSuperGap. Moreover, positioning the empty msubsup subscript (respectively msubsup superscript) may also change the total size.

In order to keep the algorithm simple, no attempt is made to handle empty scripts in a special way.

3.4.2 Underscripts and Overscripts <munder>, <mover>, <munderover>

The munder, mover and munderover elements are used to attach accents or limits placed under or over a MathML expression.

The <munderover> element accepts the attribute described in 2.1.3 Global Attributes as well as the following attributes:

Similarly, the <mover> element (respectively <munder> element) accepts the attribute described in 2.1.3 Global Attributes as well as the accent attribute (respectively the accentunder attribute).

accent, accentunder attributes, if present, must have values that are booleans. If these attributes are absent or invalid, they are treated as equal to false. User agents must implement them as described in 3.4.4 Displaystyle, scriptlevel and math-shift in scripts.

The following example shows basic use of under- and overscripts. The font-size is automatically scaled down within the scripts, unless they are meant to be accents.

<math>
  <munder>
    <mn>1</mn>
    <mn>2</mn>
  </munder>
  <mo>+</mo>
  <mover>
    <mn>3</mn>
    <mn>4</mn>
  </mover>
  <mo>+</mo>
  <munderover>
    <mn>5</mn>
    <mn>6</mn>
    <mn>7</mn>
  </munderover>
  <mo>+</mo>
  <munderover accent="true">
    <mn>8</mn>
    <mn>9</mn>
    <mn>10</mn>
  </munderover>
  <mo>+</mo>
  <munderover accentunder="true">
    <mn>11</mn>
    <mn>12</mn>
    <mn>13</mn>
  </munderover>
</math>
munder-over-munderover example

If the <munder>, <mover> or <munderover> elements do not have their computed display property equal to block math or inline math then they are laid out according to the CSS specification where the corresponding value is described. Otherwise, the layout below is performed.

3.4.2.1 Children of <munder>, <mover>, <munderover>

If the <munder> element has less or more than two in-flow children, its layout algorithm is the same as the mrow element. Otherwise, the first in-flow child is called the munder base and the second in-flow child is called the munder underscript.

If the <mover> element has less or more than two in-flow children, its layout algorithm is the same as the mrow element. Otherwise, the first in-flow child is called the mover base and the second in-flow child is called the mover overscript.

If the <munderover> element has less or more than three in-flow children, its layout algorithm is the same as the mrow element. Otherwise, the first in-flow child is called the munderover base, the second in-flow child is called the munderover underscript and its third in-flow child is called the munderover overscript.

If the <munder>, <mover> or <munderover> elements have a computed math-style property equal to compact and their base is an embellished operator with the movablelimits property, then their layout algorithms are respectively the same as the ones described for <msub>, <msup> and <msubsup> in 3.4.1.2 Base with subscript, 3.4.1.3 Base with superscript and 3.4.1.4 Base with subscript and superscript.

Otherwise, the <munder>, <mover> and <munderover> layout algorithms are respectively described in 3.4.2.3 Base with underscript, 3.4.2.4 Base with overscript and 3.4.2.5 Base with underscript and overscript.

3.4.2.2 Algorithm for stretching operators along the inline axis

The algorithm for stretching operators along the inline axis is as follows.

  1. If there is an inline stretch size constraint or block stretch size constraint then the element being laid out is an embellished operator. Lay out the base with the same stretch size constraint.
  2. Split the list of in-flow children that have not been laid out yet into a first list LToStretch containing embellished operators with a stretchy property and inline stretch axis; and a second list LNotToStretch.
  3. Perform layout without any stretch size constraint on all the items of LNotToStretch. If LToStretch is empty then stop. If LNotToStretch is empty, perform layout with inline stretch size constraint 0 for all the items of LToStretch.
  4. Calculate the target size T to the maximum inline size of the margin boxes of child boxes that have been laid out in the previous step.
  5. Lay out or relayout all the elements of LToStretch with inline stretch size constraint T.
3.4.2.3 Base with underscript

The <munder> element is laid out as shown on Figure 20. LargeOpItalicCorrection is the italic correction of the munder base if it is an embellished operator with the largeop property and 0 otherwise.

Figure 20 Box model for the <munder> element

The min-content inline size (respectively max-content inline size) of the math content are calculated like the inline size of the math content below but replacing the inline sizes of the munder base's margin box and munder underscript's margin box with the min-content inline size (respectively max-content inline size) of the munder base's margin box and munder underscript's margin box.

The in-flow children are laid out using the algorithm for stretching operators along the inline axis.

The inline size of the math content is calculated by determining the absolute difference between:

If m is the minimum calculated in the second item above then the inline offset of the munder base is −m − half the inline size of the base's margin box. The inline offset of the munder underscript is −m − half the inline size of the munder underscript's margin box − half LargeOpItalicCorrection.

Parameters UnderShift and UnderExtraDescender are determined by considering three cases in the following order:

  1. The munder base is an embellished operator with the largeop property. UnderShift is the maximum of

    UnderExtraDescender is 0.

  2. The munder base is an embellished operator with the stretchy property and stretch axis inline. UnderShift is the maximum of:

    UnderExtraDescender is 0.
  3. Otherwise, UnderShift is equal to UnderbarVerticalGap if the accentunder attribute is not an ASCII case-insensitive match to true and to zero otherwise. UnderExtraAscender is UnderbarExtraDescender.

The line-ascent of the math content is the maximum between:

The line-descent of the math content is the maximum between:

The alphabetic baseline of the munder base is aligned with the alphabetic baseline. The alphabetic baseline of the munder underscript is shifted away from the alphabetic baseline and towards the line-under by a distance equal to the ink line-descent of the munder base's margin box + UnderShift.

The math content box is placed within the content box so that their block-start edges are aligned and the middles of these edges are at the same position.

3.4.2.4 Base with overscript

The <mover> element is laid out as shown on Figure 21. LargeOpItalicCorrection is the italic correction of the mover base if it is an embellished operator with the largeop property and 0 otherwise.

Figure 21 Box model for the <mover> element

The min-content inline size (respectively max-content inline size) of the math content are calculated like the inline size of the math content below but replacing the inline sizes of the mover base's margin box and mover overscript's margin box with the min-content inline size (respectively max-content inline size) of the mover base's margin box and mover overscript's margin box.

The in-flow children are laid out using the algorithm for stretching operators along the inline axis.

The TopAccentAttachment is the top accent attachment of the mover overscript or half the inline size of the mover overscript's margin box if it is undefined.

The inline size of the math content is calculated by applying the algorithm for stretching operators along the inline axis for layout and determining the absolute difference between:

If m is the minimum calculated in the second item above then the inline offset of the mover base is −m − half the inline size of the base's margin. The inline offset of the mover overscript is −m − half the inline size of the mover overscript's margin box + half LargeOpItalicCorrection.

Parameters OverShift and OverExtraDescender are determined by considering three cases in the following order:

  1. The mover base is an embellished operator with the largeop property. OverShift is the maximum of

    OverExtraAscender is 0.

  2. The mover base is an embellished operator with the stretchy property and stretch axis inline. OverShift is the maximum of:

    OverExtraDescender is 0.
  3. Otherwise, OverShift is equal to

    1. OverbarVerticalGap if the accent attribute is not an ASCII case-insensitive match to true.
    2. Or AccentBaseHeight minus the line-ascent of the mover base's margin box if this difference is nonnegative.
    3. Or 0 otherwise.

    OverExtraAscender is OverbarExtraAscender.

Note
For accent overscripts and bases with line-ascents that are at most AccentBaseHeight, the rule from [OPEN-FONT-FORMAT] [TEXBOOK] is actually to align the alphabetic baselines of the overscripts and of the bases. This assumes that accent glyphs are designed in such a way that their ink bottoms are more or less AccentBaseHeight above their alphabetic baselines. Hence, the previous rule will guarantee that all the overscript bottoms are aligned while still avoiding collision with the bases. However, MathML can have arbitrary accent overscripts, so a more general and simpler rule is provided above: Ensure that the bottom of overscript is at least AccentBaseHeight above the alphabetic baseline of the base.

The line-ascent of the math content is the maximum between:

The line-descent of the math content is the maximum between:

The alphabetic baseline of the mover base is aligned with the alphabetic baseline. The alphabetic baseline of the mover overscript is shifted away from the alphabetic baseline and towards the line-over by a distance equal to the ink line-ascent of the base + OverShift.

The math content box is placed within the content box so that their block-start edges are aligned and the middles of these edges are at the same position.

3.4.2.5 Base with underscript and overscript

The general layout of <munderover> is shown on Figure 22. The LargeOpItalicCorrection, UnderShift, UnderExtraDescender, OverShift, OverExtraDescender parameters are calculated the same as in 3.4.2.3 Base with underscript and 3.4.2.4 Base with overscript.

Figure 22 Box model for the <munderover> element

The min-content inline size, max-content inline size and inline size of the math content are calculated as an absolute difference between a maximum inline offset and minimum inline offset. These extrema are calculated by taking the extremum value of the corresponding extrema calculated in 3.4.2.3 Base with underscript and 3.4.2.4 Base with overscript. The inline offsets of the munderover base, munderover underscript and munderover overscript are calculated as in these sections but using the new minimum m (minimum of the corresponding minima).

Like in these sections, the in-flow children are laid out using the algorithm for stretching operators along the inline axis.

The line-ascent and line-descent of the math content are also calculated by taking the extremum value of the extrema calculated in 3.4.2.3 Base with underscript and 3.4.2.4 Base with overscript.

Finally, the alphabetic baselines of the munderover base, munderover underscript and munderover overscript are calculated as in sections 3.4.2.3 Base with underscript and 3.4.2.4 Base with overscript.

The math content box is placed within the content box so that their block-start edges are aligned and the middles of these edges are at the same position.

Note

When the underscript (respectively overscript) is an empty box, the base and overscript (respectively underscript) are laid out similarly to 3.4.2.4 Base with overscript (respectively 3.4.2.3 Base with underscript) but the position of the empty underscript (respectively overscript) may add extra space. In order to keep the algorithm simple, no attempt is made to handle empty scripts in a special way.

3.4.3 Prescripts and Tensor Indices <mmultiscripts>

Presubscripts and tensor notations are represented by the mmultiscripts element. The mprescripts element is used as a separator between the postscripts and prescripts. These two elements accept the attributes described in 2.1.3 Global Attributes.

The following example shows basic use of prescripts and postscripts, involving a mprescripts. Empty mrow elements are used at positions where no scripts are rendered. The font-size is automatically scaled down within the scripts.

<math>
  <mmultiscripts>
    <mn>1</mn>
    <mn>2</mn>
    <mn>3</mn>
    <mrow></mrow>
    <mn>5</mn>
    <mprescripts/>
    <mn>6</mn>
    <mrow></mrow>
    <mn>8</mn>
    <mn>9</mn>
  </mmultiscripts>
</math>
mmultiscripts example

If the <mmultiscripts> or <mprescripts> elements do not have their computed display property equal to block math or inline math then they are laid out according to the CSS specification where the corresponding value is described. Otherwise, the layout below is performed.

The <mprescripts> element is laid out as an mrow element.

A valid <mmultiscripts> element contains the following in-flow children:

  • A first in-flow child, called the mmultiscripts base, that is not an mprescripts element.
  • Followed by an even number of in-flow children called mmultiscripts postscripts, none of them being a mprescripts element. These scripts form a (possibly empty) list subscript, superscript, subscript, superscript, subscript, superscript, etc. Each consecutive couple of children subscript, superscript is called a subscript/superscript pair.
  • Optionally followed by an mprescripts element and an even number of in-flow children called mmultiscripts prescripts, none of them being a mprescripts element. These scripts form a (possibly empty) list of subscript/superscript pair.

If an <mmultiscripts> element is not valid then it is laid out the same as the mrow element. Otherwise the layout algorithm is performed as in 3.4.3.1 Base with prescripts and postscripts.

3.4.3.1 Base with prescripts and postscripts

The <mmultiscripts> element is laid out as shown on Figure 23. For each subscript/superscript pair of mmultiscripts postscripts, the ItalicCorrection LargeOpItalicCorrection are defined as in 3.4.1.2 Base with subscript and 3.4.1.3 Base with superscript.

Figure 23 Box model for the <mmultiscripts> element

The min-content inline size (respectively max-content inline size) of the math content is calculated the same as the inline size of the math content below, but replacing "inline size" with "min-content inline size" (respectively "max-content inline size") for the mmultiscripts base's margin box and scripts' margin boxes.

If there is an inline stretch size constraint or a block stretch size constraint the mmultiscripts base is also laid out with the same stretch size constraint. Otherwise it is laid out without any stretch size constraint. The other elements are always laid out without any stretch size constraint.

The inline size of the math content is calculated with the following algorithm:

  1. Set inline-offset to 0.
  2. For each subscript/superscript pair of mmultiscripts prescripts, increment inline-offset by SpaceAfterScript + the maximum of

  3. Increment inline-offset by the inline size of the mmultiscripts base's margin box and set inline-size to inline-offset.
  4. For each subscript/superscript pair of mmultiscripts postscripts, modify inline-size to be at least:

    Increment inline-offset to the maximum of:

    Increment inline-offset by SpaceAfterScript.

  5. Return inline-size.

SubShift (respectively SuperShift) is calculated by taking the maximum of all subshifts (respectively supershifts) of each subscript/superscript pair as described in 3.4.1.4 Base with subscript and superscript.

The line-ascent of the math content is calculated by taking the maximum of all the line-ascent of each subscript/superscript pair as described in 3.4.1.4 Base with subscript and superscript but using the SubShift and SuperShift values calculated above.

The line-descent of the math content is calculated by taking the maximum of all the line-descent of each subscript/superscript pair as described in 3.4.1.4 Base with subscript and superscript but using the SubShift and SuperShift values calculated above.

Finally, the placement of the in-flow children is performed using the following algorithm:

  1. Set inline-offset to 0.
  2. For each subscript/superscript pair of mmultiscripts prescripts:

    1. Increment inline-offset by SpaceAfterScript.
    2. Set pair-inline-size to the maximum of
    3. Place the subscript at inline-start position inline-offset + pair-inline-size − the inline size of the subscript's margin box.
    4. Place the superscript at inline-start position inline-offset + pair-inline-size − the inline size of the superscript's margin box.
    5. Place the subscript (respectively superscript) so its alphabetic baseline is shifted away from the alphabetic baseline by SubShift (respectively SuperShift) towards the line-under (respectively line-over).
    6. Increment inline-offset by pair-inline-size.
  3. Place the mmultiscripts base and <mprescripts> boxes at inline offsets inline-offset and with their alphabetic baselines aligned with the alphabetic baseline.
  4. For each subscript/superscript pair of mmultiscripts postscripts:

    1. Set pair-inline-size to the maximum of
    2. Place the subscript at inline-start position inline-offsetLargeOpItalicCorrection.
    3. Place the superscript at inline-start position inline-offset + ItalicCorrection.
    4. Place the subscript (superscript) so its alphabetic baseline is shifted away from the alphabetic baseline by SubShift (respectively SuperShift) towards the line-under (respectively line-over).
    5. Increment inline-offset by pair-inline-size.
    6. Increment inline-offset by SpaceAfterScript.
Note

An <mmultiscripts> with only one subscript/superscript pair of mmultiscripts postscripts is laid out the same as a <msubsup> with the same in-flow children. However, as noticed for <msubsup>, if additionally the subscript (respectively superscript) is an empty box then it is not necessarily laid out the same as an <msub> (respectively <msup>) element. In order to keep the algorithm simple, no attempt is made to handle empty scripts in a special way.

3.4.4 Displaystyle, scriptlevel and math-shift in scripts

For all scripted elements, the rule of thumb is to set displaystyle to false and to increment scriptlevel in all child elements but the first one. However, an mover (respectively munderover) element with an accent attribute that is an ASCII case-insensitive match to true does not increment scriptlevel within its second child (respectively third child). Similarly, mover and munderover elements with an accentunder attribute that is an ASCII case-insensitive match to true do not increment scriptlevel within their second child.

<mmultiscripts> sets math-shift to compact on its children at even position if they are before an mprescripts, and on those at odd position if they are after an mprescripts. The <msub> and <msubsup> elements set math-shift to compact on their second child. mover and munderover elements with an accent attribute that is an ASCII case-insensitive match to true also set math-shift to compact within their first child.

The A. User Agent Stylesheet must contain the following style in order to implement this behavior:

msub > :not(:first-child),
msup > :not(:first-child),
msubsup > :not(:first-child),
mmultiscripts > :not(:first-child),
munder > :not(:first-child),
mover > :not(:first-child),
munderover > :not(:first-child) {
  math-depth: add(1);
  math-style: compact;
}
munder[accentunder="true" i] > :nth-child(2),
mover[accent="true" i] > :nth-child(2),
munderover[accentunder="true" i] > :nth-child(2),
munderover[accent="true" i] > :nth-child(3) {
  font-size: inherit;
}
msub > :nth-child(2),
msubsup > :nth-child(2),
mmultiscripts > :nth-child(even),
mmultiscripts > mprescripts ~ :nth-child(odd),
mover[accent="true" i] > :first-child,
munderover[accent="true" i] > :first-child {
  math-shift: compact;
}
mmultiscripts > mprescripts ~ :nth-child(even) {
  math-shift: inherit;
}
Note
In practice, all the children of the MathML elements described in this section are in-flow and the <mprescripts> is empty. Hence the CSS rules essentially perform automatic displaystyle and scriptlevel changes for the scripts; and math-shift changes for subscripts and sometimes the base.

3.5 Tabular Math

Matrices, arrays and other table-like mathematical notation are marked up using mtable mtr mtd elements. These elements are similar to the table, tr and td elements of [HTML].

The following example shows how tabular layout allows to write a matrix. Note that it is vertically centered with the fraction bar and the middle of the equal sign.

<math>
  <mfrac>
    <mi>A</mi>
    <mn>2</mn>
  </mfrac>
  <mo>=</mo>
  <mrow>
    <mo>(</mo>
    <mtable>
      <mtr>
        <mtd><mn>1</mn></mtd>
        <mtd><mn>2</mn></mtd>
        <mtd><mn>3</mn></mtd>
      </mtr>
      <mtr>
        <mtd><mn>4</mn></mtd>
        <mtd><mn>5</mn></mtd>
        <mtd><mn>6</mn></mtd>
      </mtr>
      <mtr>
        <mtd><mn>7</mn></mtd>
        <mtd><mn>8</mn></mtd>
        <mtd><mn>9</mn></mtd>
      </mtr>
    </mtable>
    <mo>)</mo>
  </mrow>
</math>
tables example

3.5.1 Table or Matrix <mtable>

The mtable is laid out as an inline-table and sets displaystyle to false. The user agent stylesheet must contain the following rules in order to implement these properties:

mtable {
  display: inline-table;
  math-style: compact;
}

The mtable element is as a CSS table and the min-content inline size, max-content inline size, inline size, block size, first baseline set and last baseline set sets are determined accordingly. The center of the table is aligned with the math axis.

The <mtable> accepts the attributes described in 2.1.3 Global Attributes.

3.5.2 Row in Table or Matrix <mtr>

The mtr is laid out as table-row. The user agent stylesheet must contain the following rules in order to implement that behavior:

mtr {
  display: table-row;
}

The <mtr> accepts the attributes described in 2.1.3 Global Attributes.

3.5.3 Entry in Table or Matrix <mtd>

The mtd is laid out as a table-cell with content centered in the cell and a default padding. The user agent stylesheet must contain the following rules:

mtd {
  display: table-cell;
  /* Centering inside table cells should rely on box alignment properties.
     See https://github.com/w3c/mathml-core/issues/156 */
  text-align: center;
  padding: 0.5ex 0.4em;
}

The <mtd> accepts the attributes described in 2.1.3 Global Attributes as well as the following attributes:

The columnspan (respectively rowspan) attribute has the same syntax and semantics as the colspan (respectively rowspan) attribute on the <td> element from [HTML]. In particular, the parsing of these attributes is handled as described in the algorithm for processing rows, always reading "colspan" as "columnspan".

Note
The name of the column spanning attribute in [MathML3] and earlier versions is columnspan and is preserved for backward compatibility reasons.

The <mtd> element generates an anonymous <mrow> box.

3.6 Enlivening Expressions

Historically, the maction element provides a mechanism for binding actions to expressions.

The <maction> element accepts the attributes described in 2.1.3 Global Attributes as well as the following attributes:

This specification does not define any observable behavior that is specific to the actiontype and selection attributes.

The following example shows the "toggle" action type from [MathML3] where the renderer alternately displays the selected subexpression, starting from "one third" and cycling through them when there is a click on the selected subexpression ("one quarter", "one half", "one third", etc). This is not part of MathML Core but can be implemented using JavaScript and CSS polyfills. The default behavior is just to render the first child.

<math>
  <maction actiontype="toggle" selection="2">
    <mfrac>
      <mn>1</mn>
      <mn>2</mn>
    </mfrac>
    <mfrac>
      <mn>1</mn>
      <mn>3</mn>
    </mfrac>
    <mfrac>
      <mn>1</mn>
      <mn>4</mn>
    </mfrac>
  </maction>
</math>
maction example

The layout algorithm of the <maction> element is the same as the <mrow> element. The user agent stylesheet must contain the following rules in order to hide all but its first child element, which is the default behavior for the legacy actiontype values:

maction > :not(:first-child) {
  display: none;
}
Note
<maction> is implemented for compatibility with full MathML. Authors whose only target is MathML Core are encouraged to use other HTML, CSS and JavaScript mechanisms to implement custom actions. They may rely on maction attributes defined in [MathML3].

3.7 Semantics and Presentation

The semantics element is the container element that associates annotations with a MathML expression. Typically, the <semantics> element has as its first child element a MathML expression to be annotated while subsequent child elements represent text annotations within an annotation element, or more complex markup annotations within an annotation-xml element.

The following example shows how the fraction "one half" can be annotated with a textual annotation (LaTeX) or an XML annotation (content MathML), which are not intended to be rendered by the user agent. This fraction is also annotated with equivalent SVG and HTML markup.

<math>
  <semantics>
    <mfrac>
      <mn>1</mn>
      <mn>2</mn>
    </mfrac>
    <annotation encoding="application/x-tex">\frac{1}{2}</annotation>
    <annotation-xml encoding="application/mathml-content+xml">
      <apply>
        <divide/>
         <cn>1</cn>
         <cn>2</cn>
      </apply>
    </annotation-xml>
    <annotation-xml>
      <svg width="25" height="75" xmlns="http://www.w3.org/2000/svg">
        <path stroke-width="5.8743"
              d="m5.9157 27.415h6.601v-22.783l-7.1813 1.4402v-3.6805l7.1408
                 -1.4402h4.0406v26.464h6.601v3.4005h-17.203z"/>
        <path stroke="#000000" stroke-width="2.3409"
              d="m0.83496 39.228h23.327"/>
        <path stroke-width="5.8743"
              d="m8.696 70.638h14.102v3.4005h-18.963v-3.4005q2.3004-2.3804
                 6.2608-6.3813 3.9806-4.0206 5.0007-5.1808 1.9403-2.1803
                 2.7004-3.6805 0.78011-1.5202 0.78011-2.9804 0-2.3804
                 -1.6802-3.8806-1.6603-1.5002-4.3406-1.5002-1.9003 0-4.0206
                 0.6601-2.1003 0.6601-4.5007 2.0003v-4.0806q2.4404-0.98013
                 4.5607-1.4802 2.1203-0.50007 3.8806-0.50007 4.6407 0 7.401
                 2.3203 2.7604 2.3203 2.7604 6.2009 0 1.8403-0.7001 3.5006
                 -0.68013 1.6402-2.5004 3.8806-0.50007 0.58009-3.1805 3.3605
                 -2.6804 2.7604-7.5614 7.7412z"/>
      </svg>
    </annotation-xml>
    <annotation-xml encoding="application/xhtml+xml">
      <div style="display: inline-flex;
                  flex-direction: column; align-items: center;">
        <div>1</div>
        <div></div>
        <div>2</div>
      </div>
    </annotation-xml>
  </semantics>
</math>
semantics example

The <semantics> element accepts the attributes described in 2.1.3 Global Attributes. Its layout algorithm is the same as the mrow element. The user agent stylesheet must contain the following rule in order to only render the annotated MathML expression:

semantics > :not(:first-child) {
  display: none;
}

The <annotation-xml> and <annotation> element accepts the attributes described in 2.1.3 Global Attributes as well as the following attribute:

This specification does not define any observable behavior that is specific to the encoding attribute.

The layout algorithm of the <annotation-xml> and <annotation> element is the same as the mtext element.

Note
Authors can use the encoding attribute to distinguish annotations for HTML integration point, clipboard copy, alternative rendering, etc. In particular, CSS can be used to render alternative annotations, e.g.
/* Hide the annotated child. */
semantics > :first-child { display: none; }
 /* Show all text annotations. */
semantics > annotation { display: inline; }
/* Show all HTML annotations. */
semantics > annotation-xml[encoding="text/html" i],
semantics > annotation-xml[encoding="application/xhtml+xml" i] {
  display: inline-block;
}

4. CSS Extensions for Math Layout

4.1 The display: block math and display: inline math value

The display property from CSS Display Module Level 3 is extended with a new inner display type:

Name: display
New values: <display-outside> || [ <display-inside> | math ]

For elements that are not MathML elements, if the specified value of display is block math or inline math then the computed value is block flow and inline flow respectively. For the mtable element the computed value is block table and inline table respectively. For the mtr element, the computed value is table-row. For the mtd element, the computed value is table-cell.

MathML elements with a computed display value equal to block math or inline math control box generation and layout according to their tag name, as described in the relevant sections. Unknown MathML elements behave the same as the mrow element.

Note
The display: block math and display: inline math values provide a default layout for MathML elements while at the same time allowing to override it with either native display values or custom values. This allows authors or polyfills to define their own custom notations to tweak or extend MathML Core.

In the following example, the default layout of the MathML mrow element is overridden to render its content as a grid.

<math>
  <msup>
    <mrow>
      <mo symmetric="false">[</mo>
      <mrow style="display: block; width: 4.5em;">
        <mrow style="display: grid;
                     grid-template-columns: 1.5em 1.5em 1.5em;
                     grid-template-rows: 1.5em 1.5em;
                     justify-items: center;
                     align-items: center;">
          <mn>12</mn>
          <mn>34</mn>
          <mn>56</mn>
          <mn>7</mn>
          <mn>8</mn>
          <mn>9</mn>
        </mrow>
      </mrow>
      <mo symmetric="false">]</mo>
    </mrow>
    <mi>α</mi>
  </msup>
</math>
display example

4.2 The math-auto transform

The text-transform property from CSS Text Module Level 4 has a new value math-auto. On text nodes containing a single character, if the computed value is math-auto and the character is present in the "Original" column of C.1 italic mappings then it is converted to the corresponding character from the "italic" column.

A common style convention is to render identifiers with multiple letters (e.g. the function name "exp") with normal style and identifiers with a single letter (e.g. the variable "n") with italic style. The math-auto property is intended to implement this default behavior, which can be overridden by authors if necessary. Note that mathematical fonts are designed with a special kind of italic glyphs located at the Unicode positions of C.1 italic mappings, which differ from the shaping obtained via italic font style. Compare this mathematical formula rendered with the Latin Modern Math font using font-style: italic (left) and text-transform: math-auto (right):

font-style: italic VS text-transform: math-auto

4.3 The math-style property

Name: math-style
Value: normal | compact
Initial: normal
Applies to: All elements
Inherited: yes
Percentages:n/a
Computed value: specified keyword
Canonical order: n/a
Animation type: not animatable
Media: visual

When math-style is compact, the math layout on descendants tries to minimize the logical height by applying the following rules:

The following example shows a mathematical formula rendered with its math root styled with math-style: compact (left) and math-style: normal (right). In the former case, the font-size is automatically scaled down within the fractions and the summation limits are rendered as subscript and superscript of the ∑. In the latter case, the ∑ is drawn bigger than normal text and vertical gaps within fractions (even relative to current font-size) are larger.

math-style example

These two math-style values typically correspond to mathematical expressions in inline and display mode respectively [TeXBook]. A mathematical formula in display mode may automatically switch to inline mode within some subformulas (e.g. scripts, matrix elements, numerators and denominators, etc) and it is sometimes desirable to override this default behavior. The math-style property allows to easily implement these features for MathML in the user agent stylesheet and with the displaystyle attribute; and also exposes them to polyfills.

4.4 The math-shift property

Name: math-shift
Value: normal | compact
Initial: normal
Applies to: All elements
Inherited: yes
Percentages:n/a
Computed value: specified keyword
Canonical order: n/a
Animation type: not animatable
Media: visual

If the value of math-shift is compact, the math layout on descendants will use the superscriptShiftUpCramped parameter to place superscript. If the value of math-shift is normal, the math will use the superscriptShiftUp parameter instead.

This property is used for positioning superscript during the layout of MathML scripted elements. See § 3.4.1 Subscripts and Superscripts <msub>, <msup>, <msubsup>, 3.4.3 Prescripts and Tensor Indices <mmultiscripts> and 3.4.2 Underscripts and Overscripts <munder>, <mover>, <munderover>.

In the following example, the two "x squared" are rendered with compact math-style and the same font-size. However, the one within the square root is rendered with compact math-shift while the other one is rendered with normal math-shift, leading to subtle different shift of the superscript "2".

math-shift example

Per [TeXBook], a mathematical formula uses normal style by default but may switch to compact style ("cramped" in TeX's terminology) within some subformulas (e.g. radicals, fraction denominators, etc). The math-shift property allows to easily implement these rules for MathML in the user agent stylesheet. Page authors or developers of polyfills may also benefit from having access to this property to tweak or refine the default implementation.

4.5 The math-depth property

A new math-depth property is introduced to describe a notion of "depth" for each element of a mathematical formula, with respect to the top-level container of that formula. Concretely, this is used to determine the computed value of the font-size property when its specified value is math.

Name: math-depth
Value: auto-add | add(<integer>) | <integer>
Initial: 0
Applies to: All elements
Inherited: yes
Percentages:n/a
Computed value: an integer, see below
Canonical order: n/a
Animation type: not animatable
Media: visual

The computed value of the math-depth value is determined as follows:

If the specified value of font-size is math then the computed value of font-size is obtained by multiplying the inherited value of font-size by a nonzero scale factor calculated by the following procedure:

  1. Let A be the inherited math-depth value, B the computed math-depth value, C be 0.71 and S be 1.0
    • If A = B then return S.
    • If B < A, swap A and B and set InvertScaleFactor to true.
    • Otherwise B > A and set InvertScaleFactor to false.
  2. Let E be B - A > 0.
  3. If the inherited first available font has an OpenType MATH table:
  4. Multiply S by CE.
  5. Return S if InvertScaleFactor is false and 1/S otherwise.

The following example shows a mathematical formula with normal math-style rendered with the Latin Modern Math font. When entering subexpressions like scripts or fractions, the font-size is automatically scaled down according to the values of MATH table contained in that font. Note that font-size is scaled down when entering the superscripts but even faster when entering a root's prescript. Also it is scaled down when entering the inner fraction but not when entering the outer one, due to automatic change of math-style in fractions.

font-size-scriptlevel example

These rules from [TeXBook] are subtle and it's worth having a separate math-depth mechanism to express and handle them. They can be implemented in MathML using the user agent stylesheet. Page authors or developers of polyfills may also benefit from having access to this property to tweak or refine the default implementation. In particular, the scriptlevel attribute from MathML provides a way to perform math-depth changes.

5. OpenType MATH table

This chapter describes features provided by MATH table of an OpenType font [OPEN-FONT-FORMAT]. Throughout this chapter, a C-like notation Table.Subtable1[index].Subtable2.Parameter is used to denote OpenType parameters. Such parameters may not be available (e.g. if the font lacks one of the subtable, has an invalid offset, etc) and so fallback options are provided.

Note
It is strongly encouraged to render MathML with a math font with the proper OpenType features. There is no guarantee that the fallback options provided will provide good enough rendering.

OpenType values expressed in design units (perhaps indirectly via a MathValueRecord entry) are scaled to appropriate values for layout purpose, taking into account head.unitsPerEm, CSS font-size or zoom level.

5.1 Layout constants (MathConstants)

These are global layout constants for the first available font:

Default fallback constant
0
Default rule thickness
post.underlineThickness or Default fallback constant if the constant is not available.
scriptPercentScaleDown
MATH.MathConstants.scriptPercentScaleDown / 100 or 0.71 if MATH.MathConstants.scriptPercentScaleDown is null or not available.
scriptScriptPercentScaleDown
MATH.MathConstants.scriptScriptPercentScaleDown / 100 or 0.5041 if MATH.MathConstants.scriptScriptPercentScaleDown is null or not available.
displayOperatorMinHeight
MATH.MathConstants.displayOperatorMinHeight or Default fallback constant if the constant is not available.
axisHeight
MATH.MathConstants.axisHeight or half OS/2.sxHeight if the constant is not available.
accentBaseHeight
MATH.MathConstants.accentBaseHeight or OS/2.sxHeight if the constant is not available.
subscriptShiftDown
MATH.MathConstants.subscriptShiftDown or OS/2.ySubscriptYOffset if the constant is not available.
subscriptTopMax
MATH.MathConstants.subscriptTopMax or ⅘ × OS/2.sxHeight if the constant is not available.
subscriptBaselineDropMin
MATH.MathConstants.subscriptBaselineDropMin or Default fallback constant if the constant is not available.
superscriptShiftUp
MATH.MathConstants.superscriptShiftUp or OS/2.ySuperscriptYOffset if the constant is not available.
superscriptShiftUpCramped
MATH.MathConstants.superscriptShiftUpCramped or Default fallback constant if the constant is not available.
superscriptBottomMin
MATH.MathConstants.superscriptBottomMin or ¼ × OS/2.sxHeight if the constant is not available.
superscriptBaselineDropMax
MATH.MathConstants.superscriptBaselineDropMax or Default fallback constant if the constant is not available.
subSuperscriptGapMin
MATH.MathConstants.subSuperscriptGapMin or 4 × default rule thickness if the constant is not available.
superscriptBottomMaxWithSubscript
MATH.MathConstants.superscriptBottomMaxWithSubscript or ⅘ × OS/2.sxHeight if the constant is not available.
spaceAfterScript
MATH.MathConstants.spaceAfterScript or 1/24em if the constant is not available.
upperLimitGapMin
MATH.MathConstants.upperLimitGapMin or Default fallback constant if the constant is not available.
upperLimitBaselineRiseMin
MATH.MathConstants.upperLimitBaselineRiseMin or Default fallback constant if the constant is not available.
lowerLimitGapMin
MATH.MathConstants.lowerLimitGapMin or Default fallback constant if the constant is not available.
lowerLimitBaselineDropMin
MATH.MathConstants.lowerLimitBaselineDropMin or Default fallback constant if the constant is not available.
stackTopShiftUp
MATH.MathConstants.stackTopShiftUp or Default fallback constant if the constant is not available.
stackTopDisplayStyleShiftUp
MATH.MathConstants.stackTopDisplayStyleShiftUp or Default fallback constant if the constant is not available.
stackBottomShiftDown
MATH.MathConstants.stackBottomShiftDown or Default fallback constant if the constant is not available.
stackBottomDisplayStyleShiftDown
MATH.MathConstants.stackBottomDisplayStyleShiftDown or Default fallback constant if the constant is not available.
stackGapMin
MATH.MathConstants.stackGapMin or 3 × default rule thickness if the constant is not available.
stackDisplayStyleGapMin
MATH.MathConstants.stackDisplayStyleGapMin or 7 × default rule thickness if the constant is not available.
stretchStackTopShiftUp
MATH.MathConstants.stretchStackTopShiftUp or Default fallback constant if the constant is not available.
stretchStackBottomShiftDown
MATH.MathConstants.stretchStackBottomShiftDown or Default fallback constant if the constant is not available.
stretchStackGapAboveMin
MATH.MathConstants.stretchStackGapAboveMin or Default fallback constant if the constant is not available.
stretchStackGapBelowMin
MATH.MathConstants.stretchStackGapBelowMin or Default fallback constant if the constant is not available.
fractionNumeratorShiftUp
MATH.MathConstants.fractionNumeratorShiftUp or Default fallback constant if the constant is not available.
fractionNumeratorDisplayStyleShiftUp
MATH.MathConstants.fractionNumeratorDisplayStyleShiftUp or Default fallback constant if the constant is not available.
fractionDenominatorShiftDown
MATH.MathConstants.fractionDenominatorShiftDown or Default fallback constant if the constant is not available.
fractionDenominatorDisplayStyleShiftDown
MATH.MathConstants.fractionDenominatorDisplayStyleShiftDown or Default fallback constant if the constant is not available.
fractionNumeratorGapMin
MATH.MathConstants.fractionNumeratorGapMin or default rule thickness if the constant is not available.
fractionNumDisplayStyleGapMin
MATH.MathConstants.fractionNumDisplayStyleGapMin or 3 × default rule thickness if the constant is not available.
fractionRuleThickness
MATH.MathConstants.fractionRuleThickness or default rule thickness if the constant is not available.
fractionDenominatorGapMin
MATH.MathConstants.fractionDenominatorGapMin or default rule thickness if the constant is not available.
fractionDenomDisplayStyleGapMin
MATH.MathConstants.fractionDenomDisplayStyleGapMin or 3 × default rule thickness if the constant is not available.
overbarVerticalGap
MATH.MathConstants.overbarVerticalGap or 3 × default rule thickness if the constant is not available.
overbarExtraAscender
MATH.MathConstants.overbarExtraAscender or default rule thickness if the constant is not available.
underbarVerticalGap
MATH.MathConstants.underbarVerticalGap or 3 × default rule thickness if the constant is not available.
underbarExtraDescender
MATH.MathConstants.underbarExtraDescender or default rule thickness if the constant is not available.
radicalVerticalGap
MATH.MathConstants.radicalVerticalGap or 1¼ × default rule thickness if the constant is not available.
radicalDisplayStyleVerticalGap
MATH.MathConstants.radicalDisplayStyleVerticalGap or default rule thickness + ¼ OS/2.sxHeight if the constant is not available.
radicalRuleThickness
MATH.MathConstants.radicalRuleThickness or default rule thickness if the constant is not available.
radicalExtraAscender
MATH.MathConstants.radicalExtraAscender or default rule thickness if the constant is not available.
radicalKernBeforeDegree
MATH.MathConstants.radicalKernBeforeDegree or 5/18em if the constant is not available.
radicalKernAfterDegree
MATH.MathConstants.radicalKernAfterDegree or −10/18em if the constant is not available.
radicalDegreeBottomRaisePercent
MATH.MathConstants.radicalDegreeBottomRaisePercent / 100.0 or 0.6 if the constant is not available.

5.2 Glyph information (MathGlyphInfo)

Note
MathTopAccentAttachment is at risk.

These are per-glyph tables for the first available font:

MathItalicsCorrectionInfo
The subtable MATH.MathGlyphInfo.MathItalicsCorrectionInfo of italics correction values. Use the corresponding value in MATH.MathGlyphInfo.MathItalicsCorrectionInfo.italicsCorrection if there is one for the requested glyph or 0 otherwise.
MathTopAccentAttachment
The subtable MATH.MathGlyphInfo.MathTopAccentAttachment of positioning top math accents along the inline axis. Use the corresponding value in MATH.MathGlyphInfo.MathTopAccentAttachment.topAccentAttachment if there is one for the requested glyph or half the advance width of the glyph otherwise.

5.3 Size variants for operators (MathVariants)

This section describes how to handle stretchy glyphs of arbitrary size using the MATH.MathVariants table.

5.3.1 The GlyphAssembly table

This section is based on [OPEN-TYPE-MATH-IN-HARFBUZZ]. For convenience, the following definitions are used:

  • omin is MATH.MathVariant.minConnectorOverlap.
  • A GlyphPartRecord is an extender if and only if GlyphPartRecord.partFlags has the fExtender flag set.
  • A GlyphAssembly is horizontal if it is obtained from MathVariant.horizGlyphConstructionOffsets. Otherwise it is vertical (and obtained from MathVariant.vertGlyphConstructionOffsets).
  • For a given GlyphAssembly table, NExt (respectively NNonExt) is the number of extenders (respectively non-extenders) in GlyphAssembly.partRecords.
  • For a given GlyphAssembly table, SExt (respectively SNonExt) is the sum of GlyphPartRecord.fullAdvance for all extenders (respectively non-extenders) in GlyphAssembly.partRecords.
  • SExt,NonOverlapping = SExtomin NExt is the sum of maximum non overlapping parts of extenders.

User agents must treat the GlyphAssembly as invalid if the following conditions are not satisfied:

  • NExt > 0. Otherwise, the assembly cannot be grown by repeating extenders.
  • SExt,NonOverlapping > 0. Otherwise, the assembly does not grow when joining extenders.
  • For each GlyphPartRecord in GlyphAssembly.partRecords, the values of GlyphPartRecord.startConnectorLength and GlyphPartRecord.endConnectorLength must be at least omin. Otherwise, it is not possible to satisfy the condition of MathVariant.minConnectorOverlap.

In this specification, a glyph assembly is built by repeating each extender r times and using the same overlap value o between each glyph. The number of glyphs in such an assembly is AssemblyGlyphCount(r) = NNonExt + r NExt while the stretch size is AssembySize(o, r) = SNonExt + r SExt − o (AssemblyGlyphCount(r) − 1).

rmin is the minimal number of repetitions needed to obtain an assembly of size at least T, i.e. the minimal r such that AssembySize(omin, r) ≥ T. It is defined as the maximum between 0 and the ceiling of ((T − SNonExt + omin (NNonExt − 1)) / SExt,NonOverlapping).

omax,theorical = (AssembySize(0, rmin) − T) / (AssemblyGlyphCount(rmin) − 1) is the theorical overlap obtained by splitting evenly the extra size of an assembly built with null overlap.

omax is the maximum overlap possible to build an assembly of size at least T by repeating each extender rmin times. If AssemblyGlyphCount(rmin) ≤ 1, then the actual overlap value is irrelevant. Otherwise, omax is defined to be the minimum of:

  • omax,theorical.
  • GlyphPartRecord.startConnectorLength for all the entries in GlyphAssembly.partRecords, excluding the last one if it is not an extender.
  • GlyphPartRecord.endConnectorLength for all the entries in GlyphAssembly.partRecords, excluding the first one if it is not an extender.

The glyph assembly stretch size for a target size T is AssembySize(omax, rmin).

The glyph assembly width, glyph assembly ascent and glyph assembly descent are defined as follows:

  • If GlyphAssembly is vertical, the width is the maximum advance width of the glyphs of ID GlyphPartRecord.glyphID for all the GlyphPartRecord in GlyphAssembly.partRecords, the ascent is the glyph assembly stretch size for a given target size T and the descent is 0.
  • Otherwise, the GlyphAssembly is horizontal, the width is glyph assembly stretch size for a given target size T while the ascent (respectively descent) is the maximum ascent (respectively descent) of the glyphs of ID GlyphPartRecord.glyphID for all the GlyphPartRecord in GlyphAssembly.partRecords.

The glyph assembly height is the sum of the glyph assembly ascent and glyph assembly descent.

Note
The horizontal (respectively vertical) metrics for a vertical (respectively horizontal) glyph assembly do not depend on the target size T.

The shaping of the glyph assembly is performed with the following algorithm:

  1. Calculate rmin and omax.
  2. Set (x, y) to (0, 0), RepetitionCounter to 0 and PartIndex to -1.
  3. Repeat the following steps:
    1. If RepetitionCounter is 0:
      1. Increment PartIndex.
      2. If PartIndex is GlyphAssembly.partCount then stop.
      3. Otherwise, set Part to GlyphAssembly.partRecords[PartIndex]. Set RepetitionCounter to rmin if Part is an extender and to 1 otherwise.
      • If the glyph assembly is horizontal then draw the glyph of ID Part.glyphID so that its (left, baseline) coordinates are at position (x, y). Set x to x + Part.fullAdvance − omax.
      • Otherwise (if the glyph assembly is vertical), then draw the glyph of id Part.glyphID so that its (left, bottom) coordinates are at position (x, y). Set y to y − Part.fullAdvance + omax.
    2. Decrement RepetitionCounter.

5.3.2 Algorithms for glyph stretching

The preferred inline size of a glyph stretched along the block axis is calculated using the following algorithm:

  1. Set S to the glyph's advance width.
  2. If there is a MathGlyphConstruction table in the MathVariants.vertGlyphConstructionOffsets table for the given glyph:
    1. For each MathGlyphVariantRecord in MathGlyphConstruction.mathGlyphVariantRecord, ensure that S is at least the advance width of the glyph of id MathGlyphVariantRecord.variantGlyph.
    2. If there is valid GlyphAssembly subtable, then ensure that S is at least the glyph assembly width.
  3. Return S.
Note
The preferred inline size of a glyph stretched along the block axis will return the maximum width of all possible vertical constructions for that glyph. In practice, math fonts are designed so that vertical constructions are almost constant width, so possible over-estimation of the actual width is small.

The algorithm to shape a stretchy glyph to inline (respectively block) dimension T is the following:

  1. If there is not any MathGlyphConstruction table in the MathVariants.horizGlyphConstructionOffsets table (respectively MathVariants.vertGlyphConstructionOffsets table) for the given glyph then exit with failure.
  2. If the glyph's advance width (respectively height) is at least T then use normal shaping and bounding box for that glyph, the MathItalicsCorrectionInfo for that glyph as italic correction and exit with success.
  3. Browse the list of MathGlyphVariantRecord in MathGlyphConstruction.mathGlyphVariantRecord. If one MathGlyphVariantRecord.advanceMeasurement is at least T then use normal shaping and bounding box for MathGlyphVariantRecord.variantGlyph, the MathItalicsCorrectionInfo for that glyph as italic correction and exit with success.
  4. If there is valid GlyphAssembly subtable then use the bounding box given by glyph assembly width, glyph assembly height, glyph assembly ascent, glyph assembly descent, the value GlyphAssembly.italicsCorrection as italic correction, perform shaping of the glyph assembly and exit with success.
  5. If none of the stretch options above allowed to cover the target size T, then choose last one that was tried and exit with success.
Note
If a font does not provide tables for stretchy constructions, User Agents may use their own internal constructions as a fallback such as the one suggested in B.4 Unicode-based Glyph Assemblies.

A. User Agent Stylesheet

@namespace url(http://www.w3.org/1998/Math/MathML);

/* Universal rules */
* {
  font-size: math;
  display: block math;
  writing-mode: horizontal-tb !important;
}

/* The <math> element */
math {
  direction: ltr;
  text-indent: 0;
  letter-spacing: normal;
  line-height: normal;
  word-spacing: normal;
  font-family: math;
  font-size: inherit;
  font-style: normal;
  font-weight: normal;
  display: inline math;
  math-shift: normal;
  math-style: compact;
  math-depth: 0;
}
math[display="block" i] {
  display: block math;
  math-style: normal;
}
math[display="inline" i] {
  display: inline math;
  math-style: compact;
}

/* <mrow>-like elements */
semantics > :not(:first-child) {
  display: none;
}
maction > :not(:first-child) {
  display: none;
}
merror {
  border: 1px solid red;
  background-color: lightYellow;
}
mphantom {
  visibility: hidden;
}

/* Token elements */
mi {
  text-transform: math-auto;
}

/* Tables */
mtable {
  display: inline-table;
  math-style: compact;
}
mtr {
  display: table-row;
}
mtd {
  display: table-cell;
  /* Centering inside table cells should rely on box alignment properties.
     See https://github.com/w3c/mathml-core/issues/156 */
  text-align: center;
  padding: 0.5ex 0.4em;
}

/* Fractions */
mfrac {
  padding-inline: 1px;
}
mfrac > * {
  math-depth: auto-add;
  math-style: compact;
}
mfrac > :nth-child(2) {
  math-shift: compact;
}

/* Other rules for scriptlevel, displaystyle and math-shift */
mroot > :not(:first-child) {
  math-depth: add(2);
  math-style: compact;
}
mroot, msqrt {
  math-shift: compact;
}
msub > :not(:first-child),
msup > :not(:first-child),
msubsup > :not(:first-child),
mmultiscripts > :not(:first-child),
munder > :not(:first-child),
mover > :not(:first-child),
munderover > :not(:first-child) {
  math-depth: add(1);
  math-style: compact;
}
munder[accentunder="true" i] > :nth-child(2),
mover[accent="true" i] > :nth-child(2),
munderover[accentunder="true" i] > :nth-child(2),
munderover[accent="true" i] > :nth-child(3) {
  font-size: inherit;
}
msub > :nth-child(2),
msubsup > :nth-child(2),
mmultiscripts > :nth-child(even),
mmultiscripts > mprescripts ~ :nth-child(odd),
mover[accent="true" i] > :first-child,
munderover[accent="true" i] > :first-child {
  math-shift: compact;
}
mmultiscripts > mprescripts ~ :nth-child(even) {
  math-shift: inherit;
}

B. Operator Tables

B.1 Operator Dictionary

Note
This section describes how to determine values of 3.2.4.2 Dictionary-based attributes and stretch axis of operators. Compact tables below are suitable for computer manipulation, see B.2 Operator Dictionary (human-readable) for an alternative presentation.

The algorithm to set the properties of an operator from its category is as follows:

The algorithm to determine the category of an operator (Content, Form) is as folllows:

  1. If Content as an UTF-16 string does not have length or 1 or 2 then exit with category Default.
  2. If Content is a single character in the range U+0320–U+03FF then exit with category Default. Otherwise, if it has two characters:
    • If Content is the surrogate pairs corresponding to U+1EEF0 ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL or U+1EEF1 ARABIC MATHEMATICAL OPERATOR HAH WITH DAL and Form is postfix, exit with category I.
    • If the second character is U+0338 COMBINING LONG SOLIDUS OVERLAY or U+20D2 COMBINING LONG VERTICAL LINE OVERLAY then replace Content with the first character and move to step 3.
    • Otherwise, if Content is listed in Operators_2_ascii_chars then replace Content with the Unicode character "U+0320 plus the index of Content in Operators_2_ascii_chars" and move to step 3.
    • Otherwise exit with category Default.
  3. If Form is infix and Content corresponds to one of U+007C VERTICAL LINE or U+223C TILDE OPERATOR then exit with category ForceDefault. If the category of (Content, Form) provided by table Figure 25 has N/A encoding in table Figure 26 (namely if it has category L or M), then exit with that category. Otherwise:
    • Set Key to Content if it is in range U+0000–U+03FF; or to Content − 0x1C00 if it is in range U+2000–U+2BFF. Otherwise, exit with category Default.
    • Add 0x0000, 0x1000, 0x2000 to Key according to whether Form is infix, prefix, postfix respectively.
    • Assert: Key is at most 0x2FFF.
    • Search an Entry in table Figure 27 such that Entry % 0x4000 is equal to Key. If one is found then return the category corresponding to encoding Entry / 0x1000 in Figure 26. Otherwise, return category Default.
Special TableEntries
Operators_2_ascii_chars18 entries (2-characters ASCII strings): '!!', '!=', '&&', '**', '*=', '++', '+=', '--', '-=', '->', '//', '/=', ':=', '<=', '<>', '==', '>=', '||',
Operators_fence61 entries (16 Unicode ranges): [U+0028–U+0029], {U+005B}, {U+005D}, [U+007B–U+007D], {U+0331}, {U+2016}, [U+2018–U+2019], [U+201C–U+201D], [U+2308–U+230B], [U+2329–U+232A], [U+2772–U+2773], [U+27E6–U+27EF], {U+2980}, [U+2983–U+2999], [U+29D8–U+29DB], [U+29FC–U+29FD],
Operators_separator3 entries: U+002C, U+003B, U+2063,
Figure 24 Special tables for the operator dictionary.
Total size: 82 entries, 90 bytes
(assuming characters are UTF-16 and 1-byte range lengths).
(Content, Form) keysCategory
313 entries (35 Unicode ranges) in infix form: [U+2190–U+2195], [U+219A–U+21AE], [U+21B0–U+21B5], {U+21B9}, [U+21BC–U+21D5], [U+21DA–U+21F0], [U+21F3–U+21FF], {U+2794}, {U+2799}, [U+279B–U+27A1], [U+27A5–U+27A6], [U+27A8–U+27AF], {U+27B1}, {U+27B3}, {U+27B5}, {U+27B8}, [U+27BA–U+27BE], [U+27F0–U+27F1], [U+27F4–U+27FF], [U+2900–U+2920], [U+2934–U+2937], [U+2942–U+2975], [U+297C–U+297F], [U+2B04–U+2B07], [U+2B0C–U+2B11], [U+2B30–U+2B3E], [U+2B40–U+2B4C], [U+2B60–U+2B65], [U+2B6A–U+2B6D], [U+2B70–U+2B73], [U+2B7A–U+2B7D], [U+2B80–U+2B87], {U+2B95}, [U+2BA0–U+2BAF], {U+2BB8}, A
108 entries (31 Unicode ranges) in infix form: {U+002B}, {U+002D}, {U+00B1}, {U+00F7}, {U+0322}, {U+2044}, [U+2212–U+2216], [U+2227–U+222A], {U+2236}, {U+2238}, [U+228C–U+228E], [U+2293–U+2296], {U+2298}, [U+229D–U+229F], [U+22BB–U+22BD], [U+22CE–U+22CF], [U+22D2–U+22D3], [U+2795–U+2797], {U+29B8}, {U+29BC}, [U+29C4–U+29C5], [U+29F5–U+29FB], [U+2A1F–U+2A2E], [U+2A38–U+2A3A], {U+2A3E}, [U+2A40–U+2A4F], [U+2A51–U+2A63], {U+2ADB}, {U+2AF6}, {U+2AFB}, {U+2AFD}, B
64 entries (33 Unicode ranges) in infix form: {U+0025}, {U+002A}, {U+002E}, [U+003F–U+0040], {U+005E}, {U+00B7}, {U+00D7}, {U+0323}, {U+032E}, {U+2022}, {U+2043}, [U+2217–U+2219], {U+2240}, {U+2297}, [U+2299–U+229B], [U+22A0–U+22A1], {U+22BA}, [U+22C4–U+22C7], [U+22C9–U+22CC], [U+2305–U+2306], {U+27CB}, {U+27CD}, [U+29C6–U+29C8], [U+29D4–U+29D7], {U+29E2}, [U+2A1D–U+2A1E], [U+2A2F–U+2A37], [U+2A3B–U+2A3D], {U+2A3F}, {U+2A50}, [U+2A64–U+2A65], [U+2ADC–U+2ADD], {U+2AFE}, C
52 entries (22 Unicode ranges) in prefix form: {U+0021}, {U+002B}, {U+002D}, {U+00AC}, {U+00B1}, {U+0331}, {U+2018}, {U+201C}, [U+2200–U+2201], [U+2203–U+2204], {U+2207}, [U+2212–U+2213], [U+221F–U+2222], [U+2234–U+2235], {U+223C}, [U+22BE–U+22BF], {U+2310}, {U+2319}, [U+2795–U+2796], {U+27C0}, [U+299B–U+29AF], [U+2AEC–U+2AED], D
40 entries (21 Unicode ranges) in postfix form: [U+0021–U+0022], [U+0025–U+0027], {U+0060}, {U+00A8}, {U+00B0}, [U+00B2–U+00B4], [U+00B8–U+00B9], [U+02CA–U+02CB], [U+02D8–U+02DA], {U+02DD}, {U+0311}, {U+0320}, {U+0325}, {U+0327}, {U+0331}, [U+2019–U+201B], [U+201D–U+201F], [U+2032–U+2037], {U+2057}, [U+20DB–U+20DC], {U+23CD}, E
30 entries in prefix form: U+0028, U+005B, U+007B, U+007C, U+2016, U+2308, U+230A, U+2329, U+2772, U+27E6, U+27E8, U+27EA, U+27EC, U+27EE, U+2980, U+2983, U+2985, U+2987, U+2989, U+298B, U+298D, U+298F, U+2991, U+2993, U+2995, U+2997, U+2999, U+29D8, U+29DA, U+29FC, F
30 entries in postfix form: U+0029, U+005D, U+007C, U+007D, U+2016, U+2309, U+230B, U+232A, U+2773, U+27E7, U+27E9, U+27EB, U+27ED, U+27EF, U+2980, U+2984, U+2986, U+2988, U+298A, U+298C, U+298E, U+2990, U+2992, U+2994, U+2996, U+2998, U+2999, U+29D9, U+29DB, U+29FD, G
27 entries (2 Unicode ranges) in prefix form: [U+222B–U+2233], [U+2A0B–U+2A1C], H
22 entries (13 Unicode ranges) in postfix form: [U+005E–U+005F], {U+007E}, {U+00AF}, [U+02C6–U+02C7], {U+02C9}, {U+02CD}, {U+02DC}, {U+02F7}, {U+0302}, {U+203E}, [U+2322–U+2323], [U+23B4–U+23B5], [U+23DC–U+23E1], I
22 entries (6 Unicode ranges) in prefix form: [U+220F–U+2211], [U+22C0–U+22C3], [U+2A00–U+2A0A], [U+2A1D–U+2A1E], {U+2AFC}, {U+2AFF}, J
8 entries (5 Unicode ranges) in infix form: {U+002F}, {U+005C}, {U+005F}, [U+2061–U+2064], {U+2206}, K
6 entries (3 Unicode ranges) in prefix form: [U+2145–U+2146], {U+2202}, [U+221A–U+221C], L
3 entries in infix form: U+002C, U+003A, U+003B, M
Figure 25 Mapping from operator (Content, Form) to a category.
Total size: 725 entries, 639 bytes
(assuming characters are UTF-16 and 1-byte range lengths).
CategoryFormEncodinglspacerspaceproperties
DefaultN/AN/A0.2777777777777778em0.2777777777777778emN/A
ForceDefaultN/AN/A0.2777777777777778em0.2777777777777778emN/A
Ainfix0x00.2777777777777778em0.2777777777777778emstretchy
Binfix0x40.2222222222222222em0.2222222222222222emN/A
Cinfix0x80.16666666666666666em0.16666666666666666emN/A
Dprefix0x100N/A
Epostfix0x200N/A
Fprefix0x500stretchy symmetric
Gpostfix0x600stretchy symmetric
Hprefix0x90.16666666666666666em0.16666666666666666emsymmetric largeop
Ipostfix0xA00stretchy
Jprefix0xD0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
Kinfix0xC00N/A
LprefixN/A0.16666666666666666em0N/A
MinfixN/A00.16666666666666666emN/A
Figure 26 Operators values for each category.
The third column provides a 4-bit encoding of the categories
where the 2 least significant bits encode the form infix (0), prefix (1) and postfix (2).
716 entries (236 ranges of length at most 16): {0x8025}, {0x802A}, {0x402B}, {0x402D}, {0x802E}, {0xC02F}, [0x803F–0x8040], {0xC05C}, {0x805E}, {0xC05F}, {0x40B1}, {0x80B7}, {0x80D7}, {0x40F7}, {0x4322}, {0x8323}, {0x832E}, {0x8422}, {0x8443}, {0x4444}, [0xC461–0xC464], [0x0590–0x0595], [0x059A–0x05A9], [0x05AA–0x05AE], [0x05B0–0x05B5], {0x05B9}, [0x05BC–0x05CB], [0x05CC–0x05D5], [0x05DA–0x05E9], [0x05EA–0x05F0], [0x05F3–0x05FF], {0xC606}, [0x4612–0x4616], [0x8617–0x8619], [0x4627–0x462A], {0x4636}, {0x4638}, {0x8640}, [0x468C–0x468E], [0x4693–0x4696], {0x8697}, {0x4698}, [0x8699–0x869B], [0x469D–0x469F], [0x86A0–0x86A1], {0x86BA}, [0x46BB–0x46BD], [0x86C4–0x86C7], [0x86C9–0x86CC], [0x46CE–0x46CF], [0x46D2–0x46D3], [0x8705–0x8706], {0x0B94}, [0x4B95–0x4B97], {0x0B99}, [0x0B9B–0x0BA1], [0x0BA5–0x0BA6], [0x0BA8–0x0BAF], {0x0BB1}, {0x0BB3}, {0x0BB5}, {0x0BB8}, [0x0BBA–0x0BBE], {0x8BCB}, {0x8BCD}, [0x0BF0–0x0BF1], [0x0BF4–0x0BFF], [0x0D00–0x0D0F], [0x0D10–0x0D1F], {0x0D20}, [0x0D34–0x0D37], [0x0D42–0x0D51], [0x0D52–0x0D61], [0x0D62–0x0D71], [0x0D72–0x0D75], [0x0D7C–0x0D7F], {0x4DB8}, {0x4DBC}, [0x4DC4–0x4DC5], [0x8DC6–0x8DC8], [0x8DD4–0x8DD7], {0x8DE2}, [0x4DF5–0x4DFB], [0x8E1D–0x8E1E], [0x4E1F–0x4E2E], [0x8E2F–0x8E37], [0x4E38–0x4E3A], [0x8E3B–0x8E3D], {0x4E3E}, {0x8E3F}, [0x4E40–0x4E4F], {0x8E50}, [0x4E51–0x4E60], [0x4E61–0x4E63], [0x8E64–0x8E65], {0x4EDB}, [0x8EDC–0x8EDD], {0x4EF6}, {0x4EFB}, {0x4EFD}, {0x8EFE}, [0x0F04–0x0F07], [0x0F0C–0x0F11], [0x0F30–0x0F3E], [0x0F40–0x0F4C], [0x0F60–0x0F65], [0x0F6A–0x0F6D], [0x0F70–0x0F73], [0x0F7A–0x0F7D], [0x0F80–0x0F87], {0x0F95}, [0x0FA0–0x0FAF], {0x0FB8}, {0x1021}, {0x5028}, {0x102B}, {0x102D}, {0x505B}, [0x507B–0x507C], {0x10AC}, {0x10B1}, {0x1331}, {0x5416}, {0x1418}, {0x141C}, [0x1600–0x1601], [0x1603–0x1604], {0x1607}, [0xD60F–0xD611], [0x1612–0x1613], [0x161F–0x1622], [0x962B–0x9633], [0x1634–0x1635], {0x163C}, [0x16BE–0x16BF], [0xD6C0–0xD6C3], {0x5708}, {0x570A}, {0x1710}, {0x1719}, {0x5729}, {0x5B72}, [0x1B95–0x1B96], {0x1BC0}, {0x5BE6}, {0x5BE8}, {0x5BEA}, {0x5BEC}, {0x5BEE}, {0x5D80}, {0x5D83}, {0x5D85}, {0x5D87}, {0x5D89}, {0x5D8B}, {0x5D8D}, {0x5D8F}, {0x5D91}, {0x5D93}, {0x5D95}, {0x5D97}, {0x5D99}, [0x1D9B–0x1DAA], [0x1DAB–0x1DAF], {0x5DD8}, {0x5DDA}, {0x5DFC}, [0xDE00–0xDE0A], [0x9E0B–0x9E1A], [0x9E1B–0x9E1C], [0xDE1D–0xDE1E], [0x1EEC–0x1EED], {0xDEFC}, {0xDEFF}, [0x2021–0x2022], [0x2025–0x2027], {0x6029}, {0x605D}, [0xA05E–0xA05F], {0x2060}, [0x607C–0x607D], {0xA07E}, {0x20A8}, {0xA0AF}, {0x20B0}, [0x20B2–0x20B4], [0x20B8–0x20B9], [0xA2C6–0xA2C7], {0xA2C9}, [0x22CA–0x22CB], {0xA2CD}, [0x22D8–0x22DA], {0xA2DC}, {0x22DD}, {0xA2F7}, {0xA302}, {0x2311}, {0x2320}, {0x2325}, {0x2327}, {0x2331}, {0x6416}, [0x2419–0x241B], [0x241D–0x241F], [0x2432–0x2437], {0xA43E}, {0x2457}, [0x24DB–0x24DC], {0x6709}, {0x670B}, [0xA722–0xA723], {0x672A}, [0xA7B4–0xA7B5], {0x27CD}, [0xA7DC–0xA7E1], {0x6B73}, {0x6BE7}, {0x6BE9}, {0x6BEB}, {0x6BED}, {0x6BEF}, {0x6D80}, {0x6D84}, {0x6D86}, {0x6D88}, {0x6D8A}, {0x6D8C}, {0x6D8E}, {0x6D90}, {0x6D92}, {0x6D94}, {0x6D96}, [0x6D98–0x6D99], {0x6DD9}, {0x6DDB}, {0x6DFD},
Figure 27 List of entries for the largest categories, sorted by key.
Key is Entry % 0x4000, category encoding is Entry / 0x1000.
Total size: 716 entries, 590 bytes
(assuming 4 bits for range lengths).
Note
  • Tables of Figure 25 and Figure 27 are encoded as ranges to take profit of the presence of many contiguous Unicode blocks.
  • To quickly find an entry in these tables, one can still perform a binary search over the range starts, followed by an extra check on the range length.
  • Since log is concave, it is more efficient to perform one binary search on the whole table of Figure 27 rather than on each large subtable of Figure 25.

The intrinsic stretch axis a Unicode character c is inline if it belongs to the list below. Otherwise, the intrinsic stretch axis of c is block.

U+003D, U+005E, U+005F, U+007E, U+00AF, U+02C6, U+02C7, U+02C9, U+02CD, U+02DC, U+02F7, U+0302, U+0332, U+203E, U+20D0, U+20D1, U+20D6, U+20D7, U+20E1, U+2190, U+2192, U+2194, U+2198, U+2199, U+219A, U+219B, U+219C, U+219D, U+219E, U+21A0, U+21A2, U+21A3, U+21A4, U+21A6, U+21A9, U+21AA, U+21AB, U+21AC, U+21AD, U+21AE, U+21B4, U+21B9, U+21BC, U+21BD, U+21C0, U+21C1, U+21C4, U+21C6, U+21C7, U+21C9, U+21CB, U+21CC, U+21CD, U+21CE, U+21CF, U+21D0, U+21D2, U+21D4, U+21DA, U+21DB, U+21DC, U+21DD, U+21E0, U+21E2, U+21E4, U+21E5, U+21E6, U+21E8, U+21F0, U+21F4, U+21F6, U+21F7, U+21F8, U+21F9, U+21FA, U+21FB, U+21FC, U+21FD, U+21FE, U+21FF, U+2322, U+2323, U+23B4, U+23B5, U+23DC, U+23DD, U+23DE, U+23DF, U+23E0, U+23E1, U+2500, U+2794, U+2799, U+279B, U+279C, U+279D, U+279E, U+279F, U+27A0, U+27A1, U+27A5, U+27A6, U+27A8, U+27A9, U+27AA, U+27AB, U+27AC, U+27AD, U+27AE, U+27AF, U+27B1, U+27B3, U+27B5, U+27B8, U+27BA, U+27BB, U+27BC, U+27BD, U+27BE, U+27F4, U+27F5, U+27F6, U+27F7, U+27F8, U+27F9, U+27FA, U+27FB, U+27FC, U+27FD, U+27FE, U+27FF, U+2900, U+2901, U+2902, U+2903, U+2904, U+2905, U+2906, U+2907, U+290C, U+290D, U+290E, U+290F, U+2910, U+2911, U+2914, U+2915, U+2916, U+2917, U+2918, U+2919, U+291A, U+291B, U+291C, U+291D, U+291E, U+291F, U+2920, U+2942, U+2943, U+2944, U+2945, U+2946, U+2947, U+2948, U+294A, U+294B, U+294E, U+2950, U+2952, U+2953, U+2956, U+2957, U+295A, U+295B, U+295E, U+295F, U+2962, U+2964, U+2966, U+2967, U+2968, U+2969, U+296A, U+296B, U+296C, U+296D, U+2970, U+2971, U+2972, U+2973, U+2974, U+2975, U+297C, U+297D, U+2B04, U+2B05, U+2B0C, U+2B30, U+2B31, U+2B32, U+2B33, U+2B34, U+2B35, U+2B36, U+2B37, U+2B38, U+2B39, U+2B3A, U+2B3B, U+2B3C, U+2B3D, U+2B3E, U+2B40, U+2B41, U+2B42, U+2B43, U+2B44, U+2B45, U+2B46, U+2B47, U+2B48, U+2B49, U+2B4A, U+2B4B, U+2B4C, U+2B60, U+2B62, U+2B64, U+2B6A, U+2B6C, U+2B70, U+2B72, U+2B7A, U+2B7C, U+2B80, U+2B82, U+2B84, U+2B86, U+2B95, U+FE35, U+FE36, U+FE37, U+FE38, U+1EEF0, U+1EEF1,
Figure 28 Sorted list of Unicode code points corresponding to operators with inline stretch axis.
Total size: 246 entries, 492 bytes (assuming 16 bits for all but the non-BMP entries).
Note
The intrinsic stretch axis could be included as a boolean property of the operator dictionary. But since it does not depend on the form and since very few operators can stretch along the inline axis, it is better implemented as a separate sorted array. Each entry can be encoded with 16 bytes if U+1EEF0 ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL and U+1EEF1 ARABIC MATHEMATICAL OPERATOR HAH WITH DAL are tested separately.

B.2 Operator Dictionary (human-readable)

This section is non-normative.

The following dictionary provides a human-readable version of B.1 Operator Dictionary. Please refer to 3.2.4.2 Dictionary-based attributes for explanation about how to use this dictionary and how to determine the values Content and Form indexing together the dictionary.

The values for rspace and lspace are indicated in the corresponding columns. The values of stretchy, symmetric, largeop, movablelimits are true if they are listed in the "properties" column.

ContentStretch Axisformlspacerspaceproperties
< U+003Cblockinfix0.2777777777777778em0.2777777777777778emN/A
= U+003Dinlineinfix0.2777777777777778em0.2777777777777778emN/A
> U+003Eblockinfix0.2777777777777778em0.2777777777777778emN/A
| U+007Cblockinfix0.2777777777777778em0.2777777777777778emfence
↖ U+2196blockinfix0.2777777777777778em0.2777777777777778emN/A
↗ U+2197blockinfix0.2777777777777778em0.2777777777777778emN/A
↘ U+2198inlineinfix0.2777777777777778em0.2777777777777778emN/A
↙ U+2199inlineinfix0.2777777777777778em0.2777777777777778emN/A
↯ U+21AFblockinfix0.2777777777777778em0.2777777777777778emN/A
↶ U+21B6blockinfix0.2777777777777778em0.2777777777777778emN/A
↷ U+21B7blockinfix0.2777777777777778em0.2777777777777778emN/A
↸ U+21B8blockinfix0.2777777777777778em0.2777777777777778emN/A
↺ U+21BAblockinfix0.2777777777777778em0.2777777777777778emN/A
↻ U+21BBblockinfix0.2777777777777778em0.2777777777777778emN/A
⇖ U+21D6blockinfix0.2777777777777778em0.2777777777777778emN/A
⇗ U+21D7blockinfix0.2777777777777778em0.2777777777777778emN/A
⇘ U+21D8blockinfix0.2777777777777778em0.2777777777777778emN/A
⇙ U+21D9blockinfix0.2777777777777778em0.2777777777777778emN/A
⇱ U+21F1blockinfix0.2777777777777778em0.2777777777777778emN/A
⇲ U+21F2blockinfix0.2777777777777778em0.2777777777777778emN/A
∈ U+2208blockinfix0.2777777777777778em0.2777777777777778emN/A
∉ U+2209blockinfix0.2777777777777778em0.2777777777777778emN/A
∊ U+220Ablockinfix0.2777777777777778em0.2777777777777778emN/A
∋ U+220Bblockinfix0.2777777777777778em0.2777777777777778emN/A
∌ U+220Cblockinfix0.2777777777777778em0.2777777777777778emN/A
∍ U+220Dblockinfix0.2777777777777778em0.2777777777777778emN/A
∝ U+221Dblockinfix0.2777777777777778em0.2777777777777778emN/A
∣ U+2223blockinfix0.2777777777777778em0.2777777777777778emN/A
∤ U+2224blockinfix0.2777777777777778em0.2777777777777778emN/A
∥ U+2225blockinfix0.2777777777777778em0.2777777777777778emN/A
∦ U+2226blockinfix0.2777777777777778em0.2777777777777778emN/A
∷ U+2237blockinfix0.2777777777777778em0.2777777777777778emN/A
∹ U+2239blockinfix0.2777777777777778em0.2777777777777778emN/A
∺ U+223Ablockinfix0.2777777777777778em0.2777777777777778emN/A
∻ U+223Bblockinfix0.2777777777777778em0.2777777777777778emN/A
∼ U+223Cblockinfix0.2777777777777778em0.2777777777777778emN/A
∽ U+223Dblockinfix0.2777777777777778em0.2777777777777778emN/A
∾ U+223Eblockinfix0.2777777777777778em0.2777777777777778emN/A
≁ U+2241blockinfix0.2777777777777778em0.2777777777777778emN/A
≂ U+2242blockinfix0.2777777777777778em0.2777777777777778emN/A
≃ U+2243blockinfix0.2777777777777778em0.2777777777777778emN/A
≄ U+2244blockinfix0.2777777777777778em0.2777777777777778emN/A
≅ U+2245blockinfix0.2777777777777778em0.2777777777777778emN/A
≆ U+2246blockinfix0.2777777777777778em0.2777777777777778emN/A
≇ U+2247blockinfix0.2777777777777778em0.2777777777777778emN/A
≈ U+2248blockinfix0.2777777777777778em0.2777777777777778emN/A
≉ U+2249blockinfix0.2777777777777778em0.2777777777777778emN/A
≊ U+224Ablockinfix0.2777777777777778em0.2777777777777778emN/A
≋ U+224Bblockinfix0.2777777777777778em0.2777777777777778emN/A
≌ U+224Cblockinfix0.2777777777777778em0.2777777777777778emN/A
≍ U+224Dblockinfix0.2777777777777778em0.2777777777777778emN/A
≎ U+224Eblockinfix0.2777777777777778em0.2777777777777778emN/A
≏ U+224Fblockinfix0.2777777777777778em0.2777777777777778emN/A
≐ U+2250blockinfix0.2777777777777778em0.2777777777777778emN/A
≑ U+2251blockinfix0.2777777777777778em0.2777777777777778emN/A
≒ U+2252blockinfix0.2777777777777778em0.2777777777777778emN/A
≓ U+2253blockinfix0.2777777777777778em0.2777777777777778emN/A
≔ U+2254blockinfix0.2777777777777778em0.2777777777777778emN/A
≕ U+2255blockinfix0.2777777777777778em0.2777777777777778emN/A
≖ U+2256blockinfix0.2777777777777778em0.2777777777777778emN/A
≗ U+2257blockinfix0.2777777777777778em0.2777777777777778emN/A
≘ U+2258blockinfix0.2777777777777778em0.2777777777777778emN/A
≙ U+2259blockinfix0.2777777777777778em0.2777777777777778emN/A
≚ U+225Ablockinfix0.2777777777777778em0.2777777777777778emN/A
≛ U+225Bblockinfix0.2777777777777778em0.2777777777777778emN/A
≜ U+225Cblockinfix0.2777777777777778em0.2777777777777778emN/A
≝ U+225Dblockinfix0.2777777777777778em0.2777777777777778emN/A
≞ U+225Eblockinfix0.2777777777777778em0.2777777777777778emN/A
≟ U+225Fblockinfix0.2777777777777778em0.2777777777777778emN/A
≠ U+2260blockinfix0.2777777777777778em0.2777777777777778emN/A
≡ U+2261blockinfix0.2777777777777778em0.2777777777777778emN/A
≢ U+2262blockinfix0.2777777777777778em0.2777777777777778emN/A
≣ U+2263blockinfix0.2777777777777778em0.2777777777777778emN/A
≤ U+2264blockinfix0.2777777777777778em0.2777777777777778emN/A
≥ U+2265blockinfix0.2777777777777778em0.2777777777777778emN/A
≦ U+2266blockinfix0.2777777777777778em0.2777777777777778emN/A
≧ U+2267blockinfix0.2777777777777778em0.2777777777777778emN/A
≨ U+2268blockinfix0.2777777777777778em0.2777777777777778emN/A
≩ U+2269blockinfix0.2777777777777778em0.2777777777777778emN/A
≪ U+226Ablockinfix0.2777777777777778em0.2777777777777778emN/A
≫ U+226Bblockinfix0.2777777777777778em0.2777777777777778emN/A
≬ U+226Cblockinfix0.2777777777777778em0.2777777777777778emN/A
≭ U+226Dblockinfix0.2777777777777778em0.2777777777777778emN/A
≮ U+226Eblockinfix0.2777777777777778em0.2777777777777778emN/A
≯ U+226Fblockinfix0.2777777777777778em0.2777777777777778emN/A
≰ U+2270blockinfix0.2777777777777778em0.2777777777777778emN/A
≱ U+2271blockinfix0.2777777777777778em0.2777777777777778emN/A
≲ U+2272blockinfix0.2777777777777778em0.2777777777777778emN/A
≳ U+2273blockinfix0.2777777777777778em0.2777777777777778emN/A
≴ U+2274blockinfix0.2777777777777778em0.2777777777777778emN/A
≵ U+2275blockinfix0.2777777777777778em0.2777777777777778emN/A
≶ U+2276blockinfix0.2777777777777778em0.2777777777777778emN/A
≷ U+2277blockinfix0.2777777777777778em0.2777777777777778emN/A
≸ U+2278blockinfix0.2777777777777778em0.2777777777777778emN/A
≹ U+2279blockinfix0.2777777777777778em0.2777777777777778emN/A
≺ U+227Ablockinfix0.2777777777777778em0.2777777777777778emN/A
≻ U+227Bblockinfix0.2777777777777778em0.2777777777777778emN/A
≼ U+227Cblockinfix0.2777777777777778em0.2777777777777778emN/A
≽ U+227Dblockinfix0.2777777777777778em0.2777777777777778emN/A
≾ U+227Eblockinfix0.2777777777777778em0.2777777777777778emN/A
≿ U+227Fblockinfix0.2777777777777778em0.2777777777777778emN/A
⊀ U+2280blockinfix0.2777777777777778em0.2777777777777778emN/A
⊁ U+2281blockinfix0.2777777777777778em0.2777777777777778emN/A
⊂ U+2282blockinfix0.2777777777777778em0.2777777777777778emN/A
⊃ U+2283blockinfix0.2777777777777778em0.2777777777777778emN/A
⊄ U+2284blockinfix0.2777777777777778em0.2777777777777778emN/A
⊅ U+2285blockinfix0.2777777777777778em0.2777777777777778emN/A
⊆ U+2286blockinfix0.2777777777777778em0.2777777777777778emN/A
⊇ U+2287blockinfix0.2777777777777778em0.2777777777777778emN/A
⊈ U+2288blockinfix0.2777777777777778em0.2777777777777778emN/A
⊉ U+2289blockinfix0.2777777777777778em0.2777777777777778emN/A
⊊ U+228Ablockinfix0.2777777777777778em0.2777777777777778emN/A
⊋ U+228Bblockinfix0.2777777777777778em0.2777777777777778emN/A
⊏ U+228Fblockinfix0.2777777777777778em0.2777777777777778emN/A
⊐ U+2290blockinfix0.2777777777777778em0.2777777777777778emN/A
⊑ U+2291blockinfix0.2777777777777778em0.2777777777777778emN/A
⊒ U+2292blockinfix0.2777777777777778em0.2777777777777778emN/A
⊜ U+229Cblockinfix0.2777777777777778em0.2777777777777778emN/A
⊢ U+22A2blockinfix0.2777777777777778em0.2777777777777778emN/A
⊣ U+22A3blockinfix0.2777777777777778em0.2777777777777778emN/A
⊦ U+22A6blockinfix0.2777777777777778em0.2777777777777778emN/A
⊧ U+22A7blockinfix0.2777777777777778em0.2777777777777778emN/A
⊨ U+22A8blockinfix0.2777777777777778em0.2777777777777778emN/A
⊩ U+22A9blockinfix0.2777777777777778em0.2777777777777778emN/A
⊪ U+22AAblockinfix0.2777777777777778em0.2777777777777778emN/A
⊫ U+22ABblockinfix0.2777777777777778em0.2777777777777778emN/A
⊬ U+22ACblockinfix0.2777777777777778em0.2777777777777778emN/A
⊭ U+22ADblockinfix0.2777777777777778em0.2777777777777778emN/A
⊮ U+22AEblockinfix0.2777777777777778em0.2777777777777778emN/A
⊯ U+22AFblockinfix0.2777777777777778em0.2777777777777778emN/A
⊰ U+22B0blockinfix0.2777777777777778em0.2777777777777778emN/A
⊱ U+22B1blockinfix0.2777777777777778em0.2777777777777778emN/A
⊲ U+22B2blockinfix0.2777777777777778em0.2777777777777778emN/A
⊳ U+22B3blockinfix0.2777777777777778em0.2777777777777778emN/A
⊴ U+22B4blockinfix0.2777777777777778em0.2777777777777778emN/A
⊵ U+22B5blockinfix0.2777777777777778em0.2777777777777778emN/A
⊶ U+22B6blockinfix0.2777777777777778em0.2777777777777778emN/A
⊷ U+22B7blockinfix0.2777777777777778em0.2777777777777778emN/A
⊸ U+22B8blockinfix0.2777777777777778em0.2777777777777778emN/A
⋈ U+22C8blockinfix0.2777777777777778em0.2777777777777778emN/A
⋍ U+22CDblockinfix0.2777777777777778em0.2777777777777778emN/A
⋐ U+22D0blockinfix0.2777777777777778em0.2777777777777778emN/A
⋑ U+22D1blockinfix0.2777777777777778em0.2777777777777778emN/A
⋔ U+22D4blockinfix0.2777777777777778em0.2777777777777778emN/A
⋕ U+22D5blockinfix0.2777777777777778em0.2777777777777778emN/A
⋖ U+22D6blockinfix0.2777777777777778em0.2777777777777778emN/A
⋗ U+22D7blockinfix0.2777777777777778em0.2777777777777778emN/A
⋘ U+22D8blockinfix0.2777777777777778em0.2777777777777778emN/A
⋙ U+22D9blockinfix0.2777777777777778em0.2777777777777778emN/A
⋚ U+22DAblockinfix0.2777777777777778em0.2777777777777778emN/A
⋛ U+22DBblockinfix0.2777777777777778em0.2777777777777778emN/A
⋜ U+22DCblockinfix0.2777777777777778em0.2777777777777778emN/A
⋝ U+22DDblockinfix0.2777777777777778em0.2777777777777778emN/A
⋞ U+22DEblockinfix0.2777777777777778em0.2777777777777778emN/A
⋟ U+22DFblockinfix0.2777777777777778em0.2777777777777778emN/A
⋠ U+22E0blockinfix0.2777777777777778em0.2777777777777778emN/A
⋡ U+22E1blockinfix0.2777777777777778em0.2777777777777778emN/A
⋢ U+22E2blockinfix0.2777777777777778em0.2777777777777778emN/A
⋣ U+22E3blockinfix0.2777777777777778em0.2777777777777778emN/A
⋤ U+22E4blockinfix0.2777777777777778em0.2777777777777778emN/A
⋥ U+22E5blockinfix0.2777777777777778em0.2777777777777778emN/A
⋦ U+22E6blockinfix0.2777777777777778em0.2777777777777778emN/A
⋧ U+22E7blockinfix0.2777777777777778em0.2777777777777778emN/A
⋨ U+22E8blockinfix0.2777777777777778em0.2777777777777778emN/A
⋩ U+22E9blockinfix0.2777777777777778em0.2777777777777778emN/A
⋪ U+22EAblockinfix0.2777777777777778em0.2777777777777778emN/A
⋫ U+22EBblockinfix0.2777777777777778em0.2777777777777778emN/A
⋬ U+22ECblockinfix0.2777777777777778em0.2777777777777778emN/A
⋭ U+22EDblockinfix0.2777777777777778em0.2777777777777778emN/A
⋲ U+22F2blockinfix0.2777777777777778em0.2777777777777778emN/A
⋳ U+22F3blockinfix0.2777777777777778em0.2777777777777778emN/A
⋴ U+22F4blockinfix0.2777777777777778em0.2777777777777778emN/A
⋵ U+22F5blockinfix0.2777777777777778em0.2777777777777778emN/A
⋶ U+22F6blockinfix0.2777777777777778em0.2777777777777778emN/A
⋷ U+22F7blockinfix0.2777777777777778em0.2777777777777778emN/A
⋸ U+22F8blockinfix0.2777777777777778em0.2777777777777778emN/A
⋹ U+22F9blockinfix0.2777777777777778em0.2777777777777778emN/A
⋺ U+22FAblockinfix0.2777777777777778em0.2777777777777778emN/A
⋻ U+22FBblockinfix0.2777777777777778em0.2777777777777778emN/A
⋼ U+22FCblockinfix0.2777777777777778em0.2777777777777778emN/A
⋽ U+22FDblockinfix0.2777777777777778em0.2777777777777778emN/A
⋾ U+22FEblockinfix0.2777777777777778em0.2777777777777778emN/A
⋿ U+22FFblockinfix0.2777777777777778em0.2777777777777778emN/A
⌁ U+2301blockinfix0.2777777777777778em0.2777777777777778emN/A
⍼ U+237Cblockinfix0.2777777777777778em0.2777777777777778emN/A
⎋ U+238Bblockinfix0.2777777777777778em0.2777777777777778emN/A
➘ U+2798blockinfix0.2777777777777778em0.2777777777777778emN/A
➚ U+279Ablockinfix0.2777777777777778em0.2777777777777778emN/A
➧ U+27A7blockinfix0.2777777777777778em0.2777777777777778emN/A
➲ U+27B2blockinfix0.2777777777777778em0.2777777777777778emN/A
➴ U+27B4blockinfix0.2777777777777778em0.2777777777777778emN/A
➶ U+27B6blockinfix0.2777777777777778em0.2777777777777778emN/A
➷ U+27B7blockinfix0.2777777777777778em0.2777777777777778emN/A
➹ U+27B9blockinfix0.2777777777777778em0.2777777777777778emN/A
⟂ U+27C2blockinfix0.2777777777777778em0.2777777777777778emN/A
⟲ U+27F2blockinfix0.2777777777777778em0.2777777777777778emN/A
⟳ U+27F3blockinfix0.2777777777777778em0.2777777777777778emN/A
⤡ U+2921blockinfix0.2777777777777778em0.2777777777777778emN/A
⤢ U+2922blockinfix0.2777777777777778em0.2777777777777778emN/A
⤣ U+2923blockinfix0.2777777777777778em0.2777777777777778emN/A
⤤ U+2924blockinfix0.2777777777777778em0.2777777777777778emN/A
⤥ U+2925blockinfix0.2777777777777778em0.2777777777777778emN/A
⤦ U+2926blockinfix0.2777777777777778em0.2777777777777778emN/A
⤧ U+2927blockinfix0.2777777777777778em0.2777777777777778emN/A
⤨ U+2928blockinfix0.2777777777777778em0.2777777777777778emN/A
⤩ U+2929blockinfix0.2777777777777778em0.2777777777777778emN/A
⤪ U+292Ablockinfix0.2777777777777778em0.2777777777777778emN/A
⤫ U+292Bblockinfix0.2777777777777778em0.2777777777777778emN/A
⤬ U+292Cblockinfix0.2777777777777778em0.2777777777777778emN/A
⤭ U+292Dblockinfix0.2777777777777778em0.2777777777777778emN/A
⤮ U+292Eblockinfix0.2777777777777778em0.2777777777777778emN/A
⤯ U+292Fblockinfix0.2777777777777778em0.2777777777777778emN/A
⤰ U+2930blockinfix0.2777777777777778em0.2777777777777778emN/A
⤱ U+2931blockinfix0.2777777777777778em0.2777777777777778emN/A
⤲ U+2932blockinfix0.2777777777777778em0.2777777777777778emN/A
⤳ U+2933blockinfix0.2777777777777778em0.2777777777777778emN/A
⤸ U+2938blockinfix0.2777777777777778em0.2777777777777778emN/A
⤹ U+2939blockinfix0.2777777777777778em0.2777777777777778emN/A
⤺ U+293Ablockinfix0.2777777777777778em0.2777777777777778emN/A
⤻ U+293Bblockinfix0.2777777777777778em0.2777777777777778emN/A
⤼ U+293Cblockinfix0.2777777777777778em0.2777777777777778emN/A
⤽ U+293Dblockinfix0.2777777777777778em0.2777777777777778emN/A
⤾ U+293Eblockinfix0.2777777777777778em0.2777777777777778emN/A
⤿ U+293Fblockinfix0.2777777777777778em0.2777777777777778emN/A
⥀ U+2940blockinfix0.2777777777777778em0.2777777777777778emN/A
⥁ U+2941blockinfix0.2777777777777778em0.2777777777777778emN/A
⥶ U+2976blockinfix0.2777777777777778em0.2777777777777778emN/A
⥷ U+2977blockinfix0.2777777777777778em0.2777777777777778emN/A
⥸ U+2978blockinfix0.2777777777777778em0.2777777777777778emN/A
⥹ U+2979blockinfix0.2777777777777778em0.2777777777777778emN/A
⥺ U+297Ablockinfix0.2777777777777778em0.2777777777777778emN/A
⥻ U+297Bblockinfix0.2777777777777778em0.2777777777777778emN/A
⦁ U+2981blockinfix0.2777777777777778em0.2777777777777778emN/A
⦂ U+2982blockinfix0.2777777777777778em0.2777777777777778emN/A
⦶ U+29B6blockinfix0.2777777777777778em0.2777777777777778emN/A
⦷ U+29B7blockinfix0.2777777777777778em0.2777777777777778emN/A
⦹ U+29B9blockinfix0.2777777777777778em0.2777777777777778emN/A
⧀ U+29C0blockinfix0.2777777777777778em0.2777777777777778emN/A
⧁ U+29C1blockinfix0.2777777777777778em0.2777777777777778emN/A
⧎ U+29CEblockinfix0.2777777777777778em0.2777777777777778emN/A
⧏ U+29CFblockinfix0.2777777777777778em0.2777777777777778emN/A
⧐ U+29D0blockinfix0.2777777777777778em0.2777777777777778emN/A
⧑ U+29D1blockinfix0.2777777777777778em0.2777777777777778emN/A
⧒ U+29D2blockinfix0.2777777777777778em0.2777777777777778emN/A
⧓ U+29D3blockinfix0.2777777777777778em0.2777777777777778emN/A
⧟ U+29DFblockinfix0.2777777777777778em0.2777777777777778emN/A
⧡ U+29E1blockinfix0.2777777777777778em0.2777777777777778emN/A
⧣ U+29E3blockinfix0.2777777777777778em0.2777777777777778emN/A
⧤ U+29E4blockinfix0.2777777777777778em0.2777777777777778emN/A
⧥ U+29E5blockinfix0.2777777777777778em0.2777777777777778emN/A
⧦ U+29E6blockinfix0.2777777777777778em0.2777777777777778emN/A
⧴ U+29F4blockinfix0.2777777777777778em0.2777777777777778emN/A
⩦ U+2A66blockinfix0.2777777777777778em0.2777777777777778emN/A
⩧ U+2A67blockinfix0.2777777777777778em0.2777777777777778emN/A
⩨ U+2A68blockinfix0.2777777777777778em0.2777777777777778emN/A
⩩ U+2A69blockinfix0.2777777777777778em0.2777777777777778emN/A
⩪ U+2A6Ablockinfix0.2777777777777778em0.2777777777777778emN/A
⩫ U+2A6Bblockinfix0.2777777777777778em0.2777777777777778emN/A
⩬ U+2A6Cblockinfix0.2777777777777778em0.2777777777777778emN/A
⩭ U+2A6Dblockinfix0.2777777777777778em0.2777777777777778emN/A
⩮ U+2A6Eblockinfix0.2777777777777778em0.2777777777777778emN/A
⩯ U+2A6Fblockinfix0.2777777777777778em0.2777777777777778emN/A
⩰ U+2A70blockinfix0.2777777777777778em0.2777777777777778emN/A
⩱ U+2A71blockinfix0.2777777777777778em0.2777777777777778emN/A
⩲ U+2A72blockinfix0.2777777777777778em0.2777777777777778emN/A
⩳ U+2A73blockinfix0.2777777777777778em0.2777777777777778emN/A
⩴ U+2A74blockinfix0.2777777777777778em0.2777777777777778emN/A
⩵ U+2A75blockinfix0.2777777777777778em0.2777777777777778emN/A
⩶ U+2A76blockinfix0.2777777777777778em0.2777777777777778emN/A
⩷ U+2A77blockinfix0.2777777777777778em0.2777777777777778emN/A
⩸ U+2A78blockinfix0.2777777777777778em0.2777777777777778emN/A
⩹ U+2A79blockinfix0.2777777777777778em0.2777777777777778emN/A
⩺ U+2A7Ablockinfix0.2777777777777778em0.2777777777777778emN/A
⩻ U+2A7Bblockinfix0.2777777777777778em0.2777777777777778emN/A
⩼ U+2A7Cblockinfix0.2777777777777778em0.2777777777777778emN/A
⩽ U+2A7Dblockinfix0.2777777777777778em0.2777777777777778emN/A
⩾ U+2A7Eblockinfix0.2777777777777778em0.2777777777777778emN/A
⩿ U+2A7Fblockinfix0.2777777777777778em0.2777777777777778emN/A
⪀ U+2A80blockinfix0.2777777777777778em0.2777777777777778emN/A
⪁ U+2A81blockinfix0.2777777777777778em0.2777777777777778emN/A
⪂ U+2A82blockinfix0.2777777777777778em0.2777777777777778emN/A
⪃ U+2A83blockinfix0.2777777777777778em0.2777777777777778emN/A
⪄ U+2A84blockinfix0.2777777777777778em0.2777777777777778emN/A
⪅ U+2A85blockinfix0.2777777777777778em0.2777777777777778emN/A
⪆ U+2A86blockinfix0.2777777777777778em0.2777777777777778emN/A
⪇ U+2A87blockinfix0.2777777777777778em0.2777777777777778emN/A
⪈ U+2A88blockinfix0.2777777777777778em0.2777777777777778emN/A
⪉ U+2A89blockinfix0.2777777777777778em0.2777777777777778emN/A
⪊ U+2A8Ablockinfix0.2777777777777778em0.2777777777777778emN/A
⪋ U+2A8Bblockinfix0.2777777777777778em0.2777777777777778emN/A
⪌ U+2A8Cblockinfix0.2777777777777778em0.2777777777777778emN/A
⪍ U+2A8Dblockinfix0.2777777777777778em0.2777777777777778emN/A
⪎ U+2A8Eblockinfix0.2777777777777778em0.2777777777777778emN/A
⪏ U+2A8Fblockinfix0.2777777777777778em0.2777777777777778emN/A
⪐ U+2A90blockinfix0.2777777777777778em0.2777777777777778emN/A
⪑ U+2A91blockinfix0.2777777777777778em0.2777777777777778emN/A
⪒ U+2A92blockinfix0.2777777777777778em0.2777777777777778emN/A
⪓ U+2A93blockinfix0.2777777777777778em0.2777777777777778emN/A
⪔ U+2A94blockinfix0.2777777777777778em0.2777777777777778emN/A
⪕ U+2A95blockinfix0.2777777777777778em0.2777777777777778emN/A
⪖ U+2A96blockinfix0.2777777777777778em0.2777777777777778emN/A
⪗ U+2A97blockinfix0.2777777777777778em0.2777777777777778emN/A
⪘ U+2A98blockinfix0.2777777777777778em0.2777777777777778emN/A
⪙ U+2A99blockinfix0.2777777777777778em0.2777777777777778emN/A
⪚ U+2A9Ablockinfix0.2777777777777778em0.2777777777777778emN/A
⪛ U+2A9Bblockinfix0.2777777777777778em0.2777777777777778emN/A
⪜ U+2A9Cblockinfix0.2777777777777778em0.2777777777777778emN/A
⪝ U+2A9Dblockinfix0.2777777777777778em0.2777777777777778emN/A
⪞ U+2A9Eblockinfix0.2777777777777778em0.2777777777777778emN/A
⪟ U+2A9Fblockinfix0.2777777777777778em0.2777777777777778emN/A
⪠ U+2AA0blockinfix0.2777777777777778em0.2777777777777778emN/A
⪡ U+2AA1blockinfix0.2777777777777778em0.2777777777777778emN/A
⪢ U+2AA2blockinfix0.2777777777777778em0.2777777777777778emN/A
⪣ U+2AA3blockinfix0.2777777777777778em0.2777777777777778emN/A
⪤ U+2AA4blockinfix0.2777777777777778em0.2777777777777778emN/A
⪥ U+2AA5blockinfix0.2777777777777778em0.2777777777777778emN/A
⪦ U+2AA6blockinfix0.2777777777777778em0.2777777777777778emN/A
⪧ U+2AA7blockinfix0.2777777777777778em0.2777777777777778emN/A
⪨ U+2AA8blockinfix0.2777777777777778em0.2777777777777778emN/A
⪩ U+2AA9blockinfix0.2777777777777778em0.2777777777777778emN/A
⪪ U+2AAAblockinfix0.2777777777777778em0.2777777777777778emN/A
⪫ U+2AABblockinfix0.2777777777777778em0.2777777777777778emN/A
⪬ U+2AACblockinfix0.2777777777777778em0.2777777777777778emN/A
⪭ U+2AADblockinfix0.2777777777777778em0.2777777777777778emN/A
⪮ U+2AAEblockinfix0.2777777777777778em0.2777777777777778emN/A
⪯ U+2AAFblockinfix0.2777777777777778em0.2777777777777778emN/A
⪰ U+2AB0blockinfix0.2777777777777778em0.2777777777777778emN/A
⪱ U+2AB1blockinfix0.2777777777777778em0.2777777777777778emN/A
⪲ U+2AB2blockinfix0.2777777777777778em0.2777777777777778emN/A
⪳ U+2AB3blockinfix0.2777777777777778em0.2777777777777778emN/A
⪴ U+2AB4blockinfix0.2777777777777778em0.2777777777777778emN/A
⪵ U+2AB5blockinfix0.2777777777777778em0.2777777777777778emN/A
⪶ U+2AB6blockinfix0.2777777777777778em0.2777777777777778emN/A
⪷ U+2AB7blockinfix0.2777777777777778em0.2777777777777778emN/A
⪸ U+2AB8blockinfix0.2777777777777778em0.2777777777777778emN/A
⪹ U+2AB9blockinfix0.2777777777777778em0.2777777777777778emN/A
⪺ U+2ABAblockinfix0.2777777777777778em0.2777777777777778emN/A
⪻ U+2ABBblockinfix0.2777777777777778em0.2777777777777778emN/A
⪼ U+2ABCblockinfix0.2777777777777778em0.2777777777777778emN/A
⪽ U+2ABDblockinfix0.2777777777777778em0.2777777777777778emN/A
⪾ U+2ABEblockinfix0.2777777777777778em0.2777777777777778emN/A
⪿ U+2ABFblockinfix0.2777777777777778em0.2777777777777778emN/A
⫀ U+2AC0blockinfix0.2777777777777778em0.2777777777777778emN/A
⫁ U+2AC1blockinfix0.2777777777777778em0.2777777777777778emN/A
⫂ U+2AC2blockinfix0.2777777777777778em0.2777777777777778emN/A
⫃ U+2AC3blockinfix0.2777777777777778em0.2777777777777778emN/A
⫄ U+2AC4blockinfix0.2777777777777778em0.2777777777777778emN/A
⫅ U+2AC5blockinfix0.2777777777777778em0.2777777777777778emN/A
⫆ U+2AC6blockinfix0.2777777777777778em0.2777777777777778emN/A
⫇ U+2AC7blockinfix0.2777777777777778em0.2777777777777778emN/A
⫈ U+2AC8blockinfix0.2777777777777778em0.2777777777777778emN/A
⫉ U+2AC9blockinfix0.2777777777777778em0.2777777777777778emN/A
⫊ U+2ACAblockinfix0.2777777777777778em0.2777777777777778emN/A
⫋ U+2ACBblockinfix0.2777777777777778em0.2777777777777778emN/A
⫌ U+2ACCblockinfix0.2777777777777778em0.2777777777777778emN/A
⫍ U+2ACDblockinfix0.2777777777777778em0.2777777777777778emN/A
⫎ U+2ACEblockinfix0.2777777777777778em0.2777777777777778emN/A
⫏ U+2ACFblockinfix0.2777777777777778em0.2777777777777778emN/A
⫐ U+2AD0blockinfix0.2777777777777778em0.2777777777777778emN/A
⫑ U+2AD1blockinfix0.2777777777777778em0.2777777777777778emN/A
⫒ U+2AD2blockinfix0.2777777777777778em0.2777777777777778emN/A
⫓ U+2AD3blockinfix0.2777777777777778em0.2777777777777778emN/A
⫔ U+2AD4blockinfix0.2777777777777778em0.2777777777777778emN/A
⫕ U+2AD5blockinfix0.2777777777777778em0.2777777777777778emN/A
⫖ U+2AD6blockinfix0.2777777777777778em0.2777777777777778emN/A
⫗ U+2AD7blockinfix0.2777777777777778em0.2777777777777778emN/A
⫘ U+2AD8blockinfix0.2777777777777778em0.2777777777777778emN/A
⫙ U+2AD9blockinfix0.2777777777777778em0.2777777777777778emN/A
⫚ U+2ADAblockinfix0.2777777777777778em0.2777777777777778emN/A
⫞ U+2ADEblockinfix0.2777777777777778em0.2777777777777778emN/A
⫟ U+2ADFblockinfix0.2777777777777778em0.2777777777777778emN/A
⫠ U+2AE0blockinfix0.2777777777777778em0.2777777777777778emN/A
⫡ U+2AE1blockinfix0.2777777777777778em0.2777777777777778emN/A
⫢ U+2AE2blockinfix0.2777777777777778em0.2777777777777778emN/A
⫣ U+2AE3blockinfix0.2777777777777778em0.2777777777777778emN/A
⫤ U+2AE4blockinfix0.2777777777777778em0.2777777777777778emN/A
⫥ U+2AE5blockinfix0.2777777777777778em0.2777777777777778emN/A
⫦ U+2AE6blockinfix0.2777777777777778em0.2777777777777778emN/A
⫧ U+2AE7blockinfix0.2777777777777778em0.2777777777777778emN/A
⫨ U+2AE8blockinfix0.2777777777777778em0.2777777777777778emN/A
⫩ U+2AE9blockinfix0.2777777777777778em0.2777777777777778emN/A
⫪ U+2AEAblockinfix0.2777777777777778em0.2777777777777778emN/A
⫫ U+2AEBblockinfix0.2777777777777778em0.2777777777777778emN/A
⫮ U+2AEEblockinfix0.2777777777777778em0.2777777777777778emN/A
⫲ U+2AF2blockinfix0.2777777777777778em0.2777777777777778emN/A
⫳ U+2AF3blockinfix0.2777777777777778em0.2777777777777778emN/A
⫴ U+2AF4blockinfix0.2777777777777778em0.2777777777777778emN/A
⫵ U+2AF5blockinfix0.2777777777777778em0.2777777777777778emN/A
⫷ U+2AF7blockinfix0.2777777777777778em0.2777777777777778emN/A
⫸ U+2AF8blockinfix0.2777777777777778em0.2777777777777778emN/A
⫹ U+2AF9blockinfix0.2777777777777778em0.2777777777777778emN/A
⫺ U+2AFAblockinfix0.2777777777777778em0.2777777777777778emN/A
⬀ U+2B00blockinfix0.2777777777777778em0.2777777777777778emN/A
⬁ U+2B01blockinfix0.2777777777777778em0.2777777777777778emN/A
⬂ U+2B02blockinfix0.2777777777777778em0.2777777777777778emN/A
⬃ U+2B03blockinfix0.2777777777777778em0.2777777777777778emN/A
⬈ U+2B08blockinfix0.2777777777777778em0.2777777777777778emN/A
⬉ U+2B09blockinfix0.2777777777777778em0.2777777777777778emN/A
⬊ U+2B0Ablockinfix0.2777777777777778em0.2777777777777778emN/A
⬋ U+2B0Bblockinfix0.2777777777777778em0.2777777777777778emN/A
⬿ U+2B3Fblockinfix0.2777777777777778em0.2777777777777778emN/A
⭍ U+2B4Dblockinfix0.2777777777777778em0.2777777777777778emN/A
⭎ U+2B4Eblockinfix0.2777777777777778em0.2777777777777778emN/A
⭏ U+2B4Fblockinfix0.2777777777777778em0.2777777777777778emN/A
⭚ U+2B5Ablockinfix0.2777777777777778em0.2777777777777778emN/A
⭛ U+2B5Bblockinfix0.2777777777777778em0.2777777777777778emN/A
⭜ U+2B5Cblockinfix0.2777777777777778em0.2777777777777778emN/A
⭝ U+2B5Dblockinfix0.2777777777777778em0.2777777777777778emN/A
⭞ U+2B5Eblockinfix0.2777777777777778em0.2777777777777778emN/A
⭟ U+2B5Fblockinfix0.2777777777777778em0.2777777777777778emN/A
⭦ U+2B66blockinfix0.2777777777777778em0.2777777777777778emN/A
⭧ U+2B67blockinfix0.2777777777777778em0.2777777777777778emN/A
⭨ U+2B68blockinfix0.2777777777777778em0.2777777777777778emN/A
⭩ U+2B69blockinfix0.2777777777777778em0.2777777777777778emN/A
⭮ U+2B6Eblockinfix0.2777777777777778em0.2777777777777778emN/A
⭯ U+2B6Fblockinfix0.2777777777777778em0.2777777777777778emN/A
⭶ U+2B76blockinfix0.2777777777777778em0.2777777777777778emN/A
⭷ U+2B77blockinfix0.2777777777777778em0.2777777777777778emN/A
⭸ U+2B78blockinfix0.2777777777777778em0.2777777777777778emN/A
⭹ U+2B79blockinfix0.2777777777777778em0.2777777777777778emN/A
⮈ U+2B88blockinfix0.2777777777777778em0.2777777777777778emN/A
⮉ U+2B89blockinfix0.2777777777777778em0.2777777777777778emN/A
⮊ U+2B8Ablockinfix0.2777777777777778em0.2777777777777778emN/A
⮋ U+2B8Bblockinfix0.2777777777777778em0.2777777777777778emN/A
⮌ U+2B8Cblockinfix0.2777777777777778em0.2777777777777778emN/A
⮍ U+2B8Dblockinfix0.2777777777777778em0.2777777777777778emN/A
⮎ U+2B8Eblockinfix0.2777777777777778em0.2777777777777778emN/A
⮏ U+2B8Fblockinfix0.2777777777777778em0.2777777777777778emN/A
⮔ U+2B94blockinfix0.2777777777777778em0.2777777777777778emN/A
⮰ U+2BB0blockinfix0.2777777777777778em0.2777777777777778emN/A
⮱ U+2BB1blockinfix0.2777777777777778em0.2777777777777778emN/A
⮲ U+2BB2blockinfix0.2777777777777778em0.2777777777777778emN/A
⮳ U+2BB3blockinfix0.2777777777777778em0.2777777777777778emN/A
⮴ U+2BB4blockinfix0.2777777777777778em0.2777777777777778emN/A
⮵ U+2BB5blockinfix0.2777777777777778em0.2777777777777778emN/A
⮶ U+2BB6blockinfix0.2777777777777778em0.2777777777777778emN/A
⮷ U+2BB7blockinfix0.2777777777777778em0.2777777777777778emN/A
⯑ U+2BD1blockinfix0.2777777777777778em0.2777777777777778emN/A
String != U+0021 U+003Dblockinfix0.2777777777777778em0.2777777777777778emN/A
String *= U+002A U+003Dblockinfix0.2777777777777778em0.2777777777777778emN/A
String += U+002B U+003Dblockinfix0.2777777777777778em0.2777777777777778emN/A
String -= U+002D U+003Dblockinfix0.2777777777777778em0.2777777777777778emN/A
String -> U+002D U+003Eblockinfix0.2777777777777778em0.2777777777777778emN/A
String // U+002F U+002Fblockinfix0.2777777777777778em0.2777777777777778emN/A
String /= U+002F U+003Dblockinfix0.2777777777777778em0.2777777777777778emN/A
String := U+003A U+003Dblockinfix0.2777777777777778em0.2777777777777778emN/A
String <= U+003C U+003Dblockinfix0.2777777777777778em0.2777777777777778emN/A
String == U+003D U+003Dblockinfix0.2777777777777778em0.2777777777777778emN/A
String >= U+003E U+003Dblockinfix0.2777777777777778em0.2777777777777778emN/A
String || U+007C U+007Cblockinfix0.2777777777777778em0.2777777777777778emfence
← U+2190inlineinfix0.2777777777777778em0.2777777777777778emstretchy
↑ U+2191blockinfix0.2777777777777778em0.2777777777777778emstretchy
→ U+2192inlineinfix0.2777777777777778em0.2777777777777778emstretchy
↓ U+2193blockinfix0.2777777777777778em0.2777777777777778emstretchy
↔ U+2194inlineinfix0.2777777777777778em0.2777777777777778emstretchy
↕ U+2195blockinfix0.2777777777777778em0.2777777777777778emstretchy
↚ U+219Ainlineinfix0.2777777777777778em0.2777777777777778emstretchy
↛ U+219Binlineinfix0.2777777777777778em0.2777777777777778emstretchy
↜ U+219Cinlineinfix0.2777777777777778em0.2777777777777778emstretchy
↝ U+219Dinlineinfix0.2777777777777778em0.2777777777777778emstretchy
↞ U+219Einlineinfix0.2777777777777778em0.2777777777777778emstretchy
↟ U+219Fblockinfix0.2777777777777778em0.2777777777777778emstretchy
↠ U+21A0inlineinfix0.2777777777777778em0.2777777777777778emstretchy
↡ U+21A1blockinfix0.2777777777777778em0.2777777777777778emstretchy
↢ U+21A2inlineinfix0.2777777777777778em0.2777777777777778emstretchy
↣ U+21A3inlineinfix0.2777777777777778em0.2777777777777778emstretchy
↤ U+21A4inlineinfix0.2777777777777778em0.2777777777777778emstretchy
↥ U+21A5blockinfix0.2777777777777778em0.2777777777777778emstretchy
↦ U+21A6inlineinfix0.2777777777777778em0.2777777777777778emstretchy
↧ U+21A7blockinfix0.2777777777777778em0.2777777777777778emstretchy
↨ U+21A8blockinfix0.2777777777777778em0.2777777777777778emstretchy
↩ U+21A9inlineinfix0.2777777777777778em0.2777777777777778emstretchy
↪ U+21AAinlineinfix0.2777777777777778em0.2777777777777778emstretchy
↫ U+21ABinlineinfix0.2777777777777778em0.2777777777777778emstretchy
↬ U+21ACinlineinfix0.2777777777777778em0.2777777777777778emstretchy
↭ U+21ADinlineinfix0.2777777777777778em0.2777777777777778emstretchy
↮ U+21AEinlineinfix0.2777777777777778em0.2777777777777778emstretchy
↰ U+21B0blockinfix0.2777777777777778em0.2777777777777778emstretchy
↱ U+21B1blockinfix0.2777777777777778em0.2777777777777778emstretchy
↲ U+21B2blockinfix0.2777777777777778em0.2777777777777778emstretchy
↳ U+21B3blockinfix0.2777777777777778em0.2777777777777778emstretchy
↴ U+21B4inlineinfix0.2777777777777778em0.2777777777777778emstretchy
↵ U+21B5blockinfix0.2777777777777778em0.2777777777777778emstretchy
↹ U+21B9inlineinfix0.2777777777777778em0.2777777777777778emstretchy
↼ U+21BCinlineinfix0.2777777777777778em0.2777777777777778emstretchy
↽ U+21BDinlineinfix0.2777777777777778em0.2777777777777778emstretchy
↾ U+21BEblockinfix0.2777777777777778em0.2777777777777778emstretchy
↿ U+21BFblockinfix0.2777777777777778em0.2777777777777778emstretchy
⇀ U+21C0inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇁ U+21C1inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇂ U+21C2blockinfix0.2777777777777778em0.2777777777777778emstretchy
⇃ U+21C3blockinfix0.2777777777777778em0.2777777777777778emstretchy
⇄ U+21C4inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇅ U+21C5blockinfix0.2777777777777778em0.2777777777777778emstretchy
⇆ U+21C6inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇇ U+21C7inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇈ U+21C8blockinfix0.2777777777777778em0.2777777777777778emstretchy
⇉ U+21C9inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇊ U+21CAblockinfix0.2777777777777778em0.2777777777777778emstretchy
⇋ U+21CBinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇌ U+21CCinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇍ U+21CDinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇎ U+21CEinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇏ U+21CFinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇐ U+21D0inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇑ U+21D1blockinfix0.2777777777777778em0.2777777777777778emstretchy
⇒ U+21D2inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇓ U+21D3blockinfix0.2777777777777778em0.2777777777777778emstretchy
⇔ U+21D4inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇕ U+21D5blockinfix0.2777777777777778em0.2777777777777778emstretchy
⇚ U+21DAinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇛ U+21DBinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇜ U+21DCinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇝ U+21DDinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇞ U+21DEblockinfix0.2777777777777778em0.2777777777777778emstretchy
⇟ U+21DFblockinfix0.2777777777777778em0.2777777777777778emstretchy
⇠ U+21E0inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇡ U+21E1blockinfix0.2777777777777778em0.2777777777777778emstretchy
⇢ U+21E2inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇣ U+21E3blockinfix0.2777777777777778em0.2777777777777778emstretchy
⇤ U+21E4inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇥ U+21E5inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇦ U+21E6inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇧ U+21E7blockinfix0.2777777777777778em0.2777777777777778emstretchy
⇨ U+21E8inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇩ U+21E9blockinfix0.2777777777777778em0.2777777777777778emstretchy
⇪ U+21EAblockinfix0.2777777777777778em0.2777777777777778emstretchy
⇫ U+21EBblockinfix0.2777777777777778em0.2777777777777778emstretchy
⇬ U+21ECblockinfix0.2777777777777778em0.2777777777777778emstretchy
⇭ U+21EDblockinfix0.2777777777777778em0.2777777777777778emstretchy
⇮ U+21EEblockinfix0.2777777777777778em0.2777777777777778emstretchy
⇯ U+21EFblockinfix0.2777777777777778em0.2777777777777778emstretchy
⇰ U+21F0inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇳ U+21F3blockinfix0.2777777777777778em0.2777777777777778emstretchy
⇴ U+21F4inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇵ U+21F5blockinfix0.2777777777777778em0.2777777777777778emstretchy
⇶ U+21F6inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇷ U+21F7inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇸ U+21F8inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇹ U+21F9inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇺ U+21FAinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇻ U+21FBinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇼ U+21FCinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇽ U+21FDinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇾ U+21FEinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⇿ U+21FFinlineinfix0.2777777777777778em0.2777777777777778emstretchy
➔ U+2794inlineinfix0.2777777777777778em0.2777777777777778emstretchy
➙ U+2799inlineinfix0.2777777777777778em0.2777777777777778emstretchy
➛ U+279Binlineinfix0.2777777777777778em0.2777777777777778emstretchy
➜ U+279Cinlineinfix0.2777777777777778em0.2777777777777778emstretchy
➝ U+279Dinlineinfix0.2777777777777778em0.2777777777777778emstretchy
➞ U+279Einlineinfix0.2777777777777778em0.2777777777777778emstretchy
➟ U+279Finlineinfix0.2777777777777778em0.2777777777777778emstretchy
➠ U+27A0inlineinfix0.2777777777777778em0.2777777777777778emstretchy
➡ U+27A1inlineinfix0.2777777777777778em0.2777777777777778emstretchy
➥ U+27A5inlineinfix0.2777777777777778em0.2777777777777778emstretchy
➦ U+27A6inlineinfix0.2777777777777778em0.2777777777777778emstretchy
➨ U+27A8inlineinfix0.2777777777777778em0.2777777777777778emstretchy
➩ U+27A9inlineinfix0.2777777777777778em0.2777777777777778emstretchy
➪ U+27AAinlineinfix0.2777777777777778em0.2777777777777778emstretchy
➫ U+27ABinlineinfix0.2777777777777778em0.2777777777777778emstretchy
➬ U+27ACinlineinfix0.2777777777777778em0.2777777777777778emstretchy
➭ U+27ADinlineinfix0.2777777777777778em0.2777777777777778emstretchy
➮ U+27AEinlineinfix0.2777777777777778em0.2777777777777778emstretchy
➯ U+27AFinlineinfix0.2777777777777778em0.2777777777777778emstretchy
➱ U+27B1inlineinfix0.2777777777777778em0.2777777777777778emstretchy
➳ U+27B3inlineinfix0.2777777777777778em0.2777777777777778emstretchy
➵ U+27B5inlineinfix0.2777777777777778em0.2777777777777778emstretchy
➸ U+27B8inlineinfix0.2777777777777778em0.2777777777777778emstretchy
➺ U+27BAinlineinfix0.2777777777777778em0.2777777777777778emstretchy
➻ U+27BBinlineinfix0.2777777777777778em0.2777777777777778emstretchy
➼ U+27BCinlineinfix0.2777777777777778em0.2777777777777778emstretchy
➽ U+27BDinlineinfix0.2777777777777778em0.2777777777777778emstretchy
➾ U+27BEinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⟰ U+27F0blockinfix0.2777777777777778em0.2777777777777778emstretchy
⟱ U+27F1blockinfix0.2777777777777778em0.2777777777777778emstretchy
⟴ U+27F4inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⟵ U+27F5inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⟶ U+27F6inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⟷ U+27F7inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⟸ U+27F8inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⟹ U+27F9inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⟺ U+27FAinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⟻ U+27FBinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⟼ U+27FCinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⟽ U+27FDinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⟾ U+27FEinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⟿ U+27FFinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤀ U+2900inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤁ U+2901inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤂ U+2902inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤃ U+2903inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤄ U+2904inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤅ U+2905inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤆ U+2906inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤇ U+2907inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤈ U+2908blockinfix0.2777777777777778em0.2777777777777778emstretchy
⤉ U+2909blockinfix0.2777777777777778em0.2777777777777778emstretchy
⤊ U+290Ablockinfix0.2777777777777778em0.2777777777777778emstretchy
⤋ U+290Bblockinfix0.2777777777777778em0.2777777777777778emstretchy
⤌ U+290Cinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤍ U+290Dinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤎ U+290Einlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤏ U+290Finlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤐ U+2910inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤑ U+2911inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤒ U+2912blockinfix0.2777777777777778em0.2777777777777778emstretchy
⤓ U+2913blockinfix0.2777777777777778em0.2777777777777778emstretchy
⤔ U+2914inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤕ U+2915inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤖ U+2916inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤗ U+2917inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤘ U+2918inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤙ U+2919inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤚ U+291Ainlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤛ U+291Binlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤜ U+291Cinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤝ U+291Dinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤞ U+291Einlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤟ U+291Finlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤠ U+2920inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⤴ U+2934blockinfix0.2777777777777778em0.2777777777777778emstretchy
⤵ U+2935blockinfix0.2777777777777778em0.2777777777777778emstretchy
⤶ U+2936blockinfix0.2777777777777778em0.2777777777777778emstretchy
⤷ U+2937blockinfix0.2777777777777778em0.2777777777777778emstretchy
⥂ U+2942inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥃ U+2943inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥄ U+2944inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥅ U+2945inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥆ U+2946inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥇ U+2947inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥈ U+2948inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥉ U+2949blockinfix0.2777777777777778em0.2777777777777778emstretchy
⥊ U+294Ainlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥋ U+294Binlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥌ U+294Cblockinfix0.2777777777777778em0.2777777777777778emstretchy
⥍ U+294Dblockinfix0.2777777777777778em0.2777777777777778emstretchy
⥎ U+294Einlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥏ U+294Fblockinfix0.2777777777777778em0.2777777777777778emstretchy
⥐ U+2950inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥑ U+2951blockinfix0.2777777777777778em0.2777777777777778emstretchy
⥒ U+2952inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥓ U+2953inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥔ U+2954blockinfix0.2777777777777778em0.2777777777777778emstretchy
⥕ U+2955blockinfix0.2777777777777778em0.2777777777777778emstretchy
⥖ U+2956inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥗ U+2957inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥘ U+2958blockinfix0.2777777777777778em0.2777777777777778emstretchy
⥙ U+2959blockinfix0.2777777777777778em0.2777777777777778emstretchy
⥚ U+295Ainlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥛ U+295Binlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥜ U+295Cblockinfix0.2777777777777778em0.2777777777777778emstretchy
⥝ U+295Dblockinfix0.2777777777777778em0.2777777777777778emstretchy
⥞ U+295Einlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥟ U+295Finlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥠ U+2960blockinfix0.2777777777777778em0.2777777777777778emstretchy
⥡ U+2961blockinfix0.2777777777777778em0.2777777777777778emstretchy
⥢ U+2962inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥣ U+2963blockinfix0.2777777777777778em0.2777777777777778emstretchy
⥤ U+2964inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥥ U+2965blockinfix0.2777777777777778em0.2777777777777778emstretchy
⥦ U+2966inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥧ U+2967inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥨ U+2968inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥩ U+2969inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥪ U+296Ainlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥫ U+296Binlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥬ U+296Cinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥭ U+296Dinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥮ U+296Eblockinfix0.2777777777777778em0.2777777777777778emstretchy
⥯ U+296Fblockinfix0.2777777777777778em0.2777777777777778emstretchy
⥰ U+2970inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥱ U+2971inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥲ U+2972inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥳ U+2973inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥴ U+2974inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥵ U+2975inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥼ U+297Cinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥽ U+297Dinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⥾ U+297Eblockinfix0.2777777777777778em0.2777777777777778emstretchy
⥿ U+297Fblockinfix0.2777777777777778em0.2777777777777778emstretchy
⬄ U+2B04inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⬅ U+2B05inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⬆ U+2B06blockinfix0.2777777777777778em0.2777777777777778emstretchy
⬇ U+2B07blockinfix0.2777777777777778em0.2777777777777778emstretchy
⬌ U+2B0Cinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⬍ U+2B0Dblockinfix0.2777777777777778em0.2777777777777778emstretchy
⬎ U+2B0Eblockinfix0.2777777777777778em0.2777777777777778emstretchy
⬏ U+2B0Fblockinfix0.2777777777777778em0.2777777777777778emstretchy
⬐ U+2B10blockinfix0.2777777777777778em0.2777777777777778emstretchy
⬑ U+2B11blockinfix0.2777777777777778em0.2777777777777778emstretchy
⬰ U+2B30inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⬱ U+2B31inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⬲ U+2B32inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⬳ U+2B33inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⬴ U+2B34inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⬵ U+2B35inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⬶ U+2B36inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⬷ U+2B37inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⬸ U+2B38inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⬹ U+2B39inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⬺ U+2B3Ainlineinfix0.2777777777777778em0.2777777777777778emstretchy
⬻ U+2B3Binlineinfix0.2777777777777778em0.2777777777777778emstretchy
⬼ U+2B3Cinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⬽ U+2B3Dinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⬾ U+2B3Einlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭀ U+2B40inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭁ U+2B41inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭂ U+2B42inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭃ U+2B43inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭄ U+2B44inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭅ U+2B45inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭆ U+2B46inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭇ U+2B47inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭈ U+2B48inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭉ U+2B49inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭊ U+2B4Ainlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭋ U+2B4Binlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭌ U+2B4Cinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭠ U+2B60inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭡ U+2B61blockinfix0.2777777777777778em0.2777777777777778emstretchy
⭢ U+2B62inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭣ U+2B63blockinfix0.2777777777777778em0.2777777777777778emstretchy
⭤ U+2B64inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭥ U+2B65blockinfix0.2777777777777778em0.2777777777777778emstretchy
⭪ U+2B6Ainlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭫ U+2B6Bblockinfix0.2777777777777778em0.2777777777777778emstretchy
⭬ U+2B6Cinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭭ U+2B6Dblockinfix0.2777777777777778em0.2777777777777778emstretchy
⭰ U+2B70inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭱ U+2B71blockinfix0.2777777777777778em0.2777777777777778emstretchy
⭲ U+2B72inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭳ U+2B73blockinfix0.2777777777777778em0.2777777777777778emstretchy
⭺ U+2B7Ainlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭻ U+2B7Bblockinfix0.2777777777777778em0.2777777777777778emstretchy
⭼ U+2B7Cinlineinfix0.2777777777777778em0.2777777777777778emstretchy
⭽ U+2B7Dblockinfix0.2777777777777778em0.2777777777777778emstretchy
⮀ U+2B80inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⮁ U+2B81blockinfix0.2777777777777778em0.2777777777777778emstretchy
⮂ U+2B82inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⮃ U+2B83blockinfix0.2777777777777778em0.2777777777777778emstretchy
⮄ U+2B84inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⮅ U+2B85blockinfix0.2777777777777778em0.2777777777777778emstretchy
⮆ U+2B86inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⮇ U+2B87blockinfix0.2777777777777778em0.2777777777777778emstretchy
⮕ U+2B95inlineinfix0.2777777777777778em0.2777777777777778emstretchy
⮠ U+2BA0blockinfix0.2777777777777778em0.2777777777777778emstretchy
⮡ U+2BA1blockinfix0.2777777777777778em0.2777777777777778emstretchy
⮢ U+2BA2blockinfix0.2777777777777778em0.2777777777777778emstretchy
⮣ U+2BA3blockinfix0.2777777777777778em0.2777777777777778emstretchy
⮤ U+2BA4blockinfix0.2777777777777778em0.2777777777777778emstretchy
⮥ U+2BA5blockinfix0.2777777777777778em0.2777777777777778emstretchy
⮦ U+2BA6blockinfix0.2777777777777778em0.2777777777777778emstretchy
⮧ U+2BA7blockinfix0.2777777777777778em0.2777777777777778emstretchy
⮨ U+2BA8blockinfix0.2777777777777778em0.2777777777777778emstretchy
⮩ U+2BA9blockinfix0.2777777777777778em0.2777777777777778emstretchy
⮪ U+2BAAblockinfix0.2777777777777778em0.2777777777777778emstretchy
⮫ U+2BABblockinfix0.2777777777777778em0.2777777777777778emstretchy
⮬ U+2BACblockinfix0.2777777777777778em0.2777777777777778emstretchy
⮭ U+2BADblockinfix0.2777777777777778em0.2777777777777778emstretchy
⮮ U+2BAEblockinfix0.2777777777777778em0.2777777777777778emstretchy
⮯ U+2BAFblockinfix0.2777777777777778em0.2777777777777778emstretchy
⮸ U+2BB8blockinfix0.2777777777777778em0.2777777777777778emstretchy
+ U+002Bblockinfix0.2222222222222222em0.2222222222222222emN/A
- U+002Dblockinfix0.2222222222222222em0.2222222222222222emN/A
± U+00B1blockinfix0.2222222222222222em0.2222222222222222emN/A
÷ U+00F7blockinfix0.2222222222222222em0.2222222222222222emN/A
⁄ U+2044blockinfix0.2222222222222222em0.2222222222222222emN/A
− U+2212blockinfix0.2222222222222222em0.2222222222222222emN/A
∓ U+2213blockinfix0.2222222222222222em0.2222222222222222emN/A
∔ U+2214blockinfix0.2222222222222222em0.2222222222222222emN/A
∕ U+2215blockinfix0.2222222222222222em0.2222222222222222emN/A
∖ U+2216blockinfix0.2222222222222222em0.2222222222222222emN/A
∧ U+2227blockinfix0.2222222222222222em0.2222222222222222emN/A
∨ U+2228blockinfix0.2222222222222222em0.2222222222222222emN/A
∩ U+2229blockinfix0.2222222222222222em0.2222222222222222emN/A
∪ U+222Ablockinfix0.2222222222222222em0.2222222222222222emN/A
∶ U+2236blockinfix0.2222222222222222em0.2222222222222222emN/A
∸ U+2238blockinfix0.2222222222222222em0.2222222222222222emN/A
⊌ U+228Cblockinfix0.2222222222222222em0.2222222222222222emN/A
⊍ U+228Dblockinfix0.2222222222222222em0.2222222222222222emN/A
⊎ U+228Eblockinfix0.2222222222222222em0.2222222222222222emN/A
⊓ U+2293blockinfix0.2222222222222222em0.2222222222222222emN/A
⊔ U+2294blockinfix0.2222222222222222em0.2222222222222222emN/A
⊕ U+2295blockinfix0.2222222222222222em0.2222222222222222emN/A
⊖ U+2296blockinfix0.2222222222222222em0.2222222222222222emN/A
⊘ U+2298blockinfix0.2222222222222222em0.2222222222222222emN/A
⊝ U+229Dblockinfix0.2222222222222222em0.2222222222222222emN/A
⊞ U+229Eblockinfix0.2222222222222222em0.2222222222222222emN/A
⊟ U+229Fblockinfix0.2222222222222222em0.2222222222222222emN/A
⊻ U+22BBblockinfix0.2222222222222222em0.2222222222222222emN/A
⊼ U+22BCblockinfix0.2222222222222222em0.2222222222222222emN/A
⊽ U+22BDblockinfix0.2222222222222222em0.2222222222222222emN/A
⋎ U+22CEblockinfix0.2222222222222222em0.2222222222222222emN/A
⋏ U+22CFblockinfix0.2222222222222222em0.2222222222222222emN/A
⋒ U+22D2blockinfix0.2222222222222222em0.2222222222222222emN/A
⋓ U+22D3blockinfix0.2222222222222222em0.2222222222222222emN/A
➕ U+2795blockinfix0.2222222222222222em0.2222222222222222emN/A
➖ U+2796blockinfix0.2222222222222222em0.2222222222222222emN/A
➗ U+2797blockinfix0.2222222222222222em0.2222222222222222emN/A
⦸ U+29B8blockinfix0.2222222222222222em0.2222222222222222emN/A
⦼ U+29BCblockinfix0.2222222222222222em0.2222222222222222emN/A
⧄ U+29C4blockinfix0.2222222222222222em0.2222222222222222emN/A
⧅ U+29C5blockinfix0.2222222222222222em0.2222222222222222emN/A
⧵ U+29F5blockinfix0.2222222222222222em0.2222222222222222emN/A
⧶ U+29F6blockinfix0.2222222222222222em0.2222222222222222emN/A
⧷ U+29F7blockinfix0.2222222222222222em0.2222222222222222emN/A
⧸ U+29F8blockinfix0.2222222222222222em0.2222222222222222emN/A
⧹ U+29F9blockinfix0.2222222222222222em0.2222222222222222emN/A
⧺ U+29FAblockinfix0.2222222222222222em0.2222222222222222emN/A
⧻ U+29FBblockinfix0.2222222222222222em0.2222222222222222emN/A
⨟ U+2A1Fblockinfix0.2222222222222222em0.2222222222222222emN/A
⨠ U+2A20blockinfix0.2222222222222222em0.2222222222222222emN/A
⨡ U+2A21blockinfix0.2222222222222222em0.2222222222222222emN/A
⨢ U+2A22blockinfix0.2222222222222222em0.2222222222222222emN/A
⨣ U+2A23blockinfix0.2222222222222222em0.2222222222222222emN/A
⨤ U+2A24blockinfix0.2222222222222222em0.2222222222222222emN/A
⨥ U+2A25blockinfix0.2222222222222222em0.2222222222222222emN/A
⨦ U+2A26blockinfix0.2222222222222222em0.2222222222222222emN/A
⨧ U+2A27blockinfix0.2222222222222222em0.2222222222222222emN/A
⨨ U+2A28blockinfix0.2222222222222222em0.2222222222222222emN/A
⨩ U+2A29blockinfix0.2222222222222222em0.2222222222222222emN/A
⨪ U+2A2Ablockinfix0.2222222222222222em0.2222222222222222emN/A
⨫ U+2A2Bblockinfix0.2222222222222222em0.2222222222222222emN/A
⨬ U+2A2Cblockinfix0.2222222222222222em0.2222222222222222emN/A
⨭ U+2A2Dblockinfix0.2222222222222222em0.2222222222222222emN/A
⨮ U+2A2Eblockinfix0.2222222222222222em0.2222222222222222emN/A
⨸ U+2A38blockinfix0.2222222222222222em0.2222222222222222emN/A
⨹ U+2A39blockinfix0.2222222222222222em0.2222222222222222emN/A
⨺ U+2A3Ablockinfix0.2222222222222222em0.2222222222222222emN/A
⨾ U+2A3Eblockinfix0.2222222222222222em0.2222222222222222emN/A
⩀ U+2A40blockinfix0.2222222222222222em0.2222222222222222emN/A
⩁ U+2A41blockinfix0.2222222222222222em0.2222222222222222emN/A
⩂ U+2A42blockinfix0.2222222222222222em0.2222222222222222emN/A
⩃ U+2A43blockinfix0.2222222222222222em0.2222222222222222emN/A
⩄ U+2A44blockinfix0.2222222222222222em0.2222222222222222emN/A
⩅ U+2A45blockinfix0.2222222222222222em0.2222222222222222emN/A
⩆ U+2A46blockinfix0.2222222222222222em0.2222222222222222emN/A
⩇ U+2A47blockinfix0.2222222222222222em0.2222222222222222emN/A
⩈ U+2A48blockinfix0.2222222222222222em0.2222222222222222emN/A
⩉ U+2A49blockinfix0.2222222222222222em0.2222222222222222emN/A
⩊ U+2A4Ablockinfix0.2222222222222222em0.2222222222222222emN/A
⩋ U+2A4Bblockinfix0.2222222222222222em0.2222222222222222emN/A
⩌ U+2A4Cblockinfix0.2222222222222222em0.2222222222222222emN/A
⩍ U+2A4Dblockinfix0.2222222222222222em0.2222222222222222emN/A
⩎ U+2A4Eblockinfix0.2222222222222222em0.2222222222222222emN/A
⩏ U+2A4Fblockinfix0.2222222222222222em0.2222222222222222emN/A
⩑ U+2A51blockinfix0.2222222222222222em0.2222222222222222emN/A
⩒ U+2A52blockinfix0.2222222222222222em0.2222222222222222emN/A
⩓ U+2A53blockinfix0.2222222222222222em0.2222222222222222emN/A
⩔ U+2A54blockinfix0.2222222222222222em0.2222222222222222emN/A
⩕ U+2A55blockinfix0.2222222222222222em0.2222222222222222emN/A
⩖ U+2A56blockinfix0.2222222222222222em0.2222222222222222emN/A
⩗ U+2A57blockinfix0.2222222222222222em0.2222222222222222emN/A
⩘ U+2A58blockinfix0.2222222222222222em0.2222222222222222emN/A
⩙ U+2A59blockinfix0.2222222222222222em0.2222222222222222emN/A
⩚ U+2A5Ablockinfix0.2222222222222222em0.2222222222222222emN/A
⩛ U+2A5Bblockinfix0.2222222222222222em0.2222222222222222emN/A
⩜ U+2A5Cblockinfix0.2222222222222222em0.2222222222222222emN/A
⩝ U+2A5Dblockinfix0.2222222222222222em0.2222222222222222emN/A
⩞ U+2A5Eblockinfix0.2222222222222222em0.2222222222222222emN/A
⩟ U+2A5Fblockinfix0.2222222222222222em0.2222222222222222emN/A
⩠ U+2A60blockinfix0.2222222222222222em0.2222222222222222emN/A
⩡ U+2A61blockinfix0.2222222222222222em0.2222222222222222emN/A
⩢ U+2A62blockinfix0.2222222222222222em0.2222222222222222emN/A
⩣ U+2A63blockinfix0.2222222222222222em0.2222222222222222emN/A
⫛ U+2ADBblockinfix0.2222222222222222em0.2222222222222222emN/A
⫶ U+2AF6blockinfix0.2222222222222222em0.2222222222222222emN/A
⫻ U+2AFBblockinfix0.2222222222222222em0.2222222222222222emN/A
⫽ U+2AFDblockinfix0.2222222222222222em0.2222222222222222emN/A
String && U+0026 U+0026blockinfix0.2222222222222222em0.2222222222222222emN/A
% U+0025blockinfix0.16666666666666666em0.16666666666666666emN/A
* U+002Ablockinfix0.16666666666666666em0.16666666666666666emN/A
. U+002Eblockinfix0.16666666666666666em0.16666666666666666emN/A
? U+003Fblockinfix0.16666666666666666em0.16666666666666666emN/A
@ U+0040blockinfix0.16666666666666666em0.16666666666666666emN/A
^ U+005Einlineinfix0.16666666666666666em0.16666666666666666emN/A
· U+00B7blockinfix0.16666666666666666em0.16666666666666666emN/A
× U+00D7blockinfix0.16666666666666666em0.16666666666666666emN/A
• U+2022blockinfix0.16666666666666666em0.16666666666666666emN/A
⁃ U+2043blockinfix0.16666666666666666em0.16666666666666666emN/A
∗ U+2217blockinfix0.16666666666666666em0.16666666666666666emN/A
∘ U+2218blockinfix0.16666666666666666em0.16666666666666666emN/A
∙ U+2219blockinfix0.16666666666666666em0.16666666666666666emN/A
≀ U+2240blockinfix0.16666666666666666em0.16666666666666666emN/A
⊗ U+2297blockinfix0.16666666666666666em0.16666666666666666emN/A
⊙ U+2299blockinfix0.16666666666666666em0.16666666666666666emN/A
⊚ U+229Ablockinfix0.16666666666666666em0.16666666666666666emN/A
⊛ U+229Bblockinfix0.16666666666666666em0.16666666666666666emN/A
⊠ U+22A0blockinfix0.16666666666666666em0.16666666666666666emN/A
⊡ U+22A1blockinfix0.16666666666666666em0.16666666666666666emN/A
⊺ U+22BAblockinfix0.16666666666666666em0.16666666666666666emN/A
⋄ U+22C4blockinfix0.16666666666666666em0.16666666666666666emN/A
⋅ U+22C5blockinfix0.16666666666666666em0.16666666666666666emN/A
⋆ U+22C6blockinfix0.16666666666666666em0.16666666666666666emN/A
⋇ U+22C7blockinfix0.16666666666666666em0.16666666666666666emN/A
⋉ U+22C9blockinfix0.16666666666666666em0.16666666666666666emN/A
⋊ U+22CAblockinfix0.16666666666666666em0.16666666666666666emN/A
⋋ U+22CBblockinfix0.16666666666666666em0.16666666666666666emN/A
⋌ U+22CCblockinfix0.16666666666666666em0.16666666666666666emN/A
⌅ U+2305blockinfix0.16666666666666666em0.16666666666666666emN/A
⌆ U+2306blockinfix0.16666666666666666em0.16666666666666666emN/A
⟋ U+27CBblockinfix0.16666666666666666em0.16666666666666666emN/A
⟍ U+27CDblockinfix0.16666666666666666em0.16666666666666666emN/A
⧆ U+29C6blockinfix0.16666666666666666em0.16666666666666666emN/A
⧇ U+29C7blockinfix0.16666666666666666em0.16666666666666666emN/A
⧈ U+29C8blockinfix0.16666666666666666em0.16666666666666666emN/A
⧔ U+29D4blockinfix0.16666666666666666em0.16666666666666666emN/A
⧕ U+29D5blockinfix0.16666666666666666em0.16666666666666666emN/A
⧖ U+29D6blockinfix0.16666666666666666em0.16666666666666666emN/A
⧗ U+29D7blockinfix0.16666666666666666em0.16666666666666666emN/A
⧢ U+29E2blockinfix0.16666666666666666em0.16666666666666666emN/A
⨝ U+2A1Dblockinfix0.16666666666666666em0.16666666666666666emN/A
⨞ U+2A1Eblockinfix0.16666666666666666em0.16666666666666666emN/A
⨯ U+2A2Fblockinfix0.16666666666666666em0.16666666666666666emN/A
⨰ U+2A30blockinfix0.16666666666666666em0.16666666666666666emN/A
⨱ U+2A31blockinfix0.16666666666666666em0.16666666666666666emN/A
⨲ U+2A32blockinfix0.16666666666666666em0.16666666666666666emN/A
⨳ U+2A33blockinfix0.16666666666666666em0.16666666666666666emN/A
⨴ U+2A34blockinfix0.16666666666666666em0.16666666666666666emN/A
⨵ U+2A35blockinfix0.16666666666666666em0.16666666666666666emN/A
⨶ U+2A36blockinfix0.16666666666666666em0.16666666666666666emN/A
⨷ U+2A37blockinfix0.16666666666666666em0.16666666666666666emN/A
⨻ U+2A3Bblockinfix0.16666666666666666em0.16666666666666666emN/A
⨼ U+2A3Cblockinfix0.16666666666666666em0.16666666666666666emN/A
⨽ U+2A3Dblockinfix0.16666666666666666em0.16666666666666666emN/A
⨿ U+2A3Fblockinfix0.16666666666666666em0.16666666666666666emN/A
⩐ U+2A50blockinfix0.16666666666666666em0.16666666666666666emN/A
⩤ U+2A64blockinfix0.16666666666666666em0.16666666666666666emN/A
⩥ U+2A65blockinfix0.16666666666666666em0.16666666666666666emN/A
⫝̸ U+2ADCblockinfix0.16666666666666666em0.16666666666666666emN/A
⫝ U+2ADDblockinfix0.16666666666666666em0.16666666666666666emN/A
⫾ U+2AFEblockinfix0.16666666666666666em0.16666666666666666emN/A
String ** U+002A U+002Ablockinfix0.16666666666666666em0.16666666666666666emN/A
String <> U+003C U+003Eblockinfix0.16666666666666666em0.16666666666666666emN/A
! U+0021blockprefix00N/A
+ U+002Bblockprefix00N/A
- U+002Dblockprefix00N/A
¬ U+00ACblockprefix00N/A
± U+00B1blockprefix00N/A
‘ U+2018blockprefix00fence
“ U+201Cblockprefix00fence
∀ U+2200blockprefix00N/A
∁ U+2201blockprefix00N/A
∃ U+2203blockprefix00N/A
∄ U+2204blockprefix00N/A
∇ U+2207blockprefix00N/A
− U+2212blockprefix00N/A
∓ U+2213blockprefix00N/A
∟ U+221Fblockprefix00N/A
∠ U+2220blockprefix00N/A
∡ U+2221blockprefix00N/A
∢ U+2222blockprefix00N/A
∴ U+2234blockprefix00N/A
∵ U+2235blockprefix00N/A
∼ U+223Cblockprefix00N/A
⊾ U+22BEblockprefix00N/A
⊿ U+22BFblockprefix00N/A
⌐ U+2310blockprefix00N/A
⌙ U+2319blockprefix00N/A
➕ U+2795blockprefix00N/A
➖ U+2796blockprefix00N/A
⟀ U+27C0blockprefix00N/A
⦛ U+299Bblockprefix00N/A
⦜ U+299Cblockprefix00N/A
⦝ U+299Dblockprefix00N/A
⦞ U+299Eblockprefix00N/A
⦟ U+299Fblockprefix00N/A
⦠ U+29A0blockprefix00N/A
⦡ U+29A1blockprefix00N/A
⦢ U+29A2blockprefix00N/A
⦣ U+29A3blockprefix00N/A
⦤ U+29A4blockprefix00N/A
⦥ U+29A5blockprefix00N/A
⦦ U+29A6blockprefix00N/A
⦧ U+29A7blockprefix00N/A
⦨ U+29A8blockprefix00N/A
⦩ U+29A9blockprefix00N/A
⦪ U+29AAblockprefix00N/A
⦫ U+29ABblockprefix00N/A
⦬ U+29ACblockprefix00N/A
⦭ U+29ADblockprefix00N/A
⦮ U+29AEblockprefix00N/A
⦯ U+29AFblockprefix00N/A
⫬ U+2AECblockprefix00N/A
⫭ U+2AEDblockprefix00N/A
String || U+007C U+007Cblockprefix00fence
! U+0021blockpostfix00N/A
" U+0022blockpostfix00N/A
% U+0025blockpostfix00N/A
& U+0026blockpostfix00N/A
' U+0027blockpostfix00N/A
` U+0060blockpostfix00N/A
¨ U+00A8blockpostfix00N/A
° U+00B0blockpostfix00N/A
² U+00B2blockpostfix00N/A
³ U+00B3blockpostfix00N/A
´ U+00B4blockpostfix00N/A
¸ U+00B8blockpostfix00N/A
¹ U+00B9blockpostfix00N/A
ˊ U+02CAblockpostfix00N/A
ˋ U+02CBblockpostfix00N/A
˘ U+02D8blockpostfix00N/A
˙ U+02D9blockpostfix00N/A
˚ U+02DAblockpostfix00N/A
˝ U+02DDblockpostfix00N/A
̑ U+0311blockpostfix00N/A
’ U+2019blockpostfix00fence
‚ U+201Ablockpostfix00N/A
‛ U+201Bblockpostfix00N/A
” U+201Dblockpostfix00fence
„ U+201Eblockpostfix00N/A
‟ U+201Fblockpostfix00N/A
′ U+2032blockpostfix00N/A
″ U+2033blockpostfix00N/A
‴ U+2034blockpostfix00N/A
‵ U+2035blockpostfix00N/A
‶ U+2036blockpostfix00N/A
‷ U+2037blockpostfix00N/A
⁗ U+2057blockpostfix00N/A
⃛ U+20DBblockpostfix00N/A
⃜ U+20DCblockpostfix00N/A
⏍ U+23CDblockpostfix00N/A
String !! U+0021 U+0021blockpostfix00N/A
String ++ U+002B U+002Bblockpostfix00N/A
String -- U+002D U+002Dblockpostfix00N/A
String || U+007C U+007Cblockpostfix00fence
( U+0028blockprefix00stretchy symmetric fence
[ U+005Bblockprefix00stretchy symmetric fence
{ U+007Bblockprefix00stretchy symmetric fence
| U+007Cblockprefix00stretchy symmetric fence
‖ U+2016blockprefix00stretchy symmetric fence
⌈ U+2308blockprefix00stretchy symmetric fence
⌊ U+230Ablockprefix00stretchy symmetric fence
〈 U+2329blockprefix00stretchy symmetric fence
❲ U+2772blockprefix00stretchy symmetric fence
⟦ U+27E6blockprefix00stretchy symmetric fence
⟨ U+27E8blockprefix00stretchy symmetric fence
⟪ U+27EAblockprefix00stretchy symmetric fence
⟬ U+27ECblockprefix00stretchy symmetric fence
⟮ U+27EEblockprefix00stretchy symmetric fence
⦀ U+2980blockprefix00stretchy symmetric fence
⦃ U+2983blockprefix00stretchy symmetric fence
⦅ U+2985blockprefix00stretchy symmetric fence
⦇ U+2987blockprefix00stretchy symmetric fence
⦉ U+2989blockprefix00stretchy symmetric fence
⦋ U+298Bblockprefix00stretchy symmetric fence
⦍ U+298Dblockprefix00stretchy symmetric fence
⦏ U+298Fblockprefix00stretchy symmetric fence
⦑ U+2991blockprefix00stretchy symmetric fence
⦓ U+2993blockprefix00stretchy symmetric fence
⦕ U+2995blockprefix00stretchy symmetric fence
⦗ U+2997blockprefix00stretchy symmetric fence
⦙ U+2999blockprefix00stretchy symmetric fence
⧘ U+29D8blockprefix00stretchy symmetric fence
⧚ U+29DAblockprefix00stretchy symmetric fence
⧼ U+29FCblockprefix00stretchy symmetric fence
) U+0029blockpostfix00stretchy symmetric fence
] U+005Dblockpostfix00stretchy symmetric fence
| U+007Cblockpostfix00stretchy symmetric fence
} U+007Dblockpostfix00stretchy symmetric fence
‖ U+2016blockpostfix00stretchy symmetric fence
⌉ U+2309blockpostfix00stretchy symmetric fence
⌋ U+230Bblockpostfix00stretchy symmetric fence
〉 U+232Ablockpostfix00stretchy symmetric fence
❳ U+2773blockpostfix00stretchy symmetric fence
⟧ U+27E7blockpostfix00stretchy symmetric fence
⟩ U+27E9blockpostfix00stretchy symmetric fence
⟫ U+27EBblockpostfix00stretchy symmetric fence
⟭ U+27EDblockpostfix00stretchy symmetric fence
⟯ U+27EFblockpostfix00stretchy symmetric fence
⦀ U+2980blockpostfix00stretchy symmetric fence
⦄ U+2984blockpostfix00stretchy symmetric fence
⦆ U+2986blockpostfix00stretchy symmetric fence
⦈ U+2988blockpostfix00stretchy symmetric fence
⦊ U+298Ablockpostfix00stretchy symmetric fence
⦌ U+298Cblockpostfix00stretchy symmetric fence
⦎ U+298Eblockpostfix00stretchy symmetric fence
⦐ U+2990blockpostfix00stretchy symmetric fence
⦒ U+2992blockpostfix00stretchy symmetric fence
⦔ U+2994blockpostfix00stretchy symmetric fence
⦖ U+2996blockpostfix00stretchy symmetric fence
⦘ U+2998blockpostfix00stretchy symmetric fence
⦙ U+2999blockpostfix00stretchy symmetric fence
⧙ U+29D9blockpostfix00stretchy symmetric fence
⧛ U+29DBblockpostfix00stretchy symmetric fence
⧽ U+29FDblockpostfix00stretchy symmetric fence
∫ U+222Bblockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
∬ U+222Cblockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
∭ U+222Dblockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
∮ U+222Eblockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
∯ U+222Fblockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
∰ U+2230blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
∱ U+2231blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
∲ U+2232blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
∳ U+2233blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
⨋ U+2A0Bblockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
⨌ U+2A0Cblockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
⨍ U+2A0Dblockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
⨎ U+2A0Eblockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
⨏ U+2A0Fblockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
⨐ U+2A10blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
⨑ U+2A11blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
⨒ U+2A12blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
⨓ U+2A13blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
⨔ U+2A14blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
⨕ U+2A15blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
⨖ U+2A16blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
⨗ U+2A17blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
⨘ U+2A18blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
⨙ U+2A19blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
⨚ U+2A1Ablockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
⨛ U+2A1Bblockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
⨜ U+2A1Cblockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop
^ U+005Einlinepostfix00stretchy
_ U+005Finlinepostfix00stretchy
~ U+007Einlinepostfix00stretchy
¯ U+00AFinlinepostfix00stretchy
ˆ U+02C6inlinepostfix00stretchy
ˇ U+02C7inlinepostfix00stretchy
ˉ U+02C9inlinepostfix00stretchy
ˍ U+02CDinlinepostfix00stretchy
˜ U+02DCinlinepostfix00stretchy
˷ U+02F7inlinepostfix00stretchy
̂ U+0302inlinepostfix00stretchy
‾ U+203Einlinepostfix00stretchy
⌢ U+2322inlinepostfix00stretchy
⌣ U+2323inlinepostfix00stretchy
⎴ U+23B4inlinepostfix00stretchy
⎵ U+23B5inlinepostfix00stretchy
⏜ U+23DCinlinepostfix00stretchy
⏝ U+23DDinlinepostfix00stretchy
⏞ U+23DEinlinepostfix00stretchy
⏟ U+23DFinlinepostfix00stretchy
⏠ U+23E0inlinepostfix00stretchy
⏡ U+23E1inlinepostfix00stretchy
𞻰 U+1EEF0inlinepostfix00stretchy
𞻱 U+1EEF1inlinepostfix00stretchy
∏ U+220Fblockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
∐ U+2210blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
∑ U+2211blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
⋀ U+22C0blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
⋁ U+22C1blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
⋂ U+22C2blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
⋃ U+22C3blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
⨀ U+2A00blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
⨁ U+2A01blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
⨂ U+2A02blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
⨃ U+2A03blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
⨄ U+2A04blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
⨅ U+2A05blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
⨆ U+2A06blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
⨇ U+2A07blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
⨈ U+2A08blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
⨉ U+2A09blockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
⨊ U+2A0Ablockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
⨝ U+2A1Dblockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
⨞ U+2A1Eblockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
⫼ U+2AFCblockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
⫿ U+2AFFblockprefix0.16666666666666666em0.16666666666666666emsymmetric largeop movablelimits
/ U+002Fblockinfix00N/A
\ U+005Cblockinfix00N/A
_ U+005Finlineinfix00N/A
⁡ U+2061blockinfix00N/A
⁢ U+2062blockinfix00N/A
⁣ U+2063blockinfix00separator
⁤ U+2064blockinfix00N/A
∆ U+2206blockinfix00N/A
ⅅ U+2145blockprefix0.16666666666666666em0N/A
ⅆ U+2146blockprefix0.16666666666666666em0N/A
∂ U+2202blockprefix0.16666666666666666em0N/A
√ U+221Ablockprefix0.16666666666666666em0N/A
∛ U+221Bblockprefix0.16666666666666666em0N/A
∜ U+221Cblockprefix0.16666666666666666em0N/A
, U+002Cblockinfix00.16666666666666666emseparator
: U+003Ablockinfix00.16666666666666666emN/A
; U+003Bblockinfix00.16666666666666666emseparator
Figure 29 Mapping from operator (Content, Form) to properties.
Total size: 1177 entries, ≥ 3679 bytes
(assuming 'Content' uses at least one UTF-16 character, 'Stretch Axis' 1 bit, 'Form' 2 bits, the different combinations of 'rspace' and 'space' at least 3 bits, and the different combinations of properties 3 bits).

B.3 Combining Character Equivalences

This section is non-normative.

The following table gives mappings between spacing and non spacing characters when used in MathML accent constructs.

Combining

Non CombiningStyleCombining
U+002Bplus signbelowU+031Fcombining plus sign below
U+002Dhyphen-minusaboveU+0305combining overline
U+002Dhyphen-minusbelowU+0320combining minus sign below
U+002Dhyphen-minusbelowU+0332combining low line
U+002Efull stopaboveU+0307combining dot above
U+002Efull stopbelowU+0323combining dot below
U+005Ecircumflex accentaboveU+0302combining circumflex accent
U+005Ecircumflex accentbelowU+032Dcombining circumflex accent below
U+005Flow linebelowU+0332combining low line
U+0060grave accentaboveU+0300combining grave accent
U+0060grave accentbelowU+0316combining grave accent below
U+007EtildeaboveU+0303combining tilde
U+007EtildebelowU+0330combining tilde below
U+00A8diaeresisaboveU+0308combining diaeresis
U+00A8diaeresisbelowU+0324combining diaeresis below
U+00AFmacronaboveU+0304combining macron
U+00AFmacronaboveU+0305combining overline
U+00B4acute accentaboveU+0301combining acute accent
U+00B4acute accentbelowU+0317combining acute accent below
U+00B8cedillabelowU+0327combining cedilla
U+02C6modifier letter circumflex accentaboveU+0302combining circumflex accent
U+02C7caronaboveU+030Ccombining caron
U+02C7caronbelowU+032Ccombining caron below
U+02D8breveaboveU+0306combining breve
U+02D8brevebelowU+032Ecombining breve below
U+02D9dot aboveaboveU+0307combining dot above
U+02D9dot abovebelowU+0323combining dot below
U+02DBogonekbelowU+0328combining ogonek
U+02DCsmall tildeaboveU+0303combining tilde
U+02DCsmall tildebelowU+0330combining tilde below
U+02DDdouble acute accentaboveU+030Bcombining double acute accent
U+203EoverlineaboveU+0305combining overline
U+2190leftwards arrowaboveU+20D6
U+2192rightwards arrowaboveU+20D7combining right arrow above
U+2192rightwards arrowaboveU+20EFcombining right arrow below
U+2212minus signaboveU+0305combining overline
U+2212minus signbelowU+0332combining low line
U+27F6long rightwards arrowaboveU+20D7combining right arrow above
U+27F6long rightwards arrowaboveU+20EFcombining right arrow below

Non Combining

CombiningStyleNon Combining
U+0300combining grave accentaboveU+0060grave accent
U+0301combining acute accentaboveU+00B4acute accent
U+0302combining circumflex accentaboveU+005Ecircumflex accent
U+0302combining circumflex accentaboveU+02C6modifier letter circumflex accent
U+0303combining tildeaboveU+007Etilde
U+0303combining tildeaboveU+02DCsmall tilde
U+0304combining macronaboveU+00AFmacron
U+0305combining overlineaboveU+002Dhyphen-minus
U+0305combining overlineaboveU+00AFmacron
U+0305combining overlineaboveU+203Eoverline
U+0305combining overlineaboveU+2212minus sign
U+0306combining breveaboveU+02D8breve
U+0307combining dot aboveaboveU+02E
U+0307combining dot aboveaboveU+002Efull stop
U+0307combining dot aboveaboveU+02D9dot above
U+0308combining diaeresisaboveU+00A8diaeresis
U+030Bcombining double acute accentaboveU+02DDdouble acute accent
U+030Ccombining caronaboveU+02C7caron
U+0312combining turned comma aboveaboveU+0B8
U+0316combining grave accent belowbelowU+0060grave accent
U+0317combining acute accent belowbelowU+00B4acute accent
U+031Fcombining plus sign belowbelowU+002Bplus sign
U+0320combining minus sign belowbelowU+002Dhyphen-minus
U+0323combining dot belowbelowU+002Efull stop
U+0323combining dot belowbelowU+02D9dot above
U+0324combining diaeresis belowbelowU+00A8diaeresis
U+0327combining cedillabelowU+00B8cedilla
U+0328combining ogonekbelowU+02DBogonek
U+032Ccombining caron belowbelowU+02C7caron
U+032Dcombining circumflex accent belowbelowU+005Ecircumflex accent
U+032Ecombining breve belowbelowU+02D8breve
U+0330combining tilde belowbelowU+007Etilde
U+0330combining tilde belowbelowU+02DCsmall tilde
U+0332combining low linebelowU+002Dhyphen-minus
U+0332combining low linebelowU+005Flow line
U+0332combining low linebelowU+2212minus sign
U+0338combining long solidus overlayoverU+02F
U+20D7combining right arrow aboveaboveU+2192rightwards arrow
U+20D7combining right arrow aboveaboveU+27F6long rightwards arrow
U+20EFcombining right arrow belowaboveU+2192rightwards arrow
U+20EFcombining right arrow belowaboveU+27F6long rightwards arrow

B.4 Unicode-based Glyph Assemblies

This section is non-normative.

The following table provides fallback that user agents may use for stretching a given base character when the font does not provide a MATH.MathVariants table. The algorithms of 5.3 Size variants for operators (MathVariants) work the same except with some adjustments:

Base Character Glyph Construction Extender Character Bottom/Left Character Middle Character Top/Right Character
U+0028 ( Vertical U+239C ⎜ U+239D ⎝ N/A U+239B ⎛
U+0029 ) Vertical U+239F ⎟ U+23A0 ⎠ N/A U+239E ⎞
U+003D = Horizontal U+003D = U+003D = N/A N/A
U+005B [ Vertical U+23A2 ⎢ U+23A3 ⎣ N/A U+23A1 ⎡
U+005D ] Vertical U+23A5 ⎥ U+23A6 ⎦ N/A U+23A4 ⎤
U+005F _ Horizontal U+005F _ U+005F _ N/A N/A
U+007B { Vertical U+23AA ⎪ U+23A9 ⎩ U+23A8 ⎨ U+23A7 ⎧
U+007C | Vertical U+007C | U+007C | N/A N/A
U+007D } Vertical U+23AA ⎪ U+23AD ⎭ U+23AC ⎬ U+23AB ⎫
U+00AF ¯ Horizontal U+00AF ¯ U+00AF ¯ N/A N/A
U+2016 ‖ Vertical U+2016 ‖ U+2016 ‖ N/A N/A
U+203E ‾ Horizontal U+203E ‾ U+203E ‾ N/A N/A
U+2190 ← Horizontal U+23AF ⎯ U+2190 ← N/A U+23AF ⎯
U+2191 ↑ Vertical U+23D0 ⏐ U+23D0 ⏐ N/A U+2191 ↑
U+2192 → Horizontal U+23AF ⎯ U+23AF ⎯ N/A U+2192 →
U+2193 ↓ Vertical U+23D0 ⏐ U+2193 ↓ N/A U+23D0 ⏐
U+2194 ↔ Horizontal U+23AF ⎯ U+2190 ← N/A U+2192 →
U+2195 ↕ Vertical U+23D0 ⏐ U+2193 ↓ N/A U+2191 ↑
U+21A4 ↤ Horizontal U+23AF ⎯ U+2190 ← N/A U+22A3 ⊣
U+21A6 ↦ Horizontal U+23AF ⎯ U+22A2 ⊢ N/A U+2192 →
U+21BC ↼ Horizontal U+23AF ⎯ U+21BC ↼ N/A U+23AF ⎯
U+21BD ↽ Horizontal U+23AF ⎯ U+21BD ↽ N/A U+23AF ⎯
U+21C0 ⇀ Horizontal U+23AF ⎯ U+23AF ⎯ N/A U+21C0 ⇀
U+21C1 ⇁ Horizontal U+23AF ⎯ U+23AF ⎯ N/A U+21C1 ⇁
U+2223 ∣ Vertical U+2223 ∣ U+2223 ∣ N/A N/A
U+2225 ∥ Vertical U+2225 ∥ U+2225 ∥ N/A N/A
U+2308 ⌈ Vertical U+23A2 ⎢ U+23A2 ⎢ N/A U+23A1 ⎡
U+2309 ⌉ Vertical U+23A5 ⎥ U+23A5 ⎥ N/A U+23A4 ⎤
U+230A ⌊ Vertical U+23A2 ⎢ U+23A3 ⎣ N/A N/A
U+230B ⌋ Vertical U+23A5 ⎥ U+23A6 ⎦ N/A N/A
U+23B0 ⎰ Vertical U+23AA ⎪ U+23AD ⎭ N/A U+23A7 ⎧
U+23B1 ⎱ Vertical U+23AA ⎪ U+23A9 ⎩ N/A U+23AB ⎫
U+27F5 ⟵ Horizontal U+23AF ⎯ U+2190 ← N/A U+23AF ⎯
U+27F6 ⟶ Horizontal U+23AF ⎯ U+23AF ⎯ N/A U+2192 →
U+27F7 ⟷ Horizontal U+23AF ⎯ U+2190 ← N/A U+2192 →
U+294E ⥎ Horizontal U+23AF ⎯ U+21BC ↼ N/A U+21C0 ⇀
U+2950 ⥐ Horizontal U+23AF ⎯ U+21BD ↽ N/A U+21C1 ⇁
U+295A ⥚ Horizontal U+23AF ⎯ U+21BC ↼ N/A U+22A3 ⊣
U+295B ⥛ Horizontal U+23AF ⎯ U+22A2 ⊢ N/A U+21C0 ⇀
U+295E ⥞ Horizontal U+23AF ⎯ U+21BD ↽ N/A U+22A3 ⊣
U+295F ⥟ Horizontal U+23AF ⎯ U+22A2 ⊢ N/A U+21C1 ⇁

C. Mathematical Alphanumeric Symbols

This section is non-normative.

As detailed in [xml-entity-names] mathematical alphanumeric symbols with form bold, italic, fraktur, monospace, double-struck etc are available in Unicode.

These alphanumeric symbols should be accessed using their Unicode code points. It is sometimes needed to distinguish between Chancery and Roundhand style for MATHEMATICAL SCRIPT characters. These are notably used in LaTeX for the \mathcal and \mathscr commands. One way to do that is to rely on Chapter 23.4 Variation Selectors of Unicode which describes a way to specify selection of particular glyph variants [UNICODE]. Indeed, the StandardizedVariants.txt file from the Unicode Character Database indicates that variant selectors U+FE00 and U+FE01 can be used on capital script to specify Chancery and Roundhand respectively.

Alternatively, some mathematical fonts rely on salt or ssXY properties from [OPEN-FONT-FORMAT] to provide both styles. Page authors may use the font-variant-alternates property with corresponding OpenType font features to access these glyphs.

In addition, the italic math alphanumeric characters may be accessed as described above using the CSS text-transform: math-auto transform which is applied by default to single character <mi> elements. As a convenience the mapping to math italic is shown below.

C.1 italic mappings

OriginalitalicΔcode point
A U+0041𝐴 U+1D4341D3F3
B U+0042𝐵 U+1D4351D3F3
C U+0043𝐶 U+1D4361D3F3
D U+0044𝐷 U+1D4371D3F3
E U+0045𝐸 U+1D4381D3F3
F U+0046𝐹 U+1D4391D3F3
G U+0047𝐺 U+1D43A1D3F3
H U+0048𝐻 U+1D43B1D3F3
I U+0049𝐼 U+1D43C1D3F3
J U+004A𝐽 U+1D43D1D3F3
K U+004B𝐾 U+1D43E1D3F3
L U+004C𝐿 U+1D43F1D3F3
M U+004D𝑀 U+1D4401D3F3
N U+004E𝑁 U+1D4411D3F3
O U+004F𝑂 U+1D4421D3F3
P U+0050𝑃 U+1D4431D3F3
Q U+0051𝑄 U+1D4441D3F3
R U+0052𝑅 U+1D4451D3F3
S U+0053𝑆 U+1D4461D3F3
T U+0054𝑇 U+1D4471D3F3
U U+0055𝑈 U+1D4481D3F3
V U+0056𝑉 U+1D4491D3F3
W U+0057𝑊 U+1D44A1D3F3
X U+0058𝑋 U+1D44B1D3F3
Y U+0059𝑌 U+1D44C1D3F3
Z U+005A𝑍 U+1D44D1D3F3
a U+0061𝑎 U+1D44E1D3ED
b U+0062𝑏 U+1D44F1D3ED
c U+0063𝑐 U+1D4501D3ED
d U+0064𝑑 U+1D4511D3ED
e U+0065𝑒 U+1D4521D3ED
f U+0066𝑓 U+1D4531D3ED
g U+0067𝑔 U+1D4541D3ED
h U+0068ℎ U+0210E20A6
i U+0069𝑖 U+1D4561D3ED
j U+006A𝑗 U+1D4571D3ED
k U+006B𝑘 U+1D4581D3ED
l U+006C𝑙 U+1D4591D3ED
m U+006D𝑚 U+1D45A1D3ED
n U+006E𝑛 U+1D45B1D3ED
o U+006F𝑜 U+1D45C1D3ED
p U+0070𝑝 U+1D45D1D3ED
q U+0071𝑞 U+1D45E1D3ED
r U+0072𝑟 U+1D45F1D3ED
s U+0073𝑠 U+1D4601D3ED
t U+0074𝑡 U+1D4611D3ED
u U+0075𝑢 U+1D4621D3ED
v U+0076𝑣 U+1D4631D3ED
w U+0077𝑤 U+1D4641D3ED
x U+0078𝑥 U+1D4651D3ED
y U+0079𝑦 U+1D4661D3ED
z U+007A𝑧 U+1D4671D3ED
ı U+0131𝚤 U+1D6A41D573
ȷ U+0237𝚥 U+1D6A51D46E
Α U+0391𝛢 U+1D6E21D351
Β U+0392𝛣 U+1D6E31D351
Γ U+0393𝛤 U+1D6E41D351
Δ U+0394𝛥 U+1D6E51D351
Ε U+0395𝛦 U+1D6E61D351
Ζ U+0396𝛧 U+1D6E71D351
Η U+0397𝛨 U+1D6E81D351
Θ U+0398𝛩 U+1D6E91D351
Ι U+0399𝛪 U+1D6EA1D351
Κ U+039A𝛫 U+1D6EB1D351
Λ U+039B𝛬 U+1D6EC1D351
Μ U+039C𝛭 U+1D6ED1D351
Ν U+039D𝛮 U+1D6EE1D351
Ξ U+039E𝛯 U+1D6EF1D351
Ο U+039F𝛰 U+1D6F01D351
Π U+03A0𝛱 U+1D6F11D351
Ρ U+03A1𝛲 U+1D6F21D351
ϴ U+03F4𝛳 U+1D6F31D2FF
Σ U+03A3𝛴 U+1D6F41D351
Τ U+03A4𝛵 U+1D6F51D351
Υ U+03A5𝛶 U+1D6F61D351
Φ U+03A6𝛷 U+1D6F71D351
Χ U+03A7𝛸 U+1D6F81D351
Ψ U+03A8𝛹 U+1D6F91D351
Ω U+03A9𝛺 U+1D6FA1D351
∇ U+2207𝛻 U+1D6FB1B4F4
α U+03B1𝛼 U+1D6FC1D34B
β U+03B2𝛽 U+1D6FD1D34B
γ U+03B3𝛾 U+1D6FE1D34B
δ U+03B4𝛿 U+1D6FF1D34B
ε U+03B5𝜀 U+1D7001D34B
ζ U+03B6𝜁 U+1D7011D34B
η U+03B7𝜂 U+1D7021D34B
θ U+03B8𝜃 U+1D7031D34B
ι U+03B9𝜄 U+1D7041D34B
κ U+03BA𝜅 U+1D7051D34B
λ U+03BB𝜆 U+1D7061D34B
μ U+03BC𝜇 U+1D7071D34B
ν U+03BD𝜈 U+1D7081D34B
ξ U+03BE𝜉 U+1D7091D34B
ο U+03BF𝜊 U+1D70A1D34B
π U+03C0𝜋 U+1D70B1D34B
ρ U+03C1𝜌 U+1D70C1D34B
ς U+03C2𝜍 U+1D70D1D34B
σ U+03C3𝜎 U+1D70E1D34B
τ U+03C4𝜏 U+1D70F1D34B
υ U+03C5𝜐 U+1D7101D34B
φ U+03C6𝜑 U+1D7111D34B
χ U+03C7𝜒 U+1D7121D34B
ψ U+03C8𝜓 U+1D7131D34B
ω U+03C9𝜔 U+1D7141D34B
∂ U+2202𝜕 U+1D7151B513
ϵ U+03F5𝜖 U+1D7161D321
ϑ U+03D1𝜗 U+1D7171D346
ϰ U+03F0𝜘 U+1D7181D328
ϕ U+03D5𝜙 U+1D7191D344
ϱ U+03F1𝜚 U+1D71A1D329
ϖ U+03D6𝜛 U+1D71B1D345

D. Acknowledgments

This section is non-normative.

MathML Core is based on MathML3. See the appendix E of [MathML3] for the people that contributed to that specification.

MathML Core was initially developed by the MathML Community Group, and then by the Math Working Group. Working Group or Community Group members who regularly participated in MathML Core meetings during the development of this specification: Brian Kardell, Bruce Miller, Daniel Marques, David Carlisle, David Farmer, Deyan Ginev, Frédéric Wang, Louis Mahler, Moritz Schubotz, Murray Sargent, Neil Soiffer, Patrick Ion, Rob Buis, Steve Noble and Sam Dooley.

In addition, we would like to extend special thanks to Brian Kardell, Neil Soiffer and Rob Buis for help with the editing.

Many thanks also to the following people for their help with the test suite: Brian Kardell, Frédéric Wang, Neil Soiffer and Rob Buis. Several tests are also based on MathML tests from browser repositories and we are grateful to the Mozilla and WebKit contributors.

We would like to thank the people who, through their input and feedback on public communication channels, have helped us with the creation of this specification: André Greiner-Petter, Anne van Kesteren, Boris Zbarsky, Brian Smith, Elika Etemad, Emilio Cobos Álvarez, ExE Boss, Ian Kilpatrick, Koji Ishii, L. David Baron, Michael Kohlhase, Michael Smith, Ryosuke Niwa, Sergey Malkin, Tab Atkins Jr., Viktor Yaffle and frankvel.

E. Security Considerations

This section is non-normative.

This specification adds script execution mechanisms via the MathML event handler attributes described in 2.1.3 Global Attributes. UAs may decide to prevent execution of scripts specified in these attributes, following the same security restrictions as those applying to HTML or SVG elements.

Note

In [MathML3], it was possible to make any element linkable via href or xlink:href attributes, with an URL pointing to an untrusted resource or even javascript: execution. These attributes are not available in MathML Core. However, as described in 2.2.1 HTML and SVG it is possible to embed HTML or SVG content inside MathML, including HTML or SVG links.

Note

In [MathML3], it was possible to use the maction element with the actiontype value set to "statusline" in order to override the text of the browser statusline. In particular, an attacker could use this to hide the URL text of an untrusted link e.g.

<math>
  <maction actiontype="statusline">
    <mtext><a href="javascript:alert('JS execution')">Click me!</a></mtext>
    <mtext>./this-is-a-safe-link.html</mtext>
  </maction>
</math>

This feature is not available in MathML Core, where the maction element essentially behaves like an mrow container with extra style.

An attacker can try to hang the UA by inserting very large stretchy operators, effectively making the algorithm shaping of the glyph assembly deal with a huge amount of glyphs. UAs may work around this issue by limiting rmin and GlyphAssembly.partCount to maximum values.

As described in CSS Fonts Module, an attacker can try to rely on malformed or malicious fonts to exploit potential security faults in browser implementations. Because the OpenType MATH table is used extensively in this specification, UAs should ensure their font sanitization mechanisms are able to deal with that table.

Finally, in order to reduce attack surface, some UAs expose runtime options to disable part of the web platform. Disabling MathML layout can essentially be achieved by forcing elements in the DOM tree to be put in the HTML namespace and disabling 4. CSS Extensions for Math Layout.

F. Privacy Considerations

This section is non-normative.

As explained in 2.2.1 HTML and SVG, MathML can be embedded into an SVG image via the <foreignObject> element which can thus be used in a canvas element. UA may decide to implement any measure to prevent potential information leakage such as tainting the canvas and returning a "SecurityError" when one tries to access the canvas' content via JavaScript APIs.

In the following example, the canvas image is set to the image of some MathML content with an HTML link to https://example.org/. It should not be possible for an attacker to determine whether that link was visited by reading pixels via context.getImageData(). For more about links in MathML, see E. Security Considerations.

let svg = `
  <svg xmlns="http://www.w3.org/2000/svg" width="100px" height="100px">
    <foreignObject width="100" height="100"
                   requiredExtensions="http://www.w3.org/1998/Math/MathML">
      <math xmlns="http://www.w3.org/1998/Math/MathML">
        <msqrt style="font-size: 25px">
          <mtext>&#x25a0;</mtext>
          <mtext><a href="https://example.org/">&#x25a0;</a></mtext>
        </msqrt>
      </math>
    </foreignObject>
  </svg>`;
let image = new Image();
image.width = 100;
image.height = 100;
image.onload = () => {
  let canvas = document.createElement('canvas');
  canvas.width = 100;
  canvas.height = 100;
  canvas.style = "border: 1px solid black";
  document.body.appendChild(canvas);
  let context = canvas.getContext("2d");
  context.drawImage(image, 0, 0);
};
image.src = `data:image/svg+xml;base64,${window.btoa(svg)}`;

This specification describes layout of DOM elements which may involve system fonts. Like for HTML/CSS layout, it is thus possible to use JavaScript APIs (e.g. context.getImageData() on content embedded in a canvas context, or even just getBoundingClientRect()) to measure box sizes and positions and infer data from system fonts. By combining miscellaneous tests on such fonts and comparing measurements against results of well-known fonts, an attacker can try and determine the default fonts of the user.

The following HTML+CSS+JavaScript document relies on a Web font with exotic metrics to try and determine whether A Well Known System Font is available by default.

<style>
  @font-face {
    font-family: MyWebFontWithVeryWideGlyphs;
    src: url("/fonts/my-web-fonts-with-very-wide-glyphs.woff");
  }
  #container {
    font-family: AWellKnownSystemFont, MyWebFontWithVeryWideGlyphs;
  }
</style>
<div id="container">SOMETEXT</div>
<div id="reference">SOMETEXT</div>
<script>
document.fonts.ready.then(() => {
  let containerWidth =
    document.getElementById("container").getBoundingClientRect().width;
  let referenceWidth =
    document.getElementById("reference").getBoundingClientRect().width;
  let isWellKnownSystemFontAvailable =
    Math.abs(containerWidth - referenceWidth) < 1;
});
</script>

The following HTML+CSS+JavaScript document tries to determine whether the UI serif font provides Asian glyphs:

<style>
  @font-face {
    font-family: MyWebFontWithVeryWideAsianGlyphs;
    src: url("/fonts/my-web-fonts-with-very-wide-asian-glyphs.woff");
  }
  #container {
    font-family: ui-serif, MyWebFontWithVeryWideAsianGlyphs
  }
  #reference {
    font-family: MyWebFontWithVeryWideAsianGlyphs;
  }
</style>
<div id="container"></div>
<div id="reference"></div>
<script>
document.fonts.ready.then(() => {
  let containerWidth =
    document.getElementById("container").getBoundingClientRect().width;
  let referenceWidth =
    document.getElementById("reference").getBoundingClientRect().width;
  let uiSerifFontDoesNotContainAsianGlyph =
    Math.abs(containerWidth - referenceWidth) < 1;
});
</script>

The following HTML+CSS document contains the same text rendered with text-decoration-thickness set to from-font and 1em (here 100 pixels) respectively. By comparing the heights of the two underlines, one can calculate a good approximation of the underlineThickness value from the PostScript Table [OPEN-FONT-FORMAT].

<style>
  #test {
    font-size: 100px;
  }
  #container {
    text-decoration-line: underline;
    text-decoration-thickness: from-font;
  }
  #reference {
    text-decoration-line: underline;
    text-decoration-thickness: 1em;
  }
</style>
<div id="test">
  <div id="container">SOMETEXT</div>
  <div id="reference">SOMETEXT</div>
</div>

This specification relies on information from 5. OpenType MATH table to render MathML content. One can get good approximation of most layout parameters from MathConstants and MathGlyphInfo using measurement techniques similar to what is described above for HTML+CSS+JavaScript document. The use of the MathVariants table for MathML rendering can also be observed by putting stretchy operators of different sizes inside a canvas context.

Although none of these parameters taken individually are personal, implementing this specification increases the set of exposed font information that can be used by an attacker to implement fingerprinting techniques. Typically, they could help determine available and preferred math fonts for a user.

G. Conformance

Conformance requirements are expressed with a combination of descriptive assertions and RFC 2119 terminology. The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in the normative parts of this document are to be interpreted as described in RFC 2119. However, for readability, these words do not appear in all uppercase letters in this specification.

All of the text of this specification is normative except sections explicitly marked as non-normative, examples, and notes. [RFC2119]

Examples in this specification are introduced with the words “for example” or are set apart from the normative text with class="example", like this:

This is an example of an informative example.

Informative notes begin with the word “Note” and are set apart from the normative text with class="note", like this:

Note

Note, this is an informative note.

Advisements are normative sections styled to evoke special attention and are set apart from other normative text with <strong class="advisement">, like this: UAs MUST provide an accessible alternative.

H. References

H.1 Normative references

[css-align-3]
CSS Box Alignment Module Level 3. Elika Etemad; Tab Atkins Jr.. W3C. 17 February 2023. W3C Working Draft. URL: https://www.w3.org/TR/css-align-3/
[css-backgrounds-3]
CSS Backgrounds and Borders Module Level 3. Elika Etemad; Brad Kemper. W3C. 11 March 2024. W3C Candidate Recommendation. URL: https://www.w3.org/TR/css-backgrounds-3/
[css-box-4]
CSS Box Model Module Level 4. Elika Etemad. W3C. 4 August 2024. W3C Working Draft. URL: https://www.w3.org/TR/css-box-4/
[CSS-CASCADE-4]
CSS Cascading and Inheritance Level 4. Elika Etemad; Tab Atkins Jr.. W3C. 13 January 2022. W3C Candidate Recommendation. URL: https://www.w3.org/TR/css-cascade-4/
[css-color-4]
CSS Color Module Level 4. Chris Lilley; Tab Atkins Jr.; Lea Verou. W3C. 13 February 2024. W3C Candidate Recommendation. URL: https://www.w3.org/TR/css-color-4/
[CSS-DISPLAY-3]
CSS Display Module Level 3. Elika Etemad; Tab Atkins Jr.. W3C. 30 March 2023. W3C Candidate Recommendation. URL: https://www.w3.org/TR/css-display-3/
[CSS-FONTS-4]
CSS Fonts Module Level 4. Chris Lilley. W3C. 1 February 2024. W3C Working Draft. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-POSITION-3]
CSS Positioned Layout Module Level 3. Elika Etemad; Tab Atkins Jr.. W3C. 10 August 2024. W3C Working Draft. URL: https://www.w3.org/TR/css-position-3/
[css-pseudo-4]
CSS Pseudo-Elements Module Level 4. Daniel Glazman; Elika Etemad; Alan Stearns. W3C. 30 December 2022. W3C Working Draft. URL: https://www.w3.org/TR/css-pseudo-4/
[css-sizing-3]
CSS Box Sizing Module Level 3. Tab Atkins Jr.; Elika Etemad. W3C. 17 December 2021. W3C Working Draft. URL: https://www.w3.org/TR/css-sizing-3/
[css-text-3]
CSS Text Module Level 3. Elika Etemad; Koji Ishii; Florian Rivoal. W3C. 30 September 2024. W3C Candidate Recommendation. URL: https://www.w3.org/TR/css-text-3/
[CSS-TEXT-4]
CSS Text Module Level 4. Elika Etemad; Koji Ishii; Alan Stearns; Florian Rivoal. W3C. 29 May 2024. W3C Working Draft. URL: https://www.w3.org/TR/css-text-4/
[CSS-VALUES-4]
CSS Values and Units Module Level 4. Tab Atkins Jr.; Elika Etemad. W3C. 12 March 2024. W3C Working Draft. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-4]
CSS Writing Modes Level 4. Elika Etemad; Koji Ishii. W3C. 30 July 2019. W3C Candidate Recommendation. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. Bert Bos; Tantek Çelik; Ian Hickson; Håkon Wium Lie. W3C. 7 June 2011. W3C Recommendation. URL: https://www.w3.org/TR/CSS21/
[CSS22]
Cascading Style Sheets Level 2 Revision 2 (CSS 2.2) Specification. Bert Bos. W3C. 12 April 2016. W3C Working Draft. URL: https://www.w3.org/TR/CSS22/
[DOM]
DOM Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://dom.spec.whatwg.org/
[HTML]
HTML Standard. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[OPEN-FONT-FORMAT]
Information technology — Coding of audio-visual objects — Part 22: Open Font Format. International Organization for Standardization. URL: http://standards.iso.org/ittf/PubliclyAvailableStandards/c052136_ISO_IEC_14496-22_2009%28E%29.zip
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[SELECT]
Selectors Level 3. Tantek Çelik; Elika Etemad; Daniel Glazman; Ian Hickson; Peter Linss; John Williams. W3C. 6 November 2018. W3C Recommendation. URL: https://www.w3.org/TR/selectors-3/
[SVG]
Scalable Vector Graphics (SVG) 1.0 Specification. Jon Ferraiolo. W3C. 4 September 2001. W3C Recommendation. URL: https://www.w3.org/TR/SVG/
[webidl]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/

H.2 Informative references

[CSS-LAYOUT-API-1]
CSS Layout API Level 1. Greg Whitworth; Ian Kilpatrick; Tab Atkins Jr.; Shane Stephens; Robert O'Callahan; Rossen Atanassov. W3C. 12 April 2018. W3C Working Draft. URL: https://www.w3.org/TR/css-layout-api-1/
[css-text-decor-4]
CSS Text Decoration Module Level 4. Elika Etemad; Koji Ishii. W3C. 4 May 2022. W3C Working Draft. URL: https://www.w3.org/TR/css-text-decor-4/
[cssom-view]
CSSOM View Module. Simon Pieters. W3C. 17 March 2016. W3C Working Draft. URL: https://www.w3.org/TR/cssom-view-1/
[HOUDINI]
CSS-TAG Houdini Editor Drafts. URL: https://drafts.css-houdini.org/
[MATHML3]
Mathematical Markup Language (MathML) Version 3.0 2nd Edition. David Carlisle; Patrick D F Ion; Robert R Miner. W3C. 10 April 2014. W3C Recommendation. URL: https://www.w3.org/TR/MathML3/
[MATHML4]
Mathematical Markup Language (MathML) Version 4.0. David Carlisle et al.. W3C Editor's Draft. URL: https://w3c.github.io/mathml/
[OPEN-TYPE-MATH-ILLUMINATED]
OpenType Math Illuminated. Ulrik Vieth. 2009. URL: https://www.tug.org/TUGboat/tb30-1/tb94vieth.pdf
[OPEN-TYPE-MATH-IN-HARFBUZZ]
OpenType MATH in HarfBuzz. Frédéric Wang. URL: https://frederic-wang.fr/2016/04/16/opentype-math-in-harfbuzz/
[TEXBOOK]
The TeXBook. Knuth, Donald E.. Addison-Wesley Professional. 1984.
[UNICODE]
The Unicode Standard. Unicode Consortium. URL: https://www.unicode.org/versions/latest/
[xml-entity-names]
XML Entity Definitions for Characters (3rd Edition). Patrick D F Ion; David Carlisle. W3C. 7 March 2023. W3C Recommendation. URL: https://www.w3.org/TR/xml-entity-names/