X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2Fmath_deliminset.C;h=82b58813cf791246c3be72c52552ba34144cd908;hb=a8e8e755fc32233e91bf787d5032fd81147d0909;hp=deecead4ffde0ec67ebde65db34d2719281599ff;hpb=5b55f3baff0812c010b85d4a815e8aacc16bd116;p=lyx.git diff --git a/src/mathed/math_deliminset.C b/src/mathed/math_deliminset.C index deecead4ff..82b58813cf 100644 --- a/src/mathed/math_deliminset.C +++ b/src/mathed/math_deliminset.C @@ -1,93 +1,180 @@ #include + #include "math_deliminset.h" -#include "math_iter.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" -using std::ostream; +using std::max; -MathDelimInset::MathDelimInset(int l, int r, short st) - : MathParInset(st, "", LM_OT_DELIM), left(l), right(r) {} +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; + if (name == "/") + return name; + if (name == "|") + return name; + return '\\' + name + ' '; +} -MathedInset * MathDelimInset::Clone() -{ - MathDelimInset * p = new MathDelimInset(left, right, GetStyle()); - MathedIter it(array); - p->SetData(it.Copy()); - return p; } -void MathDelimInset::Write(ostream & os, bool fragile) +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(WriteStream & os) const +{ + os << "\\left" << convertDelimToLatexName(left_) << cell(0) + << "\\right" << convertDelimToLatexName(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::metrics(MetricsInfo & mi) const +{ + cell(0).metrics(mi); + Dimension t; + mathed_char_dim(mi.base.font, 'I', t); + int h0 = (t.asc + t.des) / 2; + int a0 = max(cell(0).ascent(), t.asc) - h0; + int d0 = max(cell(0).descent(), t.des) + h0; + dim_.asc = max(a0, d0) + h0; + dim_.des = max(a0, d0) - h0; + dim_.wid = cell(0).width() + 2 * dw() + 8; +} + + +void MathDelimInset::draw(PainterInfo & pi, int x, int y) const { - latexkeys * l = (left != '|') ? lm_get_key_by_id(left, LM_TK_SYM): 0; - latexkeys * 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) << ' '; - } + int const w = dw(); + int const b = y - ascent(); + cell(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_); +} + + +bool MathDelimInset::isParanthesis() const +{ + return left_ == "(" && right_ == ")"; +} + + +bool MathDelimInset::isBrackets() const +{ + return left_ == "[" && right_ == "]"; +} + + +bool MathDelimInset::isAbs() const +{ + return left_ == "|" && right_ == "|"; +} + + +void MathDelimInset::maple(MapleStream & os) const +{ + if (isAbs()) { + if (cell(0).size() == 1 && cell(0).front()->asMatrixInset()) + os << "linalg[det](" << cell(0) << ')'; + else + os << "abs(" << cell(0) << ')'; } - MathParInset::Write(os, fragile); - os << "\\right"; - if (r) { - os << '\\' << r->name << ' '; - } else { - if (right == '{' || right == '}') { - os << '\\' << char(right) << ' '; - } else { - os << char(right) << ' '; - } + else + os << left_ << cell(0) << right_; +} + +void MathDelimInset::maxima(MaximaStream & os) const +{ + if (isAbs()) { + if (cell(0).size() == 1 && cell(0).front()->asMatrixInset()) + os << "determinant(" << cell(0) << ')'; + else + os << "abs(" << cell(0) << ')'; + } + else + os << left_ << cell(0) << right_; +} + + +void MathDelimInset::mathematica(MathematicaStream & os) const +{ + if (isAbs()) { + if (cell(0).size() == 1 && cell(0).front()->asMatrixInset()) + os << "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::draw(Painter & pain, int x, int y) -{ - xo = x; yo = y; - MathParInset::draw(pain, x + dw + 2, y - dh); - - 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, dw, Height(), left); - x += Width() - dw - 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, dw, Height(), right); -} - - -void -MathDelimInset::Metrics() -{ - MathParInset::Metrics(); - int d; - - mathed_char_height(LM_TC_CONST, size, 'I', d, dh); - dh /= 2; - ascent += 2 + dh; - descent += 2 - dh; - dw = Height()/5; - if (dw > 15) dw = 15; - if (dw<6) dw = 6; - width += 2*dw+4; +void MathDelimInset::octave(OctaveStream & os) const +{ + if (isAbs()) + os << "det(" << cell(0) << ')'; + else + os << left_ << cell(0) << right_; }