]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/MathSupport.cpp
Revert "DocBook: make openParTag/closeTag use paragraphs instead of layouts."
[lyx.git] / src / mathed / MathSupport.cpp
index 1c4f89ca8dc9dcf69695303a1605c068715d8c5a..45ca4296816d4161b34c2284fa595c1073df39b0 100644 (file)
@@ -82,6 +82,7 @@ namespace {
 /*
  * Internal struct of a drawing: code n x1 y1 ... xn yn, where code is:
  * 0 = end, 1 = line, 2 = polyline, 3 = square line, 4 = square polyline
+ * 5 = rounded thick line (i.e. dot for short line)
  */
 
 
@@ -293,9 +294,18 @@ double const hline[] = {
 };
 
 
+double const dot[] = {
+//     1, 0.5, 0.2, 0.5, 0.2,
+//     1, 0.4, 0.4, 0.6, 0.4,
+//     1, 0.5, 0.5, 0.5, 0.5,
+       5, 0.4, 0.4, 0.6, 0.4,
+       0
+};
+
+
 double const ddot[] = {
-       1, 0.2, 0.5, 0.3, 0.5,
-       1, 0.7, 0.5, 0.8, 0.5,
+       5, 0.0, 0.4, 0.3, 0.4,
+       5, 0.6, 0.4, 1.0, 0.4,
        0
 };
 
@@ -333,12 +343,6 @@ double const dline3[] = {
 };
 
 
-double const hlinesmall[] = {
-       1, 0.4, 0.5, 0.6, 0.5,
-       0
-};
-
-
 double const ring[] = {
        2, 5,
        0.5, 0.8,  0.8, 0.5,  0.5, 0.2,  0.2, 0.5,  0.5, 0.8,
@@ -457,7 +461,7 @@ named_deco_struct deco_table[] = {
        {"acute",          slash,      0 },
        {"tilde",          tilde,      0 },
        {"bar",            hline,      0 },
-       {"dot",            hlinesmall, 0 },
+       {"dot",            dot,        0 },
        {"check",          angle,      1 },
        {"breve",          parenth,    1 },
        {"vec",            arrow,      3 },
@@ -495,7 +499,7 @@ public:
        }
 };
 
-static init_deco_table dummy;
+static init_deco_table dummy_deco_table;
 
 
 deco_struct const * search_deco(docstring const & name)
@@ -505,7 +509,7 @@ deco_struct const * search_deco(docstring const & name)
 }
 
 
-} // namespace anon
+} // namespace
 
 
 int mathed_font_em(FontInfo const & font)
@@ -513,6 +517,12 @@ int mathed_font_em(FontInfo const & font)
        return theFontMetrics(font).em();
 }
 
