From 8225a56dfe848b3482069d856393fa07e2dd9f39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20St=C3=B6hr?= Date: Mon, 6 Apr 2009 23:58:42 +0000 Subject: [PATCH] InsetMathFrac: reimplement \cfrac with its optional argument the way Enrico proposed (http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg149855.html) git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@29131 a592a061-630c-0410-9148-cb99ea01b6c8 --- lib/ui/stdtoolbars.inc | 3 +- src/mathed/InsetMathFrac.cpp | 102 ++++++++++++++--------------------- src/mathed/InsetMathFrac.h | 2 + src/mathed/MathFactory.cpp | 6 ++- src/mathed/MathParser.cpp | 22 ++++---- 5 files changed, 60 insertions(+), 75 deletions(-) diff --git a/lib/ui/stdtoolbars.inc b/lib/ui/stdtoolbars.inc index 8aec1b1663..77b5df270d 100644 --- a/lib/ui/stdtoolbars.inc +++ b/lib/ui/stdtoolbars.inc @@ -310,7 +310,8 @@ ToolbarSet Item "Text fraction \\tfrac" "math-insert \tfrac" Item "Display fraction \\dfrac" "math-insert \dfrac" Item "Continued fraction \\cfrac" "math-insert \cfrac" - Item "Continued fraction (aligned) \\cfrac" "math-insert \cfracthree" + Item "Continued fraction (left) \\cfrac" "math-insert \cfracleft" + Item "Continued fraction (right) \\cfrac" "math-insert \cfracright" Item "Binomial \\binom" "math-insert \binom" Item "Text binomial \\tbinom" "math-insert \tbinom" Item "Display binomial \\dbinom" "math-insert \dbinom" diff --git a/src/mathed/InsetMathFrac.cpp b/src/mathed/InsetMathFrac.cpp index 66c75ba4bc..e71dcc361b 100644 --- a/src/mathed/InsetMathFrac.cpp +++ b/src/mathed/InsetMathFrac.cpp @@ -85,8 +85,7 @@ InsetMathFrac const * InsetMathFrac::asFracInset() const bool InsetMathFrac::idxForward(Cursor & cur) const { InsetMath::idx_type target = 0; - if (kind_ == UNIT || (kind_ == UNITFRAC && nargs() == 3) - || (kind_ == CFRAC && nargs() == 3)) { + if (kind_ == UNIT || (kind_ == UNITFRAC && nargs() == 3)) { if (nargs() == 3) target = 0; else if (nargs() == 2) @@ -104,8 +103,7 @@ bool InsetMathFrac::idxForward(Cursor & cur) const bool InsetMathFrac::idxBackward(Cursor & cur) const { InsetMath::idx_type target = 0; - if (kind_ == UNIT || (kind_ == UNITFRAC && nargs() == 3) - || (kind_ == CFRAC && nargs() == 3)) { + if (kind_ == UNIT || (kind_ == UNITFRAC && nargs() == 3)) { if (nargs() == 3) target = 2; else if (nargs() == 2) @@ -159,29 +157,15 @@ void InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const dim.wid = dim0.width() + dim1.wid + 5; dim.asc = dim0.height() + 5; dim.des = dim1.height() - 5; - } else if (kind_ == CFRAC) { - if (nargs() == 2) { - // cfrac is always in display size - StyleChanger dummy2(mi.base, LM_ST_DISPLAY); - cell(0).metrics(mi, dim0); - cell(1).metrics(mi, dim1); - dim.wid = max(dim0.wid, dim1.wid) + 2; - dim.asc = dim0.height() + 2 + 5; - dim.des = dim1.height() + 2 - 5; - } else { - // cfrac is always in display size - StyleChanger dummy2(mi.base, LM_ST_DISPLAY); - // use text font for the optional argument - FontSetChanger dummy3(mi.base, "textnormal"); - cell(2).metrics(mi, dim2); - // return to math font - FontSetChanger dummy4(mi.base, "mathnormal"); - cell(0).metrics(mi, dim0); - cell(1).metrics(mi, dim1); - dim.wid = 2 + max(dim0.wid, dim1.wid); - dim.asc = dim0.height() + 2 + 5; - dim.des = dim1.height() + 2 - 5; - } + } else if (kind_ == CFRAC || kind_ == CFRACLEFT + || kind_ == CFRACRIGHT) { + // cfrac is always in display size + StyleChanger dummy2(mi.base, LM_ST_DISPLAY); + cell(0).metrics(mi, dim0); + cell(1).metrics(mi, dim1); + dim.wid = max(dim0.wid, dim1.wid) + 2; + dim.asc = dim0.height() + 2 + 5; + dim.des = dim1.height() + 2 - 5; } else if (kind_ == UNITFRAC) { ShapeChanger dummy2(mi.base.font, UP_SHAPE); dim.wid = dim0.width() + dim1.wid + 5; @@ -254,36 +238,21 @@ void InsetMathFrac::draw(PainterInfo & pi, int x, int y) const y - dim0.des - 5); cell(1).draw(pi, x + dim0.width() + 5, y + dim1.asc / 2); - } else if (kind_ == CFRAC) { - if (nargs() == 2) { - // cfrac is always in display size - StyleChanger dummy2(pi.base, LM_ST_DISPLAY); - Dimension const dim0 = cell(0).dimension(*pi.base.bv); - Dimension const dim1 = cell(1).dimension(*pi.base.bv); - int m = x + dim.wid / 2; + } else if (kind_ == CFRAC || kind_ == CFRACLEFT + || kind_ == CFRACRIGHT) { + // cfrac is always in display size + StyleChanger dummy2(pi.base, LM_ST_DISPLAY); + Dimension const dim0 = cell(0).dimension(*pi.base.bv); + Dimension const dim1 = cell(1).dimension(*pi.base.bv); + int m = x + dim.wid / 2; + if (kind_ == CFRAC) cell(0).draw(pi, m - dim0.wid / 2, y - dim0.des - 2 - 5); - cell(1).draw(pi, m - dim1.wid / 2, y + dim1.asc + 2 - 5); - } else { - // cfrac is always in display size - StyleChanger dummy2(pi.base, LM_ST_DISPLAY); - // use text font for the optional argument - FontSetChanger dummy3(pi.base, "textnormal"); - Dimension const dim2 = cell(2).dimension(*pi.base.bv); - int w = mathed_char_width(pi.base.font, '['); - drawStrBlack(pi, x, y, from_ascii("[")); - x += w; - cell(2).draw(pi, x + 1, y); - x += dim2.wid; - drawStrBlack(pi, x, y, from_ascii("]")); - x += w; - // return to math font - FontSetChanger dummy4(pi.base, "mathnormal"); - Dimension const dim0 = cell(0).dimension(*pi.base.bv); - Dimension const dim1 = cell(1).dimension(*pi.base.bv); - int m = x + dim.wid / 2; - cell(0).draw(pi, m - dim0.wid / 2, y - dim0.des - 2 - 5); - cell(1).draw(pi, m - dim1.wid / 2, y + dim1.asc + 2 - 5); - } + else if (kind_ == CFRACLEFT) + cell(0).draw(pi, x + 2, y - dim0.des - 2 - 5); + else if (kind_ == CFRACRIGHT) + cell(0).draw(pi, x + dim.wid - dim0.wid - 2, + y - dim0.des - 2 - 5); + cell(1).draw(pi, m - dim1.wid / 2, y + dim1.asc + 2 - 5); } else if (kind_ == DFRAC) { // dfrac is in always in display size StyleChanger dummy2(pi.base, LM_ST_DISPLAY); @@ -317,7 +286,8 @@ void InsetMathFrac::draw(PainterInfo & pi, int x, int y) const xx + dim0.wid + 5, y - dim.asc + 2, Color_math); } - if (kind_ == FRAC || kind_ == CFRAC || kind_ == DFRAC + if (kind_ == FRAC || kind_ == CFRAC || kind_ == CFRACLEFT + || kind_ == CFRACRIGHT || kind_ == DFRAC || kind_ == TFRAC || kind_ == OVER) pi.pain.line(x + 1, y - 5, x + dim.wid - 2, y - 5, Color_math); @@ -356,6 +326,8 @@ void InsetMathFrac::write(WriteStream & os) const MathEnsurer ensurer(os); switch (kind_) { case ATOP: + // \\atop is only for compatibility, \\binom is the + // LaTeX2e successor os << '{' << cell(0) << "\\atop " << cell(1) << '}'; break; case OVER: @@ -367,11 +339,6 @@ void InsetMathFrac::write(WriteStream & os) const case TFRAC: case NICEFRAC: case CFRAC: - if (nargs() == 2) - InsetMathNest::write(os); - else - os << "\\cfrac[" << cell(2) << "]{" << cell(0) << "}{" << cell(1) << '}'; - break; case UNITFRAC: if (nargs() == 2) InsetMathNest::write(os); @@ -384,6 +351,12 @@ void InsetMathFrac::write(WriteStream & os) const else os << "\\unit{" << cell(0) << '}'; break; + case CFRACLEFT: + os << "\\cfrac[l]{" << cell(0) << "}{" << cell(1) << '}'; + break; + case CFRACRIGHT: + os << "\\cfrac[r]{" << cell(0) << "}{" << cell(1) << '}'; + break; } } @@ -394,6 +367,8 @@ docstring InsetMathFrac::name() const case FRAC: return from_ascii("frac"); case CFRAC: + case CFRACLEFT: + case CFRACRIGHT: return from_ascii("cfrac"); case DFRAC: return from_ascii("dfrac"); @@ -459,7 +434,8 @@ void InsetMathFrac::validate(LaTeXFeatures & features) const { if (kind_ == NICEFRAC || kind_ == UNITFRAC || kind_ == UNIT) features.require("units"); - if (kind_ == CFRAC || kind_ == DFRAC || kind_ == TFRAC) + if (kind_ == CFRAC || kind_ == CFRACLEFT || kind_ == CFRACRIGHT + || kind_ == DFRAC || kind_ == TFRAC) features.require("amsmath"); InsetMathNest::validate(features); } diff --git a/src/mathed/InsetMathFrac.h b/src/mathed/InsetMathFrac.h index 3254405c35..b2c55666b2 100644 --- a/src/mathed/InsetMathFrac.h +++ b/src/mathed/InsetMathFrac.h @@ -41,6 +41,8 @@ public: enum Kind { FRAC, CFRAC, + CFRACLEFT, + CFRACRIGHT, DFRAC, TFRAC, OVER, diff --git a/src/mathed/MathFactory.cpp b/src/mathed/MathFactory.cpp index c41f68d03c..81d03aec6c 100644 --- a/src/mathed/MathFactory.cpp +++ b/src/mathed/MathFactory.cpp @@ -441,8 +441,10 @@ MathAtom createInsetMath(docstring const & s) return MathAtom(new InsetMathFrac(InsetMathFrac::UNIT, 1)); if (s == "unittwo") return MathAtom(new InsetMathFrac(InsetMathFrac::UNIT)); - if (s == "cfracthree") - return MathAtom(new InsetMathFrac(InsetMathFrac::CFRAC, 3)); + if (s == "cfracleft") + return MathAtom(new InsetMathFrac(InsetMathFrac::CFRACLEFT)); + if (s == "cfracright") + return MathAtom(new InsetMathFrac(InsetMathFrac::CFRACRIGHT)); //if (s == "infer") // return MathAtom(new MathInferInset); if (s == "atop") diff --git a/src/mathed/MathParser.cpp b/src/mathed/MathParser.cpp index 7c22bcba1e..757458cc88 100644 --- a/src/mathed/MathParser.cpp +++ b/src/mathed/MathParser.cpp @@ -1320,15 +1320,19 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags, } else if (t.cs() == "cfrac") { - // Here allowed formats are \cfrac[pos]{num}{denom} - MathData ar; - parse(ar, FLAG_OPTION, mode); - if (ar.size()) { - cell->push_back(MathAtom(new InsetMathFrac(InsetMathFrac::CFRAC, 3))); - cell->back().nucleus()->cell(2) = ar; - } else { - cell->push_back(MathAtom(new InsetMathFrac(InsetMathFrac::CFRAC))); - } + // allowed formats are \cfrac[pos]{num}{denom} + docstring const arg = getArg('[', ']'); + //lyxerr << "got so far: '" << arg << "'" << endl; + if (arg == "l") + cell->push_back(MathAtom(new InsetMathFrac(InsetMathFrac::CFRACLEFT))); + else if (arg == "r") + cell->push_back(MathAtom(new InsetMathFrac(InsetMathFrac::CFRACRIGHT))); + else if (arg.empty() || arg == "c") + cell->push_back(MathAtom(new InsetMathFrac(InsetMathFrac::CFRAC))); + else { + error("found invalid optional argument"); + break; + } parse(cell->back().nucleus()->cell(0), FLAG_ITEM, mode); parse(cell->back().nucleus()->cell(1), FLAG_ITEM, mode); }