#include "math_hullinset.h"
#include "math_iterator.h"
#include "math_macroarg.h"
+#include "math_macrotemplate.h"
#include "math_mathmlstream.h"
#include "math_parser.h"
#include "math_replace.h"
bool MathCursor::popLeft()
{
- //cerr << "Leaving atom "; par()->write(cerr, false); cerr << " left\n";
+ //cerr << "Leaving atom to the left\n";
if (Cursor_.size() <= 1)
return false;
- if (par()->asScriptInset()) {
- par()->asScriptInset()->removeEmptyScripts();
- if (par()->asScriptInset()->empty())
- plainErase();
- }
Cursor_.pop_back();
return true;
}
//cerr << "Leaving atom "; par()->write(cerr, false); cerr << " right\n";
if (Cursor_.size() <= 1)
return false;
- if (par()->asScriptInset()) {
- par()->asScriptInset()->removeEmptyScripts();
- if (par()->asScriptInset()->empty())
- plainErase();
- }
Cursor_.pop_back();
posRight();
return true;
dump("error 4");
}
pos() = min(pos(), size());
+
+ // remove empty scripts if possible
+ for (pos_type i = 0; i < size(); ++i) {
+ MathScriptInset * p = array().at(i)->asScriptInset();
+ if (p) {
+ p->removeEmptyScripts();
+ if (p->empty())
+ array().erase(i);
+ }
+ }
+
+ // fix again position
+ pos() = min(pos(), size());
}
while (1) {
// avoid invalid nesting when selecting
if (!selection_ || positionable(it.cursor(), Anchor_)) {
- int xo = it.position().xpos();
- int yo = it.position().ypos();
+ MathCursorPos const & top = it.position();
+ int xo = top.xpos();
+ int yo = top.ypos();
if (xlow - 2 <= xo && xo <= xhigh + 2 &&
ylow - 2 <= yo && yo <= yhigh + 2)
{
if (inMacroArgMode()) {
--pos();
plainErase();
- if ('1' <= c && c <= '9')
+ int n = c - '0';
+ MathMacroTemplate * p = formula()->par()->asMacroTemplate();
+ if (p && 1 <= n && n <= p->numargs())
insert(MathAtom(new MathMacroArgument(c - '0')));
else {
insert(MathAtom(new MathSpecialCharInset('#')));