#include <config.h>
#include "math_parser.h"
+#include "lyxlex.h"
+#include "debug.h"
+#include "support/filetools.h" // LibFileSearch
+#include "support/lyxfunctional.h"
+
+#include <vector>
#include <algorithm>
// This lists needs to remain sorted all the time!
-latexkeys wordlist[] =
+struct latexkeys_a {
+ ///
+ char const * name;
+ ///
+ short token;
+ ///
+ unsigned int id;
+ ///
+ MathSymbolTypes type;
+};
+
+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_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},
{"kern", LM_TK_KERN, 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},
{"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},
{"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_SPECIAL, '}', LMB_NONE},
+ {"", LM_TK_SPECIAL, 0, LMB_NONE}
+
};
-// 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::vector<latexkeys> wordlist;
+
+bool initialized = false;
-struct init {
- init() {
- std::sort(wordlist, wordlist + sizeof(wordlist)/sizeof(wordlist[0]));
+} // namespace anon
+
+void ReadSymbols(string const & filename)
+{
+ for(latexkeys_a * p = wordlist_array; !string(p->name).empty(); ++p) {
+ latexkeys tmp;
+ tmp.name = p->name;
+ tmp.token = p->token;
+ tmp.id = p->id;
+ tmp.latex_font_id = 0;
+ tmp.type = p->type;
+ wordlist.push_back(tmp);
}
-};
-static init dummy;
+ LyXLex lex(0, 0);
+ lex.setFile(filename);
+ while (lex.isOK()) {
+ latexkeys tmp;
+ string font;
+ string type;
+
+ if (lex.next())
+ tmp.name = lex.getString();
+ else
+ break;
-} // namespace anon
+ if (lex.next())
+ font = lex.getString();
+ if (lex.next())
+ tmp.latex_font_id = lex.getInteger();
+ if (lex.next())
+ tmp.id = lex.getInteger();
+ if (lex.next())
+ type = lex.getString();
+
+ if (font == "cmsy")
+ tmp.token = LM_TK_CMSY;
+ else if (font == "cmm")
+ tmp.token = LM_TK_CMM;
+ else if (font == "cmex")
+ tmp.token = LM_TK_CMEX;
+ else if (font == "msa")
+ tmp.token = LM_TK_MSA;
+ else if (font == "msb")
+ tmp.token = LM_TK_MSB;
+ else
+ tmp.token = LM_TK_SYM;
+
+ if (type == "mathrel")
+ tmp.type = LMB_RELATION;
+ else if (type == "mathbin")
+ tmp.type = LMB_OPERATOR;
+ else
+ tmp.type = LMB_NONE;
+
+ wordlist.push_back(tmp);
+ }
+
+ std::sort(wordlist.begin(), wordlist.end());
+}
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;
+ if (!initialized) {
+ lyxerr[Debug::MATHED] << "Reading symbols file" << endl;
+ string const file = LibFileSearch(string(), "symbols");
+ if (file.empty())
+ lyxerr << "Could not find symbols file" << endl;
+ else
+ ReadSymbols(file);
+ initialized = true;
+ }
+
+ std::vector<latexkeys>::iterator it =
+ std::find_if(wordlist.begin(), wordlist.end(),
+ lyx::compare_memfun(&latexkeys::Name, str));
+ return (it != wordlist.end()) ? &(*it) : 0;
}
#include "mathed/support.h"
#include "lyxfont.h"
+#include "FontLoader.h"
#include "font.h"
#include "math_defs.h"
#include "math_parser.h"
using std::max;
-bool isBinaryOp(char c)
+bool isBinaryOp(char c, MathTextCodes type)
{
- return strchr("+-<>=/*", c);
+ return type < LM_TC_SYMB && strchr("+-<>=/*", c);
}
namespace {
-LyXFont * Math_Fonts = 0;
+LyXFont * MathFonts = 0;
+bool font_available[LM_FONT_END];
+bool font_available_initialized[LM_FONT_END];
void mathed_init_fonts()
{
- Math_Fonts = new LyXFont[8]; //DEC cxx cannot initialize all fonts
+ MathFonts = new LyXFont[13]; //DEC cxx cannot initialize all fonts
//at once (JMarc) rc
- for (int i = 0 ; i < 8 ; ++i) {
- Math_Fonts[i] = LyXFont(LyXFont::ALL_SANE);
+ for (int i = 0 ; i < 13 ; ++i) {
+ MathFonts[i] = LyXFont(LyXFont::ALL_SANE);
}
- Math_Fonts[0].setShape(LyXFont::ITALIC_SHAPE);
+ MathFonts[0].setShape(LyXFont::ITALIC_SHAPE);
- Math_Fonts[1].setFamily(LyXFont::SYMBOL_FAMILY);
+ MathFonts[1].setFamily(LyXFont::SYMBOL_FAMILY);
- Math_Fonts[2].setFamily(LyXFont::SYMBOL_FAMILY);
- Math_Fonts[2].setShape(LyXFont::ITALIC_SHAPE);
+ MathFonts[2].setFamily(LyXFont::SYMBOL_FAMILY);
+ MathFonts[2].setShape(LyXFont::ITALIC_SHAPE);
- Math_Fonts[3].setSeries(LyXFont::BOLD_SERIES);
+ MathFonts[3].setSeries(LyXFont::BOLD_SERIES);
- Math_Fonts[4].setFamily(LyXFont::SANS_FAMILY);
- Math_Fonts[4].setShape(LyXFont::ITALIC_SHAPE);
+ MathFonts[4].setFamily(LyXFont::SANS_FAMILY);
+ MathFonts[4].setShape(LyXFont::ITALIC_SHAPE);
- Math_Fonts[5].setFamily(LyXFont::TYPEWRITER_FAMILY);
+ MathFonts[5].setFamily(LyXFont::TYPEWRITER_FAMILY);
- Math_Fonts[6].setFamily(LyXFont::ROMAN_FAMILY);
+ MathFonts[6].setFamily(LyXFont::ROMAN_FAMILY);
- Math_Fonts[7].setFamily(LyXFont::SANS_FAMILY);
-}
+ MathFonts[7].setFamily(LyXFont::SANS_FAMILY);
-} // namespace
+ MathFonts[8].setFamily(LyXFont::CMSY_FAMILY);
+ MathFonts[9].setFamily(LyXFont::CMM_FAMILY);
+ MathFonts[10].setFamily(LyXFont::CMEX_FAMILY);
+ MathFonts[11].setFamily(LyXFont::MSA_FAMILY);
+ MathFonts[12].setFamily(LyXFont::MSB_FAMILY);
+ for (int i = 0; i < LM_FONT_END; ++i)
+ font_available_initialized[i] = false;
+}
-LyXFont WhichFont(MathTextCodes type, MathStyles size)
+
+LyXFont const & whichFontBase(MathTextCodes type)
{
- LyXFont f;
-
- if (!Math_Fonts)
+ if (!MathFonts)
mathed_init_fonts();
switch (type) {
case LM_TC_SYMB:
case LM_TC_BSYM:
- f = Math_Fonts[2];
- break;
+ return MathFonts[2];
case LM_TC_VAR:
case LM_TC_IT:
- f = Math_Fonts[0];
- break;
+ return MathFonts[0];
case LM_TC_BF:
- f = Math_Fonts[3];
- break;
-
- case LM_TC_SF:
- f = Math_Fonts[7];
- break;
+ return MathFonts[3];
case LM_TC_CAL:
- f = Math_Fonts[4];
- break;
+ return MathFonts[4];
case LM_TC_TT:
- f = Math_Fonts[5];
- break;
+ return MathFonts[5];
case LM_TC_TEXTRM:
case LM_TC_CONST:
case LM_TC_TEX:
case LM_TC_RM:
- f = Math_Fonts[6];
- break;
+ return MathFonts[6];
+
+ case LM_TC_SF:
+ return MathFonts[7];
+
+ case LM_TC_CMSY:
+ return MathFonts[8];
+
+ case LM_TC_CMM:
+ return MathFonts[9];
+
+ case LM_TC_CMEX:
+ return MathFonts[10];
+
+ case LM_TC_MSA:
+ return MathFonts[11];
+
+ case LM_TC_MSB:
+ return MathFonts[12];
default:
- f = Math_Fonts[1];
break;
}
+ return MathFonts[1];
+}
+
+
+LyXFont whichFont(MathTextCodes type, MathStyles size)
+{
+ LyXFont f = whichFontBase(type);
switch (size) {
case LM_ST_DISPLAY:
- if (type == LM_TC_BSYM) {
+ if (type == LM_TC_BSYM || type == LM_TC_CMEX) {
f.incSize();
f.incSize();
}
return f;
}
-char const * math_font_name[] = {
- "mathrm",
- "mathcal",
- "mathbf",
- "mathsf",
- "mathtt",
- "mathit",
- "textrm"
-};
+} // namespace
+
+
+bool math_font_available(MathTextCodes type)
+{
+ if (!font_available_initialized[type]) {
+ font_available_initialized[type] = true;
+ font_available[type] =
+ fontloader.available(whichFontBase(type));
+ }
+ return font_available[type];
+}
namespace {
void mathed_char_dim(MathTextCodes type, MathStyles size, unsigned char c,
int & asc, int & des, int & wid)
{
- LyXFont const font = WhichFont(type, size);
+ LyXFont const font = whichFont(type, size);
des = lyxfont::descent(c, font);
asc = lyxfont::ascent(c, font);
wid = mathed_char_width(type, size, c);
int mathed_char_height(MathTextCodes type, MathStyles size, unsigned char c,
int & asc, int & des)
{
- LyXFont const font = WhichFont(type, size);
+ LyXFont const font = whichFont(type, size);
des = lyxfont::descent(c, font);
asc = lyxfont::ascent(c, font);
return asc + des;
return mathed_char_height(type, size, c, asc, des);
}
+
int mathed_char_ascent(MathTextCodes type, MathStyles size, unsigned char c)
{
- LyXFont const font = WhichFont(type, size);
+ LyXFont const font = whichFont(type, size);
return lyxfont::ascent(c, font);
}
+
int mathed_char_descent(MathTextCodes type, MathStyles size, unsigned char c)
{
- LyXFont const font = WhichFont(type, size);
+ LyXFont const font = whichFont(type, size);
return lyxfont::descent(c, font);
}
+
int mathed_char_width(MathTextCodes type, MathStyles size, unsigned char c)
{
- LyXFont const font = WhichFont(type, size);
- if (isBinaryOp(c))
- return lyxfont::width(c, font) + 2 * lyxfont::width(' ', font);
+ LyXFont const font = whichFont(type, size);
+ LyXFont const f1 = whichFont(LM_TC_TEXTRM, size);
+#warning why f1 is used ?
+ if (isBinaryOp(c, type))
+ return lyxfont::width(c, font) + 2 * lyxfont::width(' ', f1);
else
return lyxfont::width(c, font);
}
wid = mathed_string_width(type, size, s);
}
+
int mathed_string_height(MathTextCodes type, MathStyles size, string const & s,
int & asc, int & des)
{
- LyXFont const font = WhichFont(type, size);
+ LyXFont const font = whichFont(type, size);
asc = des = 0;
for (string::const_iterator it = s.begin(); it != s.end(); ++it) {
des = max(des, lyxfont::descent(*it, font));
return asc + des;
}
+
int mathed_string_width(MathTextCodes type, MathStyles size, string const & s)
{
- return lyxfont::width(s, WhichFont(type, size));
+ return lyxfont::width(s, whichFont(type, size));
}
Matrix mt;
Matrix sqmt;
int i = 0;
- string name = l->name;
+ string const & name = l->name;
int code = (name.size() > 1) ? l->id : name[0];
if (name == ".") {
deco_struct const * mds = search_deco(code);
if (!mds) {
lyxerr << "Deco was not found. Programming error?\n";
- lyxerr << "name: '" << l->name << "', code: " << code << "\n";
+ lyxerr << "name: '" << name << "', code: " << code << "\n";
return;
}
}
-// In a near future maybe we use a better fonts renderer
+// In the future maybe we use a better fonts renderer
void drawStr(Painter & pain, MathTextCodes type, MathStyles siz,
int x, int y, string const & s)
{
- pain.text(x, y, s, WhichFont(type, siz));
+ pain.text(x, y, s, whichFont(type, siz));
}
(Painter & pain, MathTextCodes type, MathStyles siz, int x, int y, char c)
{
string s;
- if (isBinaryOp(c))
+ if (isBinaryOp(c, type))
s += ' ';
s += c;
- if (isBinaryOp(c))
+ if (isBinaryOp(c, type))
s += ' ';
drawStr(pain, type, siz, x, y, s);
}
+
// decrease math size for super- and subscripts
MathStyles smallerStyleScript(MathStyles st)
{
return st;
}
+
// decrease math size for fractions
MathStyles smallerStyleFrac(MathStyles st)
{
void math_font_max_dim(MathTextCodes code, MathStyles siz, int & asc, int & des)
{
- LyXFont font = WhichFont(code, siz);
+ LyXFont font = whichFont(code, siz);
asc = lyxfont::maxAscent(font);
des = lyxfont::maxDescent(font);
}
+
char const * latex_mathspace[] = {
"!", ",", ":", ";", "quad", "qquad"
};