void MathCursor::macroModeClose()
{
+ MathInset::difference_type const t = macroNamePos();
+ if (t == -1)
+ return;
string s = macroName();
- if (s.size()) {
- size_type old = pos();
- pos() -= s.size();
- array().erase(pos(), old);
+ array().erase(t, pos());
+ pos() = t;
+ if (s != "\\")
interpret(s);
- }
}
if (p) {
idx = Cursor_[i].idx_;
return p;
+ lyxerr << "found grid and idx: " << idx << "\n";
}
}
return 0;
}
+void MathCursor::popToEnclosingGrid()
+{
+ while (Cursor_.size() && !Cursor_.back().par_->asGridInset())
+ Cursor_.pop_back();
+}
+
+
void MathCursor::pullArg(bool goright)
{
dump("pullarg");
if (s.empty())
return true;
- if (s.size() == 1)
- return interpret(s[0]);
-
//lyxerr << "char: '" << s[0] << "' int: " << int(s[0]) << endl;
//owner_->getIntl()->getTrans().TranslateAndInsert(s[0], lt);
//lyxerr << "trans: '" << s[0] << "' int: " << int(s[0]) << endl;
return true;
}
- if (s == "\\over" || s == "\\choose" || s == "\\atop") {
+ string name = s.substr(1);
+
+ if (name == "over" || name == "choose" || name == "atop") {
MathArray ar = array();
- MathAtom t(createMathInset(s.substr(1)));
+ MathAtom t(createMathInset(name));
t->asNestInset()->cell(0).swap(array());
pos() = 0;
niceInsert(t);
return true;
}
- latexkeys const * l = in_word_set(s.substr(1));
+ latexkeys const * l = in_word_set(name);
if (l && (l->token == LM_TK_FONT || l->token == LM_TK_OLDFONT)) {
lastcode_ = static_cast<MathTextCodes>(l->id);
return true;
// prevent entering of recursive macros
if (formula()->lyxCode() == Inset::MATHMACRO_CODE
- && formula()->getInsetName() == s.substr(1))
+ && formula()->getInsetName() == name)
{
lyxerr << "can't enter recursive macro\n";
return true;
}
- niceInsert(createMathInset(s.substr(1)));
+ niceInsert(createMathInset(name));
return true;
}
bool MathCursor::interpret(char c)
{
+ //lyxerr << "interpret 2: '" << c << "'\n";
if (inMacroArgMode()) {
--pos();
plainErase();
// handle macroMode
if (inMacroMode()) {
string name = macroName();
+ //lyxerr << "interpret name: '" << name << "'\n";
- if (name == "\\" && c == '\\') {
- backspace();
- interpret("\\backslash");
+ // extend macro name if possible
+ if (isalpha(c)) {
+ insert(c, LM_TC_TEX);
return true;
}
- if (isalpha(c)) {
- insert(c, LM_TC_TEX);
+ // leave macro mode if explicitly requested
+ if (c == ' ') {
+ macroModeClose();
return true;
}
+ // handle 'special char' macros
if (name == "\\") {
- insert(c, LM_TC_TEX);
- macroModeClose();
+ // remove the '\\'
+ backspace();
+ if (c == '\\')
+ interpret("\\backslash");
+ else
+ interpret(string("\\") + c);
return true;
}
+ // leave macro mode and try again
macroModeClose();
-
- if (c == '\\')
- insert(c, LM_TC_TEX);
- else if (c != ' ')
- insert(c, lastcode_);
-
+ interpret(c);
return true;
}
ostringstream os;
if (pos() > 0)
prevAtom()->infoize(os);
- return os.str();
+ return os.str().c_str(); // .c_str() needed for lyxstring
}