]> git.lyx.org Git - lyx.git/blob - src/mathed/math_macrotable.C
further code uglification to make Jean-Marc's compiler happy
[lyx.git] / src / mathed / math_macrotable.C
1 #include <config.h>
2
3 #include <iostream>
4
5 #ifdef __GNUG__
6 #pragma implementation
7 #endif
8
9 #include "math_macrotable.h"
10 #include "math_macro.h"
11 #include "math_macrotemplate.h"
12 #include "math_parser.h"
13 #include "debug.h"
14 #include "support.h" // math_font_available
15
16 MathArray mathed_parse_cell(string const &);
17
18
19 MathMacroTable::table_type MathMacroTable::macro_table;
20
21
22 void MathMacroTable::dump()
23 {
24         lyxerr << "\n------------------------------------------\n";
25         table_type::const_iterator it;
26         for (it = macro_table.begin(); it != macro_table.end(); ++it)
27                 lyxerr << it->first << " [" << it->second.nargs() << "] : "
28                         << it->second << "\n";
29         lyxerr << "------------------------------------------\n";
30 }
31
32
33 void MathMacroTable::insertTemplate(MathMacroTemplate const & p)
34 {
35         if (macro_table.find(p.name()) != macro_table.end()) 
36                 lyxerr << "macro '" << p.name() << "' not new\n";
37         macro_table[p.name()] = p;
38 }
39
40
41 MathMacroTemplate & MathMacroTable::provideTemplate(string const & name)
42 {
43         builtinMacros();
44         
45         table_type::iterator pos = macro_table.find(name);
46
47         if (pos == macro_table.end()) {
48                 lyxerr << "MathMacroTable::provideTemplate: no template with name '"
49                        << name << "' available.\n";
50         }
51                 
52         return pos->second;
53 }
54
55
56 void MathMacroTable::createTemplate
57         (string const & name, int na, string const & text)
58 {
59         MathMacroTemplate t(name, na);
60         t.cell(0) = mathed_parse_cell(text);
61         insertTemplate(t);
62 }
63
64
65 bool MathMacroTable::hasTemplate(string const & name)
66 {
67         builtinMacros();
68         return macro_table.find(name) != macro_table.end();
69 }
70
71
72 MathMacro * MathMacroTable::cloneTemplate(string const & name)
73 {
74         return new MathMacro(provideTemplate(name));
75 }
76
77
78 void MathMacroTable::builtinMacros()
79 {
80         static bool built = false;
81         
82         if (built)
83                 return; 
84
85         built = true;
86         //lyxerr[Debug::MATHED] << "Building macros\n";
87    
88         //createTemplate("emptyset",     0, "\\not0");
89         createTemplate("notin",        0, "\\not\\in");
90         createTemplate("slash",        0, "/");
91
92         // fontmath.ltx
93
94         createTemplate("lnot",         0, "\\neg");
95         createTemplate("land",         0, "\\wedge");
96         createTemplate("lor",          0, "\\vee");
97         createTemplate("ne",           0, "\\neq");
98         createTemplate("le",           0, "\\leq");
99         createTemplate("ge",           0, "\\geq");
100         createTemplate("owns",         0, "\\ni");
101         createTemplate("gets",         0, "\\leftarrow");
102         createTemplate("to",           0, "\\rightarrow");
103         createTemplate("|",            0, "\\parallel");
104
105         createTemplate("longleftrightarrow", 0, "\\leftarrow\\kern-6mu\\rightarrow");
106         createTemplate("Longleftrightarrow", 0, "\\Leftarrow\\kern-6mu\\Rightarrow");
107         createTemplate("doteq", 0, "\\stackrel{\\cdot}{=}");
108
109         //createTemplate("models",         0, "|\\kern-9mu=");
110
111         if (math_font_available(LM_TC_CMSY)) {
112                 createTemplate("longrightarrow", 0, "\\lyxbar\\kern-5mu\\rightarrow");
113                 createTemplate("longleftarrow",  0, "\\leftarrow\\kern-5mu\\lyxbar");
114                 createTemplate("mapsto",  0, "\\mapstochar\\rightarrow");
115                 createTemplate("longmapsto",  0, "\\mapstochar\\lyxbar\\kern-5mu\\rightarrow");
116         }
117
118         if (math_font_available(LM_TC_CMR)) {
119                 createTemplate("Longrightarrow", 0, "\\lyxeq\\kern-3mu\\Rightarrow");
120                 createTemplate("Longleftarrow",  0, "\\Leftarrow\\kern-9mu\\lyxeq");
121         }
122
123         if (math_font_available(LM_TC_CMM)) {
124                 createTemplate("hookrightarrow", 0, "\\lhook\\kern-5mu\\rightarrow");
125                 createTemplate("hookleftarrow",  0, "\\leftarrow\\kern-5mu\\rhook");
126                 createTemplate("bowtie",         0, "\\triangleright\\kern-3mu\\triangleleft");
127         }
128
129         if (math_font_available(LM_TC_MSA)) {
130                 //amsfonts.sty
131
132                 createTemplate("dashrightarrow", 0, "\\lyxdabar\\lyxdabar\\lyxright");
133                 createTemplate("dashleftarrow", 0, "\\lyxleft\\lyxdabar\\lyxdabar");
134                 createTemplate("dasharrow",    0, "\\dashrightarrow");
135                 createTemplate("Box",          0, "\\square");
136                 createTemplate("Diamond",      0, "\\lozenge");
137                 createTemplate("leadsto",      0, "\\rightsquigarrow");
138
139                 // amssymb.sty
140
141                 createTemplate("restriction",  0, "\\upharpoonright");
142                 createTemplate("Doteq",        0, "\\doteqdot");
143                 createTemplate("doublecup",    0, "\\Cup");
144                 createTemplate("doublecap",    0, "\\Cap");
145                 createTemplate("llless",       0, "\\lll");
146                 createTemplate("gggtr",        0, "\\ggg");
147         }
148
149         //createTemplate("lint",       4, "\\int_#1^#2#3 d#4");
150         //createTemplate("silentmult", 0, "\\cdot");
151         //createTemplate("binom",        2, "\\left(\\frac#1#2\\right)");
152 }