3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Angus Leeming
8 * Full author contact details are available in file CREDITS.
13 #include "ControlMath.h"
15 #include "funcrequest.h"
17 #include "support/lyxalgo.h" // sorted
18 #include "support/lstrings.h"
19 #include "support/filetools.h"
27 using support::compare;
28 using support::libFileSearch;
33 ControlMath::ControlMath(Dialog & dialog)
34 : Dialog::Controller(dialog)
38 void ControlMath::dispatchFunc(kb_action action, string const & arg) const
40 kernel().dispatch(FuncRequest(action, arg));
44 void ControlMath::dispatchInsert(string const & name) const
46 dispatchFunc(LFUN_MATH_INSERT, '\\' + name);
50 void ControlMath::dispatchSubscript() const
52 dispatchFunc(LFUN_MATH_INSERT, "_");
56 void ControlMath::dispatchSuperscript() const
58 dispatchFunc(LFUN_MATH_INSERT, "^");
62 void ControlMath::dispatchCubeRoot() const
64 dispatchFunc(LFUN_MATH_INSERT, "\\root");
65 dispatchFunc(LFUN_SELF_INSERT, "3");
66 dispatchFunc(LFUN_CHAR_FORWARD);
70 void ControlMath::dispatchMatrix(string const & str) const
72 dispatchFunc(LFUN_MATH_MATRIX, str);
76 void ControlMath::dispatchDelim(string const & str) const
78 dispatchFunc(LFUN_MATH_DELIM, str);
82 void ControlMath::dispatchBigDelim(string const & str) const
84 dispatchFunc(LFUN_MATH_BIGDELIM, str);
88 void ControlMath::dispatchToggleDisplay() const
90 dispatchFunc(LFUN_MATH_DISPLAY);
94 void ControlMath::showDialog(string const & name) const
96 dispatchFunc(LFUN_DIALOG_SHOW, name);
100 char const * function_names[] = {
101 "arccos", "arcsin", "arctan", "arg", "bmod",
102 "cos", "cosh", "cot", "coth", "csc", "deg",
103 "det", "dim", "exp", "gcd", "hom", "inf", "ker",
104 "lg", "lim", "liminf", "limsup", "ln", "log",
105 "max", "min", "sec", "sin", "sinh", "sup",
106 "tan", "tanh", "Pr", ""
109 int const nr_function_names = sizeof(function_names) / sizeof(char const *) - 1;
111 char const * latex_dots[] = {
112 "ldots", "cdots", "vdots", "ddots", ""
115 int const nr_latex_dots = sizeof(latex_dots) / sizeof(char const *) - 1;
117 char const * latex_deco[] = {
118 "widehat", "widetilde", "overbrace", "overleftarrow", "overrightarrow",
119 "overline", "underbrace", "underline", "underleftarrow", "underrightarrow",
120 "underleftrightarrow", "overleftrightarrow",
121 "hat", "acute", "bar", "dot",
122 "check", "grave", "vec", "ddot",
123 "breve", "tilde", "overset", "underset", ""
126 int const nr_latex_deco = sizeof(latex_deco) / sizeof(char const *) - 1;
128 char const * latex_arrow[] = {
129 "downarrow", "leftarrow", "Downarrow", "Leftarrow",
130 "hookleftarrow", "rightarrow", "uparrow", "Rightarrow", "Uparrow",
131 "hookrightarrow", "updownarrow", "Leftrightarrow", "leftharpoonup",
132 "rightharpoonup", "rightleftharpoons", "leftrightarrow", "Updownarrow",
133 "leftharpoondown", "rightharpoondown", "mapsto",
134 "Longleftarrow", "Longrightarrow", "Longleftrightarrow",
135 "longleftrightarrow", "longleftarrow", "longrightarrow", "longmapsto",
136 "nwarrow", "nearrow", "swarrow", "searrow", "",
139 int const nr_latex_arrow = sizeof(latex_arrow) / sizeof(char const *);
141 char const * latex_bop[] = {
142 "pm", "cap", "diamond", "oplus",
143 "mp", "cup", "bigtriangleup", "ominus",
144 "times", "uplus", "bigtriangledown", "otimes",
145 "div", "sqcap", "triangleright", "oslash",
146 "cdot", "sqcup", "triangleleft", "odot",
147 "star", "vee", "amalg", "bigcirc",
148 "setminus", "wedge", "dagger", "circ",
149 "bullet", "wr", "ddagger", ""
152 int const nr_latex_bop = sizeof(latex_bop) / sizeof(char const *);
154 char const * latex_brel[] = {
155 "leq", "geq", "equiv", "models",
156 "prec", "succ", "sim", "perp",
157 "preceq", "succeq", "simeq", "mid",
158 "ll", "gg", "asymp", "parallel",
159 "subset", "supset", "approx", "smile",
160 "subseteq", "supseteq", "cong", "frown",
161 "sqsubseteq", "sqsupseteq", "doteq", "neq",
162 "in", "ni", "propto", "notin",
163 "vdash", "dashv", "bowtie", ""
166 int const nr_latex_brel = sizeof(latex_brel) / sizeof(char const *);
168 char const * latex_greek[] = {
169 "Gamma", "Delta", "Theta", "Lambda", "Xi", "Pi",
170 "Sigma", "Upsilon", "Phi", "Psi", "Omega",
171 "alpha", "beta", "gamma", "delta", "epsilon", "varepsilon", "zeta",
172 "eta", "theta", "vartheta", "iota", "kappa", "lambda", "mu",
173 "nu", "xi", "pi", "varpi", "rho", "sigma", "varsigma",
174 "tau", "upsilon", "phi", "varphi", "chi", "psi", "omega", ""
177 int const nr_latex_greek = sizeof(latex_greek) / sizeof(char const *);
179 char const * latex_misc[] = {
180 "nabla", "partial", "infty", "prime", "ell",
181 "emptyset", "exists", "forall", "imath", "jmath",
182 "Re", "Im", "aleph", "wp", "hbar",
183 "angle", "top", "bot", "Vert", "neg",
184 "flat", "natural", "sharp", "surd", "triangle",
185 "diamondsuit", "heartsuit", "clubsuit", "spadesuit",
186 "textrm \\AA", "textrm \\O", "mathcircumflex", "_",
188 "mathbb N", "mathbb Z", "mathbb Q",
189 "mathbb R", "mathbb C", "mathbb H",
190 "mathcal F", "mathcal L",
191 "mathcal H", "mathcal O", ""
194 int const nr_latex_misc = sizeof(latex_misc) / sizeof(char const *);
196 char const * latex_varsz[] = {
197 "sum", "int", "oint",
198 "prod", "coprod", "bigsqcup",
199 "bigotimes", "bigodot", "bigoplus",
200 "bigcap", "bigcup", "biguplus",
201 "bigvee", "bigwedge", ""
204 int const nr_latex_varsz = sizeof(latex_varsz) / sizeof(char const *);
206 char const * latex_ams_misc[] = {
207 "digamma", "varkappa", "beth", "daleth", "gimel",
208 "ulcorner", "urcorner", "llcorner", "lrcorner",
209 "hbar", "hslash", "vartriangle",
210 "triangledown", "square", "lozenge",
211 "circledS", "angle", "measuredangle",
212 "nexists", "mho", "Finv",
213 "Game", "Bbbk", "backprime",
214 "varnothing", "blacktriangle", "blacktriangledown",
215 "blacksquare", "blacklozenge", "bigstar",
216 "sphericalangle", "complement", "eth",
217 "diagup", "diagdown", ""
220 int const nr_latex_ams_misc = sizeof(latex_ams_misc) / sizeof(char const *);
222 char const * latex_ams_arrows[] = {
223 "dashrightarrow", "dashleftarrow", "leftleftarrows",
224 "leftrightarrows", "Lleftarrow", "twoheadleftarrow",
225 "leftarrowtail", "looparrowleft", "leftrightharpoons",
226 "curvearrowleft", "circlearrowleft", "Lsh",
227 "upuparrows", "upharpoonleft", "downharpoonleft",
228 "multimap", "leftrightsquigarrow", "rightrightarrows",
229 "rightleftarrows", "rightrightarrows", "rightleftarrows",
230 "twoheadrightarrow", "rightarrowtail", "looparrowright",
231 "rightleftharpoons", "curvearrowright", "circlearrowright",
232 "Rsh", "downdownarrows", "upharpoonright",
233 "downharpoonright", "rightsquigarrow",
234 "nleftarrow", "nrightarrow", "nLeftarrow",
235 "nRightarrow", "nleftrightarrow", "nLeftrightarrow", ""
238 int const nr_latex_ams_arrows = sizeof(latex_ams_arrows) / sizeof(char const *);
240 char const * latex_ams_rel[] = {
241 "leqq", "leqslant", "eqslantless", "eqslantgtr", "gtrsim", "gtrapprox",
242 "lesssim", "lessapprox", "approxeq", "gtrdot", "ggg", "gtrless",
243 "lessdot", "lll", "lessgtr", "gtreqless", "gtreqqless", "eqcirc",
244 "lesseqgtr", "lesseqqgtr", "doteqdot", "circeq", "triangleq", "thicksim",
245 "risingdotseq", "fallingdotseq", "backsim", "thickapprox", "supseteqq", "Supset",
246 "backsimeq", "subseteqq", "Subset", "sqsupset", "succcurlyeq", "curlyeqsucc",
247 "sqsubset", "preccurlyeq", "curlyeqprec", "succsim", "succapprox", "vartriangleright",
248 "precsim", "precapprox", "vartriangleleft", "trianglerighteq", "Vdash", "shortmid",
249 "trianglelefteq", "vDash", "Vvdash", "shortparallel", "between", "pitchfork",
250 "smallsmile", "smallfrown", "bumpeq", "varpropto", "blacktriangleleft", "therefore",
251 "Bumpeq", "geqq", "geqslant", "backepsilon", "blacktriangleright", "because", ""
254 int const nr_latex_ams_rel = sizeof(latex_ams_rel) / sizeof(char const *);
256 char const * latex_ams_nrel[] = {
257 "nless", "nleq", "nleqslant", "ngeqslant", "ngeqq", "gneq",
258 "nleqq", "lneq", "lneqq", "gneqq", "gvertneqq", "gnsim",
259 "lvertneqq", "lnsim", "lnapprox", "gnapprox", "nsucc", "nsucceq",
260 "nprec", "npreceq", "precnsim","succnsim", "succnapprox", "ncong",
261 "precnapprox", "nsim", "nshortmid", "nshortparallel", "nparallel", "nvDash",
263 "nmid", "nvdash", "nvDash", "nVDash", "ntriangleright", "ntrianglerighteq",
264 "ntriangleleft", "ntrianglelefteq", "nsubseteq", "nsupseteq", "nsupseteqq", "supsetneq",
265 "subsetneq", "varsubsetneq", "subsetneqq", "varsupsetneq", "supsetneqq", "varsupsetneqq",
266 "varsubsetneqq", "ngtr", "ngeq", "", "", ""
269 int const nr_latex_ams_nrel = sizeof(latex_ams_nrel) / sizeof(char const *);
272 char const * latex_ams_ops[] = {
273 "dotplus", "smallsetminus", "Cap",
274 "Cup", "barwedge", "veebar",
275 "doublebarwedge", "boxminus", "boxtimes",
276 "boxdot", "boxplus", "divideontimes",
277 "ltimes", "rtimes", "leftthreetimes",
278 "rightthreetimes", "curlywedge", "curlyvee",
279 "circleddash", "circledast", "circledcirc",
280 "centerdot", "intercal", ""
283 int const nr_latex_ams_ops = sizeof(latex_ams_ops) / sizeof(char const *);
294 bool operator<(XPMmap const & lhs, XPMmap const & rhs)
296 return compare(lhs.key, rhs.key) < 0;
300 class CompareKey : public std::unary_function<XPMmap, bool> {
302 CompareKey(string const & name) : name_(name) {}
303 bool operator()(XPMmap const & other) const {
304 return other.key == name_;
311 XPMmap sorted_xpm_map[] = {
312 { "Bumpeq", "bumpeq2" },
315 { "Delta", "delta2" },
316 { "Downarrow", "downarrow2" },
317 { "Gamma", "gamma2" },
318 { "Lambda", "lambda2" },
319 { "Leftarrow", "leftarrow2" },
320 { "Leftrightarrow", "leftrightarrow2" },
321 { "Longleftarrow", "longleftarrow2" },
322 { "Longleftrightarrow", "longleftrightarrow2" },
323 { "Longrightarrow", "longrightarrow2" },
324 { "Omega", "omega2" },
328 { "Rightarrow", "rightarrow2" },
329 { "Sigma", "sigma2" },
330 { "Subset", "subset2" },
331 { "Supset", "supset2" },
332 { "Theta", "theta2" },
333 { "Uparrow", "uparrow2" },
334 { "Updownarrow", "updownarrow2" },
335 { "Upsilon", "upsilon2" },
336 { "Vdash", "vdash3" },
338 { "nLeftarrow", "nleftarrow2" },
339 { "nLeftrightarrow", "nleftrightarrow2" },
340 { "nRightarrow", "nrightarrow2" },
341 { "nVDash", "nvdash3" },
342 { "nvDash", "nvdash2" },
343 { "textrm \\AA", "textrm_AA"},
344 { "textrm \\O", "textrm_Oe"},
345 { "vDash", "vdash2" }
348 size_t const nr_sorted_xpm_map = sizeof(sorted_xpm_map) / sizeof(XPMmap);
353 string const find_xpm(string const & name)
355 XPMmap const * const begin = sorted_xpm_map;
356 XPMmap const * const end = begin + nr_sorted_xpm_map;
357 BOOST_ASSERT(sorted(begin, end));
359 XPMmap const * const it =
360 std::find_if(begin, end, CompareKey(name));
364 xpm_name = it->value;
366 xpm_name = subst(name, "_", "underscore");
367 xpm_name = subst(xpm_name, ' ', '_');
369 // This way we can have "math-delim { }" on the toolbar.
370 xpm_name = subst(xpm_name, "(", "lparen");
371 xpm_name = subst(xpm_name, ")", "rparen");
372 xpm_name = subst(xpm_name, "[", "lbracket");
373 xpm_name = subst(xpm_name, "]", "rbracket");
374 xpm_name = subst(xpm_name, "{", "lbrace");
375 xpm_name = subst(xpm_name, "}", "rbrace");
376 xpm_name = subst(xpm_name, "|", "bars");
379 lyxerr[Debug::GUI] << "find_xpm(" << name << ")\n"
380 << "Looking for math XPM called \""
381 << xpm_name << '"' << std::endl;
383 return libFileSearch("images/math/", xpm_name, "xpm");
386 } // namespace frontend