X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FInsetMathSymbol.cpp;h=92d2573560a4ad808141d0d999f7263ac77012ea;hb=6c13af3f298a96c5564684b83c52989473b020ce;hp=8a1ba2fd1b4656d763b9d3b88d8ec95ace61058b;hpb=f1cba8ff64b369792fd49f5ddf90e8126ab476ac;p=lyx.git diff --git a/src/mathed/InsetMathSymbol.cpp b/src/mathed/InsetMathSymbol.cpp index 8a1ba2fd1b..92d2573560 100644 --- a/src/mathed/InsetMathSymbol.cpp +++ b/src/mathed/InsetMathSymbol.cpp @@ -12,32 +12,37 @@ #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/lyxlib.h" #include "support/textutils.h" +#include "support/unique_ptr.h" namespace lyx { InsetMathSymbol::InsetMathSymbol(latexkeys const * l) - : sym_(l), h_(0), scriptable_(false) + : sym_(l), h_(0), kerning_(0), scriptable_(false) {} InsetMathSymbol::InsetMathSymbol(char const * name) - : sym_(in_word_set(from_ascii(name))), h_(0), scriptable_(false) + : sym_(in_word_set(from_ascii(name))), h_(0), + kerning_(0), scriptable_(false) {} InsetMathSymbol::InsetMathSymbol(docstring const & name) - : sym_(in_word_set(name)), h_(0), scriptable_(false) + : sym_(in_word_set(name)), h_(0), kerning_(0), scriptable_(false) {} @@ -55,56 +60,35 @@ docstring InsetMathSymbol::name() const void InsetMathSymbol::metrics(MetricsInfo & mi, Dimension & dim) const { - //lyxerr << "metrics: symbol: '" << sym_->name - // << "' in font: '" << sym_->inset - // << "' drawn as: '" << sym_->draw - // << "'" << endl; - - int const em = mathed_char_width(mi.base.font, 'M'); - FontSetChanger dummy(mi.base, sym_->inset); - 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); + // set dim + mathedSymbolDim(mi.base, dim, sym_); + // set kerning_ + kerning_ = mathed_char_kerning(mi.base.font, *sym_->draw.rbegin()); // correct height for broken cmex and wasy font if (sym_->inset == "cmex" || sym_->inset == "wasy") { h_ = 4 * dim.des / 5; dim.asc += h_; dim.des -= h_; } - // seperate things a bit - if (isRelOp()) - dim.wid += static_cast(0.5 * em + 0.5); - else - dim.wid += static_cast(0.1667 * em + 0.5); - + // set scriptable_ scriptable_ = false; - if (mi.base.style == LM_ST_DISPLAY) + if (mi.base.font.style() == LM_ST_DISPLAY) if (sym_->inset == "cmex" || sym_->inset == "esint" || - sym_->extra == "funclim") + 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; - int const em = mathed_char_width(pi.base.font, 'M'); - if (isRelOp()) - x += static_cast(0.25*em+0.5); - else - x += static_cast(0.0833*em+0.5); - - FontSetChanger dummy(pi.base, sym_->inset.c_str()); - pi.draw(x, y - h_, sym_->draw); + mathedSymbolDraw(pi, x, y - h_, sym_); } -bool InsetMathSymbol::isRelOp() const +InsetMath::mode_type InsetMathSymbol::currentMode() const { - return sym_->extra == "mathrel"; + return sym_->extra == "textmode" ? TEXT_MODE : MATH_MODE; } @@ -114,6 +98,15 @@ bool InsetMathSymbol::isOrdAlpha() const } +MathClass InsetMathSymbol::mathClass() const +{ + 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; +} + + bool InsetMathSymbol::isScriptable() const { return scriptable_; @@ -126,14 +119,8 @@ bool InsetMathSymbol::takesLimits() const sym_->inset == "cmex" || sym_->inset == "lyxboldsymb" || sym_->inset == "esint" || - sym_->extra == "funclim"; -} - - -void InsetMathSymbol::validate(LaTeXFeatures & features) const -{ - if (!sym_->requires.empty()) - features.require(to_utf8(sym_->requires)); + sym_->extra == "funclim" || + (sym_->inset == "stmry" && sym_->extra == "mathop"); } @@ -175,19 +162,14 @@ void InsetMathSymbol::mathematica(MathematicaStream & os) const } -char const * MathMLtype(docstring const & s) -{ - if (s == "mathop") - return "mo"; - return "mi"; -} - - void InsetMathSymbol::mathmlize(MathStream & os) const { - char const * type = MathMLtype(sym_->extra); + // FIXME We may need to do more interesting things + // with MathMLtype. + char const * type = sym_->MathMLtype(); os << '<' << type << "> "; - if (sym_->xmlname == "x") // unknown so far + if (sym_->xmlname == "x") + // unknown so far os << name(); else os << sym_->xmlname; @@ -195,6 +177,29 @@ void InsetMathSymbol::mathmlize(MathStream & os) const } +void InsetMathSymbol::htmlize(HtmlStream & os, bool spacing) const +{ + // FIXME We may need to do more interesting things + // with MathMLtype. + char const * type = sym_->MathMLtype(); + bool op = (std::string(type) == "mo"); + + if (sym_->xmlname == "x") + // unknown so far + os << ' ' << name() << ' '; + else if (op && spacing) + os << ' ' << sym_->xmlname << ' '; + else + os << sym_->xmlname; +} + + +void InsetMathSymbol::htmlize(HtmlStream & os) const +{ + htmlize(os, true); +} + + void InsetMathSymbol::octave(OctaveStream & os) const { if (name() == "cdot") @@ -206,7 +211,11 @@ void InsetMathSymbol::octave(OctaveStream & os) const void InsetMathSymbol::write(WriteStream & os) const { - MathEnsurer ensurer(os); + unique_ptr ensurer; + if (currentMode() != TEXT_MODE) + ensurer = make_unique(os); + else + ensurer = make_unique(os, false, true, true); os << '\\' << name(); // $,#, etc. In theory the restriction based on catcodes, but then @@ -225,4 +234,22 @@ void InsetMathSymbol::infoize2(odocstream & os) const } +void InsetMathSymbol::validate(LaTeXFeatures & features) const +{ + // this is not really the ideal place to do this, but we can't + // validate in InsetMathExInt. + if (features.runparams().math_flavor == OutputParams::MathAsHTML + && sym_->name == from_ascii("int")) { + features.addCSSSnippet( + "span.limits{display: inline-block; vertical-align: middle; text-align:center; font-size: 75%;}\n" + "span.limits span{display: block;}\n" + "span.intsym{font-size: 150%;}\n" + "sub.limit{font-size: 75%;}\n" + "sup.limit{font-size: 75%;}"); + } else { + if (!sym_->requires.empty()) + features.require(sym_->requires); + } +} + } // namespace lyx