use super::attribute::{Variant, Accent};
#[derive(Debug, Clone, PartialEq)]
pub enum Token {
Illegal(char),
EOF,
Begin,
End,
Ampersand,
NewLine,
Left,
Right,
Paren(&'static str),
LBrace,
RBrace,
Frac,
Underscore,
Circumflex,
Overset,
Underset,
Overbrace(char),
Underbrace(char),
Sqrt,
Integral(char),
Lim(&'static str),
Space(f32),
Style(Variant),
Over(char, Accent),
Under(char, Accent),
Operator(char),
BigOp(char),
Letter(char, Variant),
Number(String),
Function(&'static str),
Slashed,
Text,
Command(String),
}
impl Token {
pub fn from_command(command: &str) -> Token {
match command {
"mathrm" => Token::Style(Variant::Normal),
"textit" => Token::Style(Variant::Italic),
"mathit" => Token::Style(Variant::Italic),
"textbf" => Token::Style(Variant::Bold),
"mathbf" => Token::Style(Variant::Bold),
"bm" => Token::Style(Variant::BoldItalic),
"symbf" => Token::Style(Variant::BoldItalic),
"mathbb" => Token::Style(Variant::DoubleStruck),
"mathfrak" => Token::Style(Variant::Fraktur),
"mathscr" => Token::Style(Variant::Script),
"mathsf" => Token::Style(Variant::SansSerif),
"texttt" => Token::Style(Variant::Monospace),
"boldsymbol" => Token::Style(Variant::BoldItalic),
"text" => Token::Text,
"sqrt" => Token::Sqrt,
"frac" => Token::Frac,
"left" => Token::Left,
"right" => Token::Right,
"begin" => Token::Begin,
"end" => Token::End,
"\\" => Token::NewLine,
"overset" => Token::Overset,
"underset" => Token::Underset,
"overbrace" => Token::Overbrace('\u{23de}'),
"underbrace" => Token::Underbrace('\u{23df}'),
"overparen" => Token::Overbrace('\u{23dc}'),
"underparen" => Token::Underbrace('\u{23dd}'),
"overbracket" => Token::Overbrace('\u{23b4}'),
"underbracket" => Token::Underbrace('\u{23b5}'),
"!" => Token::Space(-3./18.),
"," => Token::Space(3./18.),
":" => Token::Space(4./18.),
";" => Token::Space(5./18.),
" " => Token::Space(1.),
"quad" => Token::Space(1.),
"qquad" => Token::Space(2.),
"langle" => Token::Paren("⟨"),
"rangle" => Token::Paren("⟩"),
"{" => Token::Paren("{"),
"}" => Token::Paren("}"),
"lceil" => Token::Paren("⌈"),
"rceil" => Token::Paren("⌉"),
"lfloor" => Token::Paren("⌊"),
"rfloor" => Token::Paren("⌋"),
"lgroup" => Token::Paren("⦗"),
"rgroup" => Token::Paren("⦘"),
"llbracket" => Token::Paren("⟦"),
"rrbracket" => Token::Paren("⟧"),
"lim" => Token::Lim("lim"),
"liminf" => Token::Lim("lim inf"),
"limsup" => Token::Lim("lim sup"),
"min" => Token::Lim("min"),
"max" => Token::Lim("max"),
"inf" => Token::Lim("inf"),
"sup" => Token::Lim("sup"),
"int" => Token::Integral('∫'),
"iint" => Token::Integral('∬'),
"iiint" => Token::Integral('∭'),
"oint" => Token::Integral('∮'),
"dot" => Token::Over('\u{02d9}', Accent::True),
"ddot" => Token::Over('¨', Accent::True),
"bar" => Token::Over('¯', Accent::True),
"hat" => Token::Over('^', Accent::True),
"check" => Token::Over('ˇ', Accent::True),
"breve" => Token::Over('˘', Accent::True),
"acute" => Token::Over('´', Accent::True),
"grave" => Token::Over('`', Accent::True),
"tilde" => Token::Over('~', Accent::True),
"vec" => Token::Over('→', Accent::True),
"overline" => Token::Over('_', Accent::True),
"underline" => Token::Under('_', Accent::True),
"widehat" => Token::Over('^', Accent::True),
"widetilde" => Token::Over('~', Accent::True),
"overrightarrow" => Token::Over('→', Accent::True),
"overleftarrow" => Token::Over('←', Accent::True),
"sum" => Token::BigOp('∑'),
"prod" => Token::BigOp('∏'),
"coprod" => Token::BigOp('∐'),
"bigcap" => Token::BigOp('⋂'),
"bigcup" => Token::BigOp('⋃'),
"bigsqcup" => Token::BigOp('⨆'),
"bigvee" => Token::BigOp('⋁'),
"bigwedge" => Token::BigOp('⋀'),
"bigodot" => Token::BigOp('⨀'),
"bitotimes" => Token::BigOp('⨂'),
"bigoplus" => Token::BigOp('⨁'),
"biguplus" => Token::BigOp('⨄'),
"sin" => Token::Function("sin"),
"cos" => Token::Function("cos"),
"tan" => Token::Function("tan"),
"csc" => Token::Function("csc"),
"sec" => Token::Function("sec"),
"cot" => Token::Function("cot"),
"arcsin" => Token::Function("arcsin"),
"arccos" => Token::Function("arccos"),
"arctan" => Token::Function("arctan"),
"sinh" => Token::Function("sinh"),
"cosh" => Token::Function("cosh"),
"tanh" => Token::Function("tanh"),
"coth" => Token::Function("coth"),
"exp" => Token::Function("exp"),
"ln" => Token::Function("ln"),
"log" => Token::Function("log"),
"erf" => Token::Function("erf"),
"erfc" => Token::Function("erfc"),
"arg" => Token::Function("arg"),
"ker" => Token::Function("ker"),
"dim" => Token::Function("dim"),
"det" => Token::Function("det"),
"wp" => Token::Function("℘"),
"Alpha" => Token::Letter('Α', Variant::Normal),
"alpha" => Token::Letter('α', Variant::Italic),
"Beta" => Token::Letter('Β', Variant::Normal),
"beta" => Token::Letter('β', Variant::Italic),
"Gamma" => Token::Letter('Γ', Variant::Normal),
"gamma" => Token::Letter('γ', Variant::Italic),
"digamma" => Token::Letter('ϝ', Variant::Italic),
"Delta" => Token::Letter('Δ', Variant::Normal),
"delta" => Token::Letter('δ', Variant::Italic),
"Epsilon" => Token::Letter('Ε', Variant::Normal),
"epsilon" => Token::Letter('ϵ', Variant::Italic),
"varepsilon" => Token::Letter('ε', Variant::Italic),
"Zeta" => Token::Letter('Ζ', Variant::Normal),
"zeta" => Token::Letter('ζ', Variant::Italic),
"Eta" => Token::Letter('Η', Variant::Normal),
"eta" => Token::Letter('η', Variant::Italic),
"Theta" => Token::Letter('Θ', Variant::Normal),
"theta" => Token::Letter('θ', Variant::Italic),
"vartheta" => Token::Letter('ϑ', Variant::Italic),
"Iota" => Token::Letter('Ι', Variant::Normal),
"iota" => Token::Letter('ι', Variant::Italic),
"Kappa" => Token::Letter('Κ', Variant::Normal),
"kappa" => Token::Letter('κ', Variant::Italic),
"Lambda" => Token::Letter('Λ', Variant::Normal),
"lambda" => Token::Letter('λ', Variant::Italic),
"Mu" => Token::Letter('Μ', Variant::Normal),
"mu" => Token::Letter('μ', Variant::Italic),
"Nu" => Token::Letter('Ν', Variant::Normal),
"nu" => Token::Letter('ν', Variant::Italic),
"Xi" => Token::Letter('Ξ', Variant::Normal),
"xi" => Token::Letter('ξ', Variant::Italic),
"Omicron" => Token::Letter('Ο', Variant::Normal),
"omicron" => Token::Letter('ο', Variant::Italic),
"Pi" => Token::Letter('Π', Variant::Normal),
"pi" => Token::Letter('π', Variant::Italic),
"varpi" => Token::Letter('ϖ', Variant::Italic),
"Rho" => Token::Letter('Ρ', Variant::Normal),
"rho" => Token::Letter('ρ', Variant::Italic),
"varrho" => Token::Letter('ϱ', Variant::Italic),
"Sigma" => Token::Letter('Σ', Variant::Normal),
"sigma" => Token::Letter('σ', Variant::Italic),
"varsigma" => Token::Letter('ς', Variant::Italic),
"Tau" => Token::Letter('Τ', Variant::Normal),
"tau" => Token::Letter('τ', Variant::Italic),
"Upsilon" => Token::Letter('Υ', Variant::Normal),
"upsilon" => Token::Letter('υ', Variant::Italic),
"Phi" => Token::Letter('Φ', Variant::Normal),
"phi" => Token::Letter('ϕ', Variant::Italic),
"varphi" => Token::Letter('φ', Variant::Italic),
"Chi" => Token::Letter('Χ', Variant::Normal),
"chi" => Token::Letter('χ', Variant::Italic),
"Psi" => Token::Letter('Ψ', Variant::Normal),
"psi" => Token::Letter('ψ', Variant::Italic),
"Omega" => Token::Letter('Ω', Variant::Normal),
"omega" => Token::Letter('ω', Variant::Italic),
"aleph" => Token::Letter('ℵ', Variant::Normal),
"beth" => Token::Letter('ℶ', Variant::Normal),
"gimel" => Token::Letter('ℷ', Variant::Normal),
"daleth" => Token::Letter('ℸ', Variant::Normal),
"A" => Token::Letter('Å', Variant::Normal),
"a" => Token::Letter('å', Variant::Normal),
"AE" => Token::Letter('Æ', Variant::Normal),
"ae" => Token::Letter('æ', Variant::Normal),
"DH" => Token::Letter('Ð', Variant::Normal),
"dh" => Token::Letter('ð', Variant::Normal),
"dj" => Token::Letter('đ', Variant::Normal),
"L" => Token::Letter('Ł', Variant::Normal),
"l" => Token::Letter('ł', Variant::Normal),
"NG" => Token::Letter('Ŋ', Variant::Normal),
"ng" => Token::Letter('ŋ', Variant::Normal),
"O" => Token::Letter('Ø', Variant::Normal),
"o" => Token::Letter('ø', Variant::Normal),
"OE" => Token::Letter('Œ', Variant::Normal),
"oe" => Token::Letter('œ', Variant::Normal),
"ss" => Token::Letter('ß', Variant::Normal),
"TH" => Token::Letter('Þ', Variant::Normal),
"th" => Token::Letter('þ', Variant::Normal),
"imath" => Token::Letter('ı', Variant::Italic),
"jmath" => Token::Letter('ȷ', Variant::Italic),
"ell" => Token::Letter('ℓ', Variant::Italic),
"hbar" => Token::Letter('ℏ', Variant::Italic),
"hslash" => Token::Letter('ℏ', Variant::Italic),
"infty" => Token::Letter('∞', Variant::Normal),
"mho" => Token::Letter('℧', Variant::Normal),
"Finv" => Token::Letter('Ⅎ', Variant::Normal),
"Re" => Token::Letter('ℜ', Variant::Normal),
"Im" => Token::Letter('ℑ', Variant::Normal),
"complement" => Token::Letter('∁', Variant::Normal),
"emptyset" => Token::Letter('∅', Variant::Normal),
"therefore" => Token::Letter('∴', Variant::Normal),
"because" => Token::Letter('∵', Variant::Normal),
"Diamond" => Token::Letter('◊', Variant::Normal),
"Box" => Token::Letter('◻', Variant::Normal),
"triangle" => Token::Letter('△', Variant::Normal),
"angle" => Token::Letter('∠', Variant::Normal),
"dagger" => Token::Letter('†', Variant::Normal),
"dag" => Token::Letter('†', Variant::Normal),
"Dagger" => Token::Letter('‡', Variant::Normal),
"ddag" => Token::Letter('‡', Variant::Normal),
"And" => Token::Letter('&', Variant::Normal),
"eth" => Token::Letter('ð', Variant::Normal),
"S" => Token::Letter('§', Variant::Normal),
"P" => Token::Letter('¶', Variant::Normal),
"%" => Token::Letter('%', Variant::Normal),
"_" => Token::Letter('_', Variant::Normal),
"&" => Token::Letter('&', Variant::Normal),
"#" => Token::Letter('#', Variant::Normal),
"$" => Token::Letter('$', Variant::Normal),
"copyright" => Token::Letter('©', Variant::Normal),
"checkmark" => Token::Letter('✓', Variant::Normal),
"circledR" => Token::Letter('Ⓡ', Variant::Normal),
"maltese" => Token::Letter('✠', Variant::Normal),
"colon" => Token::Letter(':', Variant::Normal),
"bigtriangleup" => Token::Letter('△', Variant::Normal),
"sphericalangle" => Token::Letter('∢', Variant::Normal),
"square" => Token::Letter('□', Variant::Normal),
"lozenge" => Token::Letter('◊', Variant::Normal),
"diamondsuit" => Token::Letter('♢', Variant::Normal),
"heartsuit" => Token::Letter('♡', Variant::Normal),
"clubsuit" => Token::Letter('♣', Variant::Normal),
"spadesuit" => Token::Letter('♠', Variant::Normal),
"Game" => Token::Letter('⅁', Variant::Normal),
"flat" => Token::Letter('♭', Variant::Normal),
"natural" => Token::Letter('♮', Variant::Normal),
"sharp" => Token::Letter('♯', Variant::Normal),
"pounds" => Token::Letter('£', Variant::Normal),
"textyen" => Token::Letter('¥', Variant::Normal),
"euro" => Token::Letter('€', Variant::Normal),
"rupee" => Token::Letter('₹', Variant::Normal),
"sun" => Token::Letter('☼', Variant::Normal),
"mercury" => Token::Letter('☿', Variant::Normal),
"venus" => Token::Letter('♀', Variant::Normal),
"earth" => Token::Letter('♁', Variant::Normal),
"mars" => Token::Letter('♂', Variant::Normal),
"jupiter" => Token::Letter('♃', Variant::Normal),
"saturn" => Token::Letter('♄', Variant::Normal),
"uranus" => Token::Letter('♅', Variant::Normal),
"neptune" => Token::Letter('♆', Variant::Normal),
"astrosun" => Token::Letter('☉', Variant::Normal),
"ascnode" => Token::Letter('☊', Variant::Normal),
"times" => Token::Operator('×'),
"oplus" => Token::Operator('⊕'),
"ominus" => Token::Operator('⊖'),
"otimes" => Token::Operator('⊗'),
"oslash" => Token::Operator('⊘'),
"odot" => Token::Operator('⊙'),
"bigcirc" => Token::Operator('◯'),
"amalg" => Token::Operator('⨿'),
"pm" => Token::Operator('±'),
"mp" => Token::Operator('∓'),
"cdot" => Token::Operator('·'),
"cdots" => Token::Operator('⋯'),
"vdots" => Token::Operator('⋮'),
"ldots" => Token::Operator('…'),
"ddots" => Token::Operator('⋱'),
"circ" => Token::Operator('∘'),
"bullet" => Token::Operator('∙'),
"star" => Token::Operator('⋆'),
"div" => Token::Operator('÷'),
"lnot" => Token::Operator('¬'),
"land" => Token::Operator('∧'),
"lor" => Token::Operator('∨'),
"sim" => Token::Operator('∼'),
"simeq" => Token::Operator('≃'),
"cong" => Token::Operator('≅'),
"approx" => Token::Operator('≈'),
"ne" => Token::Operator('≠'),
"neq" => Token::Operator('≠'),
"equiv" => Token::Operator('≡'),
"nequiv" => Token::Operator('≢'),
"prec" => Token::Operator('≺'),
"succ" => Token::Operator('≻'),
"preceq" => Token::Operator('⪯'),
"succeq" => Token::Operator('⪰'),
"dashv" => Token::Operator('⊣'),
"asymp" => Token::Operator('≍'),
"doteq" => Token::Operator('≐'),
"propto" => Token::Operator('∝'),
"barwedge" => Token::Operator('⊼'),
"ltimes" => Token::Operator('⋉'),
"rtimes" => Token::Operator('⋊'),
"Join" => Token::Operator('⋈'),
"lhd" => Token::Operator('⊲'),
"rhd" => Token::Operator('⊳'),
"unlhd" => Token::Operator('⊴'),
"unrhd" => Token::Operator('⊵'),
"vee" => Token::Operator('∨'),
"uplus" => Token::Operator('⊎'),
"wedge" => Token::Operator('∧'),
"boxdot" => Token::Operator('⊡'),
"boxplus" => Token::Operator('⊞'),
"boxminus" => Token::Operator('⊟'),
"boxtimes" => Token::Operator('⊠'),
"boxbox" => Token::Operator('⧈'),
"boxslash" => Token::Operator('⧄'),
"boxbslash" => Token::Operator('⧅'),
"Cap" => Token::Operator('⋒'),
"Cup" => Token::Operator('⋓'),
"centerdot" => Token::Operator('∙'),
"circledast" => Token::Operator('⊛'),
"circledcirc" => Token::Operator('⊚'),
"circleddash" => Token::Operator('⊝'),
"curlyvee" => Token::Operator('⋎'),
"curlywedge" => Token::Operator('⋏'),
"dotplus" => Token::Operator('∔'),
"intercal" => Token::Operator('⊺'),
"divideontimes" => Token::Operator('⋇'),
"leftthreetimes" => Token::Operator('⋋'),
"rightthreetimes" => Token::Operator('⋌'),
"smallsetminus" => Token::Operator('﹨'),
"triangledown" => Token::Operator('▽'),
"triangleleft" => Token::Operator('◁'),
"triangleright" => Token::Operator('▷'),
"vartriangle" => Token::Operator('△'),
"veebar" => Token::Operator('⊻'),
"cap" => Token::Operator('∩'),
"cup" => Token::Operator('∪'),
"mid" => Token::Operator('\u{2223}'),
"nmid" => Token::Operator('\u{2224}'),
"|" => Token::Paren("\u{2225}"),
"parallel" => Token::Operator('∥'),
"perp" => Token::Operator('⊥'),
"forall" => Token::Operator('∀'),
"exists" => Token::Operator('∃'),
"nexists" => Token::Operator('∄'),
"lt" => Token::Operator('<'),
"gt" => Token::Operator('>'),
"leq" => Token::Operator('≤'),
"geq" => Token::Operator('≥'),
"ll" => Token::Operator('≪'),
"gg" => Token::Operator('≫'),
"lessapprox" => Token::Operator('⪅'),
"lesssim" => Token::Operator('≲'),
"eqslantless" => Token::Operator('⪕'),
"leqslant" => Token::Operator('⩽'),
"leqq" => Token::Operator('≦'),
"geqq" => Token::Operator('≧'),
"geqslant" => Token::Operator('⩾'),
"eqslantgtr" => Token::Operator('⪖'),
"gtrsim" => Token::Operator('≳'),
"gtrapprox" => Token::Operator('⪆'),
"approxeq" => Token::Operator('≊'),
"lessdot" => Token::Operator('⋖'),
"lll" => Token::Operator('⋘'),
"lessgtr" => Token::Operator('≶'),
"lesseqgtr" => Token::Operator('⋚'),
"lesseqqgtr" => Token::Operator('⪋'),
"doteqdot" => Token::Operator('≑'),
"risingdotseq" => Token::Operator('≓'),
"leftarrow" => Token::Operator('←'),
"gets" => Token::Operator('←'),
"rightarrow" => Token::Operator('→'),
"to" => Token::Operator('→'),
"nleftarrow" => Token::Operator('↚'),
"nrightarrow" => Token::Operator('↛'),
"leftrightarrow" => Token::Operator('↔'),
"nleftrightarrow" => Token::Operator('↮'),
"longleftarrow" => Token::Operator('⟵'),
"longrightarrow" => Token::Operator('⟶'),
"longleftrightarrow" => Token::Operator('⟷'),
"Leftarrow" => Token::Operator('⇐'),
"Rightarrow" => Token::Operator('⇒'),
"nLeftarrow" => Token::Operator('⇍'),
"nRightarrow" => Token::Operator('⇏'),
"Leftrightarrow" => Token::Operator('⇔'),
"nLeftrightarrow" => Token::Operator('⇎'),
"Longleftarrow" => Token::Operator('⟸'),
"impliedby" => Token::Operator('⟸'),
"Longrightarrow" => Token::Operator('⟹'),
"implies" => Token::Operator('⟹'),
"Longleftrightarrow" => Token::Operator('⟺'),
"iff" => Token::Operator('⟺'),
"uparrow" => Token::Operator('↑'),
"downarrow" => Token::Operator('↓'),
"updownarrow" => Token::Operator('↕'),
"Uparrow" => Token::Operator('⇑'),
"Downarrow" => Token::Operator('⇓'),
"Updownarrow" => Token::Operator('⇕'),
"nearrow" => Token::Operator('↗'),
"searrow" => Token::Operator('↘'),
"swarrow" => Token::Operator('↙'),
"nwarrow" => Token::Operator('↖'),
"rightharpoonup" => Token::Operator('⇀'),
"rightharpoondown" => Token::Operator('⇁'),
"leftharpoonup" => Token::Operator('↼'),
"leftharpoondown" => Token::Operator('↽'),
"upharpoonleft" => Token::Operator('↿'),
"upharpoonright" => Token::Operator('↾'),
"downharpoonleft" => Token::Operator('⇃'),
"downharpoonright" => Token::Operator('⇂'),
"rightleftharpoons" => Token::Operator('⇌'),
"leftrightharpoons" => Token::Operator('⇋'),
"curvearrowleft" => Token::Operator('↶'),
"circlearrowleft" => Token::Operator('↺'),
"Lsh" => Token::Operator('↰'),
"upuparrows" => Token::Operator('⇈'),
"rightrightarrows" => Token::Operator('⇉'),
"rightleftarrows" => Token::Operator('⇄'),
"Rrightarrow" => Token::Operator('⇛'),
"rightarrowtail" => Token::Operator('↣'),
"looparrowright" => Token::Operator('↬'),
"curvearrowright" => Token::Operator('↷'),
"circlearrowright" => Token::Operator('↻'),
"Rsh" => Token::Operator('↱'),
"downdownarrows" => Token::Operator('⇊'),
"leftleftarrows" => Token::Operator('⇇'),
"leftrightarrows" => Token::Operator('⇆'),
"Lleftarrow" => Token::Operator('⇚'),
"leftarrowtail" => Token::Operator('↢'),
"looparrowleft" => Token::Operator('↫'),
"mapsto" => Token::Operator('↦'),
"longmapsto" => Token::Operator('⟼'),
"hookrightarrow" => Token::Operator('↪'),
"hookleftarrow" => Token::Operator('↩'),
"multimap" => Token::Operator('⊸'),
"leftrightsquigarrow" => Token::Operator('↭'),
"rightsquigarrow" => Token::Operator('⇝'),
"lightning" => Token::Operator('↯'),
"Yleft" => Token::Operator('⤙'),
"Yright" => Token::Operator('⤚'),
"in" => Token::Operator('\u{2208}'),
"ni" => Token::Operator('\u{2209}'),
"notin" => Token::Operator('\u{2209}'),
"subset" => Token::Operator('\u{2282}'),
"supset" => Token::Operator('\u{2283}'),
"subseteq" => Token::Operator('\u{2286}'),
"supseteq" => Token::Operator('\u{2287}'),
"nsubseteq" => Token::Operator('\u{2288}'),
"nsupseteq" => Token::Operator('\u{2289}'),
"subsetneq" => Token::Operator('\u{228a}'),
"supsetneq" => Token::Operator('\u{228b}'),
"sqsubset" => Token::Operator('⊏'),
"sqsubseteq" => Token::Operator('⊑'),
"sqsupset" => Token::Operator('⊐'),
"sqsupseteq" => Token::Operator('⊒'),
"sqcap" => Token::Operator('⊓'),
"sqcup" => Token::Operator('⊔'),
"setminus" => Token::Operator('∖'),
"partial" => Token::Operator('∂'),
"nabla" => Token::Operator('∇'),
"smile" => Token::Operator('⌣'),
"from" => Token::Operator('⌢'),
"wr" => Token::Operator('≀'),
"bot" => Token::Operator('⊥'),
"top" => Token::Operator('⊤'),
"vdash" => Token::Operator('⊢'),
"vDash" => Token::Operator('⊨'),
"Vdash" => Token::Operator('⊩'),
"models" => Token::Operator('⊨'),
"slashed" => Token::Slashed,
command => Token::Command(command.to_owned()),
}
}
}