X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FInsetMathFrac.cpp;h=6a175fad31ac26e0568c24684ef557917ee5a5c9;hb=f67cf6f4bb3e3d22ac9aebfa22027c3537cbdf61;hp=cffc1d76deacabf7f87704d26f4d4ded25a0684c;hpb=23f833a92b9331c99818e5a2d14832b7c4d2beb7;p=lyx.git diff --git a/src/mathed/InsetMathFrac.cpp b/src/mathed/InsetMathFrac.cpp index cffc1d76de..6a175fad31 100644 --- a/src/mathed/InsetMathFrac.cpp +++ b/src/mathed/InsetMathFrac.cpp @@ -22,6 +22,7 @@ #include "MetricsInfo.h" #include "TextPainter.h" +#include "support/lassert.h" #include "frontends/Painter.h" using namespace std; @@ -35,14 +36,16 @@ namespace lyx { ///////////////////////////////////////////////////////////////////// -InsetMathFracBase::InsetMathFracBase(idx_type ncells) - : InsetMathNest(ncells) +InsetMathFracBase::InsetMathFracBase(Buffer * buf, idx_type ncells) + : InsetMathNest(buf, ncells) {} bool InsetMathFracBase::idxUpDown(Cursor & cur, bool up) const { - InsetMath::idx_type target = !up; // up ? 0 : 1, since upper cell has idx 0 + // If we only have one cell, target = 0, otherwise + // target = up ? 0 : 1, since upper cell has idx 0 + InsetMath::idx_type target = nargs() > 1 ? !up : 0; if (cur.idx() == target) return false; cur.idx() = target; @@ -59,8 +62,8 @@ bool InsetMathFracBase::idxUpDown(Cursor & cur, bool up) const ///////////////////////////////////////////////////////////////////// -InsetMathFrac::InsetMathFrac(Kind kind, InsetMath::idx_type ncells) - : InsetMathFracBase(ncells), kind_(kind) +InsetMathFrac::InsetMathFrac(Buffer * buf, Kind kind, InsetMath::idx_type ncells) + : InsetMathFracBase(buf, ncells), kind_(kind) {} @@ -165,7 +168,7 @@ void InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const dim.des = dim1.height() - 5; } else { if (kind_ == CFRAC || kind_ == CFRACLEFT - || kind_ == CFRACRIGHT || kind_ == DFRAC) { + || kind_ == CFRACRIGHT || kind_ == DFRAC) { // \cfrac and \dfrac are always in display size StyleChanger dummy2(mi.base, LM_ST_DISPLAY); cell(0).metrics(mi, dim0); @@ -223,7 +226,7 @@ void InsetMathFrac::draw(PainterInfo & pi, int x, int y) const ShapeChanger dummy2(pi.base.font, UP_SHAPE); cell(0).draw(pi, x + 2, y - dim0.des - 5); cell(1).draw(pi, x + dim0.width() + 5, y + dim1.asc / 2); - } else if (kind_ == FRAC) { + } else if (kind_ == FRAC || kind_ == ATOP || kind_ == OVER) { 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_ == TFRAC) { @@ -252,13 +255,13 @@ void InsetMathFrac::draw(PainterInfo & pi, int x, int y) const pi.pain.line(xx + dim0.wid, y + dim.des - 2, xx + dim0.wid + 5, - y - dim.asc + 2, Color_math); + y - dim.asc + 2, pi.base.font.color()); } 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); + x + dim.wid - 2, y - 5, pi.base.font.color()); drawMarkers(pi, x, y); } @@ -366,18 +369,30 @@ bool InsetMathFrac::extraBraces() const void InsetMathFrac::maple(MapleStream & os) const { + if (nargs() != 2) { + // Someone who knows about maple should fix this. + LASSERT(false, return); + } os << '(' << cell(0) << ")/(" << cell(1) << ')'; } void InsetMathFrac::mathematica(MathematicaStream & os) const { + if (nargs() != 2) { + // Someone who knows about mathematica should fix this. + LASSERT(false, return); + } os << '(' << cell(0) << ")/(" << cell(1) << ')'; } void InsetMathFrac::octave(OctaveStream & os) const { + if (nargs() != 2) { + // Someone who knows about octave should fix this. + LASSERT(false, return); + } os << '(' << cell(0) << ")/(" << cell(1) << ')'; } @@ -385,15 +400,105 @@ void InsetMathFrac::octave(OctaveStream & os) const void InsetMathFrac::mathmlize(MathStream & os) const { switch (kind_) { - case FRAC: - os << MTag("mfrac") << cell(0) << cell(1) << ETag("mfrac"); + case ATOP: + os << MTag("mfrac", "linethickeness='0'") + << MTag("mrow") << cell(0) << ETag("mrow") + << MTag("mrow") << cell(1) << ETag("mrow") + << ETag("mfrac"); break; + + // we do not presently distinguish these + case OVER: + case FRAC: case DFRAC: - os << MTag("mdfrac") << cell(0) << cell(1) << ETag("mdfrac"); + case TFRAC: + case CFRAC: + case CFRACLEFT: + case CFRACRIGHT: + os << MTag("mfrac") + << MTag("mrow") << cell(0) << ETag("mrow") + << MTag("mrow") << cell(1) << ETag("mrow") + << ETag("mfrac"); break; + + case NICEFRAC: + os << MTag("mfrac", "bevelled='true'") + << MTag("mrow") << cell(0) << ETag("mrow") + << MTag("mrow") << cell(1) << ETag("mrow") + << ETag("mfrac"); + break; + + case UNITFRAC: + if (nargs() == 3) + os << cell(2); + os << MTag("mfrac", "bevelled='true'") + << MTag("mrow") << cell(0) << ETag("mrow") + << MTag("mrow") << cell(1) << ETag("mrow") + << ETag("mfrac"); + break; + + case UNIT: + // FIXME This is not right, because we still output mi, etc, + // when we output the cell. So we need to prevent that somehow. + if (nargs() == 2) + os << cell(0) + << MTag("mstyle mathvariant='normal'") + << cell(1) + << ETag("mstyle"); + else + os << MTag("mstyle mathvariant='normal'") + << cell(0) + << ETag("mstyle"); + } +} + + +void InsetMathFrac::htmlize(HtmlStream & os) const +{ + switch (kind_) { + case ATOP: + os << MTag("span", "class='frac'") + << MTag("span", "class='numer'") << cell(0) << ETag("span") + << MTag("span", "class='numer'") << cell(1) << ETag("span") + << ETag("span"); + break; + + // we do not presently distinguish these + case OVER: + case FRAC: + case DFRAC: case TFRAC: - os << MTag("mtfrac") << cell(0) << cell(1) << ETag("mtfrac"); + case CFRAC: + case CFRACLEFT: + case CFRACRIGHT: + os << MTag("span", "class='frac'") + << MTag("span", "class='numer'") << cell(0) << ETag("span") + << MTag("span", "class='denom'") << cell(1) << ETag("span") + << ETag("span"); + break; + + case NICEFRAC: + os << cell(0) << '/' << cell(1); + break; + + case UNITFRAC: + if (nargs() == 3) + os << cell(2) << ' '; + os << cell(0) << '/' << cell(1); break; + + case UNIT: + // FIXME This is not right, because we still output i, etc, + // when we output the cell. So we need to prevent that somehow. + if (nargs() == 2) + os << cell(0) + << MTag("span") + << cell(1) + << ETag("span"); + else + os << MTag("span") + << cell(0) + << ETag("span"); } } @@ -403,8 +508,14 @@ void InsetMathFrac::validate(LaTeXFeatures & features) const if (kind_ == NICEFRAC || kind_ == UNITFRAC || kind_ == UNIT) features.require("units"); if (kind_ == CFRAC || kind_ == CFRACLEFT || kind_ == CFRACRIGHT - || kind_ == DFRAC || kind_ == TFRAC) + || kind_ == DFRAC || kind_ == TFRAC) features.require("amsmath"); + if (features.runparams().math_flavor == OutputParams::MathAsHTML) + // CSS adapted from eLyXer + features.addCSSSnippet( + "span.frac{display: inline-block; vertical-align: middle; text-align:center;}\n" + "span.numer{display: block;}\n" + "span.denom{display: block; border-top: thin solid #000040;}"); InsetMathNest::validate(features); } @@ -416,8 +527,8 @@ void InsetMathFrac::validate(LaTeXFeatures & features) const ///////////////////////////////////////////////////////////////////// -InsetMathBinom::InsetMathBinom(Kind kind) - : kind_(kind) +InsetMathBinom::InsetMathBinom(Buffer * buf, Kind kind) + : InsetMathFracBase(buf), kind_(kind) {} @@ -540,26 +651,75 @@ void InsetMathBinom::normalize(NormalStream & os) const void InsetMathBinom::mathmlize(MathStream & os) const { + char ldelim = ' '; + char rdelim = ' '; switch (kind_) { case BINOM: - os << MTag("mbinom") << cell(0) << cell(1) << ETag("mbinom"); - break; + case TBINOM: case DBINOM: - os << MTag("mdbinom") << cell(0) << cell(1) << ETag("mdbinom"); + case CHOOSE: + ldelim = '('; + rdelim = ')'; break; + case BRACE: + ldelim = '{'; + rdelim = '}'; + break; + case BRACK: + ldelim = '['; + rdelim = ']'; + break; + } + os << "" << ldelim << "" + << "" + << cell(0) << cell(1) + << "" + << "" << rdelim << ""; +} + + +void InsetMathBinom::htmlize(HtmlStream & os) const +{ + char ldelim = ' '; + char rdelim = ' '; + switch (kind_) { + case BINOM: case TBINOM: - os << MTag("mtbinom") << cell(0) << cell(1) << ETag("mtbinom"); + case DBINOM: + case CHOOSE: + ldelim = '('; + rdelim = ')'; + break; + case BRACE: + ldelim = '{'; + rdelim = '}'; + break; + case BRACK: + ldelim = '['; + rdelim = ']'; break; } + os << MTag("span", "class='binomdelim'") << ldelim << ETag("span") << '\n' + << MTag("span", "class='binom'") << '\n' + << MTag("span") << cell(0) << ETag("span") << '\n' + << MTag("span") << cell(1) << ETag("span") << '\n' + << ETag("span") << '\n' + << MTag("span", "class='binomdelim'") << rdelim << ETag("span") << '\n'; } void InsetMathBinom::validate(LaTeXFeatures & features) const { - if (kind_ == BINOM) - features.require("binom"); - if (kind_ == DBINOM || kind_ == TBINOM) - features.require("amsmath"); + if (features.runparams().isLaTeX()) { + if (kind_ == BINOM) + features.require("binom"); + if (kind_ == DBINOM || kind_ == TBINOM) + features.require("amsmath"); + } else if (features.runparams().math_flavor == OutputParams::MathAsHTML) + features.addCSSSnippet( + "span.binom{display: inline-block; vertical-align: bottom; text-align:center;}\n" + "span.binom span{display: block;}\n" + "span.binomdelim{font-size: 2em;}"); InsetMathNest::validate(features); }