Abstract
This document is describes MTEF, the binary equation format used by Equation Editor 3.x (all platforms). MTEF is embedded in OLE equation objects produced by Equation Editor, as well as in all the file formats in which Equation Editor can save equations. The methods used by Equation Editor to embed this information in such files is described in a separate document. See How MTEF is Stored in Files and Objects.
This file was archived on November 9, 2000 and recovered using the Wayback machine. The MathType folks have more recent documentation, but the license restrictions are incompatible with the GPL.
Contents
- Introduction
- Header
- MTEF Byte Stream
- Record Details
- Template Selectors and Variations
- Template Subobject Order
Introduction
This document is describes the binary equation format used by MathType 3.5 (all platforms). Although MTEF is not the most friendly medium for defining equations, there have been so many requests for this information, we decided to publish it anyway. We must warn the reader that it is not an easy format to understand and, more importantly, MathType is not at all forgiving in its processing of it. This means that if you send MathType MTEF with errors, it might crash. At a minimum, you will get an equation with formatting problems. Also, it is a binary format. This means that you can't use character strings to represent equations and it makes creating MTEF a little harder with programming languages like Visual Basic.
How MathType stores an equation description in an OLE equation object, a file, or on the clipboard is not described here. Please see the document on MathType MTEF Storage for more information on this subject.
Header
MTEF version history:
MTEF data exists in the following versions:
0 | MathType for the Mac 1.x (this format is not described here); |
1 | MathType for the Mac 2.x and MathType for Windows 1.x; |
2 | MathType 3.x and Equation Editor 1.x; |
3 | Equation Editor 3.x (the format described here); |
4 | MathType 3.5. |
Version 2 differs from version 1 only in the format of the header.
MTEF header (version 1):
The version 1 header consists of a single byte version number. This number is 1 if the MTEF was generated on the Mac or 101 if it was generated by the Windows version.
MTEF header (version 2 and later):
The version 2 header consists of a 5-byte header:
byte | description | value |
0 | MTEF version | 3 |
1 | generating platform | 0 for Macintosh, 1 for Windows |
2 | generating product | 0 for MathType, 1 for Equation Editor |
3 | product version | 3 |
4 | product subversion | 0 |
MTEF Byte Stream
This section describes the actual MTEF data following the header. MTEF data consists of a series of records. Each record starts with a tag byte containing the record type and some flag bits. The overall structure is:
Most MTEF values are bytes. Word values (16-bit) are written low-order byte followed by high-order byte. All dimensional values are expressed in MathType's internal units, 32nds of a point (A point is 1/72 inch).
Tag byte structure:
Each tag byte consists of a record type in the low-order 4 bits and option flags in the high-order 4 bits. The following record types are used:
value | symbol | description |
0 | END | end of MTEF, pile, line, embellishment list, or template |
1 | LINE | line (slot) record |
2 | CHAR | character record |
3 | TMPL | template record |
4 | PILE | pile (vertical stack of lines) record |
5 | MATRIX | matrix record |
6 | EMBELL | character embellishment (e.g. hat, prime) record |
7 | RULER | ruler (tab-stop location) record |
8 | FONT | font name record |
9 | SIZE | general size record |
10 | FULL | full size record |
11 | SUB | subscript size record |
12 | SUB2 | sub-subscript size record |
13 | SYM | symbol size record |
14 | SUBSYM | sub-symbol size record |
Option values:
The option flag values are record-dependent:
value | symbol | description |
Option flag values for all equation structure records: | ||
0x8 | xfLMOVE | nudge values follow tag |
Option flag values for CHAR records: | ||
0x1 | xfAUTO | character is a candidate for function recognition |
0x2 | xfEMBELL | character is followed by an embellishment list |
Option flag values for LINE records: | ||
0x1 | xfNULL | line is a placeholder only |
0x4 | xfLSPACE | line spacing value follows tag |
Option flag values for LINE and PILE records: | ||
0x2 | xfRULER | RULER record follows LINE or PILE record |
Nudge values:
LINE, CHAR, TMPL, PILE, MATRIX, and EMBELL records may store the result of nudging (small offsets applied by the user). A nudged record has the xfLMOVE flag (0x8) set in the tag byte and the tag byte is followed immediately by the nudge offset. The nudge offset consists of either two bytes or six, depending on the amount of offset. If -128 < dx < +128 and -128 < dy < +128, then the offsets are stored as two bytes, dx followed by dy, where each value is biased by 128. Otherwise, two bytes of 128 are stored, followed by the (unbiased) offsets, dx and dy, stored as 16-bit values.
Typeface values:
CHAR records contain a typeface value (biased by 128). If the value is positive, it represents one of MathType's styles:
value | symbol |
1 | fnTEXT |
2 | fnFUNCTION |
3 | fnVARIABLE |
4 | fnLCGREEK |
5 | fnUCGREEK |
6 | fnSYMBOL |
7 | fnVECTOR |
8 | fnNUMBER |
9 | fnUSER1 |
10 | fnUSER2 |
11 | fnMTEXTRA |
12 | fnTEXT_FE |
If the value is negative, it represents an explicit font as specified by a FONT record.
Object lists:
LINE, CHAR, TMPL, PILE, MATRIX, and RULER records are followed by object lists that define contents of each equation structure. Each object list contains a sequence of records of any type and terminated by an END record. In a special case for LINE records, if there are no objects in the list, the xfNULL flag will be set in the tag byte and the object list is omitted entirely (i.e. no END record). Although there are no restrictions made by the MTEF format on what record types may occur in any particular list, the user interface prevents certain things from happening. For example, the object list defining the contents of a pile contains only LINE records.
Record Details
END record (0):
Contains just the tag byte. No flags are defined.
LINE record (1):
Consists of:
- tag (1)
- [nudge] if xfLMOVE is set
- [line spacing] if xfLSPACE is set
- [RULER record] if xfRULER is set
- object list contents of line (a single pile, characters and templates, or nothing)
The line spacing value, if present, is the distance between the baseline of this line and the line above it.
CHAR record (2):
Consists of:
- tag (2)
- [nudge] if xfLMOVE is set
- [typeface] typeface value (see FONT below) + 128
- [character] 16-bit character value (encoding depends on typeface)
- [embellishment list] if xfEMBELL is set (embellishments)
Associated with every font is an encoding (a one-to-one mapping between character value and glyph; e.g. ASCII). The character represented by the character value is determined according to the encoding of the typeface value. The 16-bit character value is a Unicode value if the font is a text font or a font index if the font is symbolic.
TMPL record (3):
Consists of:
- tag (3)
- [nudge] if xfLMOVE is set
- [selector] template selector code
- [variation] template variation code
- [options] template-specific options
- [subobject list] either a single character (e.g. sigma in a summation) and/or lines
The template selector and variation codes determine the class of the template and various properties of the template, such as which subobjects can be deleted by the user (see Template Selectors and Variations for a list). The class of a template determines the order and meaning of each of its subobjects (see Template Subobject Order).
The template-specific options field is only used for integrals and fence templates:
Integral template option field values: | |
0 | fixed-size integral; |
1 | the integral expands vertically to fit its contents. |
Fence template option field values (fence alignment): | |
0 | center fence on math axis, place math axis of contents on math axis of containing line (default); |
1 | center fence on contents, place math axis of contents on math axis of containing line; |
2 | center fence on contents, center contents on math axis of containing line. |
PILE record (4):
Consists of:
- tag (4)
- [nudge] if xfLMOVE is set
- [halign] horizontal alignment
- [valign] vertical alignment
- [[RULER record]] if xfRULER is set
- [object list] list of lines contained by the pile
Horizontal alignment:
1 | left justification |
2 | centered |
3 | right justification |
4 | relational operator alignment |
5 | decimal point alignment |
Vertical alignment:
0 | alignment with baseline of top line |
1 | alignment with baseline of center line |
2 | alignment with baseline of bottom line |
3 | vertical centering |
MATRIX record (5):
Consists of:
- tag (5)
- [nudge] if xfLMOVE is set
- [valign] vertical alignment of matrix within container
- [h_just] horizontal alignment within columns
- [v_just] vertical alignment within columns
- [rows] number of rows
- [cols] number of columns
- [row_parts] row partition line types
- [col_parts] column partition line types
- [object list] list of lines, one for each element of the matrix, in order from left-to-right and top-to-bottom
The values for valign, h_just, and v_just are described in PILE above.
The row partition line type list consists of two-bit values for each possible partition line (one more than the number of rows), rounded out to the nearest byte. Each value determines the line style of the corresponding partition line (0 for none, 1 for solid, 2 for dashed, or 3 for dotted). Similarly for the column partition lines.
EMBELL record (6):
Consists of:
- tag (6)
- [nudge] if xfLMOVE is set
- [embell] embellishment type
The embellishment types are:
value | symbol | description |
2 | embDOT | single dot |
3 | embDDOT | double dot |
4 | embTDOT | triple dot |
5 | embPRIME | single prime |
6 | embDPRIME | double prime |
7 | embBPRIME | backwards prime (left of character) |
8 | embTILDE | tilde |
9 | embHAT | hat (circumflex) |
10 | embNOT | diagonal slash through character |
11 | embRARROW | right arrow |
12 | embLARROW | left arrow |
13 | embBARROW | double-headed arrow |
14 | embR1ARROW | right single-barbed arrow |
15 | embL1ARROW | left single-barbed arrow |
16 | embMBAR | mid-height horizontal bar |
17 | embOBAR | over-bar |
18 | embTPRIME | triple prime |
19 | embFROWN | over-arc, concave downward |
20 | embSMILE | over-arc, concave upward |
RULER record (7):
Consists of:
- tag (7)
- [n_stops] number of tab-stops
- [tab-stop list] tab-stops in order from left-to-right
Each tab stop is described by a tab-stop type (0 for left, 1 for center, 2 for right, 3 for equal, 4 for decimal), followed by a 16-bit offset from the left end of the slot or pile with which it is associated.
FONT record (8):
Consists of:
- tag (8)
- [tface] typeface number
- [style] 1 for italic and/or 2 for bold
- [name] font name (null-terminated)
This record associates a typeface number with an explicit font and style. The typeface number is the negative (which makes it positive) of the typeface value (unbiased) that appears in CHAR records that might follow a given FONT record. For example, a 3 in the FONT record corresponds to 125 (-3 + 128) in the CHAR record.
SIZE record (9):
Consists of one of the following cases:
if lsize < 0 (explicit point size):
- tag (9)
- 101
- -lsize (16 bits)
else if -128 < dsize < +128:
- tag (9)
- lsize
- dsize + 128
else: (large delta)
- tag (9)
- 100
- lsize
- dsize (16 bits)
Sizes in MathType are represented as a pair of values, lsize and dsize. Lsize stands for "logical size", dsize for "delta size". If it is negative, it is an explicit point size (in 32nds of a point) negated and dsize is ignored. Otherwise, lsize is one of the following typesize values and dsize is a delta from that size:
value | symbol | description |
0 | szFULL | full |
1 | szSUB | subscript |
2 | szSUB2 | sub-subscript |
3 | szSYM | symbol |
4 | szSUBSYM | sub-symbol |
5 | szUSER1 | user 1 |
6 | szUSER2 | user 2 |
TYPESIZE records (10-14):
Consists of:
- tag (10-14)
These records are just short ways of specifying a simple typesize where dsize is zero. The tag value represents an lsize + 10. So if the tag value is 10, it means equation content following it will be Full size (szFULL), tag value 11 means szSUB, and so on.
Template Selectors and Variations
This section shows the selector and variation codes for all the templates. The symbols shown here are internal identifiers in MathType and are for reference only. The class names can be used to determine the order of subobjects in the list following the template tag (see Template Subobject Order).
selector | symbol | description | class |
0 | tmANGLE | angle brackets | ParBoxClass |
variation | symbol | description | |
0 | tvBANGLE | both left and right | |
1 | tvLANGLE | left only | |
2 | tvRANGLE | right only | |
1 | tmPAREN | parentheses | ParBoxClass |
variation | symbol | description | |
0 | tvBPAREN | both left and right | |
1 | tvLPAREN | left only | |
2 | tvRPAREN | right only | |
2 | tmBRACE | braces (curly brackets) | ParBoxClass |
variation | symbol | description | |
0 | tvBBRACE | both left and right | |
1 | tvLBRACE | left only | |
2 | tvRBRACE | right only | |
3 | tmBRACK | square brackets | ParBoxClass |
variation | symbol | description | |
0 | tvBBRACK | both left and right | |
1 | tvLBRACK | left only | |
2 | tvRBRACK | right only | |
4 | tmBAR | vertical bars | ParBoxClass |
variation | symbol | description | |
0 | tvBBAR | both left and right | |
1 | tvLBAR | left only | |
2 | tvRBAR | right only | |
5 | tmDBAR | double vertical bars | ParBoxClass |
variation | symbol | description | |
0 | tvBDBAR | both left and right | |
1 | tvLDBAR | left only | |
2 | tvRDBAR | right only | |
6 | tmFLOOR | floor brackets | ParBoxClass |
7 | tmCEILING | ceiling brackets | ParBoxClass |
8 | tmLBLB | left brace, left brace | ParBoxClass |
9 | tmRBRB | right brace, right brace | ParBoxClass |
10 | tmRBLB | right brace, left brace | ParBoxClass |
11 | tmLBRP | left brace, right parenthesis | ParBoxClass |
12 | tmLPRB | left parenthesis, right brace | ParBoxClass |
13 | tmROOT | radical | RootBoxClass |
variation | symbol | description | |
0 | tvSQROOT | square root | |
1 | tvNTHROOT | nth root | |
14 | tmFRACT | fractions | FracBoxClass |
variation | symbol | description | |
0 | tvFFRACT | full-size slots | |
1 | tvPFRACT | subscript-size slots (piece fraction) | |
15 | tmSCRIPT | subscript/superscript | ScrBoxClass |
variation | symbol | description | |
0 | tvSUPER | superscript | |
1 | tvSUB | subscript | |
2 | tvSUBSUP | both | |
16 | tmUBAR | underbar | BarBoxClass |
variation | symbol | description | |
0 | tvSUBAR | single underbar | |
1 | tvDUBAR | double underbar | |
17 | tmOBAR | overbar | BarBoxClass |
variation | symbol | description | |
0 | tvSOBAR | single overbar | |
1 | tvDOBAR | double overbar | |
18 | tmLARROW | left-pointing arrow | ArroBoxClass |
variation | symbol | description | |
0 | tvLTARROW | box on top | |
1 | tvLBARROW | box below | |
19 | tmRARROW | right-pointing arrow | ArroBoxClass |
variation | symbol | description | |
0 | tvRTARROW | box on top | |
1 | tvRBARROW | box below | |
20 | tmBARROW | left- and right-pointing arrow | ArroBoxClass |
variation | symbol | description | |
0 | tvBTARROW | box on top | |
1 | tvBBARROW | box below | |
21 | tmSINT | single integral | BigOpBoxClass |
variation | symbol | description | |
0 | tvNSINT | no limits | |
1 | tvLSINT | lower limit only | |
2 | tvBSINT | both limits | |
3 | tvNCINT | contour, no limits | |
4 | tvLCINT | contour, lower limit only | |
22 | tmDINT | double integral | BigOpBoxClass |
variation | symbol | description | |
0 | tvNDINT | no limits | |
1 | tvLDINT | lower limit only | |
2 | tvNAINT | area, no limits | |
3 | tvLAINT | area, lower limit only | |
23 | tmTINT | triple integral | BigOpBoxClass |
variation | symbol | description | |
0 | tvNTINT | no limits | |
1 | tvLTINT | lower limit only | |
2 | tvNVINT | volume, no limits | |
3 | tvLVINT | volume, lower limit only | |
24 | tmSSINT | single summation-style integral | BigOpBoxClass |
variation | symbol | description | |
0 | tvBSSINT | both limits | |
1 | tvLSSINT | lower limit only | |
2 | tvLCSINT | contour, lower limit only | |
25 | tmDSINT | double summation-style integral | BigOpBoxClass |
variation | symbol | description | |
0 | tvLASINT | area, lower limit only | |
1 | tvLDSINT | lower limit only | |
26 | tmTSINT | triple summation-style integral | BigOpBoxClass |
variation | symbol | description | |
0 | tvLVSINT | volume, lower limit only | |
1 | tvLTSINT | lower limit only | |
27 | tmUHBRACE | upper horizontal brace | HBrBoxClass |
28 | tmLHBRACE | lower horizontal brace | HBrBoxClass |
29 | tmSUM | summation | BigOpBoxClass |
variation | symbol | description | |
0 | tvLSUM | lower only | |
1 | tvBSUM | both upper and lower limits | |
2 | tvNSUM | no limits | |
30 | tmISUM | summation (integral-style limits) | BigOpBoxClass |
variation | symbol | description | |
0 | tvLISUM | lower only | |
1 | tvBISUM | both upper and lower limits | |
31 | tmPROD | product | BigOpBoxClass |
variation | symbol | description | |
0 | tvLPROD | lower only | |
1 | tvBPROD | both upper and lower limits | |
2 | tvNPROD | no limits | |
32 | tmIPROD | product (integral-style limits) | BigOpBoxClass |
variation | symbol | description | |
0 | tvLIPROD | lower only | |
1 | tvBIPROD | both upper and lower limits | |
33 | tmCOPROD | coproduct | BigOpBoxClass |
variation | symbol | description | |
0 | tvLCOPROD | lower only | |
1 | tvBCOPROD | both upper and lower limits | |
2 | tvNCOPROD | no limits | |
34 | tmICOPROD | coproduct (integral-style limits) | BigOpBoxClass |
variation | symbol | description | |
0 | tvLICOPROD | lower only | |
1 | tvBICOPROD | both upper and lower limits | |
35 | tmUNION | union | BigOpBoxClass |
variation | symbol | description | |
0 | tvLUNION | lower only | |
1 | tvBUNION | both upper and lower limits | |
2 | tvNUNION | no limits | |
36 | tmIUNION | union (integral-style limits) | BigOpBoxClass |
variation | symbol | description | |
0 | tvLIUNION | lower only | |
1 | tvBIUNION | both upper and lower limits | |
37 | tmINTER | intersection | BigOpBoxClass |
variation | symbol | description | |
0 | tvLINTER | lower only | |
1 | tvBINTER | both upper and lower limits | |
2 | tvNINTER | no limits | |
38 | tmIINTER | intersection (integral-style limits) | BigOpBoxClass |
variation | symbol | description | |
0 | tvLIINTER | lower only | |
1 | tvBIINTER | both upper and lower limits | |
39 | tmLIM | limit | LimBoxClass |
variation | symbol | description | |
0 | tvULIM | upper limit | |
1 | tvLLIM | lower limit | |
2 | tvBLIM | both upper and lower limits | |
40 | tmLDIV | long division | LDivBoxClass |
variation | symbol | description | |
0 | tvLDIVW | with upper slot | |
1 | tvLDIVWO | without upper slot | |
41 | tmSLFRACT | slash fractions | SlashBoxClass |
variation | symbol | description | |
0 | tvSLFNORM | normal | |
1 | tvSLFBASE | slots on baseline | |
2 | tvSLFSUB | subscript-sized slots | |
42 | tmINTOP | big integral-style operators | BigOpBoxClass |
variation | symbol | description | |
0 | tvUINTOP | upper limit | |
1 | tvLINTOP | lower limit | |
2 | tvBINTOP | both upper and lower limits | |
43 | tmSUMOP | big summation-style operators | BigOpBoxClass |
variation | symbol | description | |
0 | tvUSUMOP | upper limit | |
1 | tvLSUMOP | lower limit | |
2 | tvBSUMOP | both upper and lower limits | |
44 | tmLSCRIPT | leading sub- and superscripts | ScrBoxClass |
variation | symbol | description | |
0 | tvLSUPER | superscript | |
1 | tvLSUB | subscript | |
2 | tvLSUBSUP | subscript and superscript | |
45 | tmDIRAC | Dirac delta | DiracBoxClass |
variation | symbol | description | |
0 | tvBDIRAC | both left and right slots | |
1 | tvLDIRAC | left slot only | |
2 | tvRDIRAC | right slot only | |
46 | tmUARROW | under arrow | VectorBoxClass |
variation | symbol | description | |
0 | tvLUARROW | left-pointing | |
1 | tvRUARROW | right-pointing | |
2 | tvDUARROW | double-headed (left and right) | |
47 | tmOARROW | over arrow | VectorBoxClass |
variation | symbol | description | |
0 | tvLOARROW | left-pointing | |
1 | tvROARROW | right-pointing | |
2 | tvDOARROW | double-headed (left and right) | |
48 | tmOARC | over arc | ArcBoxClass |
Template Subobject Order
The following list shows the order of subobjects for each template class:
ArcBoxClass vector notation
- main slot
ArroBoxClass expanding arrows
- main slot
- arrow character
BarBoxClass over-bars and under-bars
- main slot
BigOpBoxClass integrals, summations, products, etc.
- main slot (summand, integrand)
- upper slot
- lower slot
- large operator character
DiracBoxClass three-part bracket structure
- left slot
- right slot
- left angle bracket (optional)
- vertical bar
- right angle bracket (optional)
FracBoxClass fractions with a horizontal bar
- numerator slot
- denominator slot
HBrBoxClass horizontal expanding braces
- main slot
- small slot
- brace character
LDivBoxClass long division
- dividend slot
- quotient slot
LimBoxClass limits
- main slot
- lower slot
- upper slot
ParBoxClass parenthesized or bracketed slots
- main slot
- left fence character (optional)
- right fence character (optional)
RootBoxClass radical sign
- main slot
- radicand slot
ScrBoxClass subscripts and superscripts
- subscript slot
- superscript slot
SlashBoxClass fractions with a diagonal bar
- numerator slot
- denominator slot
VectorBoxClass box with upper or lower arrow
- main slot