]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/math_factory.C
Jean-Marc's fix for wrong descent
[lyx.git] / src / mathed / math_factory.C
index 68b70d19ce1a4562d631ecd76b13e833255dfb2f..7ad66b051d980d0f933a32bef1537cecd49f8241 100644 (file)
@@ -1,6 +1,3 @@
-#ifdef __GNUG__
-#pragma implementation
-#endif
 
 #include <config.h>
 
@@ -34,6 +31,7 @@
 #include "math_stackrelinset.h"
 #include "math_substackinset.h"
 #include "math_symbolinset.h"
+#include "math_tabularinset.h"
 #include "math_undersetinset.h"
 #include "math_unknowninset.h"
 #include "math_xarrowinset.h"
@@ -57,6 +55,7 @@ bool has_math_fonts;
 
 using std::endl;
 
+
 namespace {
 
 // file scope
@@ -98,15 +97,15 @@ void initSymbols()
        std::ifstream fs(filename.c_str());
        string line;
        bool skip = false;
-       while (std::getline(fs, line)) {
+       while (getline(fs, line)) {
                int charid     = 0;
                int fallbackid = 0;
-               if (line.size() > 0 && line[0] == '#')
+               if (!line.empty() && line[0] == '#')
                        continue;
 
                // special case of iffont/else/endif
                if (line.size() >= 7 && line.substr(0, 6) == "iffont") {
-                       istringstream is(line);
+                       istringstream is(STRCONV(line));
                        string tmp;
                        is >> tmp;
                        is >> tmp;
@@ -122,13 +121,13 @@ void initSymbols()
 
                // special case of pre-defined macros
                if (line.size() > 8 && line.substr(0, 5) == "\\def\\") {
-                       //lyxerr << "defining: '" << line << "'\n";
-                       istringstream is(line);
+                       //lyxerr << "defining: '" << line << '\'' << endl;
+                       istringstream is(STRCONV(line));
                        MathMacroTable::create(MathAtom(new MathMacroTemplate(is)));
                        continue;
                }
 
-               istringstream is(line);
+               istringstream is(STRCONV(line));
                latexkeys tmp;
                is >> tmp.name >> tmp.inset;
                if (isFontName(tmp.inset))
@@ -136,7 +135,7 @@ void initSymbols()
                else
                        is >> tmp.extra;
                if (!is) {
-                       lyxerr[Debug::MATHED] << "skipping line '" << line << "'" << endl;
+                       lyxerr[Debug::MATHED] << "skipping line '" << line << '\'' << endl;
                        lyxerr[Debug::MATHED]
                                << tmp.name << ' ' << tmp.inset << ' ' << tmp.extra << endl;
                        continue;
@@ -145,13 +144,17 @@ void initSymbols()
                if (isFontName(tmp.inset)) {
                        // tmp.inset _is_ the fontname here.
                        // create fallbacks if necessary
-                       if (tmp.extra=="func" || tmp.extra=="funclim" || tmp.extra=="special") {
+
+                       // symbol font is not available sometimes
+                       string symbol_font = "lyxsymbol";
+
+                       if (tmp.extra == "func" || tmp.extra == "funclim" || tmp.extra == "special") {
                                lyxerr[Debug::MATHED] << "symbol abuse for " << tmp.name << endl;
                                tmp.draw = tmp.name;
                        } else if (math_font_available(tmp.inset)) {
                                lyxerr[Debug::MATHED] << "symbol available for " << tmp.name << endl;
                                tmp.draw += char(charid);
-                       } else if (fallbackid) {
+                       } else if (fallbackid && math_font_available(symbol_font)) {
                                if (tmp.inset == "cmex")
                                        tmp.inset  = "lyxsymbol";
                                else
@@ -165,20 +168,24 @@ void initSymbols()
                        }
                } else {
                        // it's a proper inset
-                       lyxerr[Debug::MATHED] << "inset " << tmp.inset << " used for "
-                               << tmp.name << endl;
+                       lyxerr[Debug::MATHED] << "inset " << tmp.inset
+                                             << " used for " << tmp.name
+                                             << endl;
                }
 
                if (theWordList.find(tmp.name) != theWordList.end())
-                       lyxerr[Debug::MATHED] << "readSymbols: inset " << tmp.name
-                                             << " already exists." << endl;
+                       lyxerr[Debug::MATHED]
+                               << "readSymbols: inset " << tmp.name
+                               << " already exists." << endl;
                else
                        theWordList[tmp.name] = tmp;
-               lyxerr[Debug::MATHED] << "read symbol '" << tmp.name
-                                       <<  "  inset: " << tmp.inset
-                                       <<  "  draw: " << int(tmp.draw[0])
-                                       <<  "  extra: " << tmp.extra
-                                     << "'" << endl;
+
+               lyxerr[Debug::MATHED]
+                       << "read symbol '" << tmp.name
+                       << "  inset: " << tmp.inset
+                       << "  draw: " << int(tmp.draw.empty() ? 0 : tmp.draw[0])
+                       << "  extra: " << tmp.extra
+                       << '\'' << endl;
        }
        string tmp = "cmm";
        string tmp2 = "cmsy";
@@ -203,18 +210,20 @@ latexkeys const * in_word_set(string const & str)
 {
        WordList::iterator it = theWordList.find(str);
        //lyxerr << "looking up '" << str << "' found: "
-       // << (it != theWordList.end()) << "\n";
+       // << (it != theWordList.end()) << endl;
        return (it != theWordList.end()) ? &(it->second) : 0;
 }
 
 
 MathAtom createMathInset(string const & s)
 {
-       lyxerr[Debug::MATHED] << "creating inset with name: '" << s << "'" << endl;
+       lyxerr[Debug::MATHED] << "creating inset with name: '"
+                             << s << '\'' << endl;;
        latexkeys const * l = in_word_set(s);
        if (l) {
                string const & inset = l->inset;
-               lyxerr[Debug::MATHED] << " found inset: '" << inset << "'" << endl;
+               lyxerr[Debug::MATHED] << " found inset: '" <<
+                       inset << '\'' << endl;
                if (inset == "ref")
                        return MathAtom(new RefInset(l->name));
                if (inset == "underset")
@@ -267,6 +276,8 @@ MathAtom createMathInset(string const & s)
                return MathAtom(new MathSqrtInset);
        if (s == "root")
                return MathAtom(new MathRootInset);
+       if (s == "tabular")
+               return MathAtom(new MathTabularInset(s, 1, 1));
        if (s == "stackrel")
                return MathAtom(new MathStackrelInset);
        if (s == "binom" || s == "choose")
@@ -285,6 +296,6 @@ MathAtom createMathInset(string const & s)
        if (MathMacroTable::has(s))
                return MathAtom(new MathMacro(s));
 
-       //lyxerr[Debug::MATHED] << "creating inset 2 with name: '" << s << "'" << endl;
+       //lyxerr[Debug::MATHED] << "creating inset 2 with name: '" << s << '\'' << endl;
        return MathAtom(new MathUnknownInset(s));
 }