X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FInsetMathXArrow.cpp;h=d2121d6dfef331cc1ed577e12ffedbab6b16201f;hb=2de30c62f8d671a8c8d4d52a6a7310e2c5ca84de;hp=54d73563817641a4580d5d899dfe06c99bd1c17a;hpb=ab1f7c3fc575989cd0cc3b558729f3c66bb6d9aa;p=lyx.git diff --git a/src/mathed/InsetMathXArrow.cpp b/src/mathed/InsetMathXArrow.cpp index 54d7356381..d2121d6dfe 100644 --- a/src/mathed/InsetMathXArrow.cpp +++ b/src/mathed/InsetMathXArrow.cpp @@ -10,13 +10,20 @@ #include +#include "support/lassert.h" + #include "InsetMathXArrow.h" + #include "MathData.h" #include "MathStream.h" #include "MathStream.h" #include "MathSupport.h" #include "LaTeXFeatures.h" +#include "MetricsInfo.h" + + +#include using namespace std; @@ -36,7 +43,8 @@ Inset * InsetMathXArrow::clone() const void InsetMathXArrow::metrics(MetricsInfo & mi, Dimension & dim) const { - ScriptChanger dummy(mi.base); + Changer dummy2 = mi.base.changeEnsureMath(); + Changer dummy = mi.base.changeScript(); Dimension dim0; cell(0).metrics(mi, dim0); Dimension dim1; @@ -44,17 +52,20 @@ void InsetMathXArrow::metrics(MetricsInfo & mi, Dimension & dim) const dim.wid = max(dim0.width(), dim1.width()) + 10; dim.asc = dim0.height() + 10; dim.des = dim1.height(); - metricsMarkers(dim); + metricsMarkers(mi, dim); } void InsetMathXArrow::draw(PainterInfo & pi, int x, int y) const { - ScriptChanger dummy(pi.base); - cell(0).draw(pi, x + 5, y - 10); - Dimension const & dim1 = cell(1).dimension(*pi.base.bv); - cell(1).draw(pi, x + 5, y + dim1.height()); + Changer dummy2 = pi.base.changeEnsureMath(); + Changer dummy = pi.base.changeScript(); Dimension const dim = dimension(*pi.base.bv); + Dimension const & dim0 = cell(0).dimension(*pi.base.bv); + // center the cells with the decoration + cell(0).draw(pi, x + dim.width()/2 - dim0.width()/2, y - 10); + Dimension const & dim1 = cell(1).dimension(*pi.base.bv); + cell(1).draw(pi, x + dim.width()/2 - dim1.width()/2, y + dim1.height()); mathed_draw_deco(pi, x + 1, y - 7, dim.wid - 2, 5, name_); drawMarkers(pi, x, y); } @@ -64,7 +75,7 @@ void InsetMathXArrow::write(WriteStream & os) const { MathEnsurer ensurer(os); os << '\\' << name_; - if (cell(1).size()) + if (!cell(1).empty()) os << '[' << cell(1) << ']'; os << '{' << cell(0) << '}'; } @@ -78,17 +89,105 @@ void InsetMathXArrow::normalize(NormalStream & os) const void InsetMathXArrow::mathmlize(MathStream & ms) const { - char const * const arrow = name_ == "xleftarrow" - ? "←" : "→"; + char const * arrow; + + if (name_ == "xleftarrow") + arrow = "←"; + else if (name_ == "xrightarrow") + arrow = "→"; + else if (name_ == "xhookleftarrow") + arrow = "↩"; + else if (name_ == "xhookrightarrow") + arrow = "↪"; + else if (name_ == "xLeftarrow") + arrow = "⇐"; + else if (name_ == "xRightarrow") + arrow = "⇒"; + else if (name_ == "xleftrightarrow") + arrow = "↔"; + else if (name_ == "xLeftrightarrow") + arrow = "⇔"; + else if (name_ == "xleftharpoondown") + arrow = "↽"; + else if (name_ == "xleftharpoonup") + arrow = "↼"; + else if (name_ == "xleftrightharpoons") + arrow = "⇋"; + else if (name_ == "xrightharpoondown") + arrow = "⇁"; + else if (name_ == "xrightharpoonup") + arrow = "⇀"; + else if (name_ == "xrightleftharpoons") + arrow = "⇌"; + else if (name_ == "xmapsto") + arrow = "↦"; + else { + lyxerr << "mathmlize conversion for '" << name_ << "' not implemented" << endl; + LASSERT(false, arrow = "→"); + } ms << "" << arrow << cell(1) << cell(0) << ""; } +void InsetMathXArrow::htmlize(HtmlStream & os) const +{ + char const * arrow; + + if (name_ == "xleftarrow") + arrow = "←"; + else if (name_ == "xrightarrow") + arrow = "→"; + else if (name_ == "xhookleftarrow") + arrow = "↩"; + else if (name_ == "xhookrightarrow") + arrow = "↪"; + else if (name_ == "xLeftarrow") + arrow = "⇐"; + else if (name_ == "xRightarrow") + arrow = "⇒"; + else if (name_ == "xleftrightarrow") + arrow = "↔"; + else if (name_ == "xLeftrightarrow") + arrow = "⇔"; + else if (name_ == "xleftharpoondown") + arrow = "↽"; + else if (name_ == "xleftharpoonup") + arrow = "↼"; + else if (name_ == "xleftrightharpoons") + arrow = "⇋"; + else if (name_ == "xrightharpoondown") + arrow = "⇁"; + else if (name_ == "xrightharpoonup") + arrow = "⇀"; + else if (name_ == "xrightleftharpoons") + arrow = "⇌"; + else if (name_ == "xmapsto") + arrow = "↦"; + else { + lyxerr << "htmlize conversion for '" << name_ << "' not implemented" << endl; + LASSERT(false, arrow = "→"); + } + os << MTag("span", "class='xarrow'") + << MTag("span", "class='xatop'") << cell(0) << ETag("span") + << MTag("span", "class='xabottom'") << arrow << ETag("span") + << ETag("span"); +} + + void InsetMathXArrow::validate(LaTeXFeatures & features) const { - features.require("amsmath"); + if (name_ == "xleftarrow" || name_ == "xrightarrow") + features.require("amsmath"); + else + features.require("mathtools"); + if (features.runparams().math_flavor == OutputParams::MathAsHTML) + // CSS adapted from eLyXer + features.addCSSSnippet( + "span.xarrow{display: inline-block; vertical-align: middle; text-align:center;}\n" + "span.xatop{display: block;}\n" + "span.xabottom{display: block;}"); InsetMathNest::validate(features); }