X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2Fmath_deliminset.C;h=5882a0cd0528f135211911a929115ce9a5db1ae9;hb=c649284611c4198c9d70be8a16d153cdf1ec0700;hp=cb4788e9badf54ac06f9d246262ef27e94b9ccac;hpb=85a5ea7bfc80e179a61a99f2955455e84d3384cc;p=lyx.git diff --git a/src/mathed/math_deliminset.C b/src/mathed/math_deliminset.C index cb4788e9ba..5882a0cd05 100644 --- a/src/mathed/math_deliminset.C +++ b/src/mathed/math_deliminset.C @@ -6,94 +6,152 @@ #include "math_deliminset.h" #include "math_parser.h" -#include "LColor.h" -#include "Painter.h" -#include "mathed/support.h" -#include "support/LOstream.h" +#include "math_support.h" +#include "math_mathmlstream.h" +#include "math_streamstr.h" +#include "math_extern.h" -MathDelimInset::MathDelimInset(int l, int r) - : MathInset("", LM_OT_DELIM, 1), left_(l), right_(r) +using std::max; + +namespace { + +string convertDelimToLatexName(string const & name) +{ + if (name == "(") + return name; + if (name == "[") + return name; + if (name == ".") + return name; + if (name == ")") + return name; + if (name == "]") + return name; + if (name == "/") + return name; + if (name == "|") + return name; + return "\\" + name + " "; +} + +} + + + +MathDelimInset::MathDelimInset(string const & l, string const & r) + : MathNestInset(1), left_(l), right_(r) {} +MathDelimInset::MathDelimInset + (string const & l, string const & r, MathArray const & ar) + : MathNestInset(1), left_(l), right_(r) +{ + cell(0) = ar; +} + + MathInset * MathDelimInset::clone() const -{ +{ return new MathDelimInset(*this); } -void MathDelimInset::Write(std::ostream & os, bool fragile) const +void MathDelimInset::write(WriteStream & os) const { - latexkeys const * l = (left_ != '|') ? - lm_get_key_by_id(left_, LM_TK_SYM) : 0; - latexkeys const * r = (right_ != '|') ? - lm_get_key_by_id(right_, LM_TK_SYM) : 0; - - os << "\\left"; - if (l) - os << '\\' << l->name << ' '; - else { - if (left_ == '{' || left_ == '}') - os << '\\' << char(left_) << ' '; - else - os << char(left_) << ' '; - } + os << "\\left" << convertDelimToLatexName(left_) << cell(0) + << "\\right" << convertDelimToLatexName(right_); +} - cell(0).Write(os, fragile); - os << "\\right"; - if (r) - os << '\\' << r->name << ' '; - else { - if (right_ == '{' || right_ == '}') - os << '\\' << char(right_) << ' '; - else - os << char(right_) << ' '; - } +void MathDelimInset::normalize(NormalStream & os) const +{ + os << "[delim " << convertDelimToLatexName(left_) << ' ' + << convertDelimToLatexName(right_) << ' ' << cell(0) << ']'; +} + + +int MathDelimInset::dw() const +{ + int w = height() / 5; + if (w > 8) + w = 8; + if (w < 4) + w = 4; + return w; } -void MathDelimInset::draw(Painter & pain, int x, int y) -{ - xo(x); - yo(y); +void MathDelimInset::metrics(MathMetricsInfo & mi) const +{ + xcell(0).metrics(mi); + int a, d, w; + mathed_char_dim(mi.base.font, 'I', a, d, w); + int h0 = (a + d) / 2; + int a0 = max(xcell(0).ascent(), a) - h0; + int d0 = max(xcell(0).descent(), d) + h0; + ascent_ = max(a0, d0) + h0; + descent_ = max(a0, d0) - h0; + width_ = xcell(0).width() + 2 * dw() + 8; +} + - int w = dw(); - xcell(0).draw(pain, x + w, y); - - if (left_ == '.') { - pain.line(x + 4, yo() - ascent_, x + 4, yo() + descent_, - LColor::mathcursor, Painter::line_onoffdash); - } else - mathed_draw_deco(pain, x, y - ascent_, w, height(), left_); +void MathDelimInset::draw(MathPainterInfo & pi, int x, int y) const +{ + int const w = dw(); + int const b = y - ascent_; + xcell(0).draw(pi, x + w + 4, y); + mathed_draw_deco(pi, x + 4, b, w, height(), left_); + mathed_draw_deco(pi, x + width() - w - 4, b, w, height(), right_); +} - x += width() - w - 2; - if (right_ == '.') { - pain.line(x + 4, yo() - ascent_, x + 4, yo() + descent_, - LColor::mathcursor, Painter::line_onoffdash); - } else - mathed_draw_deco(pain, x, y - ascent_, w, height(), right_); +bool MathDelimInset::isParanthesis() const +{ + return left_ == "(" && right_ == ")"; } -int MathDelimInset::dw() const +bool MathDelimInset::isBrackets() const { - int w = height()/5; - if (w > 15) - w = 15; - if (w < 6) - w = 6; - return w; + return left_ == "[" && right_ == "]"; +} + + +bool MathDelimInset::isAbs() const +{ + return left_ == "|" && right_ == "|"; +} + + +void MathDelimInset::maplize(MapleStream & os) const +{ + if (isAbs()) { + bool mat = + cell(0).size() == 1 && cell(0).begin()->nucleus() + && cell(0).begin()->nucleus()->asMatrixInset(); + if (mat) + os << "linalg[det](" << cell(0) << ")"; + else + os << "abs(" << cell(0) << ")"; + } + else + os << left_ << cell(0) << right_; +} + + +void MathDelimInset::mathmlize(MathMLStream & os) const +{ + os << "" << cell(0) << ""; } -void MathDelimInset::Metrics(MathStyles st) +void MathDelimInset::octavize(OctaveStream & os) const { - xcell(0).Metrics(st); - size_ = st; - ascent_ = xcell(0).ascent() + 2; - descent_ = xcell(0).descent() + 2; - width_ = xcell(0).width() + 2 * dw() + 4; + if (isAbs()) + os << "det(" << cell(0) << ")"; + else + os << left_ << cell(0) << right_; }