3 * Copyright 2001 the LyX Team
4 * Read the file COPYING
6 * \author Alejandro Aguilar Sierra
7 * \author John Levon, moz@compsoc.man.ac.uk
13 #include XPM_H_LOCATION
16 #pragma implementation
19 #include "support/LAssert.h"
20 #include "support/lstrings.h"
22 #include "MathsSymbols.h"
23 #include "FormMathsPanel.h"
29 #ifndef CXX_GLOBAL_CSTD
34 /* Latex code for those bitmaps */
44 #include "ams_misc.xbm"
45 #include "ams_arrows.xbm"
46 #include "ams_rel.xbm"
47 #include "ams_nrel.xbm"
48 #include "ams_ops.xbm"
50 #include "mathed/math_parser.h"
62 #include "equation.xpm"
64 char const * function_names[] = {
65 "arccos", "arcsin", "arctan", "arg", "bmod",
66 "cos", "cosh", "cot", "coth", "csc", "deg",
67 "det", "dim", "exp", "gcd", "hom", "inf", "ker",
68 "lg", "lim", "liminf", "limsup", "ln", "log",
69 "max", "min", "sec", "sin", "sinh", "sup",
73 int const nr_function_names = sizeof(function_names) /
76 char const * latex_arrow[] = {
77 "downarrow", "leftarrow", "Downarrow", "Leftarrow",
78 "hookleftarrow", "rightarrow", "uparrow", "Rightarrow", "Uparrow",
79 "hookrightarrow", "updownarrow", "Leftrightarrow", "leftharpoonup",
80 "rightharpoonup", "rightleftharpoons", "leftrightarrow", "Updownarrow",
81 "leftharpoondown", "rightharpoondown", "mapsto",
82 "Longleftarrow", "Longrightarrow", "Longleftrightarrow",
83 "longleftrightarrow", "longleftarrow", "longrightarrow", "longmapsto",
84 "nwarrow", "nearrow", "swarrow", "searrow", "",
87 int const nr_latex_arrow = sizeof(latex_arrow) / sizeof(char const *);
89 char const * latex_bop[] = {
90 "pm", "cap", "diamond", "oplus",
91 "mp", "cup", "bigtriangleup", "ominus",
92 "times", "uplus", "bigtriangledown", "otimes",
93 "div", "sqcap", "triangleright", "oslash",
94 "cdot", "sqcup", "triangleleft", "odot",
95 "star", "vee", "amalg", "bigcirc",
96 "setminus", "wedge", "dagger", "circ",
97 "bullet", "wr", "ddagger", ""
100 int const nr_latex_bop = sizeof(latex_bop) / sizeof(char const *);
102 char const * latex_brel[] = {
103 "leq", "geq", "equiv", "models",
104 "prec", "succ", "sim", "perp",
105 "preceq", "succeq", "simeq", "mid",
106 "ll", "gg", "asymp", "parallel",
107 "subset", "supset", "approx", "smile",
108 "subseteq", "supseteq", "cong", "frown",
109 "sqsubseteq", "sqsupseteq", "doteq", "neq",
110 "in", "ni", "propto", "notin",
111 "vdash", "dashv", "bowtie", ""
114 int const nr_latex_brel = sizeof(latex_brel) / sizeof(char const *);
116 char const * latex_dots[] = {
117 "ldots", "cdots", "vdots", "ddots"
120 int const nr_latex_dots = sizeof(latex_dots) / sizeof(char const *);
122 char const * latex_greek[] = {
123 "Gamma", "Delta", "Theta", "Lambda", "Xi", "Pi",
124 "Sigma", "Upsilon", "Phi", "Psi", "Omega",
125 "alpha", "beta", "gamma", "delta", "epsilon", "varepsilon", "zeta",
126 "eta", "theta", "vartheta", "iota", "kappa", "lambda", "mu",
127 "nu", "xi", "pi", "varpi", "rho", "sigma", "varsigma",
128 "tau", "upsilon", "phi", "varphi", "chi", "psi", "omega", ""
131 int const nr_latex_greek = sizeof(latex_greek) / sizeof(char const *);
133 char const * latex_misc[] = {
134 "nabla", "partial", "infty", "prime", "ell",
135 "emptyset", "exists", "forall", "imath", "jmath",
136 "Re", "Im", "aleph", "wp", "hbar",
137 "angle", "top", "bot", "Vert", "neg",
138 "flat", "natural", "sharp", "surd", "triangle",
139 "diamondsuit", "heartsuit", "clubsuit", "spadesuit",
140 "textrm Å", "textrm Ø", "mathcircumflex", "_",
142 "mathbb N", "mathbb Z", "mathbb Q",
143 "mathbb R", "mathbb C", "mathbb H",
144 "mathcal F", "mathcal L",
145 "mathcal H", "mathcal O", ""
148 int const nr_latex_misc = sizeof(latex_misc) / sizeof(char const *);
150 char const * latex_varsz[] = {
151 "sum", "int", "oint",
152 "prod", "coprod", "bigsqcup",
153 "bigotimes", "bigodot", "bigoplus",
154 "bigcap", "bigcup", "biguplus",
155 "bigvee", "bigwedge", ""
158 int const nr_latex_varsz = sizeof(latex_varsz) / sizeof(char const *);
160 char const * latex_ams_misc[] = {
161 "digamma", "varkappa", "beth", "daleth", "gimel",
162 "ulcorner", "urcorner", "llcorner", "lrcorner",
163 "hbar", "hslash", "vartriangle",
164 "triangledown", "square", "lozenge",
165 "circledS", "angle", "measuredangle",
166 "nexists", "mho", "Finv",
167 "Game", "Bbbk", "backprime",
168 "varnothing", "blacktriangle", "blacktriangledown",
169 "blacksquare", "blacklozenge", "bigstar",
170 "sphericalangle", "complement", "eth",
171 "diagup", "diagdown", ""
174 int const nr_latex_ams_misc = sizeof(latex_ams_misc) / sizeof(char const *);
176 char const * latex_ams_arrows[] = {
177 "dashrightarrow", "dashleftarrow", "leftleftarrows",
178 "leftrightarrows", "Lleftarrow", "twoheadleftarrow",
179 "leftarrowtail", "looparrowleft", "leftrightharpoons",
180 "curvearrowleft", "circlearrowleft", "Lsh",
181 "upuparrows", "upharpoonleft", "downharpoonleft",
182 "multimap", "leftrightsquigarrow", "rightrightarrows",
183 "rightleftarrows", "rightrightarrows", "rightleftarrows",
184 "twoheadrightarrow", "rightarrowtail", "looparrowright",
185 "rightleftharpoons", "curvearrowright", "circlearrowright",
186 "Rsh", "downdownarrows", "upharpoonright",
187 "downharpoonright", "rightsquigarrow",
188 "nleftarrow", "nrightarrow", "nLeftarrow",
189 "nRightarrow", "nleftrightarrow", "nLeftrightarrow"
192 int const nr_latex_ams_arrows = sizeof(latex_ams_arrows) / sizeof(char const *);
194 char const * latex_ams_rel[] = {
195 "leqq", "leqslant", "eqslantless", "eqslantgtr", "gtrsim", "gtrapprox",
196 "lesssim", "lessapprox", "approxeq", "gtrdot", "ggg", "gtrless",
197 "lessdot", "lll", "lessgtr", "gtreqless", "gtreqqless", "eqcirc",
198 "lesseqgtr", "lesseqqgtr", "doteqdot", "circeq", "triangleq", "thicksim",
199 "risingdotseq", "fallingdotseq", "backsim", "thickapprox", "supseteqq", "Supset",
200 "backsimeq", "subseteqq", "Subset","sqsupset", "succcurlyeq", "curlyeqsucc",
201 "sqsubset", "preccurlyeq", "curlyeqprec", "succsim", "succapprox", "vartriangleright",
202 "precsim", "precapprox", "vartriangleleft", "trianglerighteq", "Vdash", "shortmid",
203 "trianglelefteq", "vDash", "Vvdash", "shortparallel", "between", "pitchfork",
204 "smallsmile", "smallfrown", "bumpeq", "varpropto", "blacktriangleleft", "therefore",
205 "Bumpeq", "geqq", "geqslant", "backepsilon", "blacktriangleright", "because"
208 int const nr_latex_ams_rel = sizeof(latex_ams_rel) / sizeof(char const *);
210 char const * latex_ams_nrel[] = {
211 "nless", "nleq", "nleqslant", "ngeqslant", "ngeqq", "gneq",
212 "nleqq", "lneq", "lneqq","gneqq", "gverteqq", "gnsim",
213 "lvertneqq", "lnsim", "lnapprox", "gnapprox", "nsucc", "nsucceq",
214 "nprec", "npreceq", "precnsim","succnsim", "succnapprox", "ncong",
215 "precnapprox", "nsim", "nshortmid", "nshortparallel", "nparallel", "nvDash",
217 "nmid", "nvdash", "nvDash","nVDash", "ntriangleright", "ntrianglerighteq",
218 "ntriangleleft", "ntrianglelefteq", "nsubseteq", "nsupseteq", "nsupseteqq", "supsetneq",
219 "subsetneq", "varsubsetneq", "subsetneqq", "varsupsetneq", "supsetneqq", "varsupsetneqq",
220 "varsubsetneqq", "ngtr", "ngeq","", "", ""
223 int const nr_latex_ams_nrel = sizeof(latex_ams_nrel) / sizeof(char const *);
226 char const * latex_ams_ops[] = {
227 "dotplus", "smallsetminus", "Cap",
228 "Cup", "barwedge", "veebar",
229 "doublebarwedge", "boxminus", "boxtimes",
230 "boxdot", "boxplus", "divideontimes",
231 "ltimes", "rtimes", "leftthreetimes",
232 "rightthreetimes", "curlywedge", "curlyvee",
233 "circleddash", "circledast", "circledcirc",
234 "centerdot", "intercal", ""
237 int const nr_latex_ams_ops = sizeof(latex_ams_ops) / sizeof(char const *);
239 static char const ** mathed_get_pixmap_from_icon(int d)
242 case MM_FRAC: return frac;
243 case MM_SQRT: return sqrt_xpm;
244 case MM_SUPER: return super_xpm;
245 case MM_SUB: return sub_xpm;
246 case MM_STYLE: return style_xpm;
247 case MM_DELIM: return delim;
248 case MM_MATRIX: return matrix;
249 case MM_EQU: return equation;
250 case MM_DECO: return deco;
251 case MM_SPACE: return space_xpm;
256 static char const ** pixmapFromBitmapData(char const * s, int wx, int hx)
258 char const ** data = 0;
263 for (; i < 11; ++i) {
264 char const ** latex_str = 0;
266 case 0: latex_str = latex_greek; break;
267 case 1: latex_str = latex_bop; break;
268 case 2: latex_str = latex_brel; break;
269 case 3: latex_str = latex_arrow; break;
270 case 4: latex_str = latex_varsz; break;
271 case 5: latex_str = latex_misc; break;
272 case 6: latex_str = latex_ams_misc; break;
273 case 7: latex_str = latex_ams_arrows; break;
274 case 8: latex_str = latex_ams_rel; break;
275 case 9: latex_str = latex_ams_nrel; break;
276 case 10: latex_str = latex_ams_ops; break;
277 // Add AMS stuff here -- MV
280 for (int k = 0; latex_str[k][0] > ' '; ++k) {
281 if (compare(latex_str[k], s) == 0) {
288 if (i < 11 && id >= 0) {
289 unsigned char const * bdata = 0;
295 lyxerr [Debug::MATHED] << "Imando " << i << ", " << id << endl;
334 } else if (id > 28) {
364 } else if (id > 36) {
389 XImage * xima = XCreateImage(fl_get_display(), 0, 1, XYBitmap, 0,
390 const_cast<char*>(reinterpret_cast<char const *>(bdata)), w, h, 8, 0);
391 xima->byte_order = LSBFirst;
392 xima->bitmap_bit_order = LSBFirst;
393 int x = (id % dw) * ww;
394 int y = (id/dw) * hh;
395 if (ww > wx) ww = wx;
396 if (hh > hx) hh = hx;
397 XImage * sbima = XSubImage(xima, x, y, ww, hh);
398 XpmCreateDataFromImage(fl_get_display(), const_cast<char***>(&data), sbima, sbima, 0);
400 // Dirty hack to get blue symbols quickly
401 char * sx = const_cast<char*>(strstr(data[2], "FFFFFFFF"));
403 for (int k = 0; k < 8; ++k) sx[k] = '0';
406 // XDestroyImage(xima);
413 char const ** get_pixmap_from_symbol(char const * arg, int wx, int hx)
417 char const ** data = 0;
418 latexkeys const * l = in_word_set(arg);
424 data = mathed_get_pixmap_from_icon(MM_FRAC);
427 data = mathed_get_pixmap_from_icon(MM_SQRT);
436 // I have to use directly the bitmap data since the
437 // bitmap tables are not yet created when this
438 // function is called.
439 data = pixmapFromBitmapData(arg, wx, hx);