]> git.lyx.org Git - lyx.git/blob - src/mathed/InsetMathBig.cpp
87f50dde1391b310501ad3f721b387ad293ca280
[lyx.git] / src / mathed / InsetMathBig.cpp
1 /**
2  * \file InsetMathBig.cpp
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author André Pönitz
7  *
8  * Full author contact details are available in file CREDITS.
9  */
10
11 #include <config.h>
12
13 #include "InsetMathBig.h"
14
15 #include "LaTeXFeatures.h"
16 #include "MathSupport.h"
17 #include "MathStream.h"
18 #include "MetricsInfo.h"
19
20 #include "frontends/FontMetrics.h"
21
22 #include "support/docstream.h"
23 #include "support/lstrings.h"
24
25
26 namespace lyx {
27
28
29 InsetMathBig::InsetMathBig(docstring const & name, docstring const & delim)
30         : name_(name), delim_(delim)
31 {}
32
33
34 docstring InsetMathBig::name() const
35 {
36         return name_;
37 }
38
39
40 Inset * InsetMathBig::clone() const
41 {
42         return new InsetMathBig(*this);
43 }
44
45
46 InsetMathBig::size_type InsetMathBig::size() const
47 {
48         // order: big Big bigg Bigg biggg Biggg
49         //        0   1   2    3    4     5
50         return name_[0] == 'B' ?
51                 2 * (name_.size() - 4) + 1:
52                 2 * (name_.size() - 4);
53 }
54
55
56 double InsetMathBig::increase() const
57 {
58         // The formula used in amsmath.sty is
59         // 1.2 * (1.0 + size() * 0.5) - 1.0.
60         // We use a smaller step and a bigger offset because our base size
61         // is different.
62         return (size() + 1) * 0.3;
63 }
64
65
66 void InsetMathBig::metrics(MetricsInfo & mi, Dimension & dim) const
67 {
68         double const h = theFontMetrics(mi.base.font).ascent('I');
69         double const f = increase();
70         dim.wid = 6;
71         dim.asc = int(h + f * h);
72         dim.des = int(f * h);
73 }
74
75
76 void InsetMathBig::draw(PainterInfo & pi, int x, int y) const
77 {
78         Dimension const dim = dimension(*pi.base.bv);
79         // mathed_draw_deco does not use the leading backslash, so remove it
80         // (but don't use ltrim if this is the backslash delimiter).
81         // Replace \| by \Vert (equivalent in LaTeX), since mathed_draw_deco
82         // would treat it as |.
83         docstring const delim = (delim_ == "\\|") ?  from_ascii("Vert") :
84                 (delim_ == "\\\\") ? from_ascii("\\") : support::ltrim(delim_, "\\");
85         mathed_draw_deco(pi, x + 1, y - dim.ascent(), 4, dim.height(),
86                          delim);
87         setPosCache(pi, x, y);
88 }
89
90
91 void InsetMathBig::write(WriteStream & os) const
92 {
93         MathEnsurer ensurer(os);
94         os << '\\' << name_ << delim_;
95         if (delim_[0] == '\\')
96                 os.pendingSpace(true);
97 }
98
99
100 void InsetMathBig::normalize(NormalStream & os) const
101 {
102         os << '[' << name_ << ' ' << delim_ << ']';
103 }
104
105
106 void InsetMathBig::mathmlize(MathStream & os) const
107 {
108         os << "<mo form='prefix' fence='true' stretchy='true' symmetric='true'>";
109         if (delim_ == "(" || delim_ == ")"
110                         || delim_ == "[" || delim_ == "]"
111                         || delim_ == "|" || delim_ == "/")
112                 os << delim_;
113         else if (delim_ == "\\{" || delim_ == "\\lbrace")
114                 os << "{";
115         else if (delim_ == "\\}" || delim_ == "\\rbrace")
116                 os << "}";
117         else if (delim_ == "\\slash")
118                 os << "/";
119         else if (delim_ == "\\|" || delim_ == "\\vert")
120                 os << "|";
121         else if (delim_ == "\\Vert")
122                 os << "&par;";
123         else if (delim_ == "\\\\" || delim_ == "\\backslash")
124                 os <<" \\";
125         else if (delim_ == "\\langle")
126                 os << "&lt;";
127         else if (delim_ == "\\rangle")
128                 os << "&gt;";
129         else if (delim_ == "\\lceil")
130                 os << "&lceil;";
131         else if (delim_ == "\\rceil")
132                 os << "&rceil;";
133         else if (delim_ == "\\lfloor")
134                 os << "&lfloor;";
135         else if (delim_ == "\\rfloor")
136                 os << "&rfloor;";
137         else if (delim_ == "\\downarrow")
138                 os << "&darr;";
139         else if (delim_ == "\\uparrow")
140                 os << "&uarr;";
141         else if (delim_ == "\\Downarrow")
142                 os << "&dArr;";
143         else if (delim_ == "\\Uparrow")
144                 os << "&uArr;";
145         else if (delim_ == "\\updownarrow")
146                 os << "&varr;";
147         else if (delim_ == "\\Updownarrow")
148                 os << "&vArr;";
149         os << "</mo>";
150 }
151
152
153 void InsetMathBig::htmlize(HtmlStream & os) const
154 {
155         std::string name;
156         switch (size()) {
157         case 0: case 1: name = "big"; break;
158         case 2: case 3: name = "bigg"; break;
159         case 4: case 5: name = "biggg"; break;
160         default: name  = "big"; break;
161         }
162         os << MTag("span", "class='" + name + "symbol'");
163         if (delim_ == "(" || delim_ == ")"
164                         || delim_ == "[" || delim_ == "]"
165                         || delim_ == "|" || delim_ == "/")
166                 os << delim_;
167         else if (delim_ == "\\{" || delim_ == "\\lbrace")
168                 os << "{";
169         else if (delim_ == "\\}" || delim_ == "\\rbrace")
170                 os << "}";
171         else if (delim_ == "\\slash")
172                 os << "/";
173         else if (delim_ == "\\|" || delim_ == "\\vert")
174                 os << "|";
175         else if (delim_ == "\\Vert")
176                 os << "&par;";
177         else if (delim_ == "\\\\" || delim_ == "\\backslash")
178                 os <<" \\";
179         else if (delim_ == "\\langle")
180                 os << "&lt;";
181         else if (delim_ == "\\rangle")
182                 os << "&gt;";
183         else if (delim_ == "\\lceil")
184                 os << "&lceil;";
185         else if (delim_ == "\\rceil")
186                 os << "&rceil;";
187         else if (delim_ == "\\lfloor")
188                 os << "&lfloor;";
189         else if (delim_ == "\\rfloor")
190                 os << "&rfloor;";
191         else if (delim_ == "\\downarrow")
192                 os << "&darr;";
193         else if (delim_ == "\\uparrow")
194                 os << "&uarr;";
195         else if (delim_ == "\\Downarrow")
196                 os << "&dArr;";
197         else if (delim_ == "\\Uparrow")
198                 os << "&uArr;";
199         else if (delim_ == "\\updownarrow")
200                 os << "&varr;";
201         else if (delim_ == "\\Updownarrow")
202                 os << "&vArr;";
203         os << ETag("span");
204 }
205
206
207 void InsetMathBig::infoize2(odocstream & os) const
208 {
209         os << name_;
210 }
211
212
213 bool InsetMathBig::isBigInsetDelim(docstring const & delim)
214 {
215         // mathed_draw_deco must handle these
216         static char const * const delimiters[] = {
217                 "(", ")", "\\{", "\\}", "\\lbrace", "\\rbrace", "[", "]",
218                 "|", "/", "\\slash", "\\|", "\\vert", "\\Vert", "'",
219                 "\\\\", "\\backslash",
220                 "\\langle", "\\lceil", "\\lfloor",
221                 "\\rangle", "\\rceil", "\\rfloor",
222                 "\\downarrow", "\\Downarrow",
223                 "\\uparrow", "\\Uparrow",
224                 "\\updownarrow", "\\Updownarrow", ""
225         };
226         return support::findToken(delimiters, to_utf8(delim)) >= 0;
227 }
228
229
230 void InsetMathBig::validate(LaTeXFeatures & features) const
231 {
232         if (features.runparams().math_flavor == OutputParams::MathAsHTML)
233                 features.addPreambleSnippet("<style type=\"text/css\">\n"
234                         "span.bigsymbol{font-size: 150%;}\n"
235                         "span.biggsymbol{font-size: 200%;}\n"
236                         "span.bigggsymbol{font-size: 225%;}\n"
237                         "</style>");
238 }
239
240
241 } // namespace lyx