#include <config.h>
#include "math_parser.h"
-#include <algorithm>
+#include "lyxlex.h"
+#include "debug.h"
+#include "support/filetools.h" // LibFileSearch
+#include "support/lyxfunctional.h"
+#include <map>
-bool operator<(const latexkeys & a, const latexkeys & b)
-{
- return string(a.name) < string(b.name);
-}
namespace {
-// This lists needs to remain sorted all the time!
+struct latexkeys_a {
+ ///
+ char const * name;
+ ///
+ short token;
+ ///
+ unsigned int id;
+};
-latexkeys wordlist[] =
+latexkeys_a wordlist_array[] =
{
- //{"oint", LM_TK_BIGSYM, LM_oint, LMB_NONE},
- //{"pmod", LM_TK_SYM, 0, LMB_NONE},
- {"!", LM_TK_SPACE, 0, LMB_NONE},
- {"#", LM_TK_SPECIAL, '#', LMB_NONE},
- {"$", LM_TK_SPECIAL, '$', LMB_NONE},
- {"%", LM_TK_SPECIAL, '%', LMB_NONE},
- {"&", LM_TK_SPECIAL, '&', LMB_NONE},
- {"(", LM_TK_BEGIN, LM_OT_SIMPLE, LMB_NONE},
- {")", LM_TK_END, LM_OT_SIMPLE, LMB_NONE},
- {",", LM_TK_SPACE, 1, LMB_NONE},
- {".", LM_TK_SPECIAL, '.', LMB_NONE},
- {":", LM_TK_SPACE, 2, LMB_NONE},
- {";", LM_TK_SPACE, 3, LMB_NONE},
- {"Delta", LM_TK_SYM, LM_Delta, LMB_NONE},
- {"Downarrow", LM_TK_SYM, LM_Downarrow, LMB_NONE},
- {"Gamma", LM_TK_SYM, LM_Gamma, LMB_NONE},
- {"Im", LM_TK_SYM, LM_Im, LMB_NONE},
- {"Lambda", LM_TK_SYM, LM_Lambda, LMB_NONE},
- {"Leftarrow", LM_TK_SYM, LM_Leftarrow, LMB_NONE},
- {"Leftrightarrow", LM_TK_SYM, LM_Leftrightarrow, LMB_NONE},
- {"Longleftarrow", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"Longleftrightarrow", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"Longrightarrow", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"Omega", LM_TK_SYM, LM_Omega, LMB_NONE},
- {"Phi", LM_TK_SYM, LM_Phi, LMB_NONE},
- {"Pi", LM_TK_SYM, LM_Pi, LMB_NONE},
- {"Pr", LM_TK_FUNCLIM, 0, LMB_NONE},
- {"Psi", LM_TK_SYM, LM_Psi, LMB_NONE},
- {"Re", LM_TK_SYM, LM_Re, LMB_NONE},
- {"Rightarrow", LM_TK_SYM, LM_Rightarrow, LMB_NONE},
- {"Sigma", LM_TK_SYM, LM_Sigma, LMB_NONE},
- {"Theta", LM_TK_SYM, LM_Theta, LMB_NONE},
- {"Uparrow", LM_TK_SYM, LM_Uparrow, LMB_NONE},
- {"Updownarrow", LM_TK_NOGLYPH, LM_Updownarrow, LMB_NONE},
- {"Upsilon", LM_TK_SYM, LM_Upsilon, LMB_NONE},
- {"Vert", LM_TK_NOGLYPH, LM_Vert, LMB_NONE},
- {"Xi", LM_TK_SYM, LM_Xi, LMB_NONE},
- {"[", LM_TK_BEGIN, LM_OT_EQUATION, LMB_NONE},
- {"\\", LM_TK_NEWLINE, static_cast<unsigned>(-1), LMB_NONE}, // -1 needed in mathed_parse_lines!
- {"]", LM_TK_END, LM_OT_EQUATION, LMB_NONE},
- {"_", LM_TK_SPECIAL, '_', LMB_NONE},
- {"acute", LM_TK_DECORATION, LM_acute, LMB_NONE},
- {"aleph", LM_TK_SYM, LM_aleph, LMB_NONE},
- {"alpha", LM_TK_SYM, LM_alpha, LMB_NONE},
- {"amalg", LM_TK_NOGLYPH, 0, LMB_OPERATOR},
- {"angle", LM_TK_SYM, LM_angle, LMB_NONE},
- {"approx", LM_TK_SYM, LM_approx, LMB_RELATION},
- {"arccos", LM_TK_FUNC, 0, LMB_NONE},
- {"arcsin", LM_TK_FUNC, 0, LMB_NONE},
- {"arctan", LM_TK_FUNC, 0, LMB_NONE},
- {"arg", LM_TK_FUNC, 0, LMB_NONE},
- {"asymp", LM_TK_NOGLYPH, 0, LMB_RELATION},
- {"atop", LM_TK_ATOP, 0, LMB_NONE},
- {"backslash", LM_TK_SPECIAL, '\\', LMB_NONE},
- {"bar", LM_TK_DECORATION, LM_bar, LMB_NONE},
- {"begin", LM_TK_BEGIN, 0, LMB_NONE},
- {"beta", LM_TK_SYM, LM_beta, LMB_NONE},
- {"bigcap", LM_TK_NOGLYPHB, 0, LMB_NONE},
- {"bigcirc", LM_TK_NOGLYPH, 0, LMB_OPERATOR},
- {"bigcup", LM_TK_NOGLYPHB, 0, LMB_NONE},
- {"bigodot", LM_TK_NOGLYPHB, 0, LMB_NONE},
- {"bigoplus", LM_TK_NOGLYPHB, 0, LMB_NONE},
- {"bigotimes", LM_TK_NOGLYPHB, 0, LMB_NONE},
- {"bigsqcup", LM_TK_NOGLYPHB, 0, LMB_NONE},
- {"bigtriangledown", LM_TK_NOGLYPH, 0, LMB_OPERATOR},
- {"bigtriangleup", LM_TK_NOGLYPH, 0, LMB_OPERATOR},
- {"biguplus", LM_TK_NOGLYPHB, 0, LMB_NONE},
- {"bigvee", LM_TK_NOGLYPHB, 0, LMB_NONE},
- {"bigwedge", LM_TK_NOGLYPHB, 0, LMB_NONE},
- {"binom", LM_TK_BINOM, 0, LMB_NONE},
- {"bmod", LM_TK_FUNC, 0, LMB_NONE},
- {"bot", LM_TK_SYM, LM_bot, LMB_NONE},
- {"bowtie", LM_TK_NOGLYPH, 0, LMB_RELATION},
- {"breve", LM_TK_DECORATION, LM_breve, LMB_NONE},
- {"bullet", LM_TK_SYM, LM_bullet, LMB_OPERATOR},
- {"cal", LM_TK_OLDFONT, LM_TC_CAL, LMB_OPERATOR},
- {"cap", LM_TK_SYM, LM_cap, LMB_OPERATOR},
- {"cdot", LM_TK_SYM, LM_cdot, LMB_OPERATOR},
- {"cdots", LM_TK_DOTS, LM_cdots, LMB_NONE},
- {"check", LM_TK_DECORATION, LM_check, LMB_NONE},
- {"chi", LM_TK_SYM, LM_chi, LMB_NONE},
- {"choose", LM_TK_CHOOSE, 0, LMB_NONE},
- {"circ", LM_TK_NOGLYPH, 0, LMB_OPERATOR},
- {"clubsuit", LM_TK_SYM, LM_clubsuit, LMB_NONE},
- {"cong", LM_TK_SYM, LM_cong, LMB_RELATION},
- {"coprod", LM_TK_NOGLYPHB, 0, LMB_NONE},
- {"cos", LM_TK_FUNC, 0, LMB_NONE},
- {"cosh", LM_TK_FUNC, 0, LMB_NONE},
- {"cot", LM_TK_FUNC, 0, LMB_NONE},
- {"coth", LM_TK_FUNC, 0, LMB_NONE},
- {"csc", LM_TK_FUNC, 0, LMB_NONE},
- {"cup", LM_TK_SYM, LM_cup, LMB_OPERATOR},
- {"dagger", LM_TK_NOGLYPH, 0, LMB_OPERATOR},
- {"dashv", LM_TK_NOGLYPH, 0, LMB_RELATION},
- {"ddagger", LM_TK_NOGLYPH, 0, LMB_OPERATOR},
- {"ddot", LM_TK_DECORATION, LM_ddot, LMB_NONE},
- {"ddots", LM_TK_DOTS, LM_ddots, LMB_NONE},
- {"deg", LM_TK_FUNC, 0, LMB_NONE},
- {"delta", LM_TK_SYM, LM_delta, LMB_NONE},
- {"det", LM_TK_FUNCLIM, 0, LMB_NONE},
- {"diamond", LM_TK_SYM, LM_diamond, LMB_OPERATOR},
- {"diamondsuit", LM_TK_SYM, LM_diamondsuit, LMB_NONE},
- {"dim", LM_TK_FUNC, 0, LMB_NONE},
- //{"displaystyle", LM_TK_STY, LM_ST_DISPLAY, LMB_NONE},
- {"div", LM_TK_SYM, LM_div, LMB_OPERATOR},
- {"dot", LM_TK_DECORATION, LM_dot, LMB_NONE},
- {"doteq", LM_TK_NOGLYPH, 0, LMB_RELATION},
- {"downarrow", LM_TK_SYM, LM_downarrow, LMB_NONE},
- {"ell", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"end", LM_TK_END, 0, LMB_NONE},
- {"epsilon", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"equiv", LM_TK_SYM, LM_equiv, LMB_RELATION},
- {"eta", LM_TK_SYM, LM_eta, LMB_NONE},
- {"exists", LM_TK_SYM, LM_exists, LMB_NONE},
- {"exp", LM_TK_FUNC, 0, LMB_NONE},
- {"flat", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"forall", LM_TK_SYM, LM_forall, LMB_NONE},
- {"frac", LM_TK_FRAC, 0, LMB_NONE},
- {"frown", LM_TK_NOGLYPH, 0, LMB_RELATION},
- {"gamma", LM_TK_SYM, LM_gamma, LMB_NONE},
- {"gcd", LM_TK_FUNCLIM, 0, LMB_NONE},
- {"geq", LM_TK_SYM, LM_geq, LMB_RELATION},
- {"grave", LM_TK_DECORATION, LM_grave, LMB_NONE},
- {"hat", LM_TK_DECORATION, LM_hat, LMB_NONE},
- {"hbar", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"heartsuit", LM_TK_SYM, LM_heartsuit, LMB_NONE},
- {"hom", LM_TK_FUNC, 0, LMB_NONE},
- {"hookleftarrow", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"hookrightarrow", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"imath", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"in", LM_TK_SYM, LM_in, LMB_RELATION},
- {"inf", LM_TK_FUNCLIM, 0, LMB_NONE},
- {"infty", LM_TK_SYM, LM_infty, LMB_NONE},
- {"int", LM_TK_BIGSYM, LM_int, LMB_NONE},
- {"iota", LM_TK_SYM, LM_iota, LMB_NONE},
- {"jmath", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"kappa", LM_TK_SYM, LM_kappa, LMB_NONE},
- {"ker", LM_TK_FUNC, 0, LMB_NONE},
- {"label", LM_TK_LABEL, 0, LMB_NONE},
- {"lambda", LM_TK_SYM, LM_lambda, LMB_NONE},
- {"langle", LM_TK_SYM, LM_langle, LMB_NONE},
- {"lceil", LM_TK_SYM, LM_lceil, LMB_NONE},
- {"ldots", LM_TK_DOTS, LM_ldots, LMB_NONE},
- {"left", LM_TK_LEFT, 0, LMB_NONE},
- {"leftarrow", LM_TK_SYM, LM_leftarrow, LMB_NONE},
- {"leftharpoondown", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"leftharpoonup", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"leftrightarrow", LM_TK_SYM, LM_leftrightarrow, LMB_NONE},
- {"leq", LM_TK_SYM, LM_leq, LMB_RELATION},
- {"lfloor", LM_TK_SYM, LM_lfloor, LMB_NONE},
- {"lg", LM_TK_FUNC, 0, LMB_NONE},
- {"lim", LM_TK_FUNCLIM, 0, LMB_NONE},
- {"liminf", LM_TK_FUNCLIM, 0, LMB_NONE},
- {"limits", LM_TK_LIMIT, 1 , LMB_NONE},
- {"limsup", LM_TK_FUNCLIM, 0, LMB_NONE},
- {"ln", LM_TK_FUNC, 0, LMB_NONE},
- {"log", LM_TK_FUNC, 0, LMB_NONE},
- {"longleftarrow", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"longleftrightarrow", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"longmapsto", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"longrightarrow", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"mapsto", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"mathbf", LM_TK_FONT, LM_TC_BF, LMB_NONE},
- {"mathcal", LM_TK_FONT, LM_TC_CAL, LMB_NONE},
- {"mathit", LM_TK_FONT, LM_TC_IT, LMB_NONE},
- {"mathnormal", LM_TK_FONT, LM_TC_VAR, LMB_NONE},
- {"mathrm", LM_TK_FONT, LM_TC_RM, LMB_NONE},
- {"mathsf", LM_TK_FONT, LM_TC_SF, LMB_NONE},
- {"mathtt", LM_TK_FONT, LM_TC_TT, LMB_NONE},
- {"max", LM_TK_FUNCLIM, 0, LMB_NONE},
- {"mid", LM_TK_SYM, LM_mid, LMB_RELATION},
- {"min", LM_TK_FUNCLIM, 0, LMB_NONE},
- {"models", LM_TK_NOGLYPH, 0, LMB_RELATION},
- {"mp", LM_TK_NOGLYPH, 0, LMB_OPERATOR},
- {"mu", LM_TK_SYM, LM_mu, LMB_NONE},
- {"nabla", LM_TK_SYM, LM_nabla, LMB_NONE},
- {"natural", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"nearrow", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"neg", LM_TK_SYM, LM_neg, LMB_NONE},
- {"neq", LM_TK_SYM, LM_neq, LMB_RELATION},
- {"newcommand", LM_TK_NEWCOMMAND, 0 , LMB_NONE},
- {"ni", LM_TK_SYM, LM_ni, LMB_RELATION},
- {"nolimits", LM_TK_LIMIT, static_cast<unsigned>(-1), LMB_NONE},
- {"nonumber", LM_TK_NONUM, 0, LMB_NONE},
- {"not", LM_TK_NOT, LM_not, LMB_NONE},
- {"nu", LM_TK_SYM, LM_nu, LMB_NONE},
- {"nwarrow", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"odot", LM_TK_NOGLYPH, 0, LMB_OPERATOR},
- {"omega", LM_TK_SYM, LM_omega, LMB_NONE},
- {"ominus", LM_TK_NOGLYPH, 0, LMB_OPERATOR},
- {"oplus", LM_TK_SYM, LM_oplus, LMB_OPERATOR},
- {"oslash", LM_TK_SYM, LM_oslash, LMB_OPERATOR},
- {"otimes", LM_TK_SYM, LM_otimes, LMB_OPERATOR},
- {"over", LM_TK_OVER, 0, LMB_NONE},
- {"overbrace", LM_TK_DECORATION, LM_overbrace, LMB_NONE},
- {"overleftarrow", LM_TK_DECORATION, LM_overleftarrow, LMB_NONE},
- {"overline", LM_TK_DECORATION, LM_overline, LMB_NONE},
- {"overrightarrow", LM_TK_DECORATION, LM_overightarrow, LMB_NONE},
- {"parallel", LM_TK_NOGLYPH, 0, LMB_RELATION},
- {"partial", LM_TK_SYM, LM_partial, LMB_NONE},
- {"phi", LM_TK_SYM, LM_phi, LMB_NONE},
- {"pi", LM_TK_SYM, LM_pi, LMB_NONE},
- {"pm", LM_TK_SYM, LM_pm, LMB_OPERATOR},
- {"prec", LM_TK_NOGLYPH, 0, LMB_RELATION},
- {"preceq", LM_TK_NOGLYPH, 0, LMB_RELATION},
- {"prime", LM_TK_SYM, LM_prime, LMB_NONE},
- {"prod", LM_TK_BIGSYM, LM_prod, LMB_NONE},
- {"propto", LM_TK_SYM, LM_propto, LMB_RELATION},
- {"protect", LM_TK_PROTECT, 0, LMB_RELATION},
- {"psi", LM_TK_SYM, LM_psi, LMB_NONE},
- {"qquad", LM_TK_SPACE, 5, LMB_NONE},
- {"quad", LM_TK_SPACE, 4, LMB_NONE},
- {"rangle", LM_TK_SYM, LM_rangle, LMB_NONE},
- {"rceil", LM_TK_SYM, LM_rceil, LMB_NONE},
- {"rfloor", LM_TK_SYM, LM_rfloor, LMB_NONE},
- {"rho", LM_TK_SYM, LM_rho, LMB_NONE},
- {"right", LM_TK_RIGHT, 0, LMB_NONE},
- {"rightarrow", LM_TK_SYM, LM_rightarrow, LMB_NONE},
- {"rightharpoondown", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"rightharpoonup", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"rightleftharpoons", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"root", LM_TK_ROOT, 0, LMB_NONE},
- //{"scriptscriptstyle", LM_TK_STY, LM_ST_SCRIPTSCRIPT, LMB_NONE},
- //{"scriptstyle", LM_TK_STY, LM_ST_SCRIPT, LMB_NONE},
- {"searrow", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"sec", LM_TK_FUNC, 0, LMB_NONE},
- {"setminus", LM_TK_NOGLYPH, 0, LMB_OPERATOR},
- {"sharp", LM_TK_SYM, LM_sharp, LMB_NONE},
- {"sigma", LM_TK_SYM, LM_sigma, LMB_NONE},
- {"sim", LM_TK_SYM, LM_sim, LMB_RELATION},
- {"simeq", LM_TK_NOGLYPH, 0, LMB_RELATION},
- {"sin", LM_TK_FUNC, 0, LMB_NONE},
- {"sinh", LM_TK_FUNC, 0, LMB_NONE},
- {"smile", LM_TK_NOGLYPH, 0, LMB_RELATION},
- {"spadesuit", LM_TK_SYM, LM_spadesuit, LMB_NONE},
- {"sqcap", LM_TK_NOGLYPH, 0, LMB_OPERATOR},
- {"sqcup", LM_TK_NOGLYPH, 0, LMB_OPERATOR},
- {"sqrt", LM_TK_SQRT, 0, LMB_NONE},
- {"sqsubseteq", LM_TK_NOGLYPH, 0, LMB_RELATION},
- {"sqsupseteq", LM_TK_NOGLYPH, 0, LMB_RELATION},
- {"stackrel", LM_TK_STACK, 0, LMB_NONE},
- {"star", LM_TK_NOGLYPH, 0, LMB_OPERATOR},
- {"subset", LM_TK_SYM, LM_subset, LMB_RELATION},
- {"subseteq", LM_TK_SYM, LM_subseteq, LMB_RELATION},
- {"succ", LM_TK_NOGLYPH, 0, LMB_RELATION},
- {"succeq", LM_TK_NOGLYPH, 0, LMB_RELATION},
- {"sum", LM_TK_BIGSYM, LM_sum, LMB_NONE},
- {"sup", LM_TK_FUNCLIM, 0, LMB_NONE},
- {"supset", LM_TK_SYM, LM_supset, LMB_RELATION},
- {"supseteq", LM_TK_SYM, LM_supseteq, LMB_RELATION},
- {"surd", LM_TK_SYM, LM_surd, LMB_NONE},
- {"swarrow", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"tan", LM_TK_FUNC, 0, LMB_NONE},
- {"tanh", LM_TK_FUNC, 0, LMB_NONE},
- {"tau", LM_TK_SYM, LM_tau, LMB_NONE},
- {"textrm", LM_TK_FONT, LM_TC_TEXTRM, LMB_NONE},
- {"textdegree", LM_TK_SYM, LM_textdegree, LMB_NONE},
- //{"textstyle", LM_TK_STY, LM_ST_TEXT, LMB_NONE},
- {"therefore", LM_TK_SYM, LM_therefore, LMB_NONE},
- {"theta", LM_TK_SYM, LM_theta, LMB_NONE},
- {"tilde", LM_TK_DECORATION, LM_tilde, LMB_NONE},
- {"times", LM_TK_SYM, LM_times, LMB_OPERATOR},
- {"top", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"triangle", LM_TK_NOGLYPH, 0, LMB_NONE},
- {"triangleleft", LM_TK_NOGLYPH, 0, LMB_OPERATOR},
- {"triangleright", LM_TK_NOGLYPH, 0, LMB_OPERATOR},
- {"underbrace", LM_TK_DECORATION, LM_underbrace, LMB_NONE},
- {"underline", LM_TK_DECORATION, LM_underline, LMB_NONE},
- {"uparrow", LM_TK_SYM, LM_uparrow, LMB_NONE},
- {"updownarrow", LM_TK_NOGLYPH, LM_updownarrow, LMB_NONE},
- {"uplus", LM_TK_NOGLYPH, 0, LMB_OPERATOR},
- {"upsilon", LM_TK_SYM, LM_upsilon, LMB_NONE},
- {"varepsilon", LM_TK_SYM, LM_varepsilon, LMB_NONE},
- {"varphi", LM_TK_SYM, LM_varphi, LMB_NONE},
- {"varpi", LM_TK_SYM, LM_varpi, LMB_NONE},
- {"varsigma", LM_TK_SYM, LM_varsigma, LMB_NONE},
- {"vartheta", LM_TK_SYM, LM_vartheta, LMB_NONE},
- {"vdash", LM_TK_NOGLYPH, 0, LMB_RELATION},
- {"vdots", LM_TK_DOTS, LM_vdots, LMB_NONE},
- {"vec", LM_TK_DECORATION, LM_vec, LMB_NONE},
- {"vee", LM_TK_SYM, LM_vee, LMB_OPERATOR},
- {"wedge", LM_TK_SYM, LM_wedge, LMB_OPERATOR},
- {"widehat", LM_TK_DECORATION, LM_widehat, LMB_NONE},
- {"widetilde", LM_TK_DECORATION, LM_widetilde, LMB_NONE},
- {"wp", LM_TK_SYM, LM_wp, LMB_NONE},
- {"wr", LM_TK_NOGLYPH, 0, LMB_OPERATOR},
- {"xi", LM_TK_SYM, LM_xi, LMB_NONE},
- {"zeta", LM_TK_SYM, LM_zeta, LMB_NONE},
- {"{", LM_TK_SPECIAL, '{', LMB_NONE},
- {"|", LM_TK_UNDEF, '|', LMB_NONE},
- {"}", LM_TK_SPECIAL, '}', LMB_NONE}
+ {"!", LM_TK_SPACE, 0},
+ {"#", LM_TK_SPECIAL, '#'},
+ {"$", LM_TK_SPECIAL, '$'},
+ {"%", LM_TK_SPECIAL, '%'},
+ {"&", LM_TK_SPECIAL, '&'},
+ {"(", LM_TK_BEGIN, LM_OT_SIMPLE},
+ {")", LM_TK_END, LM_OT_SIMPLE},
+ {",", LM_TK_SPACE, 1},
+ {".", LM_TK_SPECIAL, '.'},
+ {":", LM_TK_SPACE, 2},
+ {";", LM_TK_SPACE, 3},
+ {"Pr", LM_TK_FUNCLIM, 0},
+ {"[", LM_TK_BEGIN, LM_OT_EQUATION},
+ {"\\", LM_TK_NEWLINE, static_cast<unsigned>(-1)}, // -1 needed in mathed_parse_lines!
+ {"]", LM_TK_END, LM_OT_EQUATION},
+ {"_", LM_TK_SPECIAL, '_'},
+ {"acute", LM_TK_DECORATION, 0},
+ {"arccos", LM_TK_FUNC, 0},
+ {"arcsin", LM_TK_FUNC, 0},
+ {"arctan", LM_TK_FUNC, 0},
+ {"arg", LM_TK_FUNC, 0},
+ {"atop", LM_TK_ATOP, 0},
+ {"backslash", LM_TK_SPECIAL, '\\'},
+ {"bar", LM_TK_DECORATION, 0},
+ {"begin", LM_TK_BEGIN, 0},
+ {"binom", LM_TK_BINOM, 0},
+ {"bmod", LM_TK_FUNC, 0},
+ {"breve", LM_TK_DECORATION, 0},
+ {"cal", LM_TK_OLDFONT, LM_TC_CAL},
+ {"cdots", LM_TK_DOTS, 0},
+ {"check", LM_TK_DECORATION, 0},
+ {"choose", LM_TK_CHOOSE, 0},
+ {"cos", LM_TK_FUNC, 0},
+ {"cosh", LM_TK_FUNC, 0},
+ {"cot", LM_TK_FUNC, 0},
+ {"coth", LM_TK_FUNC, 0},
+ {"csc", LM_TK_FUNC, 0},
+ {"ddot", LM_TK_DECORATION, 0},
+ {"ddots", LM_TK_DOTS, 0},
+ {"deg", LM_TK_FUNC, 0},
+ {"det", LM_TK_FUNCLIM, 0},
+ {"dim", LM_TK_FUNC, 0},
+ //{"displaystyle", LM_TK_STY, LM_ST_DISPLAY},
+ {"dot", LM_TK_DECORATION, 0},
+ {"end", LM_TK_END, 0},
+ {"exp", LM_TK_FUNC, 0},
+ {"frac", LM_TK_FRAC, 0},
+ {"gcd", LM_TK_FUNCLIM, 0},
+ {"grave", LM_TK_DECORATION, 0},
+ {"hat", LM_TK_DECORATION, 0},
+ {"hom", LM_TK_FUNC, 0},
+ {"inf", LM_TK_FUNCLIM, 0},
+ {"ker", LM_TK_FUNC, 0},
+ {"kern", LM_TK_KERN, 0},
+ {"label", LM_TK_LABEL, 0},
+ {"ldots", LM_TK_DOTS, 0},
+ {"left", LM_TK_LEFT, 0},
+ {"lg", LM_TK_FUNC, 0},
+ {"lim", LM_TK_FUNCLIM, 0},
+ {"liminf", LM_TK_FUNCLIM, 0},
+ {"limits", LM_TK_LIMIT, 1 },
+ {"limsup", LM_TK_FUNCLIM, 0},
+ {"ln", LM_TK_FUNC, 0},
+ {"log", LM_TK_FUNC, 0},
+ {"mathbb", LM_TK_FONT, LM_TC_BB},
+ {"mathbf", LM_TK_FONT, LM_TC_BF},
+ {"mathcal", LM_TK_FONT, LM_TC_CAL},
+ {"mathit", LM_TK_FONT, LM_TC_IT},
+ {"mathnormal", LM_TK_FONT, LM_TC_VAR},
+ {"mathrm", LM_TK_FONT, LM_TC_RM},
+ {"mathsf", LM_TK_FONT, LM_TC_SF},
+ {"mathtt", LM_TK_FONT, LM_TC_TT},
+ {"max", LM_TK_FUNCLIM, 0},
+ {"min", LM_TK_FUNCLIM, 0},
+ {"newcommand", LM_TK_NEWCOMMAND, 0 },
+ {"nolimits", LM_TK_LIMIT, static_cast<unsigned>(-1)},
+ {"nonumber", LM_TK_NONUM, 0},
+ {"not", LM_TK_NOT, 0},
+ {"over", LM_TK_OVER, 0},
+ {"overbrace", LM_TK_DECORATION, 0},
+ {"overleftarrow", LM_TK_DECORATION, 0},
+ {"overline", LM_TK_DECORATION, 0},
+ {"overrightarrow", LM_TK_DECORATION, 0},
+ {"protect", LM_TK_PROTECT, 0},
+ {"qquad", LM_TK_SPACE, 5},
+ {"quad", LM_TK_SPACE, 4},
+ {"right", LM_TK_RIGHT, 0},
+ {"root", LM_TK_ROOT, 0},
+ //{"scriptscriptstyle", LM_TK_STY, LM_ST_SCRIPTSCRIPT},
+ //{"scriptstyle", LM_TK_STY, LM_ST_SCRIPT},
+ {"sec", LM_TK_FUNC, 0},
+ {"sin", LM_TK_FUNC, 0},
+ {"sinh", LM_TK_FUNC, 0},
+ {"sqrt", LM_TK_SQRT, 0},
+ {"stackrel", LM_TK_STACK, 0},
+ {"sup", LM_TK_FUNCLIM, 0},
+ {"tan", LM_TK_FUNC, 0},
+ {"tanh", LM_TK_FUNC, 0},
+ {"textrm", LM_TK_FONT, LM_TC_TEXTRM},
+ //{"textstyle", LM_TK_STY, LM_ST_TEXT},
+ {"tilde", LM_TK_DECORATION, 0},
+ {"underbrace", LM_TK_DECORATION, 0},
+ {"underline", LM_TK_DECORATION, 0},
+ {"vdots", LM_TK_DOTS, 0},
+ {"vec", LM_TK_DECORATION, 0},
+ {"widehat", LM_TK_DECORATION, 0},
+ {"widetilde", LM_TK_DECORATION, 0},
+ {"{", LM_TK_SPECIAL, '{'},
+ {"|", LM_TK_UNDEF, '|'},
+ {"}", LM_TK_SPECIAL, '}'},
};
-// the "Initializer": Its default constructor is executed on loading and
-// sorts the list. Not exactly needed as long as the list is kept sorted
-// but who knows...
+std::map<string, latexkeys> wordlist;
-struct init {
- init() {
- std::sort(wordlist, wordlist + sizeof(wordlist)/sizeof(wordlist[0]));
- }
-};
-static init dummy;
+
+MathTokenEnum tokenEnum(const string & font)
+{
+ if (font == "cmr")
+ return LM_TK_CMR;
+ if (font == "cmsy")
+ return LM_TK_CMSY;
+ if (font == "cmm")
+ return LM_TK_CMM;
+ if (font == "cmex")
+ return LM_TK_CMEX;
+ if (font == "msa")
+ return LM_TK_MSA;
+ if (font == "msb")
+ return LM_TK_MSB;
+ return LM_TK_SYM;
+}
+
+MathSymbolTypes symbolType(const string & type)
+{
+ if (type == "mathrel")
+ return LMB_RELATION;
+ if (type == "mathbin")
+ return LMB_OPERATOR;
+ return LMB_NONE;
+}
+
} // namespace anon
+void ReadSymbols(string const & filename)
+{
+ LyXLex lex(0, 0);
+ lex.setFile(filename);
+ while (lex.isOK() && lex.next()) {
+ latexkeys tmp;
+ tmp.name = lex.getString();
+ if (lex.next())
+ tmp.token = tokenEnum(lex.getString());
+ if (lex.next())
+ tmp.latex_font_id = lex.getInteger();
+ if (lex.next())
+ tmp.id = lex.getInteger();
+ if (lex.next())
+ tmp.type = symbolType(lex.getString());
+ wordlist[tmp.name] = tmp;
+ }
+}
+
+
+void initSymbols()
+{
+ unsigned const n = sizeof(wordlist_array) / sizeof(wordlist_array[0]);
+ for (latexkeys_a * p = wordlist_array; p != wordlist_array + n; ++p) {
+ latexkeys tmp;
+ tmp.name = p->name;
+ tmp.token = p->token;
+ tmp.id = p->id;
+ tmp.type = LMB_NONE;
+ tmp.latex_font_id = 0;
+ wordlist[p->name] = tmp;
+ }
+
+ lyxerr[Debug::MATHED] << "Reading symbols file\n";
+ string const file = LibFileSearch(string(), "symbols");
+ if (file.empty())
+ lyxerr << "Could not find symbols file\n";
+ else
+ ReadSymbols(file);
+}
+
+
latexkeys const * in_word_set(string const & str)
{
-#ifdef WITH_WARNINGS
-#warning Not nice yet...
-#endif
- latexkeys tmp;
- tmp.name = str.c_str();
- int const n = sizeof(wordlist)/sizeof(wordlist[0]);
- latexkeys const * pos = std::lower_bound(wordlist, wordlist + n, tmp);
- return (string(pos->name) == str) ? pos : 0;
+ static bool initialized = false;
+
+ if (!initialized) {
+ initSymbols();
+ initialized = true;
+ }
+
+ std::map<string, latexkeys>::iterator it = wordlist.find(str);
+ return (it != wordlist.end()) ? &(it->second) : 0;
}