X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2Fmath_deliminset.C;h=82b58813cf791246c3be72c52552ba34144cd908;hb=a8e8e755fc32233e91bf787d5032fd81147d0909;hp=4ada1f77cc373fd1b5a2d3b0eca47a630bb7024e;hpb=1b787e207d68610c6c8a1b3e21fce15891e38bef;p=lyx.git diff --git a/src/mathed/math_deliminset.C b/src/mathed/math_deliminset.C index 4ada1f77cc..82b58813cf 100644 --- a/src/mathed/math_deliminset.C +++ b/src/mathed/math_deliminset.C @@ -1,35 +1,30 @@ #include -#ifdef __GNUG__ -#pragma implementation -#endif #include "math_deliminset.h" #include "math_parser.h" #include "math_support.h" -#include "support/LOstream.h" #include "math_mathmlstream.h" +#include "math_streamstr.h" +#include "math_extern.h" -MathDelimInset::MathDelimInset(string const & l, string const & r) - : MathNestInset(1), left_(l), right_(r) -{} - +using std::max; -MathInset * MathDelimInset::clone() const -{ - return new MathDelimInset(*this); -} +namespace { - -string MathDelimInset::latexName(string const & name) +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 == "]") @@ -38,90 +33,148 @@ string MathDelimInset::latexName(string const & name) return name; if (name == "|") return 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; } -void MathDelimInset::write(MathWriteInfo & os) const +MathInset * MathDelimInset::clone() const { - os << "\\left" << latexName(left_).c_str() << cell(0) - << "\\right" << latexName(right_).c_str(); + return new MathDelimInset(*this); } -void MathDelimInset::writeNormal(NormalStream & os) const +void MathDelimInset::write(WriteStream & os) const { - os << "[delim " << latexName(left_).c_str() << ' ' - << latexName(right_).c_str() << ' ' << cell(0) << ']'; + 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 > 15) - w = 15; + if (w > 8) + w = 8; if (w < 4) w = 4; return w; } -void MathDelimInset::metrics(MathMetricsInfo const & mi) const +void MathDelimInset::metrics(MetricsInfo & mi) const { - xcell(0).metrics(mi); - int a, d, w; - mathed_char_dim(LM_TC_VAR, mi, 'I', a, d, w); - int h0 = (a + d) / 2; - int a0 = std::max(xcell(0).ascent(), a) - h0; - int d0 = std::max(xcell(0).descent(), d) + h0; - ascent_ = std::max(a0, d0) + h0; - descent_ = std::max(a0, d0) - h0; - width_ = xcell(0).width() + 2 * dw() + 4; + 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(Painter & pain, int x, int y) const -{ +void MathDelimInset::draw(PainterInfo & pi, int x, int y) const +{ int const w = dw(); - int const b = y - ascent_; - xcell(0).draw(pain, x + w + 2, y); - mathed_draw_deco(pain, x + 1, b, w, height(), left_); - mathed_draw_deco(pain, x + width() - w - 1, b, w, height(), right_); + 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::isMatrix() const +bool MathDelimInset::isParanthesis() const { - return left_ == "(" && right_ == ")" && cell(0).size() == 1 && - cell(0).begin()->nucleus() && cell(0).begin()->nucleus()->asArrayInset(); + 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) << ')'; + } + 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::maplize(MapleStream & os) const +void MathDelimInset::mathematica(MathematicaStream & os) const { - if (left_ == "|" && right_ == "|") { - if (cell(0).isMatrix()) - os << "linalg[det](" << cell(0) << ")"; + if (isAbs()) { + if (cell(0).size() == 1 && cell(0).front()->asMatrixInset()) + os << "Det" << cell(0) << ']'; else - os << "abs(" << cell(0) << ")"; + os << "Abs[" << cell(0) << ']'; } else - os << left_.c_str() << cell(0) << right_.c_str(); + os << left_ << cell(0) << right_; } void MathDelimInset::mathmlize(MathMLStream & os) const { - os << "" << cell(0) << ""; + os << "" << cell(0) << ""; } -void MathDelimInset::octavize(OctaveStream & os) const +void MathDelimInset::octave(OctaveStream & os) const { - if (left_ == "|" && right_ == "|") - os << "det(" << cell(0) << ")"; + if (isAbs()) + os << "det(" << cell(0) << ')'; else - os << left_.c_str() << cell(0) << right_.c_str(); + os << left_ << cell(0) << right_; }