/* Copyright (c) 2008-2022 Jan W. Krieger () This software is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation, either version 2.1 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License (LGPL) for more details. You should have received a copy of the GNU Lesser General Public License (LGPL) along with this program. If not, see . */ #include "jkqtmathtext/nodes/jkqtmathtextsymbolnode.h" #include "jkqtmathtext/jkqtmathtexttools.h" #include "jkqtmathtext/jkqtmathtext.h" #include "jkqtcommon/jkqtpcodestructuring.h" #include "jkqtcommon/jkqtpstringtools.h" #include #include #include #include #include #include #include JKQTMathTextSymbolNode::JKQTMathTextSymbolNode(JKQTMathText* _parent, const QString& name, bool _addWhitespace): JKQTMathTextNode(_parent), symbolName(name), addWhitespace(_addWhitespace) { fillSymbolTables(); } JKQTMathTextSymbolNode::~JKQTMathTextSymbolNode() { } QString JKQTMathTextSymbolNode::getTypeName() const { return QLatin1String("JKQTMathTextSymbolNode(")+symbolName+QLatin1String(")"); } void JKQTMathTextSymbolNode::getSizeInternal(QPainter& painter, JKQTMathTextEnvironment currentEv, double& width, double& baselineHeight, double& overallHeight, double& strikeoutPos, const JKQTMathTextNodeSize* prevNodeSize) { double dummy1, dummy2; getSymbolSizeInternal(painter, currentEv, width, baselineHeight, overallHeight, strikeoutPos, dummy1, dummy2, prevNodeSize); } void JKQTMathTextSymbolNode::getSymbolSizeInternal(QPainter &painter, JKQTMathTextEnvironment currentEv, double &width, double &baselineHeight, double &overallHeight, double &strikeoutPos, double &subSuperXCorrection, double &subBesidesXCorrection, const JKQTMathTextNodeSize *prevNodeSize) { const auto fullProps=symbols.value(symbolName, SymbolFullProps()); const GlobalSymbolFlags globalFlags=fullProps.globalFlags; const auto drawProps=fullProps.getDrawingData(currentEv, parentMathText); const QFont f=drawProps.first; const QFontMetricsF fm(f); const JKQTMathTextSymbolNode::SymbolProps symprops=drawProps.second; const SymbolFlags symflags=symprops.flags; const QString sym=symprops.symbol; const QRectF tbr=getTightBoundingRect(fm, sym, globalFlags); const QRectF br=getBoundingRect(fm, sym, globalFlags); const QRectF tbrNoSymbol=JKQTMathTextGetTightBoundingRect(f, "X", painter.device()); const QRectF mintbr=JKQTMathTextGetTightBoundingRect(f, "(", painter.device()); const double yShift=symprops.yShiftFactor*tbr.height(); if (currentEv.insideMath) { width=qMax(br.width(), mintbr.width()); if (has(globalFlags, ExtendWidthInMathmode)) { if (!symprops.getSymbolSingleChar().isNull()) width=width*parentMathText->getMathoperatorWidthFactor(); else width=width+mintbr.width(); } } else { width=br.width(); } if (!sym.isEmpty()) { overallHeight=tbr.height(); baselineHeight=tbr.height()-tbr.bottom(); } else { overallHeight=tbrNoSymbol.height(); baselineHeight=tbrNoSymbol.height()-tbrNoSymbol.bottom(); } const double oldDescent=overallHeight-baselineHeight; if (has(symflags, HeightIsAscent)) { baselineHeight=fm.ascent(); overallHeight=baselineHeight+oldDescent; } strikeoutPos=fm.strikeOutPos(); if (has(globalFlags, IntLikeSymbolCorrection)) { subSuperXCorrection=parentMathText->getIntSubSuperXCorrectionFactor()*tbr.width(); subBesidesXCorrection=parentMathText->getIntSubBesidesXCorrectionXFactor()*JKQTMathTextGetTightBoundingRect(f, "X", painter.device()).width(); } } QRectF JKQTMathTextSymbolNode::getBoundingRect(const QFontMetricsF &fm, const QString &text, GlobalSymbolFlags globalFlags) { if (has(globalFlags, MakeWhitespaceHalf) && text.contains(' ')) { const QStringList str=text.simplified().trimmed().split(' '); const QRectF brSp=fm.boundingRect("i"); QRectF br; for (int i=0; ibr.top()) { br.setTop(lbr.top()); } if (lbr.bottom()br.top()) { br.setTop(lbr.top()); } if (lbr.bottom()symbolName; } bool JKQTMathTextSymbolNode::getAddWhitespace() const { return addWhitespace; } void JKQTMathTextSymbolNode::getSymbolSize(QPainter &painter, JKQTMathTextEnvironment currentEv, double &width, double &baselineHeight, double &overallHeight, double &strikeoutPos, double &subSuperXCorrection, double &subBesidesXCorrection, const JKQTMathTextNodeSize *prevNodeSize) { double w=width, b=baselineHeight, o=overallHeight, s=strikeoutPos; getSymbolSizeInternal(painter, currentEv, w, b, o, s, subSuperXCorrection, subBesidesXCorrection, prevNodeSize); if (w<1e5) width=w; if (b<1e5) baselineHeight=b; if (o<1e5) overallHeight=o; if (s<1e5) strikeoutPos=s; } bool JKQTMathTextSymbolNode::hasSymbol(const QString &symbolName) { fillSymbolTables(); return symbols.contains(symbolName); } JKQTMathTextSymbolNode::SymbolProps::SymbolProps(): SymbolProps(QString()) { } JKQTMathTextSymbolNode::SymbolProps::SymbolProps(const QString &_symbol, SymbolFlags _flags, double _fontScalingFactor, double _yShiftFactor): symbol(_symbol), flags(_flags), fontScalingFactor(_fontScalingFactor), yShiftFactor(_yShiftFactor) { } JKQTMathTextSymbolNode::SymbolFullProps JKQTMathTextSymbolNode::MathOperatorSymbol(const QString &op) { return MathOperatorSymbol(op, op); } JKQTMathTextSymbolNode::SymbolFullProps JKQTMathTextSymbolNode::MathOperatorSymbol(const QString &op, const QString &ophtml) { return SymbolFullProps(SymbolProps(op, ItalicOff|BoldOff, 1.0, 0.0)).setGlobalFlags(ExtendWidthInMathmode).addHtml(ophtml, ItalicOff|BoldOff, 1.0, 0.0); } JKQTMathTextSymbolNode::SymbolFullProps JKQTMathTextSymbolNode::MathOperatorText(const QString &op) { return MathOperatorText(op, op); } JKQTMathTextSymbolNode::SymbolFullProps JKQTMathTextSymbolNode::MathOperatorText(const QString &op, const QString &ophtml) { return SymbolFullProps(SymbolProps(op, ItalicOff|BoldOff|HeightIsAscent, 1.0, 0.0)).setGlobalFlags(ExtendWidthInMathmode|MakeWhitespaceHalf).addHtml(ophtml, ItalicOff|BoldOff|HeightIsAscent, 1.0, 0.0); } JKQTMathTextSymbolNode::SymbolFullProps JKQTMathTextSymbolNode::MathOperatorSymbolUnicode(const QString &unicode) { return SymbolFullProps(MTFEUnicode, SymbolProps(unicode, ItalicOff|BoldOff, 1.0, 0.0)).setGlobalFlags(ExtendWidthInMathmode|MakeWhitespaceHalf); } JKQTMathTextSymbolNode::SymbolFullProps JKQTMathTextSymbolNode::GreekLetter_WinSymbol_Unicode_Html(const QString &letterWinSymbol, const QString &letterUnicode, const QString &html) { return SymbolFullProps(MTEFallbackGreek, MTFEUnicode, SymbolProps(letterUnicode), MTFEWinSymbol, SymbolProps(letterWinSymbol), html); } JKQTMathTextSymbolNode::SymbolFullProps JKQTMathTextSymbolNode::SymbolStd(const QString &symbol, const QString &html) { return SymbolFullProps(MTFEStandard, SymbolProps(symbol), html); } JKQTMathTextSymbolNode::SymbolFullProps JKQTMathTextSymbolNode::SymbolUnicode(const QString &symbol, const QString &html) { return SymbolFullProps(MTFEUnicode, SymbolProps(symbol), html); } JKQTMathTextSymbolNode::SymbolFullProps JKQTMathTextSymbolNode::UprightSymbolStd(const QString &symbol, const QString &html) { return SymbolFullProps(MTFEStandard, SymbolProps(symbol, ItalicOff), html, ItalicOff); } JKQTMathTextSymbolNode::SymbolFullProps JKQTMathTextSymbolNode::UprightSymbolUnicode(const QString &symbol, const QString &html) { return SymbolFullProps(MTFEUnicode, SymbolProps(symbol, ItalicOff), html, ItalicOff); } JKQTMathTextSymbolNode::SymbolFullProps JKQTMathTextSymbolNode::SimpleTextSymbol(const QString &symbol, const QString &html) { return SymbolFullProps(MTFEStandard, SymbolProps(symbol), html); } JKQTMathTextSymbolNode::SymbolFullProps JKQTMathTextSymbolNode::SimpleTextSymbol(const QString &symbol) { return SymbolFullProps(MTFEStandard, SymbolProps(symbol), symbol); } JKQTMathTextSymbolNode::SymbolFullProps JKQTMathTextSymbolNode::SimpleUprightTextSymbol(const QString &symbol, const QString &html) { return SymbolFullProps(MTFEStandard, SymbolProps(symbol, ItalicOff), html, ItalicOff); } JKQTMathTextSymbolNode::SymbolFullProps JKQTMathTextSymbolNode::SimpleUprightTextSymbol(const QString &symbol) { return SymbolFullProps(MTFEStandard, SymbolProps(symbol, ItalicOff), symbol, ItalicOff); } QHash JKQTMathTextSymbolNode::symbols=QHash(); void JKQTMathTextSymbolNode::fillSymbolTables() { if (symbols.size()>0) return; // tables have already been filled! So nothing to do here /************************************************************************************** * STANDARD Symbols available in all standard fonts **************************************************************************************/ symbols[" "]=SimpleTextSymbol(" ", " "); symbols[""]=SimpleTextSymbol(" ", " "); symbols["#"]=SimpleTextSymbol("#", "#"); symbols["%"]=SimpleTextSymbol("%", "≫"); symbols["&"]=SimpleTextSymbol("&", "&"); symbols["("]=SimpleUprightTextSymbol("("); symbols[")"]=SimpleUprightTextSymbol(")"); symbols["["]=SimpleUprightTextSymbol("["); symbols["]"]=SimpleUprightTextSymbol("]"); symbols["_"]=SimpleTextSymbol("_"); symbols["{"]=SimpleUprightTextSymbol("{"); symbols["|"]=SimpleUprightTextSymbol("||", "‖").addUprightUnicode(QChar(0x2016)); symbols["}"]=SimpleUprightTextSymbol("}"); symbols["AC"]=UprightSymbolUnicode(QChar(0x223F)).addUprightHtml("∿").addUprightStd("~"); symbols["Angstrom"]= symbols["Angstroem"]=UprightSymbolUnicode(QChar(0x212B)).addUprightStd(QChar(0xC5)); symbols["Beth"]=symbols["Bet"]=symbols["beth"]=symbols["bet"]=SymbolUnicode(QChar(0x2136)).addHtml("ℶ"); symbols["Box"]=UprightSymbolUnicode(QChar(0x25A1)); symbols["DC"]=SymbolUnicode(QChar(0x2393)).addWinSymbol(QChar(0xBB)).addStd("="); symbols["EUR"]=SymbolUnicode(QChar(0x20AC)); symbols["Im"]=UprightSymbolUnicode(QChar(0x2111)).addHtml("ℑ").addWinSymbol(QChar(0xC1)); symbols["No"]=SymbolUnicode(QChar(0x2116)); symbols["Ohm"]=symbols["ohm"]=UprightSymbolUnicode(QChar(0x2126)).addUprightWinSymbol("W").addUprightHtml("Ω"); symbols["P"]=SimpleTextSymbol(QChar(0xB6)).addHtml("¶"); symbols["Re"]=SymbolUnicode(QChar(0x211C)).addHtml("ℜ").addWinSymbol(QChar(0xC2)); symbols["S"]=symbols["§"]=SimpleTextSymbol(QChar(0xA7)).addHtml("§"); symbols["accurrent"]=SymbolUnicode(QChar(0x23E6)); symbols["alef"]=symbols["aleph"]=symbols["Aleph"]=symbols["Alef"]=SymbolUnicode(QChar(0x2135)).addHtml("ℵ").addWinSymbol(QChar(0xC0)); symbols["angle"]=UprightSymbolUnicode(QChar(0x2220)).addHtml("∠").addWinSymbol(QChar(0xD0)); symbols["backslash"]=SimpleTextSymbol("\\"); symbols["benzene"]=UprightSymbolUnicode(QChar(0x232C)); symbols["benzenr"]=UprightSymbolUnicode(QChar(0x23E3)); symbols["blacksquare"]=UprightSymbolUnicode(QChar(0x220E)).addHtml("□"); symbols["blcorner"]=symbols["llcorner"]=UprightSymbolUnicode(QChar(0x231E)); symbols["brcorner"]=symbols["lrcorner"]=UprightSymbolUnicode(QChar(0x231F)); symbols["bullet"]=UprightSymbolUnicode(QChar(0x2022)).addUprightHtml("•").addUprightWinSymbol(QChar(0xB7)); symbols["cdots"]=SymbolUnicode(QChar(0x22EF)).addHtml("···").addStd(QString(3, QChar(0xB7))); symbols["celsius"]=symbols["degC"]=SymbolUnicode(QChar(0x2103)).addUprightStd("°C").addUprightHtml("°C"); symbols["cent"]=SimpleTextSymbol(QChar(0xA2), "¢"); symbols["circ"]=UprightSymbolStd(QChar(0x2218)); symbols["co"]=UprightSymbolUnicode(QChar(0x2105)); symbols["copyright"]=symbols["textcopyright"]=SimpleTextSymbol(QChar(0xA5), "©"); symbols["dalet"]=symbols["Dalet"]=symbols["daleth"]=symbols["Daleth"]=SymbolUnicode(QChar(0x2138)).addHtml("ℸ"); symbols["dd"] = SymbolFullProps(SymbolProps("d", Upright|BoldOff), "d", Upright|BoldOff); symbols["diamond"]=UprightSymbolUnicode(QChar(0x22C4)).addHtml("⋄").addWinSymbol(QChar(0xE0)); symbols["dollar"]=SymbolUnicode(QChar(0x0024)); symbols["dollar"]=symbols["$"]=SimpleTextSymbol(QChar(0x24), "$"); symbols["dprime"]=SymbolUnicode(QChar(0x2033)).addHtml("″").addStd("''"); symbols["ellipsis"]=symbols["dots"]=symbols["ldots"]=SymbolUnicode(QChar(0x2026)).addHtml("…").addWinSymbol(QChar(0xBC)).addStd("..."); symbols["euro"]=symbols["EUR"]=SimpleTextSymbol(QChar(0x20AC), "€"); symbols["fahrenheit"]=symbols["degF"]=SymbolUnicode(QChar(0x2109)); symbols["female"]=SymbolUnicode(QChar(0x2640)).addHtml("♀"); symbols["flq"]=SymbolUnicode(QChar(0x2039)).addHtml("‹").addStd("<"); symbols["flqq"]=SymbolUnicode(QChar(0x00AB)).addHtml("«").addStd(QChar(0xAB)); symbols["frown"]=SymbolUnicode(QChar(0x2322)).addHtml("⌢"); symbols["frq"]=SymbolUnicode(QChar(0x203A)).addHtml("›").addStd(">"); symbols["frqq"]=SymbolUnicode(QChar(0x00BB)).addHtml("»").addStd(QChar(0xBB)); symbols["gimel"]=symbols["Gimel"]=SymbolUnicode(QChar(0x2137)).addHtml("ℷ"); symbols["glq"]=SymbolUnicode(QChar(0x2018)).addHtml("‘").addStd("'"); symbols["glqq"]=SymbolUnicode(QChar(0x201C)).addHtml("“").addStd("\""); symbols["grq"]=SymbolUnicode(QChar(0x2019)).addHtml("’").addStd("'"); symbols["grqq"]=SymbolUnicode(QChar(0x201D)).addHtml("”").addStd("\""); symbols["hbar"]=SymbolUnicode(QChar(0x210F)).addHtml("ℏ").addStd("h", DrawBar); symbols["hexagon"]=UprightSymbolUnicode(QChar(0x2394)); symbols["ii"] = SymbolFullProps(SymbolProps("i", Upright|BoldOff), "i", Upright|BoldOff); symbols["infty"]=SymbolUnicode(QChar(0x221E)).addHtml("∞").addWinSymbol(QChar(0xA5)).addStd("8", Rotate90); symbols["langle"]=UprightSymbolUnicode(QChar(0x2329)).addWinSymbol(QChar(0xE1)); symbols["lceil"]=UprightSymbolUnicode(QChar(0x2308)).addHtml("⌈").addWinSymbol(QChar(0xE9)); symbols["ldots"]=symbols["dots"]=SimpleTextSymbol("..."); symbols["lfloor"]=UprightSymbolUnicode(QChar(0x230A)).addHtml("⌊").addWinSymbol(QChar(0xEB)); symbols["lightning"]=SymbolUnicode(QChar(0x21AF)); symbols["male"]=SymbolUnicode(QChar(0x2642)).addHtml("♂"); symbols["measuredangle"]=UprightSymbolUnicode(QChar(0x2221)).addHtml("∡"); symbols["micro"] = SimpleTextSymbol(QChar(0xB5), "µ"); symbols["ohm"]=SymbolUnicode(QChar(0x2126)); symbols["partial"]=UprightSymbolUnicode(QChar(0x2202)).addHtml("∂").addWinSymbol(QChar(0xB6)); symbols["perthousand"]=symbols["permil"]=SymbolUnicode(QChar(0x2030)).addHtml("‰"); symbols["pound"]=SimpleTextSymbol(QChar(0xA3), "£"); symbols["pound"]=SymbolUnicode(QChar(0x00A3)); symbols["prime"]=SymbolUnicode(QChar(0x2032)).addHtml("′").addStd("'"); symbols["rangle"]=UprightSymbolUnicode(QChar(0x232A)).addWinSymbol(QChar(0xF1)); symbols["rceil"]=UprightSymbolUnicode(QChar(0x2309)).addHtml("⌉").addWinSymbol(QChar(0xF9)); symbols["registered"]=symbols["textregistered"]=symbols["circledR"]=SimpleTextSymbol(QChar(0xAA), "®"); symbols["rfloor"]=UprightSymbolUnicode(QChar(0x230B)).addHtml("⌋").addWinSymbol(QChar(0xFB)); symbols["rightangle"]=UprightSymbolUnicode(QChar(0x221F)).addHtml("∟"); symbols["smile"]=UprightSymbolUnicode(QChar(0x2323)).addHtml("⌣"); symbols["sphericalangle"]=UprightSymbolUnicode(QChar(0x2222)).addHtml("∢"); symbols["star"]=UprightSymbolUnicode(QChar(0x22C6)); symbols["tcohm"]=SymbolUnicode(QChar(0x2126)); symbols["textbar"]=SimpleTextSymbol("|", "|"); symbols["textdegree"]=symbols["degree"] = SimpleTextSymbol(QChar(0xB0), "°"); symbols["textgreater"]=SimpleTextSymbol(">", ">"); symbols["textless"]=SimpleTextSymbol("<", "<"); symbols["tlcorner"]=symbols["ulcorner"]=SymbolUnicode(QChar(0x231C)); symbols["trademark"]=SymbolUnicode(QChar(0x2122)).addHtml("™").addWinSymbol(QChar(0xD4)).addStd("(TM)"); symbols["trapezium"]=SymbolUnicode(QChar(0x23E2)).addHtml("⏢"); symbols["trcorner"]=symbols["urcorner"]=UprightSymbolUnicode(QChar(0x231D)); symbols["trprime"]=SymbolUnicode(QChar(0x2034)).addHtml("‴").addStd("'''"); symbols["varcarriagereturn"]=SymbolUnicode(QChar(0x23CE)).addWinSymbol(QChar(0xBF)); symbols["varhexagonlrbonds"]=SymbolUnicode(QChar(0x232C)); symbols["yen"]=SimpleTextSymbol(QChar(0xA5), "¥"); symbols["yen"]=SymbolUnicode(QChar(0x00A5)); /************************************************************************************** * STANDARD MathOperator Strings **************************************************************************************/ symbols["Pr"] = MathOperatorText("Pr"); symbols["acos"] = MathOperatorText("acos"); symbols["arccos"] = MathOperatorText("arccos"); symbols["arcsin"] = MathOperatorText("arcsin"); symbols["arctan"] = MathOperatorText("arctan"); symbols["arg"] = MathOperatorText("arg"); symbols["argmax"] = MathOperatorText("arg max", "arg max"); symbols["argmin"] = MathOperatorText("arg min", "arg min"); symbols["asin"] = MathOperatorText("asin"); symbols["atan"] = MathOperatorText("atan"); symbols["cos"] = MathOperatorText("cos"); symbols["cosh"] = MathOperatorText("cosh"); symbols["cot"] = MathOperatorText("cot"); symbols["coth"] = MathOperatorText("coth"); symbols["coth"] = MathOperatorText("coth"); symbols["deg"] = MathOperatorText("deg"); symbols["det"] = MathOperatorText("det"); symbols["dim"] = MathOperatorText("dim"); symbols["exp"] = MathOperatorText("exp"); symbols["gcd"] = MathOperatorText("gcd"); symbols["hom"] = MathOperatorText("hom"); symbols["ker"] = MathOperatorText("ker"); symbols["lb"] = MathOperatorText("lb"); symbols["ld"] = MathOperatorText("ld"); symbols["lim"] = MathOperatorText("lim"); symbols["liminf"] = MathOperatorText("lim inf", "lim inf"); symbols["limsup"] = MathOperatorText("lim sup", "lim sup"); symbols["ln"] = MathOperatorText("ln"); symbols["log"] = MathOperatorText("log"); symbols["max"] = MathOperatorText("max"); symbols["median"] = MathOperatorText("median"); symbols["min"] = MathOperatorText("min"); symbols["mod"] = MathOperatorText("mod"); symbols["sec"] = MathOperatorText("sec"); symbols["sgn"] = MathOperatorText("sgn"); symbols["sign"] = MathOperatorText("sign"); symbols["sin"] = MathOperatorText("sin"); symbols["sinh"] = MathOperatorText("sinh"); symbols["tan"] = MathOperatorText("tan"); symbols["tanh"] = MathOperatorText("tanh"); /************************************************************************************** * STANDARD MathOperator Symbols **************************************************************************************/ symbols["*"]=symbols["ast"]=symbols["asterisk"]=MathOperatorSymbolUnicode(QChar(0x2217)).addMathOperatorStd("*").addMathOperatorHtml("*"); symbols["+"]=MathOperatorSymbolUnicode(QChar(0x2B)).addMathOperatorHtml("+").addMathOperatorStd("+"); symbols["-"]=MathOperatorSymbolUnicode(QChar(0x2212)).addMathOperatorHtml("-").addMathOperatorStd("-"); symbols["<"]=MathOperatorSymbol("<", "<"); symbols["="] = MathOperatorSymbol("="); symbols[">"]=MathOperatorSymbol(">", ">"); symbols["Downarrow"]=UprightSymbolUnicode(QChar(0x21D3)).addUprightHtml("⇓").addUprightWinSymbol(QChar(0xDF)); symbols["Leftarrow"]=UprightSymbolUnicode(QChar(0x21D0)).addUprightHtml("⇐").addUprightWinSymbol(QChar(0xDC)); symbols["Rightarrow"]=UprightSymbolUnicode(QChar(0x21D2)).addUprightHtml("⇒").addUprightWinSymbol(QChar(0xDE)); symbols["Uparrow"]=UprightSymbolUnicode(QChar(0x21D1)).addUprightHtml("⇑").addUprightWinSymbol(QChar(0xDD)); symbols["Updownarrow"]=UprightSymbolUnicode(QChar(0x21D5)).addUprightHtml("⇕"); symbols["approx"]=MathOperatorSymbolUnicode(QChar(0x2248)).addMathOperatorHtml("≈").addMathOperatorWinSymbol(QChar(0xBB)); symbols["bbC"]=SymbolUnicode(QChar(0x2102)); symbols["bbH"]=MathOperatorSymbolUnicode(QChar(0x210D)); symbols["bbN"]=MathOperatorSymbolUnicode(QChar(0x2115)); symbols["bbP"]=MathOperatorSymbolUnicode(QChar(0x2119)); symbols["bbQ"]=MathOperatorSymbolUnicode(QChar(0x211A)); symbols["bbR"]=MathOperatorSymbolUnicode(QChar(0x211D)); symbols["bbZ"]=MathOperatorSymbolUnicode(QChar(0x2124)); symbols["because"]=MathOperatorSymbolUnicode(QChar(0x2235)).addMathOperatorHtml("∵"); symbols["bigcap"]=MathOperatorSymbolUnicode(QChar(0x22C2)).addMathOperatorHtml("∫").addMathOperatorWinSymbol(QChar(0xC7), 1.8); symbols["bigcup"]=MathOperatorSymbolUnicode(QChar(0x22C3)).addMathOperatorHtml("∫").addMathOperatorWinSymbol(QChar(0xC8), 1.8); symbols["bighat"]=MathOperatorSymbolUnicode(QChar(0x22C0)).addMathOperatorHtml("∫").addMathOperatorWinSymbol(QChar(0xD9), 1.8); symbols["bigvee"]=MathOperatorSymbolUnicode(QChar(0x22C1)).addMathOperatorHtml("∫").addMathOperatorWinSymbol(QChar(0xDA), 1.8); symbols["bot"]=symbols["perp"]=MathOperatorSymbolUnicode(QChar(0x22A5)).addMathOperatorHtml("⊥"); symbols["cap"]=symbols["land"]=MathOperatorSymbolUnicode(QChar(0x2229)).addMathOperatorHtml("∩").addMathOperatorWinSymbol(QChar(0xC7)); symbols["cdot"]=MathOperatorSymbol(QChar(0xB7)).addMathOperatorHtml("·").addMathOperatorWinSymbol(QChar(0xD7)); symbols["cong"]=MathOperatorSymbolUnicode(QChar(0x2245)).addMathOperatorHtml("≅"); symbols["coprod"]=MathOperatorSymbolUnicode(QChar(0x2210)).addMathOperatorHtml("∐").addWinSymbol(QChar(0xD5), ItalicOff|BoldOff|FlipUpDown, 1.8, 0.1); symbols["cup"]=symbols["lor"]=MathOperatorSymbolUnicode(QChar(0x222A)).addMathOperatorHtml("∪").addMathOperatorWinSymbol(QChar(0xC8)); symbols["ddots"]=MathOperatorSymbolUnicode(QChar(0x22F1)).addMathOperatorHtml("⋱"); symbols["div"]=MathOperatorSymbolUnicode(QChar(0x00F7)).addMathOperatorHtml("÷").addMathOperatorWinSymbol(QChar(0xB8)); symbols["downarrow"]=UprightSymbolUnicode(QChar(0x2193)).addUprightHtml("↓").addUprightWinSymbol(QChar(0xAF)); symbols["downharpoonleft"]=UprightSymbolUnicode(QChar(0x21C3)).addUprightHtml("⇃"); symbols["downharpoonright"]=UprightSymbolUnicode(QChar(0x21C2)).addUprightHtml("⇂"); symbols["emptyset"]=symbols["varnothing"]=MathOperatorSymbolUnicode(QChar(0x2205)).addMathOperatorHtml("∅").addMathOperatorWinSymbol(QChar(0xC6)).addStd("0", BoldOff|ItalicOff|DrawSlash); symbols["equiv"]=MathOperatorSymbolUnicode(QChar(0x2261)).addMathOperatorHtml("≡").addMathOperatorWinSymbol(QChar(0xBA)); symbols["exists"]=MathOperatorSymbolUnicode(QChar(0x2203)).addMathOperatorHtml("∃").addMathOperatorWinSymbol(QChar(0x24)).addStd("E", ItalicOff|BoldOff|FlipLeftRight); symbols["forall"]=MathOperatorSymbolUnicode(QChar(0x2200)).addMathOperatorHtml("∀").addMathOperatorWinSymbol(QChar(0x22)).addStd("A", ItalicOff|BoldOff|FlipUpDown); symbols["geq"]=symbols["ge"]=MathOperatorSymbolUnicode(QChar(0x2265)).addMathOperatorHtml("≥").addMathOperatorWinSymbol(QChar(0xB3)); symbols["geqq"]=MathOperatorSymbolUnicode(QChar(0x2267)).addMathOperatorHtml("≧"); symbols["gg"]=MathOperatorSymbolUnicode(QChar(0x226B)).addMathOperatorHtml("≫").addMathOperatorStd(">>"); symbols["iddots"]=MathOperatorSymbolUnicode(QChar(0x22F0)).addMathOperatorHtml("⋰"); symbols["iff"]=symbols["Leftrightarrow"]=UprightSymbolUnicode(QChar(0x21D4)).addUprightHtml("⇔").addUprightWinSymbol(QChar(0xDB)); symbols["iiint"]=MathOperatorSymbolUnicode(QChar(0x222D)).setGlobalFlags(IntLikeSymbolCorrection).addMathOperatorHtml("∭").addMathOperatorWinSymbol(QString(3, QChar(0xF2)), 1.8, 0.1); symbols["iint"]=MathOperatorSymbolUnicode(QChar(0x222C)).setGlobalFlags(IntLikeSymbolCorrection).addMathOperatorHtml("∬").addMathOperatorWinSymbol(QString(2, QChar(0xF2)), 1.8, 0.1); symbols["in"]=MathOperatorSymbolUnicode(QChar(0x2208)).addMathOperatorHtml("∈").addMathOperatorWinSymbol(QChar(0xCE)); symbols["int"]=MathOperatorSymbolUnicode(QChar(0x222B)).setGlobalFlags(IntLikeSymbolCorrection).addMathOperatorHtml("∫").addMathOperatorWinSymbol(QChar(0xF2), 1.8, 0.1); symbols["leftarrow"]=UprightSymbolUnicode(QChar(0x2190)).addUprightHtml("←").addUprightWinSymbol(QChar(0xAC)); symbols["leftharpoondown"]=UprightSymbolUnicode(QChar(0x21BD)).addUprightHtml("↽"); symbols["leftharpoonup"]=UprightSymbolUnicode(QChar(0x21BC)).addUprightHtml("↼"); symbols["leftrightarrow"]=UprightSymbolUnicode(QChar(0x2194)).addUprightHtml("↔").addUprightWinSymbol(QChar(0xAB)); symbols["leftrightharpoon"]=UprightSymbolUnicode(QChar(0x21CB)).addUprightHtml("⇋"); symbols["leq"]=symbols["le"]=MathOperatorSymbolUnicode(QChar(0x2264)).addMathOperatorHtml("≤").addMathOperatorWinSymbol(QChar(0xA3)); symbols["leqq"]=MathOperatorSymbolUnicode(QChar(0x2266)).addMathOperatorHtml("≦"); symbols["ll"]=MathOperatorSymbolUnicode(QChar(0x226A)).addMathOperatorHtml("≪").addMathOperatorStd("<<"); symbols["lnot"]=MathOperatorSymbolUnicode(QChar(0xAC)).addMathOperatorWinSymbol(QChar(0xD8)).addMathOperatorHtml("¬"); symbols["mapimage"]=MathOperatorSymbolUnicode(QChar(0x22B7)).addMathOperatorHtml("⊷"); symbols["maporiginal"]=MathOperatorSymbolUnicode(QChar(0x22B6)).addMathOperatorHtml("⊶"); symbols["mapsto"]=MathOperatorSymbolUnicode(QChar(0x21A6)).addMathOperatorHtml("↦"); symbols["mid"]=MathOperatorSymbolUnicode(QChar(0x2223)).addMathOperatorHtml("∣").addMathOperatorWinSymbol(QChar(0xBD)).addMathOperatorStd("|"); symbols["mp"]=MathOperatorSymbolUnicode(QChar(0x2213)).addMathOperatorHtml("∓"); symbols["multimap"]=MathOperatorSymbolUnicode(QChar(0x22B8)).addMathOperatorHtml("⊸"); symbols["nabla"]=MathOperatorSymbolUnicode(QChar(0x2207)).addMathOperatorHtml("∇").addMathOperatorWinSymbol(QChar(0xD1)); symbols["ne"]=MathOperatorSymbolUnicode(QChar(0x2260)).addMathOperatorHtml("≠").addMathOperatorWinSymbol(QChar(0xB9)); symbols["nearrow"]=UprightSymbolUnicode(QChar(0x2197)).addUprightHtml("↗"); symbols["neg"]=symbols["lnot"]=MathOperatorSymbolUnicode(QChar(0x00AC)).addMathOperatorHtml("¬").addMathOperatorWinSymbol(QChar(0xD8)); symbols["neq"]=MathOperatorSymbolUnicode(QChar(0x2260)).addMathOperatorHtml("≠").addMathOperatorWinSymbol(QChar(0xB9)).addStd("=", ItalicOff|BoldOff|DrawSlash); symbols["nexists"]=MathOperatorSymbolUnicode(QChar(0x2204)).addMathOperatorHtml("∄").addStd("E", ItalicOff|BoldOff|FlipLeftRight|DrawSlash).addMathOperatorWinSymbol(QChar(0x24), ItalicOff|BoldOff|DrawSlash); symbols["ni"]=MathOperatorSymbolUnicode(QChar(0x220B)).addMathOperatorHtml("∋").addMathOperatorWinSymbol(QChar(0xCE), ItalicOff|BoldOff|FlipLeftRight); symbols["nmid"]=MathOperatorSymbolUnicode(QChar(0x2224)).addMathOperatorHtml("∤"); symbols["notin"]=MathOperatorSymbolUnicode(QChar(0x2209)).addMathOperatorHtml("∉").addMathOperatorWinSymbol(QChar(0xCF)); symbols["notni"]=MathOperatorSymbolUnicode(QChar(0x220C)).addMathOperatorHtml("∌"); symbols["nparallel"]=MathOperatorSymbolUnicode(QChar(0x2226)).addMathOperatorHtml("∦"); symbols["nwarrow"]=UprightSymbolUnicode(QChar(0x2196)).addUprightHtml("↖"); symbols["odot"]=MathOperatorSymbolUnicode(QChar(0x2299)).addMathOperatorHtml("⊙"); symbols["oiiint"]=MathOperatorSymbolUnicode(QChar(0x2230)).setGlobalFlags(IntLikeSymbolCorrection).addMathOperatorHtml("∰"); symbols["oiint"]=MathOperatorSymbolUnicode(QChar(0x222F)).setGlobalFlags(IntLikeSymbolCorrection).addMathOperatorHtml("∯"); symbols["oint"]=MathOperatorSymbolUnicode(QChar(0x222E)).setGlobalFlags(IntLikeSymbolCorrection).addMathOperatorHtml("∮"); symbols["ominus"]=MathOperatorSymbolUnicode(QChar(0x2296)).addMathOperatorHtml("⊖"); symbols["oplus"]=MathOperatorSymbolUnicode(QChar(0x2295)).addMathOperatorHtml("⊕").addMathOperatorWinSymbol(QChar(0xC5)); symbols["oslash"]=MathOperatorSymbolUnicode(QChar(0x2298)).addMathOperatorHtml("⊘"); symbols["otimes"]=MathOperatorSymbolUnicode(QChar(0x2297)).addMathOperatorHtml("⊗").addMathOperatorWinSymbol(QChar(0xC4)); symbols["parallel"]=MathOperatorSymbolUnicode(QChar(0x2225)).addMathOperatorHtml("∥").addMathOperatorStd("||"); symbols["pm"] = MathOperatorSymbol(QChar(0xB1), "±").addMathOperatorWinSymbol(QChar(0xB1)); symbols["prec"]=MathOperatorSymbolUnicode(QChar(0x227A)).addMathOperatorHtml("≺"); symbols["prod"]=MathOperatorSymbolUnicode(QChar(0x220F)).addMathOperatorWinSymbol(QChar(0xD5), 1.8, 0.1).addMathOperatorHtml("∏"); symbols["propto"]=MathOperatorSymbolUnicode(QChar(0x221D)).addMathOperatorWinSymbol(QChar(0xB5)).addMathOperatorHtml("∝"); symbols["rightharpoondown"]=UprightSymbolUnicode(QChar(0x21C1)).addUprightHtml("⇁"); symbols["rightharpoonup"]=UprightSymbolUnicode(QChar(0x21C0)).addUprightHtml("⇀"); symbols["rightleftharpoon"]=UprightSymbolUnicode(QChar(0x21CC)).addUprightHtml("⇌"); symbols["searrow"]=UprightSymbolUnicode(QChar(0x2198)).addUprightHtml("↘"); symbols["setminus"]=MathOperatorSymbolUnicode(QChar(0x2216)).addMathOperatorHtml("∖"); symbols["~"]=symbols["sim"]=symbols["tilde"]=MathOperatorSymbolUnicode(QChar(0x223C)).addMathOperatorHtml("˜").addMathOperatorStd("~"); symbols["simeq"]=MathOperatorSymbolUnicode(QChar(0x2243)).addMathOperatorHtml("≃"); symbols["sqcap"]=MathOperatorSymbolUnicode(QChar(0x2293)).addMathOperatorHtml("⊓"); symbols["sqcup"]=MathOperatorSymbolUnicode(QChar(0x2294)).addMathOperatorHtml("⊔"); symbols["square"]=MathOperatorSymbolUnicode(QChar(0x25A1)); symbols["subset"]=MathOperatorSymbolUnicode(QChar(0x2282)).addMathOperatorHtml("⊂").addMathOperatorWinSymbol(QChar(0xCC)); symbols["subseteq"]=MathOperatorSymbolUnicode(QChar(0x2286)).addMathOperatorHtml("⊆").addMathOperatorWinSymbol(QChar(0xCD)); symbols["subsetnot"]=MathOperatorSymbolUnicode(QChar(0x2284)).addMathOperatorHtml("⊄").addMathOperatorWinSymbol(QChar(0xCB)); symbols["succ"]=MathOperatorSymbolUnicode(QChar(0x227B)).addMathOperatorHtml("≻"); symbols["sum"]=MathOperatorSymbolUnicode(QChar(0x2211)).addMathOperatorWinSymbol(QChar(0xE5), 1.8, 0.1).addMathOperatorHtml("∑"); symbols["supset"]=MathOperatorSymbolUnicode(QChar(0x2283)).addMathOperatorHtml("⊃").addMathOperatorWinSymbol(QChar(0xC9)); symbols["supseteq"]=MathOperatorSymbolUnicode(QChar(0x2287)).addMathOperatorHtml("⊇").addMathOperatorWinSymbol(QChar(0xCA)); symbols["supsetnot"]=MathOperatorSymbolUnicode(QChar(0x2285)).addMathOperatorHtml("⊅"); symbols["swarrow"]=UprightSymbolUnicode(QChar(0x2199)).addUprightHtml("↙"); symbols["therefore"]=MathOperatorSymbolUnicode(QChar(0x2234)).addMathOperatorHtml("∴").addMathOperatorWinSymbol(QChar(0x5C)); symbols["times"] = MathOperatorSymbol(QChar(0xD7), "×").addMathOperatorWinSymbol(QChar(0xB4)); symbols["to"]=symbols["rightarrow"]=UprightSymbolUnicode(QChar(0x2192)).addUprightHtml("→").addUprightWinSymbol(QChar(0xAE)); symbols["top"]=MathOperatorSymbolUnicode(QChar(0x22A4)).addMathOperatorHtml("⊤").addMathOperatorWinSymbol(QChar(0x5E)); symbols["triangle"]=MathOperatorSymbolUnicode(QChar(0x2206)); symbols["uparrow"]=UprightSymbolUnicode(QChar(0x2191)).addUprightHtml("↑").addUprightWinSymbol(QChar(0xAD)); symbols["updownarrow"]=UprightSymbolUnicode(QChar(0x2195)).addUprightHtml("↕"); symbols["upharpoonleft"]=UprightSymbolUnicode(QChar(0x21BF)).addUprightHtml("↿"); symbols["upharpoonright"]=UprightSymbolUnicode(QChar(0x21BE)).addUprightHtml("↾"); symbols["vartriangleleft"]=MathOperatorSymbolUnicode(QChar(0x22B2)).addMathOperatorHtml("⊲"); symbols["vdots"]=MathOperatorSymbolUnicode(QChar(0x22EE)).addMathOperatorHtml("⋮"); symbols["vee"]=MathOperatorSymbolUnicode(QChar(0x2228)).addMathOperatorHtml("∨").addMathOperatorWinSymbol(QChar(0xDA)); symbols["wedge"]=MathOperatorSymbolUnicode(QChar(0x2227)).addMathOperatorHtml("∧").addMathOperatorWinSymbol(QChar(0xD9)); /************************************************************************************** * GREEK letters **************************************************************************************/ symbols["alpha"]=GreekLetter_WinSymbol_Unicode_Html( "a", QChar(0x3B1), "α"); symbols["beta"]=GreekLetter_WinSymbol_Unicode_Html("b", QChar(0x3B2), "β"); symbols["gamma"]=GreekLetter_WinSymbol_Unicode_Html("g", QChar(0x3B3), "γ"); symbols["delta"]=GreekLetter_WinSymbol_Unicode_Html("d", QChar(0x3B4), "δ"); symbols["epsilon"]=GreekLetter_WinSymbol_Unicode_Html("e", QChar(0x3F5), "ϵ"); symbols["varepsilon"]=GreekLetter_WinSymbol_Unicode_Html("e", QChar(0x3B5), "ε"); symbols["zeta"]=GreekLetter_WinSymbol_Unicode_Html("z", QChar(0x3B6),"ζ"); symbols["eta"]=GreekLetter_WinSymbol_Unicode_Html("h", QChar(0x3B7),"η"); symbols["theta"]=GreekLetter_WinSymbol_Unicode_Html("q", QChar(0x3B8),"θ"); symbols["vartheta"]=GreekLetter_WinSymbol_Unicode_Html("J", QChar(0x3D1),"ϑ"); symbols["iota"]=GreekLetter_WinSymbol_Unicode_Html("i", QChar(0x3B9),"ι"); symbols["kappa"]=GreekLetter_WinSymbol_Unicode_Html("k", QChar(0x3BA),"κ"); symbols["lambda"]=GreekLetter_WinSymbol_Unicode_Html("l", QChar(0x3BB),"λ"); symbols["mu"]=GreekLetter_WinSymbol_Unicode_Html("m", QChar(0x3BC),"μ"); symbols["nu"]=GreekLetter_WinSymbol_Unicode_Html("n", QChar(0x3BD),"ν"); symbols["xi"]=GreekLetter_WinSymbol_Unicode_Html("x", QChar(0x3BE),"ξ"); symbols["pi"]=GreekLetter_WinSymbol_Unicode_Html("p", QChar(0x3C0),"π"); symbols["varpi"]=GreekLetter_WinSymbol_Unicode_Html("v", QChar(0x3D6),"ϖ"); symbols["rho"]=GreekLetter_WinSymbol_Unicode_Html("r", QChar(0x3C1),"ρ"); symbols["varrho"]=GreekLetter_WinSymbol_Unicode_Html("r", QChar(0x3F1),"ϱ"); symbols["sigma"]=GreekLetter_WinSymbol_Unicode_Html("s", QChar(0x3C3),"σ"); symbols["varsigma"]=GreekLetter_WinSymbol_Unicode_Html("V", QChar(0x3C2),"ς"); symbols["tau"]=GreekLetter_WinSymbol_Unicode_Html("t", QChar(0x3C4),"τ"); symbols["upsilon"]=GreekLetter_WinSymbol_Unicode_Html("u", QChar(0x3C5),"υ"); symbols["phi"]=GreekLetter_WinSymbol_Unicode_Html("f", QChar(0x3D5),"ϕ"); symbols["varphi"]=GreekLetter_WinSymbol_Unicode_Html("j", QChar(0x3C6),"φ"); symbols["chi"]=GreekLetter_WinSymbol_Unicode_Html("c", QChar(0x3C7),"χ"); symbols["psi"]=GreekLetter_WinSymbol_Unicode_Html("y", QChar(0x3C8),"ψ"); symbols["omega"]=GreekLetter_WinSymbol_Unicode_Html("w", QChar(0x3C9),"ω"); symbols["Gamma"]=GreekLetter_WinSymbol_Unicode_Html("G", QChar(0x3A9),"Γ"); symbols["Delta"]=GreekLetter_WinSymbol_Unicode_Html("D", QChar(0x394),"Δ"); symbols["Theta"]=GreekLetter_WinSymbol_Unicode_Html("Q", QChar(0x398),"Θ"); symbols["Lambda"]=GreekLetter_WinSymbol_Unicode_Html("L", QChar(0x39B),"Λ"); symbols["Omega"]=GreekLetter_WinSymbol_Unicode_Html("W", QChar(0x3A9),"Ω"); symbols["Xi"]=GreekLetter_WinSymbol_Unicode_Html("X", QChar(0x39E),"Ξ"); symbols["Pi"]=GreekLetter_WinSymbol_Unicode_Html("P", QChar(0x3A0),"Π"); symbols["Sigma"]=GreekLetter_WinSymbol_Unicode_Html("S", QChar(0x3A3),"Σ"); symbols["Upsilon"]=GreekLetter_WinSymbol_Unicode_Html("U", QChar(0x3C6),"Υ"); symbols["Phi"]=GreekLetter_WinSymbol_Unicode_Html("F", QChar(0x3A6),"Φ"); symbols["Psi"]=GreekLetter_WinSymbol_Unicode_Html("Y", QChar(0x3A8),"Ψ"); } JKQTMathTextSymbolNode::SymbolFullProps::SymbolFullProps(): customFontFamily(), html(), fontType(MTECurrentFont), globalFlags(NoGLobalSymbolFlags) { } JKQTMathTextSymbolNode::SymbolFullProps::SymbolFullProps(const QString &_font, const SymbolProps &props, const QString &_html, SymbolFlags _htmlflags, double _htmlfontScalingFactor, double _htmlyShiftFactor): customFontFamily(_font), html(_html, _htmlflags, _htmlfontScalingFactor, _htmlyShiftFactor), fontType(MTECustomFont), globalFlags(NoGLobalSymbolFlags) { this->props[MTFEStandard]=props; } JKQTMathTextSymbolNode::SymbolFullProps::SymbolFullProps(const QString &_font, const QString &symbol, const QString &_html, SymbolFlags _htmlflags, double _htmlfontScalingFactor, double _htmlyShiftFactor): customFontFamily(_font), html(_html, _htmlflags, _htmlfontScalingFactor, _htmlyShiftFactor), fontType(MTECustomFont), globalFlags(NoGLobalSymbolFlags) { this->props[MTFEStandard]=SymbolProps(symbol); } JKQTMathTextSymbolNode::SymbolFullProps::SymbolFullProps(const SymbolProps &props, const QString &_html, SymbolFlags _htmlflags, double _htmlfontScalingFactor, double _htmlyShiftFactor): customFontFamily(), html(_html, _htmlflags, _htmlfontScalingFactor, _htmlyShiftFactor), fontType(MTECurrentFont), globalFlags(NoGLobalSymbolFlags) { this->props[MTFEStandard]=props; } JKQTMathTextSymbolNode::SymbolFullProps::SymbolFullProps(JKQTMathTextEnvironmentFont _fontType, const SymbolProps &props, const QString &_html, SymbolFlags _htmlflags, double _htmlfontScalingFactor, double _htmlyShiftFactor): customFontFamily(), html(_html, _htmlflags, _htmlfontScalingFactor, _htmlyShiftFactor), fontType(_fontType), globalFlags(NoGLobalSymbolFlags) { this->props[MTFEStandard]=props; } JKQTMathTextSymbolNode::SymbolFullProps::SymbolFullProps(JKQTMathTextEnvironmentFont _fontType, const QString &symbol, const QString &_html, SymbolFlags _htmlflags, double _htmlfontScalingFactor, double _htmlyShiftFactor): customFontFamily(), html(_html, _htmlflags, _htmlfontScalingFactor, _htmlyShiftFactor), fontType(_fontType), globalFlags(NoGLobalSymbolFlags) { this->props[MTFEStandard]=SymbolProps(symbol); } JKQTMathTextSymbolNode::SymbolFullProps::SymbolFullProps(JKQTMathTextFontEncoding enc0, const SymbolProps &props0, const QString &_html, SymbolFlags _htmlflags, double _htmlfontScalingFactor, double _htmlyShiftFactor): customFontFamily(), html(_html, _htmlflags, _htmlfontScalingFactor, _htmlyShiftFactor), fontType(MTECurrentFont), globalFlags(NoGLobalSymbolFlags) { this->props[enc0]=props0; } JKQTMathTextSymbolNode::SymbolFullProps::SymbolFullProps(JKQTMathTextEnvironmentFont _fontType, JKQTMathTextFontEncoding enc0, const SymbolProps &props0, const QString &_html, SymbolFlags _htmlflags, double _htmlfontScalingFactor, double _htmlyShiftFactor): customFontFamily(), html(_html, _htmlflags, _htmlfontScalingFactor, _htmlyShiftFactor), fontType(_fontType), globalFlags(NoGLobalSymbolFlags) { this->props[enc0]=props0; } JKQTMathTextSymbolNode::SymbolFullProps::SymbolFullProps(JKQTMathTextFontEncoding enc0, const SymbolProps &props0, JKQTMathTextFontEncoding enc1, const SymbolProps &props1, const QString &_html, SymbolFlags _htmlflags, double _htmlfontScalingFactor, double _htmlyShiftFactor): customFontFamily(), html(_html, _htmlflags, _htmlfontScalingFactor, _htmlyShiftFactor), fontType(MTECurrentFont), globalFlags(NoGLobalSymbolFlags) { this->props[enc0]=props0; this->props[enc1]=props1; } JKQTMathTextSymbolNode::SymbolFullProps::SymbolFullProps(JKQTMathTextEnvironmentFont _fontType, JKQTMathTextFontEncoding enc0, const SymbolProps &props0, JKQTMathTextFontEncoding enc1, const SymbolProps &props1, const QString &_html, SymbolFlags _htmlflags, double _htmlfontScalingFactor, double _htmlyShiftFactor): customFontFamily(), html(_html, _htmlflags, _htmlfontScalingFactor, _htmlyShiftFactor), fontType(_fontType), globalFlags(NoGLobalSymbolFlags) { this->props[enc0]=props0; this->props[enc1]=props1; } JKQTMathTextSymbolNode::SymbolFullProps::SymbolFullProps(JKQTMathTextFontEncoding enc0, const SymbolProps &props0, JKQTMathTextFontEncoding enc1, const SymbolProps &props1, JKQTMathTextFontEncoding enc2, const SymbolProps &props2, const QString &_html, SymbolFlags _htmlflags, double _htmlfontScalingFactor, double _htmlyShiftFactor): customFontFamily(), html(_html, _htmlflags, _htmlfontScalingFactor, _htmlyShiftFactor), fontType(MTECurrentFont), globalFlags(NoGLobalSymbolFlags) { this->props[enc0]=props0; this->props[enc1]=props1; this->props[enc2]=props2; } JKQTMathTextSymbolNode::SymbolFullProps::SymbolFullProps(JKQTMathTextEnvironmentFont _fontType, JKQTMathTextFontEncoding enc0, const SymbolProps &props0, JKQTMathTextFontEncoding enc1, const SymbolProps &props1, JKQTMathTextFontEncoding enc2, const SymbolProps &props2, const QString &_html, SymbolFlags _htmlflags, double _htmlfontScalingFactor, double _htmlyShiftFactor): customFontFamily(), html(_html, _htmlflags, _htmlfontScalingFactor, _htmlyShiftFactor), fontType(_fontType), globalFlags(NoGLobalSymbolFlags) { this->props[enc0]=props0; this->props[enc1]=props1; this->props[enc2]=props2; } JKQTMathTextSymbolNode::SymbolFullProps &JKQTMathTextSymbolNode::SymbolFullProps::add(JKQTMathTextFontEncoding enc, const SymbolProps &_props) { props[enc]=_props; return *this; } JKQTMathTextSymbolNode::SymbolFullProps &JKQTMathTextSymbolNode::SymbolFullProps::addWinSymbol(const QString &_symbol, SymbolFlags _flags, double _fontScalingFactor, double _yShiftFactor) { props[MTFEWinSymbol]=SymbolProps(_symbol, _flags, _fontScalingFactor, _yShiftFactor); return *this; } JKQTMathTextSymbolNode::SymbolFullProps &JKQTMathTextSymbolNode::SymbolFullProps::addMathOperatorWinSymbol(const QString &_symbol, double _fontScalingFactor, double _yShiftFactor) { props[MTFEWinSymbol]=SymbolProps(_symbol, ItalicOff|BoldOff, _fontScalingFactor, _yShiftFactor); return *this; } JKQTMathTextSymbolNode::SymbolFullProps &JKQTMathTextSymbolNode::SymbolFullProps::addUprightWinSymbol(const QString &_symbol, double _fontScalingFactor, double _yShiftFactor) { props[MTFEWinSymbol]=SymbolProps(_symbol, ItalicOff, _fontScalingFactor, _yShiftFactor); return *this; } JKQTMathTextSymbolNode::SymbolFullProps &JKQTMathTextSymbolNode::SymbolFullProps::addUnicode(const QString &_symbol, SymbolFlags _flags, double _fontScalingFactor, double _yShiftFactor) { props[MTFEUnicode]=SymbolProps(_symbol, _flags, _fontScalingFactor, _yShiftFactor); return *this; } JKQTMathTextSymbolNode::SymbolFullProps &JKQTMathTextSymbolNode::SymbolFullProps::addUprightUnicode(const QString &_symbol, double _fontScalingFactor, double _yShiftFactor) { props[MTFEUnicode]=SymbolProps(_symbol, ItalicOff, _fontScalingFactor, _yShiftFactor); return *this; } JKQTMathTextSymbolNode::SymbolFullProps &JKQTMathTextSymbolNode::SymbolFullProps::addMathOperatorUnicode(const QString &_symbol, double _fontScalingFactor, double _yShiftFactor) { props[MTFEUnicode]=SymbolProps(_symbol, ItalicOff|BoldOff, _fontScalingFactor, _yShiftFactor); return *this; } JKQTMathTextSymbolNode::SymbolFullProps &JKQTMathTextSymbolNode::SymbolFullProps::addStd(const QString &_symbol, SymbolFlags _flags, double _fontScalingFactor, double _yShiftFactor) { props[MTFEStandard]=SymbolProps(_symbol, _flags, _fontScalingFactor, _yShiftFactor); return *this; } JKQTMathTextSymbolNode::SymbolFullProps &JKQTMathTextSymbolNode::SymbolFullProps::addMathOperatorStd(const QString &_symbol, double _fontScalingFactor, double _yShiftFactor) { props[MTFEStandard]=SymbolProps(_symbol, ItalicOff|BoldOff, _fontScalingFactor, _yShiftFactor); return *this; } JKQTMathTextSymbolNode::SymbolFullProps &JKQTMathTextSymbolNode::SymbolFullProps::addUprightStd(const QString &_symbol, double _fontScalingFactor, double _yShiftFactor) { props[MTFEStandard]=SymbolProps(_symbol, ItalicOff, _fontScalingFactor, _yShiftFactor); return *this; } JKQTMathTextSymbolNode::SymbolFullProps &JKQTMathTextSymbolNode::SymbolFullProps::addHtml(const QString &_symbol, SymbolFlags _flags, double _fontScalingFactor, double _yShiftFactor) { html=SymbolProps(_symbol, _flags, _fontScalingFactor, _yShiftFactor); return *this; } JKQTMathTextSymbolNode::SymbolFullProps &JKQTMathTextSymbolNode::SymbolFullProps::addMathOperatorHtml(const QString &_symbol, double _fontScalingFactor, double _yShiftFactor) { html=SymbolProps(_symbol, ItalicOff|BoldOff, _fontScalingFactor, _yShiftFactor); return *this; } JKQTMathTextSymbolNode::SymbolFullProps &JKQTMathTextSymbolNode::SymbolFullProps::addUprightHtml(const QString &_symbol, double _fontScalingFactor, double _yShiftFactor) { html=SymbolProps(_symbol, ItalicOff, _fontScalingFactor, _yShiftFactor); return *this; } JKQTMathTextSymbolNode::SymbolFullProps &JKQTMathTextSymbolNode::SymbolFullProps::addGlobalFlags(GlobalSymbolFlags addglobalFlags) { globalFlags |= addglobalFlags; return *this; } JKQTMathTextSymbolNode::SymbolFullProps &JKQTMathTextSymbolNode::SymbolFullProps::setGlobalFlags(GlobalSymbolFlags addglobalFlags) { globalFlags = addglobalFlags; return *this; } QPair JKQTMathTextSymbolNode::SymbolFullProps::getDrawingData(JKQTMathTextEnvironment currentEv, JKQTMathText* parent) const { SymbolProps outProps; QFont outFont; const JKQTMathTextFontEncoding currentEnc=currentEv.getFontEncoding(parent); QFont currentFont=currentEv.getFont(parent); currentFont.setStyleStrategy(QFont::NoFontMerging); const QFontMetricsF currentFM(currentFont); QFont fallbackGreekFont=parent->getFallbackFontGreek(); fallbackGreekFont.setStyleStrategy(QFont::NoFontMerging); const QFontMetricsF fallbackGreekFM(fallbackGreekFont); QFont fallbackSymbolsFont=parent->getFallbackFontSymbols(); fallbackSymbolsFont.setStyleStrategy(QFont::NoFontMerging); const QFontMetricsF fallbackSymbolsFM(fallbackSymbolsFont); if (fontType==MTEFallbackGreek) { if (currentEnc!=MTFEStandard && props.contains(currentEnc)) { outProps=props[currentEnc]; const QChar ch=props[currentEnc].getSymbolSingleChar(); if (!ch.isNull() && !currentFM.inFont(ch)) { currentEv.font=MTEFallbackGreek; outProps=props.value(currentEv.getFontEncoding(parent), outProps); } } else if (currentEnc==MTFEStandard && props.contains(currentEnc)){ outProps=props[currentEnc]; const QChar ch=props[currentEnc].getSymbolSingleChar(); if (!ch.isNull() && fallbackGreekFM.inFont(ch)) { currentEv.font=MTEFallbackGreek; outProps=props.value(currentEv.getFontEncoding(parent), outProps); } } else { currentEv.font=MTEFallbackGreek; } } else if (fontType==MTEFallbackSymbols) { if (currentEnc!=MTFEStandard && props.contains(currentEnc)) { outProps=props[currentEnc]; const QChar ch=props[currentEnc].getSymbolSingleChar(); if (!ch.isNull() && !currentFM.inFont(ch)) { currentEv.font=MTEFallbackGreek; outProps=props.value(currentEv.getFontEncoding(parent), outProps); } } else if (currentEnc==MTFEStandard && props.contains(currentEnc)){ outProps=props[currentEnc]; const QChar ch=props[currentEnc].getSymbolSingleChar(); if (!ch.isNull() && fallbackSymbolsFM.inFont(ch)) { currentEv.font=MTEFallbackSymbols; outProps=props.value(currentEv.getFontEncoding(parent), outProps); } } else { currentEv.font=MTEFallbackGreek; } } else if (fontType!=MTEEnvironmentFontCount) { if (fontType!=MTECurrentFont) { currentEv.font=fontType; } if (fontType==MTECustomFont) { currentEv.customFontName=customFontFamily; outProps=props.value(MTFEStandard, outProps); } else { QFont lcurrentFont=currentEv.getFont(parent); lcurrentFont.setStyleStrategy(QFont::NoFontMerging); const QFontMetricsF lcurrentFM(lcurrentFont); auto lcurrentEnc=currentEv.getFontEncoding(parent); outProps=props.value(lcurrentEnc, props.value(MTFEStandard, outProps)); const QChar ch=outProps.getSymbolSingleChar(); if (!ch.isNull() && !lcurrentFM.inFont(ch) && fallbackSymbolsFM.inFont(ch)) { currentEv.font=MTEFallbackSymbols; outProps=props.value(currentEv.getFontEncoding(parent), outProps); } } if (props.contains(currentEv.getFontEncoding(parent))) outProps=props[currentEv.getFontEncoding(parent)]; } outFont=currentEv.getFont(parent); if (outProps.fontScalingFactor!=1) outFont.setPointSizeF(outFont.pointSizeF()*outProps.fontScalingFactor); if (has(outProps.flags, ItalicOn)) outFont.setItalic(true); if (has(outProps.flags, ItalicOff)) outFont.setItalic(false); if (has(outProps.flags, BoldOn)) outFont.setBold(true); if (has(outProps.flags, BoldOff)) outFont.setBold(false); return QPair(outFont, outProps); }