X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FInsetMathFrac.cpp;h=467735558cd2d087e35e25e5e8463a8a8dd9e931;hb=4c724a6072013247ac178f0acec06825585c6c55;hp=11d24469db1c09b752105035e8a1951186a2fcbb;hpb=c271d0d8c197fb13298bfafe92836e4292d4c7e7;p=lyx.git diff --git a/src/mathed/InsetMathFrac.cpp b/src/mathed/InsetMathFrac.cpp index 11d24469db..467735558c 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; @@ -167,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); @@ -254,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); } @@ -368,28 +369,137 @@ 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) << ')'; } void InsetMathFrac::mathmlize(MathStream & os) const { - os << MTag("mfrac") - << MTag("mrow") << cell(0) << ETag("mrow") - << MTag("mrow") << cell(1) << ETag("mrow") - << ETag("mfrac"); + switch (kind_) { + 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: + 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: + 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"); + } } @@ -398,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); } @@ -437,8 +553,8 @@ void InsetMathBinom::metrics(MetricsInfo & mi, Dimension & dim) const { Dimension dim0, dim1; - // FIXME: for an unknown reason the cells must be set directly - // after the StyleChanger and cannot be set after the if case + // The cells must be set while the RAII objects (StyleChanger, + // FracChanger) do still exist and cannot be set after the if case. if (kind_ == DBINOM) { StyleChanger dummy(mi.base, LM_ST_DISPLAY); cell(0).metrics(mi, dim0); @@ -471,8 +587,8 @@ void InsetMathBinom::draw(PainterInfo & pi, int x, int y) const kind_ == BRACK ? from_ascii("]") : from_ascii(")"); int m = x + dim.width() / 2; - // FIXME: for an unknown reason the cells must be drawn directly - // after the StyleChanger and cannot be drawn after the if case + // The cells must be drawn while the RAII objects (StyleChanger, + // FracChanger) do still exist and cannot be drawn after the if case. if (kind_ == DBINOM) { StyleChanger dummy(pi.base, LM_ST_DISPLAY); cell(0).draw(pi, m - dim0.wid / 2, y - dim0.des - 3 - 5); @@ -535,27 +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: - 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 << "" << ldelim << "" + << "" + << cell(0) << cell(1) + << "" + << "" << rdelim << ""; +} + + +void InsetMathBinom::htmlize(HtmlStream & os) const +{ + char ldelim = ' '; + char rdelim = ' '; + switch (kind_) { + case BINOM: + case TBINOM: case DBINOM: - default: - 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 << 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); }