Skip to content

XML data format

ylemkimon edited this page Oct 24, 2017 · 1 revision

The XML format by which mathematical expressions are internally represented is specified as follows:

  • The document is <m>[component]</m>

  • A [component] consists of alternating <e> and <f> nodes, always starting and ending with <e> nodes.

  • <e> nodes represent expressions and contain only text, as in <e>x+1</e>

  • <f> nodes represent symbols and have one attribute: type, whose value comes from the type field in symbols.json. They look like <f type="symbol_type">[sequence of b nodes][sequence of c or l nodes]</f>

  • <b> nodes represent methods for rendering a symbol, specified in the p attribute. They contain text interspersed with <r> nodes which determine where the editable components of the symbol go. For example, a square root symbol will specify how to render itself in LaTeX by having in its b nodes: <b p="latex">\sqrt{<r ref="1" />}</b>, indicating that it should be rendered as \sqrt{first component goes here}.

  • <r> nodes are references to components inside <b> nodes, and have only a ref attribute, whose value is the index of the component that should be rendered in place of that <r> node.

  • <c> nodes are the editable components of a symbol, appearing under an <f> node after the <b> nodes, and in order of index (as referenced in the <r> nodes). They can also appear as children of <l> nodes, representing the elements of the array. They have whatever attributes are specified in the attrs key for this symbol in symbols.json, and they look like <c attrs...>[component]</c>, where a [component] is as defined above.

  • <l> nodes are arrays, and may appear as children of <f> nodes or of other <l> nodes (in the case of a multi-dimensional array). An <l> node always has an s attribute indicating how many immediate children it has (e.g., in the case of a 1D array, how many elements the array has, represented by the number of <c> nodes).

Examples

The simple expression x+1 is represented as:

<m>
  <e>x+1</e>
</m>

sin(x) is represented as:

<m>
  <e></e>
  <f>
    <b p="latex">\sin\left(<r ref="1"/>\right)</b>
    <b p="text">sin(<r ref="1"/>)</b>
    <c><e>x</e></c>
  </f>
  <e></e>
</m>

The square root of x+1 is:

<m>
  <e></e>
  <f>
    <b p="latex">\sqrt{<r ref="1"/>}</b>
    <b p="text">sqrt(<r ref="1"/>)</b>
    <c><e>x+1</e></c>
  </f>
  <e></e>
</m>

1+(1-x)/sin(x) would be represented as:

<m>
  <e>1+</e>
  <f>
    <b p="latex">\dfrac{<r ref="1"/>}{<r ref="2"/>}</b>
    <b p="small_latex">\frac{<r ref="1"/>}{<r ref="2"/>}</b>
    <b p="text">(<r ref="1"/>)/(<r ref="2"/>)</b>
    <c up="1" down="2" name="numerator"><e>1-x</e></c>
    <c up="1" down="2" name="denominator">
      <e></e>
      <f>
        <b p="latex">\sin\left(<r ref="1"/>\right)</b>
        <b p="text">sin(<r ref="1"/>)</b>
        <c><e>x</e></c>
      </f>
      <e></e>
    </c>
  </f>
  <e></e>
</m>

The 2x3 matrix [1, 2, 3; x, y, z] would be represented by:

<m>
  <e></e>
  <f type="matrix" group="array">
    <b p="latex">\left(\begin{matrix} <r ref="1" d="2" sep0=" &amp; " sep1="\\"/> \end{matrix}\right)</b>
    <b p="text">matrix(<r ref="1" d="2" sep0="," sep1=";"/>)</b>
    <l s="2">
      <l s="3">
        <c><e>1</e></c>
	<c><e>2</e></c>
	<c><e>3</e></c>
      </l>
      <l s="3">
        <c><e>x</e></c>
	<c><e>y</e></c>
	<c><e>z</e></c>
      </l>
    </l>
  </f>
  <e></e>
</m>
Clone this wiki locally