X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FInsetMathFrac.cpp;h=6a175fad31ac26e0568c24684ef557917ee5a5c9;hb=e1d9ad9f2802875bc233122e14c8d273a95dd1ed;hp=9ec6c7b0862d1dd686b71ee2876c3d120786a867;hpb=a0043da05f5d32653917d8c551ee50138e639b00;p=lyx.git diff --git a/src/mathed/InsetMathFrac.cpp b/src/mathed/InsetMathFrac.cpp index 9ec6c7b086..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; @@ -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,37 +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 { - os << MTag("span", "class='frac'") - << MTag("span", "class='numer'") << cell(0) << ETag("span") - << MTag("span", "class='denom'") << cell(1) << ETag("span") - << ETag("span"); + 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"); + } } @@ -407,15 +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.addPreambleSnippet(""); + "span.denom{display: block; border-top: thin solid #000040;}"); InsetMathNest::validate(features); } @@ -578,12 +678,48 @@ void InsetMathBinom::mathmlize(MathStream & os) const } +void InsetMathBinom::htmlize(HtmlStream & os) const +{ + char ldelim = ' '; + char rdelim = ' '; + switch (kind_) { + case BINOM: + case TBINOM: + 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); }