#include "InsetMathFont.h"
#include "InsetMathSymbol.h"
+#include "Length.h"
#include "MathData.h"
+#include "MathFactory.h"
#include "MathParser.h"
#include "MathStream.h"
+#include "LaTeXFeatures.h"
#include "MetricsInfo.h"
#include "frontends/FontLoader.h"
}
-} // namespace anon
+} // namespace
int mathed_font_em(FontInfo const & font)
* punctuation, and is put around inner objects, except where these
* are followed by a close or preceded by an open symbol, and except
* if the other object is a large operator or a binary relation.
+ *
+ * See the file MathClass.cpp for a formal implementation of the rules
+ * above.
*/
-int mathed_thinmuskip(FontInfo font)
+int mathed_mu(FontInfo const & font, double mu)
{
- font.setFamily(SYMBOL_FAMILY);
- return support::iround(3.0 / 18 * theFontMetrics(font).em());
+ MetricsBase mb(nullptr, font);
+ return Length(mu, Length::MU).inPixels(mb);
}
-
-int mathed_medmuskip(FontInfo font)
-{
- font.setFamily(SYMBOL_FAMILY);
- return support::iround(4.0 / 18 * theFontMetrics(font).em());
-}
-
-
-int mathed_thickmuskip(FontInfo font)
-{
- font.setFamily(SYMBOL_FAMILY);
- return support::iround(5.0 / 18 * theFontMetrics(font).em());
-}
+int mathed_thinmuskip(FontInfo const & font) { return mathed_mu(font, 3.0); }
+int mathed_medmuskip(FontInfo const & font) { return mathed_mu(font, 4.0); }
+int mathed_thickmuskip(FontInfo const & font) { return mathed_mu(font, 5.0); }
int mathed_char_width(FontInfo const & font, char_type c)
int mathed_char_kerning(FontInfo const & font, char_type c)
{
frontend::FontMetrics const & fm = theFontMetrics(font);
- return fm.rbearing(c) - fm.width(c);
+ return max(0, fm.rbearing(c) - fm.width(c));
}
}
-void mathedSymbolDim(MetricsInfo & mi, Dimension & dim, latexkeys const * sym)
+void mathedSymbolDim(MetricsBase & mb, Dimension & dim, latexkeys const * sym)
{
LASSERT((bool)sym, return);
//lyxerr << "metrics: symbol: '" << sym->name
bool const italic_upcase_greek = sym->inset == "cmr" &&
sym->extra == "mathalpha" &&
- mi.base.fontname == "mathit";
+ mb.fontname == "mathit";
std::string const font = italic_upcase_greek ? "cmm" : sym->inset;
- Changer dummy = mi.base.changeFontSet(font);
- mathed_string_dim(mi.base.font, sym->draw, dim);
- // seperate things a bit
- if (sym->extra == "mathbin")
- dim.wid += 2 * mathed_medmuskip(mi.base.font);
- else if (sym->extra == "mathrel")
- dim.wid += 2 * mathed_thickmuskip(mi.base.font);
- else if (sym->extra == "mathpunct")
- dim.wid += mathed_thinmuskip(mi.base.font);
+ Changer dummy = mb.changeFontSet(font);
+ mathed_string_dim(mb.font, sym->draw, dim);
}
sym->extra == "mathalpha" &&
pi.base.fontname == "mathit";
std::string const font = italic_upcase_greek ? "cmm" : sym->inset;
- if (sym->extra == "mathbin")
- x += mathed_medmuskip(pi.base.font);
- else if (sym->extra == "mathrel")
- x += mathed_thickmuskip(pi.base.font);
Changer dummy = pi.base.changeFontSet(font);
pi.draw(x, y, sym->draw);
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);
}
}
+int axis_height(MetricsBase & mb)
+{
+ Changer dummy = mb.changeFontSet("mathnormal");
+ return theFontMetrics(mb.font).ascent('-') - 1;
+}
+
+
+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;
+ if (!req.empty())
+ features.require(req);
+ }
+}
+
+
} // namespace lyx