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
This commit is contained in:
Uwe Stöhr 2007-10-28 21:48:51 +00:00
parent 4c3950f90a
commit 256638827a
3 changed files with 188 additions and 0 deletions

View File

@ -549,4 +549,144 @@ void InsetMathBinom::normalize(NormalStream & os) const
os << "[binom " << cell(0) << ' ' << cell(1) << ']'; 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 } // namespace lyx

View 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 } // namespace lyx
#endif #endif

View File

@ -392,6 +392,10 @@ MathAtom createInsetMath(docstring const & s)
return MathAtom(new InsetMathDFrac); return MathAtom(new InsetMathDFrac);
if (s == "tfrac") if (s == "tfrac")
return MathAtom(new InsetMathTFrac); return MathAtom(new InsetMathTFrac);
if (s == "dbinom")
return MathAtom(new InsetMathDBinom);
if (s == "tbinom")
return MathAtom(new InsetMathTBinom);
if (s == "hphantom") if (s == "hphantom")
return MathAtom(new InsetMathPhantom(InsetMathPhantom::hphantom)); return MathAtom(new InsetMathPhantom(InsetMathPhantom::hphantom));
if (s == "phantom") if (s == "phantom")