On Mon, Sep 25, 2006 at 03:28:12PM +0200, Jean-Marc Lasgouttes wrote: > >>>>> "Enrico" == Enrico Forestieri <[EMAIL PROTECTED]> writes: > > Enrico> Done. Please, find attached a revised patch against 1.4 (ATM > Enrico> 1.5 is unusable). However, I verified that it still applies to > Enrico> 1.5 after the substitution RunCommand -> runCommand. > > Enrico, I would welcome this patch in 1.4.4svn. I guess you should > apply it to 1.5 forst.
It was already applied to 1.5 by Bo. Now I applied it to 1.4.x, too. -- Enrico
Index: src/mathed/ChangeLog =================================================================== --- src/mathed/ChangeLog (revision 15137) +++ src/mathed/ChangeLog (working copy) @@ -1,3 +1,65 @@ +2006-09-25 Enrico Forestieri <[EMAIL PROTECTED]> + + * src/mathed/math_symbolinset.C + (void MathSymbolInset::maxima): newer maxima versions use inf + instead of INF. Add support for greek pi. + (void MathSymbolInset::mathematica): Add support for \cdot. + + * src/mathed/math_stringinset.h: account for the const version + of asStringInset(). + + * src/mathed/math_extern.C (bool extractScript): added a boolean + to formal parameters in order to only extract superscripts. + (MathArray::iterator extractArgument): leave out delimiters and a + possible superscript for function arguments. + (bool isKnownFunction): + (bool extractFunctionName): recognize standard and user defined + function names. + (void splitScripts): correctly split scripts as expected by other + functions. + (MathAtom replaceDelims): ranamed as replaceParenDelims. + (bool testOpenBracket): + (bool testCloseBracket): test for "[" and "]", respectively. + (MathAtom replaceBracketDelims): replace something delimited by + "[" and "]" with a proper DelimInset. + (void extractDelims): create a DelimInset for "[" and "]" delimiters. + (void extractFunctions): improved recognition of function names. + (bool testTermDelimiter): test for '+' or '-' as term delimiters + (MathArray::iterator extractTerm): extract a "term", i.e., something + delimited by '+' or '-'. + (bool testDiffItem): improved recognition of a "differential fraction" + (void extractDiff): call splitScripts() on numerator and denominator + of a differential fraction before analyzing them. + (void extractLims): improved recognition of a limit function. + (void extractStructure): reorganized order of searches. + (MathArray pipeThroughMaxima): newer versions of maxima use simpsum + instead of SIMPSUM. + (string fromMathematicaName): translates from mathematica names. + (void prettifyMathematicaOutput): convert to LyX format the latex + macros output by mathematica. + (MathArray pipeThroughMathematica): call mathematica and collect + its output. + (MathArray pipeThroughExtern): add support for mathematica. + + * src/mathed/math_numberinset.[Ch] + (void MathNumberInset::mathematica): add support for mathematica. + + * src/mathed/math_matrixinset.[Ch] + (void MathMatrixInset::mathematica): add support for mathematica. + + * src/mathed/math_diffinset.[Ch] + (void MathDiffInset::maxima): add support for maxima. + (void MathDiffInset::mathematica): mathematica uses "D" and not + "Dt" for normal derivatives. + + * src/mathed/math_liminset.[Ch] + (void MathLimInset::maxima): add support for maxima. + (void MathLimInset::mathematica): mathematica uses "Limit" and + not "Lim" for limits. + + * src/mathed/math_exfuncinset.C + (string asMathematicaName): added some more function names. + 2006-08-22 Jean-Marc Lasgouttes <[EMAIL PROTECTED]> * math_nestinset.C (lfunMousePress): on button 2 press, paste Index: src/mathed/math_symbolinset.C =================================================================== --- src/mathed/math_symbolinset.C (revision 15137) +++ src/mathed/math_symbolinset.C (working copy) @@ -162,7 +162,9 @@ void MathSymbolInset::maxima(MaximaStrea if (name() == "cdot") os << '*'; else if (name() == "infty") - os << "INF"; + os << "inf"; + else if (name() == "pi") + os << "%pi"; else os << name(); } @@ -172,6 +174,7 @@ void MathSymbolInset::mathematica(Mathem { if ( name() == "pi") { os << "Pi"; return;} if ( name() == "infty") { os << "Infinity"; return;} + if ( name() == "cdot") { os << '*'; return;} os << name(); } Index: src/mathed/math_stringinset.h =================================================================== --- src/mathed/math_stringinset.h (revision 15137) +++ src/mathed/math_stringinset.h (working copy) @@ -31,6 +31,8 @@ public: std::string str() const { return str_; } /// MathStringInset * asStringInset() { return this; } + /// + MathStringInset const * asStringInset() const { return this; } /// void normalize(NormalStream &) const; Index: src/mathed/math_extern.C =================================================================== --- src/mathed/math_extern.C (revision 15137) +++ src/mathed/math_extern.C (working copy) @@ -22,6 +22,7 @@ #include "math_diffinset.h" #include "math_exfuncinset.h" #include "math_exintinset.h" +#include "math_fontinset.h" #include "math_fracinset.h" #include "math_liminset.h" #include "math_matrixinset.h" @@ -34,6 +35,7 @@ #include "debug.h" #include "support/filetools.h" #include "support/lstrings.h" +#include "frontends/controllers/ControlMath.h" #include <algorithm> #include <sstream> @@ -44,6 +46,8 @@ using lyx::support::LibFileSearch; using lyx::support::RunCommand; using lyx::support::subst; +using lyx::frontend::function_names; + using std::string; using std::endl; using std::find_if; @@ -74,7 +78,7 @@ typedef MathAtom ReplaceArgumentFunc(con // try to extract a super/subscript // modify iterator position to point behind the thing bool extractScript(MathArray & ar, - MathArray::iterator & pos, MathArray::iterator last) + MathArray::iterator & pos, MathArray::iterator last, bool superscript) { // nothing to get here if (pos == last) @@ -84,6 +88,10 @@ bool extractScript(MathArray & ar, if (!(*pos)->asScriptInset()) return false; + // do we want superscripts only? + if (superscript && !(*pos)->asScriptInset()->hasUp()) + return false; + // it is a scriptinset, use it. ar.push_back(*pos); ++pos; @@ -94,16 +102,31 @@ bool extractScript(MathArray & ar, // try to extract an "argument" to some function. // returns position behind the argument MathArray::iterator extractArgument(MathArray & ar, - MathArray::iterator pos, MathArray::iterator last, string const & = "") + MathArray::iterator pos, MathArray::iterator last, bool function = false) { // nothing to get here if (pos == last) return pos; - // something deliminited _is_ an argument + // something delimited _is_ an argument if ((*pos)->asDelimInset()) { - ar.push_back(*pos); - return pos + 1; + // leave out delimiters if this is a function argument + if (function) { + MathArray const & arg = (*pos)->asDelimInset()->cell(0); + MathArray::const_iterator cur = arg.begin(); + MathArray::const_iterator end = arg.end(); + while (cur != end) + ar.push_back(*cur++); + } else + ar.push_back(*pos); + ++pos; + if (pos == last) + return pos; + // if there's one, get following superscript only if this + // isn't a function argument + if (!function) + extractScript(ar, pos, last, true); + return pos; } // always take the first thing, no matter what it is @@ -114,9 +137,9 @@ MathArray::iterator extractArgument(Math if (pos == last) return pos; - // if the next item is a subscript, it most certainly belongs to the - // thing we have - extractScript(ar, pos, last); + // if the next item is a super/subscript, it most certainly belongs + // to the thing we have + extractScript(ar, pos, last, false); if (pos == last) return pos; @@ -197,6 +220,39 @@ bool extractString(MathAtom const & at, } +// is this a known function? +bool isKnownFunction(string const & str) +{ + for (int i = 0; *function_names[i]; ++i) { + if (str == function_names[i]) + return true; + } + return false; +} + + +// extract a function name from this inset +bool extractFunctionName(MathAtom const & at, string & str) +{ + if (at->asSymbolInset()) { + str = at->asSymbolInset()->name(); + return isKnownFunction(str); + } + if (at->asUnknownInset()) { + // assume it is well known... + str = at->name(); + return true; + } + if (at->asFontInset() && at->name() == "mathrm") { + // assume it is well known... + MathArray const & ar = at->asFontInset()->cell(0); + str = charSequence(ar.begin(), ar.end()); + return ar.size() == str.size(); + } + return false; +} + + // convert this inset somehow to a number bool extractNumber(MathArray const & ar, int & i) { @@ -279,24 +335,42 @@ void splitScripts(MathArray & ar) { //lyxerr << "\nScripts from: " << ar << endl; for (size_t i = 0; i < ar.size(); ++i) { - // is this script inset? - if (!ar[i]->asScriptInset()) - continue; + MathScriptInset const * script = ar[i]->asScriptInset(); - // no problem if we don't have both... - if (!ar[i]->asScriptInset()->hasUp()) + // is this a script inset and do we also have a superscript? + if (!script || !script->hasUp()) continue; - if (!ar[i]->asScriptInset()->hasDown()) + + // we must have a nucleus if we only have a superscript + if (!script->hasDown() && script->nuc().size() == 0) continue; + if (script->nuc().size() == 1) { + // leave alone sums and integrals + MathSymbolInset const * sym = + script->nuc().front()->asSymbolInset(); + if (sym && (sym->name() == "sum" || sym->name() == "int")) + continue; + } + // create extra script inset and move superscript over MathScriptInset * p = ar[i].nucleus()->asScriptInset(); auto_ptr<MathScriptInset> q(new MathScriptInset(true)); swap(q->up(), p->up()); p->removeScript(true); + // if we don't have a subscript, get rid of the ScriptInset + if (!script->hasDown()) { + MathArray arg(p->nuc()); + MathArray::const_iterator it = arg.begin(); + MathArray::const_iterator et = arg.end(); + ar.erase(i); + while (it != et) + ar.insert(i++, *it++); + } else + ++i; + // insert new inset behind - ++i; ar.insert(i, MathAtom(q.release())); } //lyxerr << "\nScripts to: " << ar << endl; @@ -390,7 +464,7 @@ void extractNumbers(MathArray & ar) // -// search deliminiters +// search delimiters // bool testOpenParen(MathAtom const & at) @@ -405,17 +479,36 @@ bool testCloseParen(MathAtom const & at) } -MathAtom replaceDelims(const MathArray & ar) +MathAtom replaceParenDelims(const MathArray & ar) { return MathAtom(new MathDelimInset("(", ")", ar)); } -// replace '('...')' sequences by a real MathDelimInset +bool testOpenBracket(MathAtom const & at) +{ + return testString(at, "["); +} + + +bool testCloseBracket(MathAtom const & at) +{ + return testString(at, "]"); +} + + +MathAtom replaceBracketDelims(const MathArray & ar) +{ + return MathAtom(new MathDelimInset("[", "]", ar)); +} + + +// replace '('...')' and '['...']' sequences by a real MathDelimInset void extractDelims(MathArray & ar) { //lyxerr << "\nDelims from: " << ar << endl; - replaceNested(ar, testOpenParen, testCloseParen, replaceDelims); + replaceNested(ar, testOpenParen, testCloseParen, replaceParenDelims); + replaceNested(ar, testOpenBracket, testCloseBracket, replaceBracketDelims); //lyxerr << "\nDelims to: " << ar << endl; } @@ -441,10 +534,8 @@ void extractFunctions(MathArray & ar) string name; // is it a function? - if ((*it)->asUnknownInset()) { - // it certainly is if it is well known... - name = (*it)->name(); - } else { + // it certainly is if it is well known... + if (!extractFunctionName(*it, name)) { // is this a user defined function? // it it probably not, if it doesn't have a name. if (!extractString(*it, name)) @@ -463,13 +554,13 @@ void extractFunctions(MathArray & ar) // do we have an exponent like in // 'sin' '^2' 'x' -> 'sin(x)' '^2' MathArray exp; - extractScript(exp, jt, ar.end()); + extractScript(exp, jt, ar.end(), true); // create a proper inset as replacement auto_ptr<MathExFuncInset> p(new MathExFuncInset(name)); // jt points to the "argument". Get hold of this. - MathArray::iterator st = extractArgument(p->cell(0), jt, ar.end()); + MathArray::iterator st = extractArgument(p->cell(0), jt, ar.end(), true); // replace the function name by a real function inset *it = MathAtom(p.release()); @@ -562,6 +653,25 @@ void extractIntegrals(MathArray & ar) } +bool testTermDelimiter(MathAtom const & at) +{ + return testString(at, "+") || testString(at, "-"); +} + + +// try to extract a "term", i.e., something delimited by '+' or '-'. +// returns position behind the term +MathArray::iterator extractTerm(MathArray & ar, + MathArray::iterator pos, MathArray::iterator last) +{ + while (pos != last && !testTermDelimiter(*pos)) { + ar.push_back(*pos); + ++pos; + } + return pos; +} + + // // search sums // @@ -631,7 +741,7 @@ void extractSums(MathArray & ar) p->cell(3) = sub->up(); // use something behind the script as core - MathArray::iterator tt = extractArgument(p->cell(0), it + 1, ar.end()); + MathArray::iterator tt = extractTerm(p->cell(0), it + 1, ar.end()); // cleanup ar.erase(it + 1, tt); @@ -648,7 +758,16 @@ void extractSums(MathArray & ar) // tests for 'd' or '\partial' bool testDiffItem(MathAtom const & at) { - return testString(at, "d"); + if (testString(at, "d") || testSymbol(at, "partial")) + return true; + + // we may have d^n .../d and splitScripts() has not yet seen it + MathScriptInset const * sup = at->asScriptInset(); + if (sup && !sup->hasDown() && sup->hasUp() && sup->nuc().size() == 1) { + MathAtom const & ma = sup->nuc().front(); + return testString(ma, "d") || testSymbol(ma, "partial"); + } + return false; } @@ -689,7 +808,8 @@ void extractDiff(MathArray & ar) // collect function, let jt point behind last used item MathArray::iterator jt = it + 1; //int n = 1; - MathArray const & numer = f->cell(0); + MathArray numer(f->cell(0)); + splitScripts(numer); if (numer.size() > 1 && numer[1]->asScriptInset()) { // this is something like d^n f(x) / d... or d^n / d... // FIXME @@ -697,24 +817,25 @@ void extractDiff(MathArray & ar) if (numer.size() > 2) diff->cell(0) = MathArray(numer.begin() + 2, numer.end()); else - jt = extractArgument(diff->cell(0), jt, ar.end()); + jt = extractTerm(diff->cell(0), jt, ar.end()); } else { // simply d f(x) / d... or d/d... if (numer.size() > 1) diff->cell(0) = MathArray(numer.begin() + 1, numer.end()); else - jt = extractArgument(diff->cell(0), jt, ar.end()); + jt = extractTerm(diff->cell(0), jt, ar.end()); } // collect denominator parts - MathArray const & denom = f->cell(1); - for (MathArray::const_iterator dt = denom.begin(); dt != denom.end();) { + MathArray denom(f->cell(1)); + splitScripts(denom); + for (MathArray::iterator dt = denom.begin(); dt != denom.end();) { // find the next 'd' - MathArray::const_iterator et + MathArray::iterator et = find_if(dt + 1, denom.end(), &testDiffItem); // point before this - MathArray::const_iterator st = et - 1; + MathArray::iterator st = et - 1; MathScriptInset const * script = (*st)->asScriptInset(); if (script && script->hasUp()) { // things like d.../dx^n @@ -755,24 +876,20 @@ bool testRightArrow(MathAtom const & at) // assume 'extractDelims' ran before void extractLims(MathArray & ar) { - // we need at least three items... - if (ar.size() < 3) - return; - //lyxerr << "\nLimits from: " << ar << endl; - for (size_t i = 0; i + 2 < ar.size(); ++i) { + for (size_t i = 0; i < ar.size(); ++i) { MathArray::iterator it = ar.begin() + i; - // is this a limit function? - if (!testSymbol(*it, "lim")) + // must be a script inset with a subscript (without superscript) + MathScriptInset const * sub = (*it)->asScriptInset(); + if (!sub || !sub->hasDown() || sub->hasUp() || sub->nuc().size() != 1) continue; - // the next one must be a subscript (without superscript) - MathScriptInset const * sub = (*(it + 1))->asScriptInset(); - if (!sub || !sub->hasDown() || sub->hasUp()) + // is this a limit function? + if (!testSymbol(sub->nuc().front(), "lim")) continue; - // and it must contain a -> symbol + // subscript must contain a -> symbol MathArray const & s = sub->down(); MathArray::const_iterator st = find_if(s.begin(), s.end(), &testRightArrow); if (st == s.end()) @@ -784,7 +901,7 @@ void extractLims(MathArray & ar) // use something behind the script as core MathArray f; - MathArray::iterator tt = extractArgument(f, it + 2, ar.end()); + MathArray::iterator tt = extractTerm(f, it + 1, ar.end()); // cleanup ar.erase(it + 1, tt); @@ -803,12 +920,12 @@ void extractLims(MathArray & ar) void extractStructure(MathArray & ar) { //lyxerr << "\nStructure from: " << ar << endl; + splitScripts(ar); + extractDelims(ar); extractIntegrals(ar); extractSums(ar); - splitScripts(ar); extractNumbers(ar); extractMatrices(ar); - extractDelims(ar); extractFunctions(ar); extractDets(ar); extractDiff(ar); @@ -942,7 +1059,7 @@ namespace { MaximaStream ms(os); ms << ar; string expr = os.str(); - string const header = "SIMPSUM:true;"; + string const header = "simpsum:true;"; string out; for (int i = 0; i < 100; ++i) { // at most 100 attempts @@ -1175,6 +1292,89 @@ namespace { return res; } + + string fromMathematicaName(string const & name) + { + if (name == "Sin") return "sin"; + if (name == "Sinh") return "sinh"; + if (name == "ArcSin") return "arcsin"; + if (name == "Cos") return "cos"; + if (name == "Cosh") return "cosh"; + if (name == "ArcCos") return "arccos"; + if (name == "Tan") return "tan"; + if (name == "Tanh") return "tanh"; + if (name == "ArcTan") return "arctan"; + if (name == "Cot") return "cot"; + if (name == "Coth") return "coth"; + if (name == "Csc") return "csc"; + if (name == "Sec") return "sec"; + if (name == "Exp") return "exp"; + if (name == "Log") return "log"; + if (name == "Arg" ) return "arg"; + if (name == "Det" ) return "det"; + if (name == "GCD" ) return "gcd"; + if (name == "Max" ) return "max"; + if (name == "Min" ) return "min"; + if (name == "Erf" ) return "erf"; + if (name == "Erfc" ) return "erfc"; + return name; + } + + + void prettifyMathematicaOutput(string & out, string const & macroName, + bool roman, bool translate) + { + string const macro = "\\" + macroName + "{"; + string::size_type const len = macro.length(); + string::size_type i = out.find(macro); + + while (i != string::npos) { + string::size_type const j = get_matching_brace(out, i + len); + string const name = out.substr(i + len, j - i - len); + out = out.substr(0, i) + + (roman ? "\\mathrm{" : "") + + (translate ? fromMathematicaName(name) : name) + + out.substr(roman ? j : j + 1); + //lyxerr << "out: " << out << endl; + i = out.find(macro, i); + } + } + + + MathArray pipeThroughMathematica(string const &, MathArray const & ar) + { + ostringstream os; + MathematicaStream ms(os); + ms << ar; + string const expr = os.str(); + string out; + + lyxerr << "expr: '" << expr << "'" << endl; + + string const full = "TeXForm[" + expr + "]"; + out = captureOutput("math", full); + lyxerr << "out: '" << out << "'" << endl; + + string::size_type pos1 = out.find("Out[1]//TeXForm= "); + string::size_type pos2 = out.find("In[2]:="); + + if (pos1 == string::npos || pos2 == string::npos) + return MathArray(); + + // get everything from pos1+17 to pos2 + out = out.substr(pos1 + 17, pos2 - pos1 - 17); + out = subst(subst(out, '\r', ' '), '\n', ' '); + + // tries to make the result prettier + prettifyMathematicaOutput(out, "Mfunction", true, true); + prettifyMathematicaOutput(out, "Muserfunction", true, false); + prettifyMathematicaOutput(out, "Mvariable", false, false); + + MathArray res; + mathed_parse_cell(res, out); + return res; + } + } @@ -1190,6 +1390,9 @@ MathArray pipeThroughExtern(string const if (lang == "maple") return pipeThroughMaple(extra, ar); + if (lang == "mathematica") + return pipeThroughMathematica(extra, ar); + // create normalized expression ostringstream os; NormalStream ns(os); Index: src/mathed/math_numberinset.C =================================================================== --- src/mathed/math_numberinset.C (revision 15137) +++ src/mathed/math_numberinset.C (working copy) @@ -54,6 +54,12 @@ void MathNumberInset::maple(MapleStream } +void MathNumberInset::mathematica(MathematicaStream & os) const +{ + os << str_; +} + + void MathNumberInset::octave(OctaveStream & os) const { os << str_; Index: src/mathed/math_matrixinset.C =================================================================== --- src/mathed/math_matrixinset.C (revision 15137) +++ src/mathed/math_matrixinset.C (working copy) @@ -70,6 +70,24 @@ void MathMatrixInset::maxima(MaximaStrea } +void MathMatrixInset::mathematica(MathematicaStream & os) const +{ + os << '{'; + for (row_type row = 0; row < nrows(); ++row) { + if (row) + os << ','; + os << '{'; + for (col_type col = 0; col < ncols(); ++col) { + if (col) + os << ','; + os << cell(index(row, col)); + } + os << '}'; + } + os << '}'; +} + + void MathMatrixInset::mathmlize(MathMLStream & os) const { MathGridInset::mathmlize(os); Index: src/mathed/math_diffinset.C =================================================================== --- src/mathed/math_diffinset.C (revision 15137) +++ src/mathed/math_diffinset.C (working copy) @@ -69,9 +69,23 @@ void MathDiffInset::maple(MapleStream & } +void MathDiffInset::maxima(MaximaStream & os) const +{ + os << "diff("; + for (idx_type idx = 0; idx < nargs(); ++idx) { + if (idx != 0) + os << ','; + os << cell(idx); + if (idx != 0) + os << ",1"; + } + os << ')'; +} + + void MathDiffInset::mathematica(MathematicaStream & os) const { - os << "Dt["; + os << "D["; for (idx_type idx = 0; idx < nargs(); ++idx) { if (idx != 0) os << ','; Index: src/mathed/math_liminset.C =================================================================== --- src/mathed/math_liminset.C (revision 15137) +++ src/mathed/math_liminset.C (working copy) @@ -59,9 +59,15 @@ void MathLimInset::maple(MapleStream & o } +void MathLimInset::maxima(MaximaStream & os) const +{ + os << "limit(" << cell(0) << ',' << cell(1) << ',' << cell(2) << ')'; +} + + void MathLimInset::mathematica(MathematicaStream & os) const { - os << "Lim[" << cell(0) << ',' << cell(1) << ',' << cell(2) << ']'; + os << "Limit[" << cell(0) << ',' << cell(1) << "-> " << cell(2) << ']'; } Index: src/mathed/math_exfuncinset.C =================================================================== --- src/mathed/math_exfuncinset.C (revision 15137) +++ src/mathed/math_exfuncinset.C (working copy) @@ -80,12 +80,15 @@ string asMathematicaName(string const & if (name == "sin") return "Sin"; if (name == "sinh") return "Sinh"; if (name == "arcsin") return "ArcSin"; + if (name == "asin") return "ArcSin"; if (name == "cos") return "Cos"; if (name == "cosh") return "Cosh"; - if (name == "arcos") return "ArcCos"; + if (name == "arccos") return "ArcCos"; + if (name == "acos") return "ArcCos"; if (name == "tan") return "Tan"; if (name == "tanh") return "Tanh"; if (name == "arctan") return "ArcTan"; + if (name == "atan") return "ArcTan"; if (name == "cot") return "Cot"; if (name == "coth") return "Coth"; if (name == "csc") return "Csc"; @@ -93,6 +96,13 @@ string asMathematicaName(string const & if (name == "exp") return "Exp"; if (name == "log") return "Log"; if (name == "ln" ) return "Log"; + if (name == "arg" ) return "Arg"; + if (name == "det" ) return "Det"; + if (name == "gcd" ) return "GCD"; + if (name == "max" ) return "Max"; + if (name == "min" ) return "Min"; + if (name == "erf" ) return "Erf"; + if (name == "erfc" ) return "Erfc"; return name; } Index: src/mathed/math_numberinset.h =================================================================== --- src/mathed/math_numberinset.h (revision 15137) +++ src/mathed/math_numberinset.h (working copy) @@ -38,6 +38,8 @@ public: /// void maple(MapleStream &) const; /// + void mathematica(MathematicaStream &) const; + /// void mathmlize(MathMLStream &) const; /// void write(WriteStream & os) const; Index: src/mathed/math_matrixinset.h =================================================================== --- src/mathed/math_matrixinset.h (revision 15137) +++ src/mathed/math_matrixinset.h (working copy) @@ -35,6 +35,8 @@ public: /// void maxima(MaximaStream &) const; /// + void mathematica(MathematicaStream &) const; + /// void mathmlize(MathMLStream &) const; /// void octave(OctaveStream &) const; Index: src/mathed/math_diffinset.h =================================================================== --- src/mathed/math_diffinset.h (revision 15137) +++ src/mathed/math_diffinset.h (working copy) @@ -38,6 +38,8 @@ public: /// void mathmlize(MathMLStream &) const; /// + void maxima(MaximaStream &) const; + /// void write(WriteStream & os) const; private: virtual std::auto_ptr<InsetBase> doClone() const; Index: src/mathed/math_liminset.h =================================================================== --- src/mathed/math_liminset.h (revision 15137) +++ src/mathed/math_liminset.h (working copy) @@ -32,6 +32,8 @@ public: /// void maple(MapleStream &) const; /// + void maxima(MaximaStream &) const; + /// void mathematica(MathematicaStream &) const; /// void mathmlize(MathMLStream &) const;