On Sun, Apr 27, 2025 at 07:28:00PM +0000, Pavel Sanda wrote: > commit 9665f6d39ad055b865f78764533d289ae32a22fb > Author: Pavel Sanda <sa...@lyx.org> > Date: Sun Apr 27 21:25:57 2025 +0200 > > CAS: Allow commands for maxima (part of #13178). > > Now constructs like: > math-extern maxima factor > should work.
Candidate for stable. P > --- > src/LyXAction.cpp | 9 +++++++-- > src/mathed/MathExtern.cpp | 21 ++++++++++++++++----- > 2 files changed, 23 insertions(+), 7 deletions(-) > > diff --git a/src/LyXAction.cpp b/src/LyXAction.cpp > index 7b52bd2ab4..ecc7b4f327 100644 > --- a/src/LyXAction.cpp > +++ b/src/LyXAction.cpp > @@ -2825,9 +2825,14 @@ void LyXAction::init() > * \li Syntax: math-extern <LANG> [<COMMAND>] > * \li Params: <LANG>: octave|maxima|maple|mathematica|script \n > where "script" stands for the external script > (normalized > - expression will be passed) > + expression will be passed)\n > + <COMMAND>: Particular command can be entered here. The way it > will > + be used is language specific. E.g. for maxima it > will > + be rewritten to the form:\n > + simpsum:true;tex(<COMMAND>(MATHED_EXPRESSION))}} > * \li Origin: Andre, 24 Apr 2001 > - * \li Sample: math-extern maple simplify > + * \li Sample: math-extern maple simplify \n > + math-extern maxima factor > * \endvar > */ > { LFUN_MATH_EXTERN, "math-extern", Noop, Math }, > diff --git a/src/mathed/MathExtern.cpp b/src/mathed/MathExtern.cpp > index 301c4b1a69..34c75af407 100644 > --- a/src/mathed/MathExtern.cpp > +++ b/src/mathed/MathExtern.cpp > @@ -1102,7 +1102,7 @@ namespace { > return string::npos; > } > > - MathData pipeThroughMaxima(docstring const &, MathData const & ar) > + MathData pipeThroughMaxima(docstring const &command, MathData const & > ar) > { > odocstringstream os; > MaximaStream ms(os); > @@ -1110,6 +1110,16 @@ namespace { > docstring expr = os.str(); > docstring const header = from_ascii("simpsum:true;"); > > + docstring comm_left = from_ascii("tex("); > + docstring comm_right = from_ascii(");"); > + // "simpsum:true;tex(COMMAND(EXPR));" if command (e.g. > "factor") is present > + if (command != "noextra") { > + comm_left = comm_left + command + "("; > + comm_right = ")" + comm_right; > + } > + int preplen = comm_left.length(); > + int headlen = header.length(); > + > string out; > for (int i = 0; i < 100; ++i) { // at most 100 attempts > // try to fix missing '*' the hard way > @@ -1120,8 +1130,8 @@ namespace { > // 2x; > // ^ > // > - lyxerr << "checking expr: '" << to_utf8(expr) << "'" << > endl; > - docstring full = header + "tex(" + expr + ");"; > + docstring full = header + comm_left + expr + comm_right; > + lyxerr << "checking input: '" << to_utf8(full) << "'" > << endl; > out = captureOutput("maxima", to_utf8(full)); > > // leave loop if expression syntax is probably ok > @@ -1141,10 +1151,11 @@ namespace { > getline(is, line); > getline(is, line); > size_t pos = line.find('^'); > - lyxerr << "found caret at pos: '" << pos << "'" << endl; > + //we print with header at lyxerr, but maxima won't show > it in its error > + lyxerr << "found caret at pos: '" << pos + headlen << > "'" << endl; > if (pos == string::npos || pos < 4) > break; // caret position not found > - pos -= 4; // skip the "tex(" part > + pos -= preplen; // skip the "tex(command(" part (header > is not printed by maxima) > if (expr[pos] == '*') > break; // two '*' in a row are definitely bad > expr.insert(pos, from_ascii("*")); > -- > lyx-cvs mailing list > lyx-...@lists.lyx.org > https://lists.lyx.org/mailman/listinfo/lyx-cvs -- lyx-devel mailing list lyx-devel@lists.lyx.org https://lists.lyx.org/mailman/listinfo/lyx-devel