mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-23 21:40:19 +00:00
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
This commit is contained in:
parent
3e341497a8
commit
8225a56dfe
@ -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"
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -41,6 +41,8 @@ public:
|
||||
enum Kind {
|
||||
FRAC,
|
||||
CFRAC,
|
||||
CFRACLEFT,
|
||||
CFRACRIGHT,
|
||||
DFRAC,
|
||||
TFRAC,
|
||||
OVER,
|
||||
|
@ -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")
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user