X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FInsetMathSymbol.cpp;h=291dabb3b9d037e85d1ce57b8ea69dfb7295abc6;hb=593bfe248a15be99bfce7e12cde6c59c92951f5f;hp=a04f6e0bcf7bed47bd99dd7593ed81854d00591f;hpb=65a6cc1fc3bc71a53e6f004a9b18e8dd1d32ecf2;p=lyx.git diff --git a/src/mathed/InsetMathSymbol.cpp b/src/mathed/InsetMathSymbol.cpp index a04f6e0bcf..291dabb3b9 100644 --- a/src/mathed/InsetMathSymbol.cpp +++ b/src/mathed/InsetMathSymbol.cpp @@ -12,35 +12,36 @@ #include "InsetMathSymbol.h" -#include "Dimension.h" -#include "LaTeXFeatures.h" #include "MathAtom.h" #include "MathParser.h" #include "MathStream.h" #include "MathSupport.h" +#include "Dimension.h" +#include "LaTeXFeatures.h" +#include "MetricsInfo.h" + #include "support/debug.h" #include "support/docstream.h" #include "support/textutils.h" +#include "support/unique_ptr.h" -#include - +using namespace std; namespace lyx { InsetMathSymbol::InsetMathSymbol(latexkeys const * l) - : sym_(l), h_(0), kerning_(0), scriptable_(false) + : sym_(l) {} InsetMathSymbol::InsetMathSymbol(char const * name) - : sym_(in_word_set(from_ascii(name))), h_(0), - kerning_(0), scriptable_(false) + : sym_(in_word_set(from_ascii(name))) {} InsetMathSymbol::InsetMathSymbol(docstring const & name) - : sym_(in_word_set(name)), h_(0), kerning_(0), scriptable_(false) + : sym_(in_word_set(name)) {} @@ -56,68 +57,43 @@ docstring InsetMathSymbol::name() const } +/// The default limits value +Limits InsetMathSymbol::defaultLimits(bool display) const +{ + if (allowsLimitsChange() && sym_->extra != "func" && display) + return LIMITS; + else + return NO_LIMITS; +} + + void InsetMathSymbol::metrics(MetricsInfo & mi, Dimension & dim) const { - //lyxerr << "metrics: symbol: '" << sym_->name - // << "' in font: '" << sym_->inset - // << "' drawn as: '" << sym_->draw - // << "'" << endl; - - bool const italic_upcase_greek = sym_->inset == "cmr" && - sym_->extra == "mathalpha" && - mi.base.fontname == "mathit"; - std::string const font = italic_upcase_greek ? "cmm" : sym_->inset; - FontSetChanger dummy(mi.base, from_ascii(font)); - mathed_string_dim(mi.base.font, sym_->draw, dim); - docstring::const_reverse_iterator rit = sym_->draw.rbegin(); - kerning_ = mathed_char_kerning(mi.base.font, *rit); - // correct height for broken cmex and wasy font - if (sym_->inset == "cmex" || sym_->inset == "wasy") { - h_ = 4 * dim.des / 5; + // set dim + // FIXME: this should depend on BufferView + // set negative kerning_ so that a subscript is moved leftward + kerning_ = -mathedSymbolDim(mi.base, dim, sym_); + if (sym_->draw != sym_->name) { + // align character vertically + // FIXME: this should depend on BufferView + h_ = 0; + if (mathClass() == MC_OP) { + // center the symbol around the fraction axis + // See rule 13 of Appendix G of the TeXbook. + h_ = axis_height(mi.base) + (dim.des - dim.asc) / 2; + } else if (sym_->inset == "wasy") { + // correct height for broken wasy font + h_ = 4 * dim.des / 5; + } dim.asc += h_; dim.des -= h_; } - // seperate things a bit - if (isMathBin()) - dim.wid += 2 * mathed_medmuskip(mi.base.font); - else if (isMathRel()) - dim.wid += 2 * mathed_thickmuskip(mi.base.font); - else if (isMathPunct()) - dim.wid += mathed_thinmuskip(mi.base.font); - // FIXME: I see no reason for this - //else - // dim.wid += support::iround(0.1667 * em); - - scriptable_ = false; - if (mi.base.style == LM_ST_DISPLAY) - if (sym_->inset == "cmex" || sym_->inset == "esint" || - sym_->extra == "funclim" || - (sym_->inset == "stmry" && sym_->extra == "mathop")) - scriptable_ = true; } void InsetMathSymbol::draw(PainterInfo & pi, int x, int y) const { - //lyxerr << "metrics: symbol: '" << sym_->name - // << "' in font: '" << sym_->inset - // << "' drawn as: '" << sym_->draw - // << "'" << endl; - - bool const italic_upcase_greek = sym_->inset == "cmr" && - sym_->extra == "mathalpha" && - pi.base.fontname == "mathit"; - std::string const font = italic_upcase_greek ? "cmm" : sym_->inset; - if (isMathBin()) - x += mathed_medmuskip(pi.base.font); - else if (isMathRel()) - x += mathed_thickmuskip(pi.base.font); - // FIXME: I see no reason for this - //else - // x += support::iround(0.0833 * em); - - FontSetChanger dummy(pi.base, from_ascii(font)); - pi.draw(x, y - h_, sym_->draw); + mathedSymbolDraw(pi, x, y - h_, sym_); } @@ -127,44 +103,18 @@ InsetMath::mode_type InsetMathSymbol::currentMode() const } -bool InsetMathSymbol::isMathBin() const -{ - return sym_->extra == "mathbin"; -} - - -bool InsetMathSymbol::isMathRel() const -{ - return sym_->extra == "mathrel"; -} - - -bool InsetMathSymbol::isMathPunct() const -{ - return sym_->extra == "mathpunct"; -} - - bool InsetMathSymbol::isOrdAlpha() const { return sym_->extra == "mathord" || sym_->extra == "mathalpha"; } -bool InsetMathSymbol::isScriptable() const +MathClass InsetMathSymbol::mathClass() const { - return scriptable_; -} - - -bool InsetMathSymbol::takesLimits() const -{ - return - sym_->inset == "cmex" || - sym_->inset == "lyxboldsymb" || - sym_->inset == "esint" || - sym_->extra == "funclim" || - (sym_->inset == "stmry" && sym_->extra == "mathop"); + if (sym_->extra == "func" || sym_->extra == "funclim") + return MC_OP; + MathClass const mc = string_to_class(sym_->extra); + return (mc == MC_UNKNOWN) ? MC_ORD : mc; } @@ -206,18 +156,20 @@ void InsetMathSymbol::mathematica(MathematicaStream & os) const } -void InsetMathSymbol::mathmlize(MathStream & os) const +void InsetMathSymbol::mathmlize(MathMLStream & ms) const { // FIXME We may need to do more interesting things // with MathMLtype. - char const * type = sym_->MathMLtype(); - os << '<' << type << "> "; - if (sym_->xmlname == "x") + docstring tag = from_ascii(ms.namespacedTag(sym_->MathMLtype())); + ms << '<' << tag << ">"; + if ((ms.xmlMode() && sym_->xmlname == "x") || (!ms.xmlMode() && sym_->htmlname == "x")) // unknown so far - os << name(); + ms << name(); + else if (ms.xmlMode()) + ms << sym_->xmlname; else - os << sym_->xmlname; - os << " '; + ms << sym_->htmlname; + ms << "'; } @@ -228,13 +180,13 @@ void InsetMathSymbol::htmlize(HtmlStream & os, bool spacing) const char const * type = sym_->MathMLtype(); bool op = (std::string(type) == "mo"); - if (sym_->xmlname == "x") + if (sym_->htmlname == "x") // unknown so far os << ' ' << name() << ' '; else if (op && spacing) - os << ' ' << sym_->xmlname << ' '; + os << ' ' << sym_->htmlname << ' '; else - os << sym_->xmlname; + os << sym_->htmlname; } @@ -253,11 +205,13 @@ void InsetMathSymbol::octave(OctaveStream & os) const } -void InsetMathSymbol::write(WriteStream & os) const +void InsetMathSymbol::write(TeXMathStream & os) const { - boost::scoped_ptr ensurer; + unique_ptr ensurer; if (currentMode() != TEXT_MODE) - ensurer.reset(new MathEnsurer(os)); + ensurer = make_unique(os); + else + ensurer = make_unique(os, false, true, true); os << '\\' << name(); // $,#, etc. In theory the restriction based on catcodes, but then @@ -267,6 +221,7 @@ void InsetMathSymbol::write(WriteStream & os) const return; os.pendingSpace(true); + writeLimits(os); } @@ -289,8 +244,8 @@ void InsetMathSymbol::validate(LaTeXFeatures & features) const "sub.limit{font-size: 75%;}\n" "sup.limit{font-size: 75%;}"); } else { - if (!sym_->requires.empty()) - features.require(sym_->requires); + if (!sym_->required.empty()) + features.require(sym_->required); } }