Pretty MuPad: вывод назначения, выражения и результата в одной строке-как создать эту функцию?

Я пытаюсь получить MuPad Matlabs так же красиво и удобно, как MathCad.

предположим два назначения переменных:

x_a:=2*unit::mm;
y_b:=5*unit::mm;

и я хочу prettyfied (typeset с Tex) выводить как

z = x_a + y_b = 7 mm

мне уже удалось сделать это с помощью output::mathText(...):

output::mathText(hold(z)," = " , (z:=hold(x_a+y_b)) , " = " , z)

который выглядит как нужные:

enter image description here

но это не очень удобно и не читабельно. Поэтому я пытаюсь обернуть его в макрос или функция:

evalPrint(z,x_a+y_b)

как я могу это сделать?


что я пробовал:

я написал процедуру следующим образом:

evalPrint :=
proc(x,y) begin
  output::mathText(hold(x)," = " , (x:=hold(y)) , " = " , x)
end_proc:

но я просто

enter image description here

что я упустил?


о Хорхлер это: его первое решение как-то не работает, в то время как второе делает:

правила:

evalPrintVal := proc(x,y) option hold;
begin
    output::mathText(x, " = ", evalassign(x,y));
end_proc:
evalPrintEq := proc(x,y) option hold;
begin
    output::mathText(x, " = ", evalassign(x,y), " = ", context(y));
end_proc:
evalPrintEq2 := proc(x,y) option hold;
begin
    output::mathText(x, " = ", y, " = ", evalassign(x,y));
end_proc:

звоните:

evalPrintVal(U_1,15000*unit::V);
evalPrintEq(E_h, U_1*1.05);
evalPrintEq2(E_h, U_1*1.05);

выход:

enter image description here

1 ответов


это проблема область. MuPAD ничем не отличается от большинства других языков программирования в том, что методы/функции/процедуры имеют ограниченный лексической области. The DOM_VAR тип домена относится к локальной переменной процедуры (немного больше здесь). Вы не можете напрямую видеть имя переменной до ее передачи в функцию Matlab (используйте inputname для этого), и MuPAD не отличается. Вдобавок, аргументы, как правило, оценивали до они переходят в функции или процедуру.

к счастью, исправить это довольно легко с точки зрения кодирования. Во-первых, вам нужно использовать hold для proc. Это, по-видимому, предотвращает оценку входных аргументов и разрешает доступ к "фактическому параметру в форме, которая использовалась в вызове процедуры."Тогда вам нужно использовать context для оценки последние часть вашего выхода. Результирующая процедура выглядит следующим образом:

evalPrint := proc(x,y) option hold;
begin
    output::mathText(x, " = ", y, " = ", context(y));
end_proc:

затем

x_a := 2*unit::mm;
y_b := 5*unit::mm;
evalPrint(z, x_a+y_b);
z;

возвращает

MuPAD output one

однако, поскольку это было сделано в процедуре, значение z не было присвоено значение в глобальной области, как в вашем встроенном выражении. Для этого в evalassign функция может быть использована:

evalPrint := proc(x,y) option hold;
begin
    output::mathText(x, " = ", evalassign(x,hold(y)), " = ", context(y));
end_proc:

которая теперь возвращает 7 mm на z как ваш встроенный выражение:

MuPAD output two

эта форма также работает и немного более лаконична:

evalPrint := proc(x,y) option hold;
begin
    output::mathText(x, " = ", y, " = ", evalassign(x,y));
end_proc:

протестировано в R2015a.