]> git.lyx.org Git - features.git/commitdiff
InsetMathFrac: add support for \tbinom and \dbinom, fixes bug 4305
authorUwe Stöhr <uwestoehr@web.de>
Sun, 28 Oct 2007 21:48:51 +0000 (21:48 +0000)
committerUwe Stöhr <uwestoehr@web.de>
Sun, 28 Oct 2007 21:48:51 +0000 (21:48 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@21247 a592a061-630c-0410-9148-cb99ea01b6c8

src/mathed/InsetMathFrac.cpp
src/mathed/InsetMathFrac.h
src/mathed/MathFactory.cpp

index adf078643258b39d1c183ef99e13d982d929779c..50bfbb4ade3b75a342981c5675273c471ba3e07f 100644 (file)
@@ -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
index b5e99e82d77e91bb78553ecb8cdee5e9328fb4c4..0788747d39d4022696e98e9c7ed7486608abc477 100644 (file)
@@ -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
index e0edd493e93b57b00522a95087a35ae6a8b52549..f8df7a81a5728ebe0950ff826295eafdb26e40f8 100644 (file)
@@ -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")