From 256638827a89402950f53cf109395afcbd462319 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20St=C3=B6hr?= Date: Sun, 28 Oct 2007 21:48:51 +0000 Subject: [PATCH] InsetMathFrac: add support for \tbinom and \dbinom, fixes bug 4305 git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@21247 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/mathed/InsetMathFrac.cpp | 140 +++++++++++++++++++++++++++++++++++ src/mathed/InsetMathFrac.h | 44 +++++++++++ src/mathed/MathFactory.cpp | 4 + 3 files changed, 188 insertions(+) diff --git a/src/mathed/InsetMathFrac.cpp b/src/mathed/InsetMathFrac.cpp index adf0786432..50bfbb4ade 100644 --- a/src/mathed/InsetMathFrac.cpp +++ b/src/mathed/InsetMathFrac.cpp @@ -549,4 +549,144 @@ void InsetMathBinom::normalize(NormalStream & os) const os << "[binom " << cell(0) << ' ' << cell(1) << ']'; } + +///////////////////////////////////////////////////////////////////// +// +// InsetMathDBinom +// +///////////////////////////////////////////////////////////////////// + +Inset * InsetMathDBinom::clone() const +{ + return new InsetMathDBinom(*this); +} + + +int InsetMathDBinom::dw(int height) const +{ + int w = height / 5; + if (w > 15) + w = 15; + if (w < 6) + w = 6; + return w; +} + + +void InsetMathDBinom::metrics(MetricsInfo & mi, Dimension & dim) const +{ + Dimension dim0, dim1; + cell(0).metrics(mi, dim0); + cell(1).metrics(mi, dim1); + dim.asc = dim0.height() + 4 + 5; + dim.des = dim1.height() + 4 - 5; + dim.wid = std::max(dim0.width(), dim1.wid) + 2 * dw(dim.height()) + 4; + metricsMarkers2(dim); + // Cache the inset dimension. + setDimCache(mi, dim); +} + + +void InsetMathDBinom::draw(PainterInfo & pi, int x, int y) const +{ + Dimension const dim = dimension(*pi.base.bv); + Dimension const & dim0 = cell(0).dimension(*pi.base.bv); + Dimension const & dim1 = cell(1).dimension(*pi.base.bv); + int m = x + dim.width() / 2; + cell(0).draw(pi, m - dim0.width() / 2, y - dim0.des - 3 - 5); + cell(1).draw(pi, m - dim1.wid / 2, y + dim1.asc + 3 - 5); + mathed_draw_deco(pi, x, y - dim.ascent(), dw(dim.height()), dim.height(), from_ascii("(")); + mathed_draw_deco(pi, x + dim.width() - dw(dim.height()), y - dim.ascent(), + dw(dim.height()), dim.height(), from_ascii(")")); + drawMarkers2(pi, x, y); +} + + +docstring InsetMathDBinom::name() const +{ + return from_ascii("dbinom"); +} + +void InsetMathDBinom::mathmlize(MathStream & os) const +{ + os << MTag("mdbinom") << cell(0) << cell(1) << ETag("mdbinom"); +} + +void InsetMathDBinom::validate(LaTeXFeatures & features) const +{ + features.require("amsmath"); + InsetMathNest::validate(features); +} + + +///////////////////////////////////////////////////////////////////// +// +// InsetMathTBinom +// +///////////////////////////////////////////////////////////////////// + +Inset * InsetMathTBinom::clone() const +{ + return new InsetMathTBinom(*this); +} + + +int InsetMathTBinom::dw(int height) const +{ + int w = height / 5; + if (w > 15) + w = 15; + if (w < 6) + w = 6; + return w; +} + + +void InsetMathTBinom::metrics(MetricsInfo & mi, Dimension & dim) const +{ + StyleChanger dummy(mi.base, LM_ST_SCRIPT); + Dimension dim0, dim1; + cell(0).metrics(mi, dim0); + cell(1).metrics(mi, dim1); + dim.asc = dim0.height() + 4 + 5; + dim.des = dim1.height() + 4 - 5; + dim.wid = std::max(dim0.width(), dim1.wid) + 2 * dw(dim.height()) + 4; + metricsMarkers2(dim); + // Cache the inset dimension. + setDimCache(mi, dim); +} + + +void InsetMathTBinom::draw(PainterInfo & pi, int x, int y) const +{ + StyleChanger dummy(pi.base, LM_ST_SCRIPT); + Dimension const dim = dimension(*pi.base.bv); + Dimension const & dim0 = cell(0).dimension(*pi.base.bv); + Dimension const & dim1 = cell(1).dimension(*pi.base.bv); + int m = x + dim.width() / 2; + cell(0).draw(pi, m - dim0.width() / 2, y - dim0.des - 3 - 5); + cell(1).draw(pi, m - dim1.wid / 2, y + dim1.asc + 3 - 5); + mathed_draw_deco(pi, x, y - dim.ascent(), dw(dim.height()), dim.height(), from_ascii("(")); + mathed_draw_deco(pi, x + dim.width() - dw(dim.height()), y - dim.ascent(), + dw(dim.height()), dim.height(), from_ascii(")")); + drawMarkers2(pi, x, y); +} + + +docstring InsetMathTBinom::name() const +{ + return from_ascii("tbinom"); +} + +void InsetMathTBinom::mathmlize(MathStream & os) const +{ + os << MTag("mtbinom") << cell(0) << cell(1) << ETag("mtbinom"); +} + +void InsetMathTBinom::validate(LaTeXFeatures & features) const +{ + features.require("amsmath"); + InsetMathNest::validate(features); +} + } // namespace lyx diff --git a/src/mathed/InsetMathFrac.h b/src/mathed/InsetMathFrac.h index b5e99e82d7..0788747d39 100644 --- a/src/mathed/InsetMathFrac.h +++ b/src/mathed/InsetMathFrac.h @@ -155,6 +155,50 @@ private: }; +/// \dbinom support +class InsetMathDBinom : public InsetMathFracBase { +public: + /// + InsetMathDBinom() {} + /// + void metrics(MetricsInfo & mi, Dimension & dim) const; + /// + void draw(PainterInfo &, int x, int y) const; + /// + docstring name() const; + /// + void mathmlize(MathStream &) const; + /// + void validate(LaTeXFeatures & features) const; +private: + Inset * clone() const; + /// + int dw(int height) const; +}; + + +/// \tbinom support +class InsetMathTBinom : public InsetMathFracBase { +public: + /// + InsetMathTBinom() {} + /// + void metrics(MetricsInfo & mi, Dimension & dim) const; + /// + void draw(PainterInfo &, int x, int y) const; + /// + docstring name() const; + /// + void mathmlize(MathStream &) const; + /// + void validate(LaTeXFeatures & features) const; +private: + Inset * clone() const; + /// + int dw(int height) const; +}; + + } // namespace lyx #endif diff --git a/src/mathed/MathFactory.cpp b/src/mathed/MathFactory.cpp index e0edd493e9..f8df7a81a5 100644 --- a/src/mathed/MathFactory.cpp +++ b/src/mathed/MathFactory.cpp @@ -392,6 +392,10 @@ MathAtom createInsetMath(docstring const & s) return MathAtom(new InsetMathDFrac); if (s == "tfrac") return MathAtom(new InsetMathTFrac); + if (s == "dbinom") + return MathAtom(new InsetMathDBinom); + if (s == "tbinom") + return MathAtom(new InsetMathTBinom); if (s == "hphantom") return MathAtom(new InsetMathPhantom(InsetMathPhantom::hphantom)); if (s == "phantom")