+
+int mathed_font_x_height(FontInfo const & font)
+{
+       return theFontMetrics(font).xHeight();
+}
+
 /* The math units. Quoting TeX by Topic, p.205:
  *
  * Spacing around mathematical objects is measured in mu units. A mu
@@ -539,7 +549,7 @@ int mathed_font_em(FontInfo const & font)
 int mathed_mu(FontInfo const & font, double mu)
 {
        MetricsBase mb(nullptr, font);
-       return Length(mu, Length::MU).inPixels(mb);
+       return mb.inPixels(Length(mu, Length::MU));
 }
 
 int mathed_thinmuskip(FontInfo const & font) { return mathed_mu(font, 3.0); }
@@ -617,7 +627,7 @@ void mathed_draw_deco(PainterInfo & pi, int x, int y, int w, int h,
 
        for (int i = 0; d[i]; ) {
                int code = int(d[i++]);
-               if (code & 1) {  // code == 1 || code == 3
+               if (code & 1) {  // code == 1 || code == 3 || code == 5
                        double xx = d[i++];
                        double yy = d[i++];
                        double x2 = d[i++];
@@ -631,11 +641,21 @@ void mathed_draw_deco(PainterInfo & pi, int x, int y, int w, int h,
                                int(x + xx + 0.5), int(y + yy + 0.5),
                                int(x + x2 + 0.5), int(y + y2 + 0.5),
                                pi.base.font.color());
+                       if (code == 5) {  // thicker, but rounded
+                               pi.pain.line(
+                                       int(x + xx + 0.5+1), int(y + yy + 0.5-1),
+                                       int(x + x2 + 0.5-1), int(y + y2 + 0.5-1),
+                               pi.base.font.color());
+                               pi.pain.line(
+                                       int(x + xx + 0.5+1), int(y + yy + 0.5+1),
+                                       int(x + x2 + 0.5-1), int(y + y2 + 0.5+1),
+                               pi.base.font.color());
+                       }
                } else {
                        int xp[32];
                        int yp[32];
-                       int const n = int(d[i++]);
-                       for (int j = 0; j < n; ++j) {
+                       int const n2 = int(d[i++]);
+                       for (int j = 0; j < n2; ++j) {
                                double xx = d[i++];
                                double yy = d[i++];
 //          lyxerr << ' ' << xx << ' ' << yy << ' ';
@@ -647,15 +667,22 @@ void mathed_draw_deco(PainterInfo & pi, int x, int y, int w, int h,
                                yp[j] = int(y + yy + 0.5);
                                //  lyxerr << "P[" << j ' ' << xx << ' ' << yy << ' ' << x << ' ' << y << ']';
                        }
-                       pi.pain.lines(xp, yp, n, pi.base.font.color());
+                       pi.pain.lines(xp, yp, n2, pi.base.font.color());
                }
        }
 }
 
 
-void mathedSymbolDim(MetricsBase & mb, Dimension & dim, latexkeys const * sym)
+docstring const &  mathedSymbol(MetricsBase & mb, latexkeys const * sym)
 {
-       LASSERT((bool)sym, return);
+       return (mb.font.style() == DISPLAY_STYLE && !sym->dsp_draw.empty()) ?
+               sym->dsp_draw : sym->draw;
+}
+
+
+int mathedSymbolDim(MetricsBase & mb, Dimension & dim, latexkeys const * sym)
+{
+       LASSERT((bool)sym, return 0);
        //lyxerr << "metrics: symbol: '" << sym->name
        //      << "' in font: '" << sym->inset
        //      << "' drawn as: '" << sym->draw
@@ -666,7 +693,8 @@ void mathedSymbolDim(MetricsBase & mb, Dimension & dim, latexkeys const * sym)
                mb.fontname == "mathit";
        std::string const font = italic_upcase_greek ? "cmm" : sym->inset;
        Changer dummy = mb.changeFontSet(font);
-       mathed_string_dim(mb.font, sym->draw, dim);
+       mathed_string_dim(mb.font, mathedSymbol(mb, sym), dim);
+       return mathed_char_kerning(mb.font, mathedSymbol(mb, sym).back());
 }
 
 
@@ -684,7 +712,7 @@ void mathedSymbolDraw(PainterInfo & pi, int x, int y, latexkeys const * sym)
        std::string const font = italic_upcase_greek ? "cmm" : sym->inset;
 
        Changer dummy = pi.base.changeFontSet(font);
-       pi.draw(x, y, sym->draw);
+       pi.draw(x, y, mathedSymbol(pi.base, sym));
 }
 
 
@@ -755,6 +783,8 @@ fontinfo fontinfos[] = {
                          inh_shape, Color_math},
        {"mathbb",        MSB_FAMILY, inh_series,
                          inh_shape, Color_math},
+       {"mathds",        DS_FAMILY, inh_series,
+                         inh_shape, Color_math},
        {"mathtt",        TYPEWRITER_FAMILY, inh_series,
                          inh_shape, Color_math},
        {"mathit",        inh_family, inh_series,
@@ -961,8 +991,13 @@ docstring asString(MathData const & ar)
 
 void asArray(docstring const & str, MathData & ar, Parse::flags pf)
 {
+       // If the QUIET flag is set, we are going to parse for either
+       // a paste operation or a macro definition. We try to do the
+       // right thing in all cases.
+
        bool quiet = pf & Parse::QUIET;
-       if ((str.size() == 1 && quiet) || (!mathed_parse_cell(ar, str, pf) && quiet))
+       bool macro = pf & Parse::MACRODEF;
+       if ((str.size() == 1 && quiet) || (!mathed_parse_cell(ar, str, pf) && quiet && !macro))
                mathed_parse_cell(ar, str, pf | Parse::VERBATIM);
 }
 
@@ -999,7 +1034,7 @@ void validate_math_word(LaTeXFeatures & features, docstring const & word)
        MathWordList const & words = mathedWordList();
        MathWordList::const_iterator it = words.find(word);
        if (it != words.end()) {
-               string const req = it->second.requires;
+               string const req = it->second.required;
                if (!req.empty())
                        features.require(req);
        }