|
|
|
|
package eqn
|
|
|
|
|
|
|
|
|
|
import "fmt"
|
|
|
|
|
|
|
|
|
|
type RecordType uint8
|
|
|
|
|
type OptionType uint8
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
END RecordType = 0
|
|
|
|
|
LINE RecordType = 1
|
|
|
|
|
CHAR RecordType = 2
|
|
|
|
|
TMPL RecordType = 3
|
|
|
|
|
PILE RecordType = 4
|
|
|
|
|
MATRIX RecordType = 5
|
|
|
|
|
EMBELL RecordType = 6
|
|
|
|
|
RULER RecordType = 7
|
|
|
|
|
FONT_STYLE_DEF RecordType = 8
|
|
|
|
|
SIZE RecordType = 9
|
|
|
|
|
FULL RecordType = 10
|
|
|
|
|
SUB RecordType = 11
|
|
|
|
|
SUB2 RecordType = 12
|
|
|
|
|
SYM RecordType = 13
|
|
|
|
|
SUBSYM RecordType = 14
|
|
|
|
|
COLOR RecordType = 15
|
|
|
|
|
COLOR_DEF RecordType = 16
|
|
|
|
|
FONT_DEF RecordType = 17
|
|
|
|
|
EQN_PREFS RecordType = 18
|
|
|
|
|
ENCODING_DEF RecordType = 19
|
|
|
|
|
FUTURE RecordType = 100
|
|
|
|
|
ROOT RecordType = 255
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
MtefOptNudge OptionType = 0x08
|
|
|
|
|
MtefOptCharEmbell OptionType = 0x01
|
|
|
|
|
MtefOptCharFuncStart OptionType = 0x02
|
|
|
|
|
MtefOptCharEncChar8 OptionType = 0x04
|
|
|
|
|
MtefOptCharEncChar16 OptionType = 0x10
|
|
|
|
|
MtefOptCharEncNoMtcode OptionType = 0x20
|
|
|
|
|
MtefOptLineNull OptionType = 0x01
|
|
|
|
|
mtefOPT_LP_RULER OptionType = 0x02
|
|
|
|
|
MtefOptLineLspace OptionType = 0x04
|
|
|
|
|
MtefOptLpRuler OptionType = 0x02
|
|
|
|
|
MtefColorCmyk OptionType = 0x01
|
|
|
|
|
MtefColorSpot OptionType = 0x02
|
|
|
|
|
MtefColorName OptionType = 0x04
|
|
|
|
|
mtefCOLOR_CMYK OptionType = 0x01
|
|
|
|
|
mtefCOLOR_SPOT OptionType = 0x02
|
|
|
|
|
mtefCOLOR_NAME OptionType = 0x04
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
fnTEXT uint8 = 1
|
|
|
|
|
fnFUNCTION uint8 = 2
|
|
|
|
|
fnVARIABLE uint8 = 3
|
|
|
|
|
fnLCGREEK uint8 = 4
|
|
|
|
|
fnUCGREEK uint8 = 5
|
|
|
|
|
fnSYMBOL uint8 = 6
|
|
|
|
|
fnVECTOR uint8 = 7
|
|
|
|
|
fnNUMBER uint8 = 8
|
|
|
|
|
fnUSER1 uint8 = 9
|
|
|
|
|
fnUSER2 uint8 = 10
|
|
|
|
|
fnMTEXTRA uint8 = 11
|
|
|
|
|
fnTEXT_FE uint8 = 12
|
|
|
|
|
fnEXPAND uint8 = 22
|
|
|
|
|
fnMARKER uint8 = 23
|
|
|
|
|
fnSPACE uint8 = 24
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type MtTabStop struct {
|
|
|
|
|
next *MtTabStop
|
|
|
|
|
_type int16
|
|
|
|
|
offset int16
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MtRuler struct {
|
|
|
|
|
nStops int16
|
|
|
|
|
tabStopList *MtTabStop
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MtLine struct {
|
|
|
|
|
nudgeX int16
|
|
|
|
|
nudgeY int16
|
|
|
|
|
lineSpace uint8
|
|
|
|
|
null bool
|
|
|
|
|
ruler *MtRuler
|
|
|
|
|
objectList *MtObjList
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MtEmbell struct {
|
|
|
|
|
next *MtEmbell
|
|
|
|
|
nudgeX int16
|
|
|
|
|
nudgeY int16
|
|
|
|
|
embell uint8
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MtChar struct {
|
|
|
|
|
nudgeX int16
|
|
|
|
|
nudgeY int16
|
|
|
|
|
options uint8
|
|
|
|
|
typeface uint8
|
|
|
|
|
//16-bit integer MTCode value
|
|
|
|
|
mtcode uint16
|
|
|
|
|
//8-bit font position
|
|
|
|
|
bits8 uint8
|
|
|
|
|
//16-bit integer font position
|
|
|
|
|
bits16 uint16
|
|
|
|
|
embellishments *MtEmbell
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MtEqnPrefs struct {
|
|
|
|
|
sizes []string
|
|
|
|
|
spaces []string
|
|
|
|
|
styles []byte
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MtSize struct {
|
|
|
|
|
lsize uint8
|
|
|
|
|
dsize uint8
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MtfontStyleDef struct {
|
|
|
|
|
fontDefIndex uint8
|
|
|
|
|
name string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MtfontDef struct {
|
|
|
|
|
encDefIndex uint8
|
|
|
|
|
name string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MtColorDefIndex struct {
|
|
|
|
|
index uint8
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MtColorDef struct {
|
|
|
|
|
values []uint8
|
|
|
|
|
name string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MtObjList struct {
|
|
|
|
|
next *MtObjList
|
|
|
|
|
tag RecordType
|
|
|
|
|
objPtr []MtObject
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MtTmpl struct {
|
|
|
|
|
nudgeX int16
|
|
|
|
|
nudgeY int16
|
|
|
|
|
selector uint8
|
|
|
|
|
variation uint16
|
|
|
|
|
options uint8
|
|
|
|
|
objectList *MtObjList
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MtPile struct {
|
|
|
|
|
nudgeX int16
|
|
|
|
|
nudgeY int16
|
|
|
|
|
halign uint8
|
|
|
|
|
valign uint8
|
|
|
|
|
|
|
|
|
|
//ruler可以不读,不影响后面字节错位,因为这个是一个完整的额外record数据
|
|
|
|
|
ruler *MtRuler
|
|
|
|
|
|
|
|
|
|
//objectList可以不读,不影响后面字节错位,因为这个是一个完整的额外record数据
|
|
|
|
|
objectList *MtObjList
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MtMatrix struct {
|
|
|
|
|
nudgeX int16
|
|
|
|
|
nudgeY int16
|
|
|
|
|
valign uint8
|
|
|
|
|
h_just uint8
|
|
|
|
|
v_just uint8
|
|
|
|
|
|
|
|
|
|
rows uint8
|
|
|
|
|
cols uint8
|
|
|
|
|
|
|
|
|
|
//row_parts uint8
|
|
|
|
|
//col_parts uint8
|
|
|
|
|
|
|
|
|
|
//objectList可以不读,不影响后面字节错位,因为这个是一个完整的额外record数据
|
|
|
|
|
objectList *MtObjList
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MtEmbellRd struct {
|
|
|
|
|
options uint8
|
|
|
|
|
nudgeX int16
|
|
|
|
|
nudgeY int16
|
|
|
|
|
embellType uint8
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MtAST struct {
|
|
|
|
|
tag RecordType
|
|
|
|
|
value MtObject
|
|
|
|
|
children []*MtAST
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MtObject interface{}
|
|
|
|
|
|
|
|
|
|
func (ast *MtAST) debug(indent int) {
|
|
|
|
|
fmt.Printf("> %#v MtAST %#v\n", indent, ast)
|
|
|
|
|
indent += 1
|
|
|
|
|
for _, ele := range ast.children {
|
|
|
|
|
ele.debug(indent)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type SelectorType uint8
|
|
|
|
|
|
|
|
|
|
//Template selectors and variations:
|
|
|
|
|
const (
|
|
|
|
|
//Fences (parentheses, etc.):
|
|
|
|
|
//selector symbol description class
|
|
|
|
|
tmANGLE SelectorType = 0 // angle brackets ParBoxClass
|
|
|
|
|
tmPAREN SelectorType = 1 // parentheses ParBoxClass
|
|
|
|
|
tmBRACE SelectorType = 2 // braces (curly brackets) ParBoxClass
|
|
|
|
|
tmBRACK SelectorType = 3 // square brackets ParBoxClass
|
|
|
|
|
tmBAR SelectorType = 4 // vertical bars ParBoxClass
|
|
|
|
|
tmDBAR SelectorType = 5 // double vertical bars ParBoxClass
|
|
|
|
|
tmFLOOR SelectorType = 6 // floor brackets ParBoxClass
|
|
|
|
|
tmCEILING SelectorType = 7 // ceiling brackets ParBoxClass
|
|
|
|
|
tmOBRACK SelectorType = 8 // open (white) brackets ParBoxClass
|
|
|
|
|
//variations variation bits symbol description
|
|
|
|
|
//0×0001 tvFENCE_L left fence is present
|
|
|
|
|
//0×0002 tvFENCE_R right fence is present
|
|
|
|
|
|
|
|
|
|
//Intervals:
|
|
|
|
|
//selector symbol description class
|
|
|
|
|
tmINTERVAL SelectorType = 9 // unmatched brackets and parentheses ParBoxClass
|
|
|
|
|
//variations variation bits symbol description
|
|
|
|
|
//0×0000 tvINTV_LEFT_LP left fence is left parenthesis
|
|
|
|
|
//0×0001 tvINTV_LEFT_RP left fence is right parenthesis
|
|
|
|
|
//0×0002 tvINTV_LEFT_LB left fence is left bracket
|
|
|
|
|
//0×0003 tvINTV_LEFT_RB left fence is right bracket
|
|
|
|
|
//0×0000 tvINTV_RIGHT_LP right fence is left parenthesis
|
|
|
|
|
//0×0010 tvINTV_RIGHT_RP right fence is right parenthesis
|
|
|
|
|
//0×0020 tvINTV_RIGHT_LB right fence is left bracket
|
|
|
|
|
//0×0030 tvINTV_RIGHT_RB right fence is right bracket
|
|
|
|
|
|
|
|
|
|
//Radicals (square and nth roots):
|
|
|
|
|
//selector symbol description class
|
|
|
|
|
tmROOT SelectorType = 10 // radical RootBoxClass
|
|
|
|
|
//variations variation symbol description
|
|
|
|
|
//0 tvROOT_SQ square root
|
|
|
|
|
//1 tvROOT_NTH nth root
|
|
|
|
|
|
|
|
|
|
//Fractions:
|
|
|
|
|
//selector symbol description class
|
|
|
|
|
tmFRACT SelectorType = 11 // fractions
|
|
|
|
|
//variations variation bits symbol description
|
|
|
|
|
//0×0001 tvFR_SMALL subscript-size slots (piece fraction)
|
|
|
|
|
//0×0002 tvFR_SLASH fraction bar is a slash
|
|
|
|
|
//0×0004 tvFR_BASE num. and denom. are baseline aligned
|
|
|
|
|
|
|
|
|
|
//Over and Underbars:
|
|
|
|
|
//selector symbol description class
|
|
|
|
|
tmUBAR SelectorType = 12 // underbar BarBoxClass
|
|
|
|
|
tmOBAR SelectorType = 13 // overbar BarBoxClass
|
|
|
|
|
//variations variation bits symbol description
|
|
|
|
|
//0×0001 tvBAR_DOUBLE bar is doubled, else single
|
|
|
|
|
|
|
|
|
|
//Arrows:
|
|
|
|
|
//selector symbol description class
|
|
|
|
|
tmARROW SelectorType = 14 // arrow ArroBoxClass
|
|
|
|
|
//variations variation symbol description
|
|
|
|
|
//0×0000 tvAR_SINGLE single arrow
|
|
|
|
|
//0×0001 tvAR_DOUBLE double arrow
|
|
|
|
|
//0×0002 tvAR_HARPOON harpoon
|
|
|
|
|
//0×0004 tvAR_TOP top slot is present
|
|
|
|
|
//0×0008 tvAR_BOTTOM bottom slot is present
|
|
|
|
|
//0×0010 tvAR_LEFT if single, arrow points left
|
|
|
|
|
//0×0020 tvAR_RIGHT if single, arrow points right
|
|
|
|
|
//0×0010 tvAR_LOS if double or harpoon, large over small
|
|
|
|
|
//0×0020 tvAR_SOL if double or harpoon, small over large
|
|
|
|
|
|
|
|
|
|
//Integrals (see Limit Variations):
|
|
|
|
|
//selector symbol description class
|
|
|
|
|
tmINTEG SelectorType = 15 // integral BigOpBoxClass
|
|
|
|
|
//variations variation symbol description
|
|
|
|
|
//0×0001 tvINT_1 single integral sign
|
|
|
|
|
//0×0002 tvINT_2 double integral sign
|
|
|
|
|
//0×0003 tvINT_3 triple integral sign
|
|
|
|
|
//0×0004 tvINT_LOOP has loop w/o arrows
|
|
|
|
|
//0×0008 tvINT_CW_LOOP has clockwise loop
|
|
|
|
|
//0×000C tvINT_CCW_LOOP has counter-clockwise loop
|
|
|
|
|
//0×0100 tvINT_EXPAND integral signs expand
|
|
|
|
|
|
|
|
|
|
//Sums, products, coproducts, unions, intersections, etc. (see Limit Variations):
|
|
|
|
|
//selector symbol description class
|
|
|
|
|
tmSUM SelectorType = 16 // sum BigOpBoxClass
|
|
|
|
|
tmPROD SelectorType = 17 // product BigOpBoxClass
|
|
|
|
|
tmCOPROD SelectorType = 18 // coproduct BigOpBoxClass
|
|
|
|
|
tmUNION SelectorType = 19 // union BigOpBoxClass
|
|
|
|
|
tmINTER SelectorType = 20 // intersection BigOpBoxClass
|
|
|
|
|
tmINTOP SelectorType = 21 // integral-style big operator BigOpBoxClass
|
|
|
|
|
tmSUMOP SelectorType = 22 // summation-style big operator BigOpBoxClass
|
|
|
|
|
|
|
|
|
|
//Limits (see Limit Variations):
|
|
|
|
|
//selector symbol description class
|
|
|
|
|
tmLIM SelectorType = 23 // limits LimBoxClass
|
|
|
|
|
//variations variation symbol description
|
|
|
|
|
//0 tvSUBAR single underbar
|
|
|
|
|
//1 tvDUBAR double underbar
|
|
|
|
|
|
|
|
|
|
//Horizontal braces and brackets:
|
|
|
|
|
//selector symbol description class
|
|
|
|
|
tmHBRACE SelectorType = 24 // horizontal brace HFenceBoxClass
|
|
|
|
|
tmHBRACK SelectorType = 25 // horizontal bracket HFenceBoxClass
|
|
|
|
|
//variations variation symbol description
|
|
|
|
|
//0×0001 tvHB_TOP slot is on the top, else on the bottom
|
|
|
|
|
|
|
|
|
|
//Long division:
|
|
|
|
|
//selector symbol description class
|
|
|
|
|
tmLDIV SelectorType = 26 // long division LDivBoxClass
|
|
|
|
|
//variations variation symbol description
|
|
|
|
|
//0×0001 tvLD_UPPER upper slot is present
|
|
|
|
|
|
|
|
|
|
//Subscripts and superscripts:
|
|
|
|
|
//selector symbol description class
|
|
|
|
|
tmSUB SelectorType = 27 // subscript ScrBoxClass
|
|
|
|
|
tmSUP SelectorType = 28 // superscript ScrBoxClass
|
|
|
|
|
tmSUBSUP SelectorType = 29 // subscript and superscript ScrBoxClass
|
|
|
|
|
//variations variation symbol description
|
|
|
|
|
//0×0001 tvSU_PRECEDES script precedes scripted item,
|
|
|
|
|
|
|
|
|
|
//else follows
|
|
|
|
|
//Dirac bra-ket notation:
|
|
|
|
|
//selector symbol description class
|
|
|
|
|
tmDIRAC SelectorType = 30 // bra-ket notation DiracBoxClass
|
|
|
|
|
//variations variation symbol description
|
|
|
|
|
//0×0001 tvDI_LEFT left part is present
|
|
|
|
|
//0×0002 tvDI_RIGHT right part is present
|
|
|
|
|
|
|
|
|
|
//Vectors:
|
|
|
|
|
//selector symbol description class
|
|
|
|
|
tmVEC SelectorType = 31 // vector HatBoxClass
|
|
|
|
|
//variations variation symbol description
|
|
|
|
|
//0×0001 tvVE_LEFT arrow points left
|
|
|
|
|
//0×0002 tvVE_RIGHT arrow points right
|
|
|
|
|
//0×0004 tvVE_UNDER arrow under slot, else over slot
|
|
|
|
|
//0×0008 tvVE_HARPOON harpoon
|
|
|
|
|
|
|
|
|
|
//Hats, arcs, tilde, joint status:
|
|
|
|
|
//selector symbol description class
|
|
|
|
|
tmTILDE SelectorType = 32 // tilde over characters HatBoxClass
|
|
|
|
|
tmHAT SelectorType = 33 // hat over characters HatBoxClass
|
|
|
|
|
tmARC SelectorType = 34 // arc over characters HatBoxClass
|
|
|
|
|
tmJSTATUS SelectorType = 35 // joint status construct HatBoxClass
|
|
|
|
|
|
|
|
|
|
//Overstrikes (cross-outs):
|
|
|
|
|
//selector symbol description class
|
|
|
|
|
tmSTRIKE SelectorType = 36 // overstrike (cross-out) StrikeBoxClass
|
|
|
|
|
//variations variation symbol description
|
|
|
|
|
//0×0001 tvST_HORIZ line is horizontal, else slashes
|
|
|
|
|
//0×0002 tvST_UP if slashes, slash from lower-left to upper-right is present
|
|
|
|
|
//0×0004 tvST_DOWN if slashes, slash from upper-left to lower-right is present
|
|
|
|
|
|
|
|
|
|
//Boxes:
|
|
|
|
|
//selector symbol description class
|
|
|
|
|
tmBOX SelectorType = 37 // box TBoxBoxClass
|
|
|
|
|
//variations variation symbol description
|
|
|
|
|
//0×0001 tvBX_ROUND corners are round, else square
|
|
|
|
|
//0×0002 tvBX_LEFT left side is present
|
|
|
|
|
//0×0004 tvBX_RIGHT right side is present
|
|
|
|
|
//0×0008 tvBX_TOP top side is present
|
|
|
|
|
//0×0010 tvBX_BOTTOM bottom side is present
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type EmbellType uint8
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
emb1DOT EmbellType = 2
|
|
|
|
|
emb2DOT EmbellType = 3
|
|
|
|
|
emb3DOT EmbellType = 4
|
|
|
|
|
emb1PRIME EmbellType = 5
|
|
|
|
|
emb2PRIME EmbellType = 6
|
|
|
|
|
embBPRIME EmbellType = 7
|
|
|
|
|
embTILDE EmbellType = 8
|
|
|
|
|
embHAT EmbellType = 9
|
|
|
|
|
embNOT EmbellType = 10
|
|
|
|
|
embRARROW EmbellType = 11
|
|
|
|
|
embLARROW EmbellType = 12
|
|
|
|
|
embBARROW EmbellType = 13
|
|
|
|
|
embR1ARROW EmbellType = 14
|
|
|
|
|
embL1ARROW EmbellType = 15
|
|
|
|
|
embMBAR EmbellType = 16
|
|
|
|
|
embOBAR EmbellType = 17
|
|
|
|
|
emb3PRIME EmbellType = 18
|
|
|
|
|
embFROWN EmbellType = 19
|
|
|
|
|
embSMILE EmbellType = 20
|
|
|
|
|
embX_BARS EmbellType = 21
|
|
|
|
|
embUP_BAR EmbellType = 22
|
|
|
|
|
embDOWN_BAR EmbellType = 23
|
|
|
|
|
emb4DOT EmbellType = 24
|
|
|
|
|
embU_1DOT EmbellType = 25
|
|
|
|
|
embU_2DOT EmbellType = 26
|
|
|
|
|
embU_3DOT EmbellType = 27
|
|
|
|
|
embU_4DOT EmbellType = 28
|
|
|
|
|
embU_BAR EmbellType = 29
|
|
|
|
|
embU_TILDE EmbellType = 30
|
|
|
|
|
embU_FROWN EmbellType = 31
|
|
|
|
|
embU_SMILE EmbellType = 32
|
|
|
|
|
embU_RARROW EmbellType = 33
|
|
|
|
|
embU_LARROW EmbellType = 34
|
|
|
|
|
embU_BARROW EmbellType = 35
|
|
|
|
|
embU_R1ARROW EmbellType = 36
|
|
|
|
|
embU_L1ARROW EmbellType = 37
|
|
|
|
|
)
|