X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FInsetMathSymbol.cpp;h=1999846729868998005b1f628e392481e63257d1;hb=6de3c19fd63f810eed90ef3bc4469faf28e949c2;hp=93f9f5e828a25ce8d8cebba1c0c98788542995e9;hpb=bd3e07179ffa4011ce3afe4d1d5583028c734751;p=lyx.git diff --git a/src/mathed/InsetMathSymbol.cpp b/src/mathed/InsetMathSymbol.cpp index 93f9f5e828..1999846729 100644 --- a/src/mathed/InsetMathSymbol.cpp +++ b/src/mathed/InsetMathSymbol.cpp @@ -3,7 +3,7 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author André Pönitz + * \author André Pönitz * * Full author contact details are available in file CREDITS. */ @@ -11,24 +11,22 @@ #include #include "InsetMathSymbol.h" + #include "Dimension.h" -#include "MathStream.h" +#include "LaTeXFeatures.h" +#include "MathAtom.h" +#include "MathParser.h" #include "MathStream.h" #include "MathSupport.h" -#include "MathParser.h" -#include "MathAtom.h" -#include "LaTeXFeatures.h" - -#include "debug.h" -#include "LyXRC.h" +#include "support/debug.h" +#include "support/docstream.h" #include "support/textutils.h" -namespace lyx { +#include -using std::string; -using std::auto_ptr; +namespace lyx { InsetMathSymbol::InsetMathSymbol(latexkeys const * l) : sym_(l), h_(0), scriptable_(false) @@ -45,9 +43,9 @@ InsetMathSymbol::InsetMathSymbol(docstring const & name) {} -auto_ptr InsetMathSymbol::doClone() const +Inset * InsetMathSymbol::clone() const { - return auto_ptr(new InsetMathSymbol(*this)); + return new InsetMathSymbol(*this); } @@ -57,15 +55,19 @@ docstring InsetMathSymbol::name() const } -bool InsetMathSymbol::metrics(MetricsInfo & mi, Dimension & dim) const +void InsetMathSymbol::metrics(MetricsInfo & mi, Dimension & dim) const { //lyxerr << "metrics: symbol: '" << sym_->name // << "' in font: '" << sym_->inset // << "' drawn as: '" << sym_->draw - // << "'" << std::endl; + // << "'" << endl; + bool const italic_upcase_greek = sym_->inset == "cmr" && + sym_->extra == "mathalpha" && + mi.base.fontname == "mathit"; + docstring const font = italic_upcase_greek ? from_ascii("cmm") : sym_->inset; int const em = mathed_char_width(mi.base.font, 'M'); - FontSetChanger dummy(mi.base, sym_->inset); + FontSetChanger dummy(mi.base, 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); @@ -86,12 +88,6 @@ bool InsetMathSymbol::metrics(MetricsInfo & mi, Dimension & dim) const if (sym_->inset == "cmex" || sym_->inset == "esint" || sym_->extra == "funclim") scriptable_ = true; - - if (dim_ == dim) - return false; - - dim_ = dim; - return true; } @@ -100,18 +96,29 @@ void InsetMathSymbol::draw(PainterInfo & pi, int x, int y) const //lyxerr << "metrics: symbol: '" << sym_->name // << "' in font: '" << sym_->inset // << "' drawn as: '" << sym_->draw - // << "'" << std::endl; + // << "'" << endl; + + bool const italic_upcase_greek = sym_->inset == "cmr" && + sym_->extra == "mathalpha" && + pi.base.fontname == "mathit"; + docstring const font = italic_upcase_greek ? from_ascii("cmm") : sym_->inset; 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()); + FontSetChanger dummy(pi.base, font); pi.draw(x, y - h_, sym_->draw); } +InsetMath::mode_type InsetMathSymbol::currentMode() const +{ + return sym_->extra == "textmode" ? TEXT_MODE : MATH_MODE; +} + + bool InsetMathSymbol::isRelOp() const { return sym_->extra == "mathrel"; @@ -140,13 +147,6 @@ bool InsetMathSymbol::takesLimits() const } -void InsetMathSymbol::validate(LaTeXFeatures & features) const -{ - if (!sym_->requires.empty()) - features.require(to_utf8(sym_->requires)); -} - - void InsetMathSymbol::normalize(NormalStream & os) const { os << "[symbol " << name() << ']'; @@ -185,19 +185,23 @@ void InsetMathSymbol::mathematica(MathematicaStream & os) const } +// FIXME This will likely need some work. char const * MathMLtype(docstring const & s) { - if (s == "mathop") - return "mo"; - return "mi"; + if (s == "mathord") + return "mi"; + return "mo"; } void InsetMathSymbol::mathmlize(MathStream & os) const { + // FIXME We may need to do more interesting things + // with MathMLtype. char const * type = MathMLtype(sym_->extra); os << '<' << type << "> "; - if (sym_->xmlname == "x") // unknown so far + if (sym_->xmlname == "x") + // unknown so far os << name(); else os << sym_->xmlname; @@ -205,6 +209,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 = MathMLtype(sym_->extra); + 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") @@ -216,6 +243,9 @@ void InsetMathSymbol::octave(OctaveStream & os) const void InsetMathSymbol::write(WriteStream & os) const { + boost::scoped_ptr ensurer; + if (currentMode() != TEXT_MODE) + ensurer.reset(new MathEnsurer(os)); os << '\\' << name(); // $,#, etc. In theory the restriction based on catcodes, but then @@ -230,8 +260,26 @@ void InsetMathSymbol::write(WriteStream & os) const void InsetMathSymbol::infoize2(odocstream & os) const { - os << "Symbol: " << name(); + os << from_ascii("Symbol: ") << name(); } +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(to_utf8(sym_->requires)); + } +} + } // namespace lyx