2001-08-13 14:19:16 +00:00
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
#include "math_parser.h"
|
2002-02-14 14:52:23 +00:00
|
|
|
#include "math_arrayinset.h"
|
2002-02-14 14:19:52 +00:00
|
|
|
#include "math_amsarrayinset.h"
|
2001-08-13 15:26:41 +00:00
|
|
|
#include "math_binominset.h"
|
2001-10-24 18:29:55 +00:00
|
|
|
#include "math_boxinset.h"
|
2002-02-14 14:19:52 +00:00
|
|
|
#include "math_casesinset.h"
|
2001-08-13 14:19:16 +00:00
|
|
|
#include "math_decorationinset.h"
|
|
|
|
#include "math_dotsinset.h"
|
2002-06-24 15:37:14 +00:00
|
|
|
#include "math_fboxinset.h"
|
2002-05-30 07:09:54 +00:00
|
|
|
#include "math_fontinset.h"
|
2001-08-13 14:19:16 +00:00
|
|
|
#include "math_fracinset.h"
|
2001-08-21 14:20:50 +00:00
|
|
|
#include "math_kerninset.h"
|
2001-10-18 13:21:21 +00:00
|
|
|
#include "math_lefteqninset.h"
|
2001-08-13 14:19:16 +00:00
|
|
|
#include "math_macro.h"
|
|
|
|
#include "math_macrotable.h"
|
2001-09-12 14:31:18 +00:00
|
|
|
#include "math_macroarg.h"
|
2001-08-17 09:48:24 +00:00
|
|
|
#include "math_notinset.h"
|
2001-08-13 14:19:16 +00:00
|
|
|
#include "math_rootinset.h"
|
2002-01-03 12:02:54 +00:00
|
|
|
#include "math_sizeinset.h"
|
2001-08-13 14:19:16 +00:00
|
|
|
#include "math_spaceinset.h"
|
2002-02-14 14:19:52 +00:00
|
|
|
#include "math_splitinset.h"
|
2001-08-13 14:19:16 +00:00
|
|
|
#include "math_sqrtinset.h"
|
|
|
|
#include "math_stackrelinset.h"
|
2002-02-14 14:52:23 +00:00
|
|
|
#include "math_substackinset.h"
|
2001-11-09 10:44:24 +00:00
|
|
|
#include "math_symbolinset.h"
|
2002-02-01 10:33:06 +00:00
|
|
|
#include "math_undersetinset.h"
|
2001-11-09 10:44:24 +00:00
|
|
|
#include "math_unknowninset.h"
|
2002-02-05 09:51:40 +00:00
|
|
|
#include "math_xarrowinset.h"
|
|
|
|
#include "math_xymatrixinset.h"
|
2002-02-08 08:03:38 +00:00
|
|
|
#include "math_xyarrowinset.h"
|
2001-08-13 14:19:16 +00:00
|
|
|
|
2002-06-24 15:51:35 +00:00
|
|
|
#include "ref_inset.h"
|
|
|
|
|
2002-05-30 07:09:54 +00:00
|
|
|
#include "math_metricsinfo.h"
|
|
|
|
#include "debug.h"
|
|
|
|
#include "math_support.h"
|
|
|
|
#include "Lsstream.h"
|
|
|
|
#include "support/filetools.h" // LibFileSearch
|
2002-06-18 15:44:30 +00:00
|
|
|
#include "frontends/font_loader.h"
|
2002-05-30 07:09:54 +00:00
|
|
|
|
|
|
|
#include <map>
|
|
|
|
#include <fstream>
|
|
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
// file scope
|
|
|
|
typedef std::map<string, latexkeys> WordList;
|
|
|
|
WordList theWordList;
|
|
|
|
|
|
|
|
|
|
|
|
struct key_type {
|
|
|
|
///
|
2002-06-18 15:44:30 +00:00
|
|
|
string name;
|
2002-05-30 07:09:54 +00:00
|
|
|
///
|
2002-06-18 15:44:30 +00:00
|
|
|
string inset;
|
2002-05-30 07:09:54 +00:00
|
|
|
///
|
2002-06-24 15:37:14 +00:00
|
|
|
string extra;
|
2002-05-30 07:09:54 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
key_type wordlist_array[] =
|
2001-08-13 14:19:16 +00:00
|
|
|
{
|
2002-06-24 15:37:14 +00:00
|
|
|
{"!", "space", ""},
|
|
|
|
{",", "space", ""},
|
|
|
|
{":", "space", ""},
|
|
|
|
{";", "space", ""},
|
|
|
|
{"Vmatrix", "matrix", ""},
|
|
|
|
{"acute", "decoration", ""},
|
|
|
|
{"bar", "decoration", ""},
|
|
|
|
{"begin", "begin", ""},
|
|
|
|
{"bf", "oldfont", ""},
|
|
|
|
{"bmatrix", "matrix", ""},
|
|
|
|
{"acute", "decoration", ""},
|
|
|
|
{"breve", "decoration", ""},
|
|
|
|
{"cal", "oldfont", ""},
|
|
|
|
{"cdots", "dots", ""},
|
|
|
|
{"check", "decoration", ""},
|
|
|
|
{"ddot", "decoration", ""},
|
|
|
|
{"dddot", "decoration", ""},
|
|
|
|
{"ddots", "dots", ""},
|
|
|
|
{"displaystyle", "style", ""},
|
|
|
|
{"dot", "decoration", ""},
|
|
|
|
{"dotsb", "dots", ""},
|
|
|
|
{"dotsc", "dots", ""},
|
|
|
|
{"dotsi", "dots", ""},
|
|
|
|
{"dotsm", "dots", ""},
|
|
|
|
{"dotso", "dots", ""},
|
|
|
|
{"end", "end", ""},
|
|
|
|
{"fbox", "fbox", ""},
|
|
|
|
{"frak", "font", ""},
|
|
|
|
{"grave", "decoration", ""},
|
|
|
|
{"hat", "decoration", ""},
|
|
|
|
{"it", "oldfont", ""},
|
|
|
|
{"label", "label", ""},
|
|
|
|
{"ldots", "dots", ""},
|
|
|
|
{"left", "left", ""},
|
|
|
|
{"limits", "limit", ""},
|
|
|
|
{"lyxbox", "box", ""},
|
|
|
|
{"lyxnegspace", "space", ""},
|
|
|
|
{"lyxposspace", "space", ""},
|
|
|
|
{"mathbb", "font", ""},
|
|
|
|
{"mathbf", "font", ""},
|
|
|
|
{"mathcal", "font", ""},
|
|
|
|
{"mathfrak", "font", ""},
|
|
|
|
{"mathit", "font", ""},
|
|
|
|
{"mathnormal", "font", ""},
|
|
|
|
{"mathring", "decoration", ""},
|
|
|
|
{"mathrm", "font", ""},
|
|
|
|
{"mathsf", "font", ""},
|
|
|
|
{"mathtt", "font", ""},
|
|
|
|
{"matrix", "matrix", ""},
|
|
|
|
{"mbox", "box", ""},
|
|
|
|
{"newcommand", "newcommand", ""},
|
|
|
|
{"nolimits", "limit", ""},
|
|
|
|
{"nonumber", "nonum", ""},
|
|
|
|
{"overbrace", "decoration", ""},
|
|
|
|
{"overleftarrow", "decoration", ""},
|
|
|
|
{"overline", "decoration", ""},
|
|
|
|
{"overrightarrow", "decoration", ""},
|
|
|
|
{"overleftrightarrow", "decoration", ""},
|
|
|
|
{"pmatrix", "matrix", ""},
|
|
|
|
{"protect", "protect", ""},
|
|
|
|
{"qquad", "space", ""},
|
|
|
|
{"quad", "space", ""},
|
|
|
|
{"right", "right", ""},
|
|
|
|
{"rm", "oldfont", ""},
|
|
|
|
{"scriptscriptstyle", "style", ""},
|
|
|
|
{"scriptstyle", "style", ""},
|
|
|
|
{"textbf", "font", "mathtext"},
|
|
|
|
{"textit", "font", "mathtext"},
|
|
|
|
{"textmd", "font", "mathtext"},
|
|
|
|
{"textrm", "font", "mathtext"},
|
|
|
|
{"textsl", "font", "mathtext"},
|
|
|
|
{"textup", "font", "mathtext"},
|
|
|
|
{"textstyle", "style", ""},
|
|
|
|
{"tilde", "decoration", ""},
|
|
|
|
{"tt", "oldfont", ""},
|
|
|
|
{"underbar", "decoration", ""},
|
|
|
|
{"underbrace", "decoration", ""},
|
|
|
|
{"underleftarrow", "decoration", ""},
|
|
|
|
{"underline", "decoration", ""},
|
|
|
|
{"underrightarrow", "decoration", ""},
|
|
|
|
{"underleftrightarrow", "decoration", ""},
|
|
|
|
{"underset", "underset", ""},
|
|
|
|
{"vdots", "dots", ""},
|
|
|
|
{"vec", "decoration", ""},
|
|
|
|
{"vmatrix", "matrix", ""},
|
|
|
|
{"widehat", "decoration", ""},
|
|
|
|
{"widetilde", "decoration", ""}
|
2002-05-30 07:09:54 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2002-06-18 15:44:30 +00:00
|
|
|
bool math_font_available(string & name)
|
|
|
|
{
|
|
|
|
LyXFont f;
|
|
|
|
augmentFont(f, name);
|
|
|
|
|
|
|
|
// Do we have the font proper?
|
|
|
|
if (fontloader.available(f))
|
|
|
|
return true;
|
|
|
|
|
|
|
|
// can we fake it?
|
|
|
|
if (name == "eufrak") {
|
|
|
|
name = "lyxfakefrak";
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2002-06-24 15:37:14 +00:00
|
|
|
lyxerr[Debug::MATHED] << "font " << name << " not available and I can't fake it\n";
|
2002-06-18 15:44:30 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2002-05-30 07:09:54 +00:00
|
|
|
|
|
|
|
void readSymbols(string const & filename)
|
|
|
|
{
|
2002-06-25 14:01:29 +00:00
|
|
|
lyxerr[Debug::MATHED] << "read symbols from " << filename << "\n";
|
2002-05-30 07:09:54 +00:00
|
|
|
std::ifstream fs(filename.c_str());
|
|
|
|
while (fs) {
|
|
|
|
int charid = 0;
|
|
|
|
int fallbackid = 0;
|
|
|
|
latexkeys tmp;
|
|
|
|
string line;
|
|
|
|
getline(fs, line);
|
|
|
|
istringstream is(line);
|
|
|
|
is >> tmp.name
|
|
|
|
>> tmp.inset
|
|
|
|
>> charid
|
|
|
|
>> fallbackid
|
|
|
|
>> tmp.extra
|
|
|
|
>> tmp.xmlname;
|
|
|
|
if (!is)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
// tmp.inset _is_ the fontname here.
|
2002-06-18 15:44:30 +00:00
|
|
|
// create fallbacks if necessary
|
|
|
|
if (tmp.extra == "func" || tmp.extra == "funclim" || tmp.extra=="special") {
|
|
|
|
lyxerr[Debug::MATHED] << "symbol abuse for " << tmp.name << "\n";
|
|
|
|
tmp.draw = tmp.name;
|
|
|
|
} else if (math_font_available(tmp.inset)) {
|
|
|
|
lyxerr[Debug::MATHED] << "symbol available for " << tmp.name << "\n";
|
2002-05-30 07:09:54 +00:00
|
|
|
tmp.draw += char(charid);
|
2002-06-18 15:44:30 +00:00
|
|
|
} else if (fallbackid) {
|
2002-05-30 07:09:54 +00:00
|
|
|
if (tmp.inset == "cmex")
|
2002-06-18 15:44:30 +00:00
|
|
|
tmp.inset = "lyxsymbol";
|
2002-05-30 07:09:54 +00:00
|
|
|
else
|
2002-06-18 15:44:30 +00:00
|
|
|
tmp.inset = "lyxboldsymbol";
|
|
|
|
lyxerr[Debug::MATHED] << "symbol fallback for " << tmp.name << "\n";
|
2002-05-30 07:09:54 +00:00
|
|
|
tmp.draw += char(fallbackid);
|
2002-06-18 15:44:30 +00:00
|
|
|
} else {
|
|
|
|
lyxerr[Debug::MATHED] << "faking " << tmp.name << "\n";
|
|
|
|
tmp.draw = tmp.name;
|
2002-06-24 15:37:14 +00:00
|
|
|
tmp.inset = "lyxtex";
|
2002-05-30 07:09:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (theWordList.find(tmp.name) != theWordList.end())
|
2002-05-30 10:20:27 +00:00
|
|
|
lyxerr[Debug::MATHED] << "readSymbols: inset " << tmp.name
|
2002-05-30 07:09:54 +00:00
|
|
|
<< " already exists.\n";
|
|
|
|
else
|
|
|
|
theWordList[tmp.name] = tmp;
|
2002-05-30 10:20:27 +00:00
|
|
|
lyxerr[Debug::MATHED] << "read symbol '" << tmp.name
|
2002-05-30 07:09:54 +00:00
|
|
|
<< " inset: " << tmp.inset
|
|
|
|
<< " draw: " << int(tmp.draw[0])
|
|
|
|
<< " extra: " << tmp.extra
|
|
|
|
<< "'\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void initSymbols()
|
|
|
|
{
|
|
|
|
unsigned const n = sizeof(wordlist_array) / sizeof(wordlist_array[0]);
|
|
|
|
for (key_type * p = wordlist_array; p != wordlist_array + n; ++p) {
|
|
|
|
latexkeys tmp;
|
|
|
|
tmp.name = p->name;
|
|
|
|
tmp.inset = p->inset;
|
|
|
|
tmp.draw = p->name;
|
|
|
|
theWordList[p->name] = tmp;
|
2001-08-13 14:19:16 +00:00
|
|
|
}
|
2002-05-30 07:09:54 +00:00
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace anon
|
|
|
|
|
|
|
|
|
|
|
|
latexkeys const * in_word_set(string const & str)
|
|
|
|
{
|
|
|
|
static bool initialized = false;
|
|
|
|
|
|
|
|
if (!initialized) {
|
|
|
|
initSymbols();
|
|
|
|
initialized = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
WordList::iterator it = theWordList.find(str);
|
2002-06-03 07:31:08 +00:00
|
|
|
//lyxerr << "looking up '" << str << "' found: "
|
|
|
|
// << (it != theWordList.end()) << "\n";
|
2002-05-30 07:09:54 +00:00
|
|
|
return (it != theWordList.end()) ? &(it->second) : 0;
|
2001-08-13 14:19:16 +00:00
|
|
|
}
|
2001-08-15 05:50:39 +00:00
|
|
|
|
|
|
|
|
2001-10-12 12:02:49 +00:00
|
|
|
MathAtom createMathInset(string const & s)
|
2001-08-15 05:50:39 +00:00
|
|
|
{
|
2002-05-30 09:19:12 +00:00
|
|
|
lyxerr[Debug::MATHED] << "creating inset with name: '" << s << "'\n";
|
2001-09-12 14:31:18 +00:00
|
|
|
if (s.size() == 2 && s[0] == '#' && s[1] >= '1' && s[1] <= '9')
|
2001-10-12 12:02:49 +00:00
|
|
|
return MathAtom(new MathMacroArgument(s[1] - '0'));
|
2001-09-12 14:31:18 +00:00
|
|
|
|
2001-10-23 09:03:07 +00:00
|
|
|
if (s.size() == 3 && s[0] == '\\' && s[1] == '#'
|
|
|
|
&& s[2] >= '1' && s[2] <= '9')
|
2001-10-12 12:02:49 +00:00
|
|
|
return MathAtom(new MathMacroArgument(s[2] - '0'));
|
2002-03-27 10:51:46 +00:00
|
|
|
if (s == "kern")
|
2002-03-25 12:11:25 +00:00
|
|
|
return MathAtom(new MathKernInset);
|
2002-02-04 18:44:51 +00:00
|
|
|
if (s == "xymatrix")
|
|
|
|
return MathAtom(new MathXYMatrixInset);
|
2002-02-15 15:01:01 +00:00
|
|
|
if (s == "xrightarrow" || s == "xleftarrow")
|
2002-02-05 09:51:40 +00:00
|
|
|
return MathAtom(new MathXArrowInset(s));
|
2002-02-15 14:50:40 +00:00
|
|
|
if (s == "split" || s == "gathered" || s == "aligned")
|
|
|
|
return MathAtom(new MathSplitInset(s));
|
2002-02-14 14:19:52 +00:00
|
|
|
if (s == "cases")
|
|
|
|
return MathAtom(new MathCasesInset);
|
2002-02-14 14:52:23 +00:00
|
|
|
if (s == "substack")
|
|
|
|
return MathAtom(new MathSubstackInset);
|
|
|
|
if (s == "subarray" || s == "array")
|
|
|
|
return MathAtom(new MathArrayInset(s, 1, 1));
|
2002-05-30 07:09:54 +00:00
|
|
|
if (s == "sqrt")
|
|
|
|
return MathAtom(new MathSqrtInset);
|
|
|
|
if (s == "root")
|
|
|
|
return MathAtom(new MathRootInset);
|
|
|
|
if (s == "stack")
|
|
|
|
return MathAtom(new MathStackrelInset);
|
|
|
|
if (s == "binom" || s == "choose")
|
|
|
|
return MathAtom(new MathBinomInset);
|
|
|
|
if (s == "over" || s == "frac")
|
|
|
|
return MathAtom(new MathFracInset);
|
|
|
|
if (s == "atop")
|
|
|
|
return MathAtom(new MathFracInset(true));
|
|
|
|
if (s == "not")
|
|
|
|
return MathAtom(new MathNotInset);
|
|
|
|
if (s == "lefteqn")
|
|
|
|
return MathAtom(new MathLefteqnInset);
|
2002-06-24 15:37:14 +00:00
|
|
|
if (s == "ref")
|
|
|
|
return MathAtom(new RefInset);
|
|
|
|
|
2002-02-14 14:19:52 +00:00
|
|
|
|
2001-08-15 05:50:39 +00:00
|
|
|
latexkeys const * l = in_word_set(s);
|
2002-05-30 07:09:54 +00:00
|
|
|
if (l) {
|
|
|
|
string const & inset = l->inset;
|
2002-06-18 15:44:30 +00:00
|
|
|
lyxerr[Debug::MATHED] << " found inset: '" << inset << "'\n";
|
2002-05-30 07:09:54 +00:00
|
|
|
if (inset == "underset")
|
|
|
|
return MathAtom(new MathUndersetInset);
|
|
|
|
if (inset == "decoration")
|
|
|
|
return MathAtom(new MathDecorationInset(l->name));
|
2002-06-25 13:19:50 +00:00
|
|
|
if (inset == "space")
|
|
|
|
return MathAtom(new MathSpaceInset(l->name));
|
2002-05-30 07:09:54 +00:00
|
|
|
if (inset == "dots")
|
|
|
|
return MathAtom(new MathDotsInset(l->name));
|
|
|
|
if (inset == "box")
|
|
|
|
return MathAtom(new MathBoxInset(l->name));
|
2002-06-24 15:37:14 +00:00
|
|
|
if (inset == "fbox")
|
|
|
|
return MathAtom(new MathFboxInset);
|
2002-05-30 07:09:54 +00:00
|
|
|
if (inset == "style")
|
|
|
|
return MathAtom(new MathSizeInset(l));
|
|
|
|
if (inset == "font")
|
|
|
|
return MathAtom(new MathFontInset(l->name));
|
|
|
|
if (inset == "oldfont")
|
|
|
|
return MathAtom(new MathFontInset(l->name));
|
2002-06-24 15:37:14 +00:00
|
|
|
if (inset == "matrix")
|
|
|
|
return MathAtom(new MathAMSArrayInset(s));
|
2002-06-18 15:44:30 +00:00
|
|
|
return MathAtom(new MathSymbolInset(l));
|
2002-05-30 07:09:54 +00:00
|
|
|
}
|
2001-08-15 05:50:39 +00:00
|
|
|
|
2002-03-21 17:42:56 +00:00
|
|
|
if (MathMacroTable::has(s))
|
2001-10-12 12:02:49 +00:00
|
|
|
return MathAtom(new MathMacro(s));
|
2001-08-15 05:50:39 +00:00
|
|
|
|
2002-05-30 09:19:12 +00:00
|
|
|
//lyxerr[Debug::MATHED] << "creating inset 2 with name: '" << s << "'\n";
|
2001-11-09 10:44:24 +00:00
|
|
|
return MathAtom(new MathUnknownInset(s));
|
2001-08-15 05:50:39 +00:00
|
|
|
}
|