* 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.
*/
#include "InsetMathColor.h"
#include "InsetMathComment.h"
#include "InsetMathDelim.h"
+#include "InsetMathEnsureMath.h"
#include "InsetMathEnv.h"
#include "InsetMathFrac.h"
#include "InsetMathKern.h"
#include "InsetMathRef.h"
#include "InsetMathRoot.h"
#include "InsetMathScript.h"
+#include "InsetMathSpace.h"
#include "InsetMathSplit.h"
#include "InsetMathSqrt.h"
#include "InsetMathTabular.h"
// at.nucleus()->cell(0) = ar;
//else
// lyxerr << "unusual contents found: " << ar << endl;
- return false;
- }
- at = ar[0];
- return true;
+ success_ = false;
+ } else
+ at = ar[0];
+ return success_;
}
putback();
res += '{' + parse_verbatim_item() + '}';
} else
- res += t.asString();
+ res += t.asInput();
}
}
return res;
res += '{' + parse_verbatim_item() + '}';
}
else
- res += t.asString();
+ res += t.asInput();
}
}
return res;
} else {
// simple $...$ stuff
putback();
- cell->push_back(MathAtom(new InsetMathHull(hullSimple)));
- parse2(cell->back(), FLAG_SIMPLE, InsetMath::MATH_MODE, false);
+ if (mode == InsetMath::UNDECIDED_MODE) {
+ cell->push_back(MathAtom(new InsetMathHull(hullSimple)));
+ parse2(cell->back(), FLAG_SIMPLE, InsetMath::MATH_MODE, false);
+ } else {
+ // Don't create nested math hulls (bug #5392)
+ cell->push_back(MathAtom(new InsetMathEnsureMath));
+ parse(cell->back().nucleus()->cell(0), FLAG_SIMPLE, InsetMath::MATH_MODE);
+ }
}
}
return success_;
}
- else if (t.cat() == catOther)
- cell->push_back(MathAtom(new InsetMathChar(t.character())));
+ else if (t.cat() == catOther) {
+ char_type c = t.character();
+ if (isAsciiOrMathAlpha(c)
+ || mode_ & Parse::VERBATIM
+ || !(mode_ & Parse::USETEXT)
+ || mode == InsetMath::TEXT_MODE) {
+ cell->push_back(MathAtom(new InsetMathChar(c)));
+ } else {
+ MathAtom at = createInsetMath("text");
+ at.nucleus()->cell(0).push_back(MathAtom(new InsetMathChar(c)));
+ while (nextToken().cat() == catOther
+ && !isAsciiOrMathAlpha(nextToken().character())) {
+ c = getToken().character();
+ at.nucleus()->cell(0).push_back(MathAtom(new InsetMathChar(c)));
+ }
+ cell->push_back(at);
+ }
+ }
else if (t.cat() == catComment) {
docstring s;
}
else if (t.cs() == "(") {
+ if (mode == InsetMath::MATH_MODE) {
+ error("bad math environment");
+ break;
+ }
cell->push_back(MathAtom(new InsetMathHull(hullSimple)));
parse2(cell->back(), FLAG_SIMPLE2, InsetMath::MATH_MODE, false);
}
else if (t.cs() == "[") {
+ if (mode != InsetMath::UNDECIDED_MODE) {
+ error("bad math environment");
+ break;
+ }
cell->push_back(MathAtom(new InsetMathHull(hullEquation)));
parse2(cell->back(), FLAG_EQUATION, InsetMath::MATH_MODE, false);
}
parse(cell->back().nucleus()->cell(0), FLAG_ITEM, mode);
}
}
+
else if (t.cs() == "unitfrac") {
// Here allowed formats are \unitfrac[val]{num}{denom}
MathData ar;
parse(cell->back().nucleus()->cell(1), FLAG_ITEM, mode);
}
+ else if (t.cs() == "cfrac") {
+ // allowed formats are \cfrac[pos]{num}{denom}
+ docstring const arg = getArg('[', ']');
+ //lyxerr << "got so far: '" << arg << "'" << endl;
+ if (arg == "l")
+ cell->push_back(MathAtom(new InsetMathFrac(InsetMathFrac::CFRACLEFT)));
+ else if (arg == "r")
+ cell->push_back(MathAtom(new InsetMathFrac(InsetMathFrac::CFRACRIGHT)));
+ else if (arg.empty() || arg == "c")
+ cell->push_back(MathAtom(new InsetMathFrac(InsetMathFrac::CFRAC)));
+ else {
+ error("found invalid optional argument");
+ break;
+ }
+ parse(cell->back().nucleus()->cell(0), FLAG_ITEM, mode);
+ parse(cell->back().nucleus()->cell(1), FLAG_ITEM, mode);
+ }
+
else if (t.cs() == "xrightarrow" || t.cs() == "xleftarrow") {
cell->push_back(createInsetMath(t.cs()));
parse(cell->back().nucleus()->cell(1), FLAG_OPTION, mode);
}
else if (name == "math") {
+ if (mode == InsetMath::MATH_MODE) {
+ error("bad math environment");
+ break;
+ }
cell->push_back(MathAtom(new InsetMathHull(hullSimple)));
parse2(cell->back(), FLAG_END, InsetMath::MATH_MODE, true);
}
else if (name == "equation" || name == "equation*"
|| name == "displaymath") {
+ if (mode != InsetMath::UNDECIDED_MODE) {
+ error("bad math environment");
+ break;
+ }
cell->push_back(MathAtom(new InsetMathHull(hullEquation)));
parse2(cell->back(), FLAG_END, InsetMath::MATH_MODE, (name == "equation"));
}
else if (name == "eqnarray" || name == "eqnarray*") {
+ if (mode != InsetMath::UNDECIDED_MODE) {
+ error("bad math environment");
+ break;
+ }
cell->push_back(MathAtom(new InsetMathHull(hullEqnArray)));
parse2(cell->back(), FLAG_END, InsetMath::MATH_MODE, !stared(name));
}
else if (name == "align" || name == "align*") {
+ if (mode != InsetMath::UNDECIDED_MODE) {
+ error("bad math environment");
+ break;
+ }
cell->push_back(MathAtom(new InsetMathHull(hullAlign)));
parse2(cell->back(), FLAG_END, InsetMath::MATH_MODE, !stared(name));
}
else if (name == "flalign" || name == "flalign*") {
+ if (mode != InsetMath::UNDECIDED_MODE) {
+ error("bad math environment");
+ break;
+ }
cell->push_back(MathAtom(new InsetMathHull(hullFlAlign)));
parse2(cell->back(), FLAG_END, InsetMath::MATH_MODE, !stared(name));
}
else if (name == "alignat" || name == "alignat*") {
+ if (mode != InsetMath::UNDECIDED_MODE) {
+ error("bad math environment");
+ break;
+ }
// ignore this for a while
getArg('{', '}');
cell->push_back(MathAtom(new InsetMathHull(hullAlignAt)));
}
else if (name == "xalignat" || name == "xalignat*") {
+ if (mode != InsetMath::UNDECIDED_MODE) {
+ error("bad math environment");
+ break;
+ }
// ignore this for a while
getArg('{', '}');
cell->push_back(MathAtom(new InsetMathHull(hullXAlignAt)));
}
else if (name == "xxalignat") {
+ if (mode != InsetMath::UNDECIDED_MODE) {
+ error("bad math environment");
+ break;
+ }
// ignore this for a while
getArg('{', '}');
cell->push_back(MathAtom(new InsetMathHull(hullXXAlignAt)));
}
else if (name == "multline" || name == "multline*") {
+ if (mode != InsetMath::UNDECIDED_MODE) {
+ error("bad math environment");
+ break;
+ }
cell->push_back(MathAtom(new InsetMathHull(hullMultline)));
parse2(cell->back(), FLAG_END, InsetMath::MATH_MODE, !stared(name));
}
else if (name == "gather" || name == "gather*") {
+ if (mode != InsetMath::UNDECIDED_MODE) {
+ error("bad math environment");
+ break;
+ }
cell->push_back(MathAtom(new InsetMathHull(hullGather)));
parse2(cell->back(), FLAG_END, InsetMath::MATH_MODE, !stared(name));
}
parse(cell->back().nucleus()->cell(0), FLAG_ITEM, InsetMath::TEXT_MODE);
}
+ else if (t.cs() == "hspace" && nextToken().character() != '*') {
+ docstring const name = t.cs();
+ docstring const arg = parse_verbatim_item();
+ Length length;
+ if (isValidLength(to_utf8(arg), &length))
+ cell->push_back(MathAtom(new InsetMathSpace(length)));
+ else {
+ // Since the Length class cannot use length variables
+ // we must not create an InsetMathSpace.
+ cell->push_back(MathAtom(new MathMacro(name)));
+ MathData ar;
+ mathed_parse_cell(ar, '{' + arg + '}');
+ cell->append(ar);
+ }
+ }
+
#if 0
else if (t.cs() == "infer") {
MathData ar;
return success_;
}
docstring rem;
- cmd = Encodings::fromLaTeXCommand(cmd, rem);
- for (size_t i = 0; i < cmd.size(); ++i)
- cell->push_back(MathAtom(new InsetMathChar(cmd[i])));
- if (rem.size()) {
- MathAtom at = createInsetMath(t.cs());
- cell->push_back(at);
- MathData ar;
- if (!mathed_parse_cell(ar, '{' + rem + '}', mode_))
- success_ = false;;
- cell->append(ar);
- }
+ do {
+ cmd = Encodings::fromLaTeXCommand(cmd, rem);
+ for (size_t i = 0; i < cmd.size(); ++i)
+ cell->push_back(MathAtom(new InsetMathChar(cmd[i])));
+ if (rem.size()) {
+ char_type c = rem[0];
+ cell->push_back(MathAtom(new InsetMathChar(c)));
+ cmd = rem.substr(1);
+ rem.clear();
+ } else
+ cmd.clear();
+ } while (cmd.size());
}
else if (t.cs().size()) {