X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FInsetMathScript.cpp;h=fc72b6b078e1052002cd045701c607767e57ac40;hb=28be7d552f62cc02fa86d7f79201d089bfb2d7b5;hp=b361e5d0c2faaf3326c32e5303a6dadc54d756bb;hpb=1b1f8dd235ba8e168348cd23c824063f2595a0c5;p=lyx.git diff --git a/src/mathed/InsetMathScript.cpp b/src/mathed/InsetMathScript.cpp index b361e5d0c2..fc72b6b078 100644 --- a/src/mathed/InsetMathScript.cpp +++ b/src/mathed/InsetMathScript.cpp @@ -10,22 +10,24 @@ #include +#include "InsetMathScript.h" + +#include "InsetMathBrace.h" +#include "InsetMathSymbol.h" +#include "MathData.h" +#include "MathStream.h" +#include "MathSupport.h" + #include "BufferView.h" #include "Cursor.h" #include "DispatchResult.h" #include "FuncRequest.h" #include "FuncStatus.h" -#include "InsetMathBrace.h" -#include "InsetMathScript.h" -#include "InsetMathSymbol.h" #include "LaTeXFeatures.h" -#include "MathData.h" -#include "MathStream.h" -#include "MathSupport.h" +#include "MetricsInfo.h" #include "support/debug.h" #include "support/gettext.h" - #include "support/lassert.h" @@ -90,7 +92,7 @@ MathData const & InsetMathScript::down() const { if (nargs() == 3) return cell(2); - LBUFERR(nargs() > 1, _("Invalid number of math cells.")); + LBUFERR(nargs() > 1); return cell(1); } @@ -99,21 +101,21 @@ MathData & InsetMathScript::down() { if (nargs() == 3) return cell(2); - LBUFERR(nargs() > 1, _("Invalid number of math cells.")); + LBUFERR(nargs() > 1); return cell(1); } MathData const & InsetMathScript::up() const { - LBUFERR(nargs() > 1, _("Invalid number of math cells.")); + LBUFERR(nargs() > 1); return cell(1); } MathData & InsetMathScript::up() { - LBUFERR(nargs() > 1, _("Invalid number of math cells.")); + LBUFERR(nargs() > 1); return cell(1); } @@ -224,7 +226,8 @@ int InsetMathScript::dx0(BufferView const & bv) const { LASSERT(hasDown(), return 0); Dimension const dim = dimension(bv); - return hasLimits() ? (dim.wid - down().dimension(bv).width()) / 2 : nwid(bv); + return hasLimits() ? (dim.wid - down().dimension(bv).width()) / 2 + : nwid(bv) + min(nker(&bv), 0); } @@ -232,7 +235,8 @@ int InsetMathScript::dx1(BufferView const & bv) const { LASSERT(hasUp(), return 0); Dimension const dim = dimension(bv); - return hasLimits() ? (dim.wid - up().dimension(bv).width()) / 2 : nwid(bv) + nker(&bv); + return hasLimits() ? (dim.wid - up().dimension(bv).width()) / 2 + : nwid(bv) + max(nker(&bv), 0); } @@ -263,21 +267,36 @@ int InsetMathScript::ndes(BufferView const & bv) const int InsetMathScript::nker(BufferView const * bv) const { - if (!nuc().empty()) { - int kerning = nuc().kerning(bv); - return kerning > 0 ? kerning : 0; - } + if (!nuc().empty()) + return nuc().kerning(bv); return 0; } +MathClass InsetMathScript::mathClass() const +{ + // FIXME: this is a hack, since the class will not be correct if + // the nucleus has several elements or if the last element is a math macro + // or a macro argument proxy. + // The correct implementation would require to linearize the nucleus. + if (nuc().empty()) + return MC_ORD; + else { + // return the class of last element since this is the one that counts. + MathClass mc = nuc().back()->mathClass(); + return (mc == MC_UNKNOWN) ? MC_ORD : mc; + } +} + + void InsetMathScript::metrics(MetricsInfo & mi, Dimension & dim) const { + Changer dummy2 = mi.base.changeEnsureMath(); Dimension dim0; Dimension dim1; Dimension dim2; cell(0).metrics(mi, dim0); - ScriptChanger dummy(mi.base); + Changer dummy = mi.base.changeScript(); if (nargs() > 1) cell(1).metrics(mi, dim1); if (nargs() > 2) @@ -301,9 +320,9 @@ void InsetMathScript::metrics(MetricsInfo & mi, Dimension & dim) const dim.wid = max(dim.wid, dimdown.width()); } else { if (hasUp()) - dim.wid = max(dim.wid, nker(mi.base.bv) + dimup.width()); + dim.wid = max(dim.wid, max(nker(mi.base.bv), 0) + dimup.width()); if (hasDown()) - dim.wid = max(dim.wid, dimdown.width()); + dim.wid = max(dim.wid, min(nker(mi.base.bv), 0) + dimdown.width()); dim.wid += nwid(bv); } int na = nasc(bv); @@ -318,12 +337,12 @@ void InsetMathScript::metrics(MetricsInfo & mi, Dimension & dim) const dim.des = max(nd, des); } else dim.des = nd; - metricsMarkers(dim); } void InsetMathScript::draw(PainterInfo & pi, int x, int y) const { + Changer dummy2 = pi.base.changeEnsureMath(); BufferView & bv = *pi.base.bv; if (!nuc().empty()) nuc().draw(pi, x + dxx(bv), y); @@ -332,12 +351,11 @@ void InsetMathScript::draw(PainterInfo & pi, int x, int y) const if (editing(&bv)) pi.draw(x + dxx(bv), y, char_type('.')); } - ScriptChanger dummy(pi.base); + Changer dummy = pi.base.changeScript(); if (hasUp()) up().draw(pi, x + dx1(bv), y - dy1(bv)); if (hasDown()) down().draw(pi, x + dx0(bv), y + dy0(bv)); - drawMarkers(pi, x, y); } @@ -595,21 +613,18 @@ void InsetMathScript::mathematica(MathematicaStream & os) const } -// FIXME XHTML -// It may be worth trying to output munder, mover, and munderover -// in certain cases, e.g., for display formulas. But then we would -// need to know if we're in a display formula. void InsetMathScript::mathmlize(MathStream & os) const { bool d = hasDown() && !down().empty(); bool u = hasUp() && !up().empty(); + bool l = hasLimits(); if (u && d) - os << MTag("msubsup"); + os << MTag(l ? "munderover" : "msubsup"); else if (u) - os << MTag("msup"); + os << MTag(l ? "mover" : "msup"); else if (d) - os << MTag("msub"); + os << MTag(l ? "munder" : "msub"); if (!nuc().empty()) os << MTag("mrow") << nuc() << ETag("mrow"); @@ -619,11 +634,11 @@ void InsetMathScript::mathmlize(MathStream & os) const if (u && d) os << MTag("mrow") << down() << ETag("mrow") << MTag("mrow") << up() << ETag("mrow") - << ETag("msubsup"); + << ETag(l ? "munderover" : "msubsup"); else if (u) - os << MTag("mrow") << up() << ETag("mrow") << ETag("msup"); + os << MTag("mrow") << up() << ETag("mrow") << ETag(l ? "mover" : "msup"); else if (d) - os << MTag("mrow") << down() << ETag("mrow") << ETag("msub"); + os << MTag("mrow") << down() << ETag("mrow") << ETag(l ? "munder" : "msub"); }