漂亮的MuPad:在一行中输出赋值,表达式和结果 - 如何创建该函数?

6
我希望您能够将Matlab的MuPad与MathCad一样美观和方便。
假设有两个变量分配:
x_a:=2*unit::mm;
y_b:=5*unit::mm;

我希望您能提供一个漂亮的(使用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

我错过了什么?


关于 horchler的答案:他的第一个解决方案不起作用,而第二个解决方案可以:
操作步骤:
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个回答

4
这是一个范围问题。MuPAD和其他大多数编程语言一样,方法/函数/过程具有有限的词法作用域DOM_VAR域类型指的是过程的局部变量(更多详情请见此处)。在Matlab函数中,您无法直接查看变量名称(使用inputname),MuPAD也不例外。此外,参数通常在传递到函数或过程之前进行评估。
幸运的是,从编程角度来看,修复方法非常简单。首先,您需要为proc使用hold选项。这似乎既可以防止评估输入参数,又可以访问“在过程调用中使用的实际参数形式”。然后,您需要使用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毫米,就像您的内联表达式中的z一样:

MuPAD output two

这个表单同样有效,而且稍微更加简洁:

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

在R2015a中进行测试。


1
这看起来已经非常有前途了,我会尽快尝试一下。感谢您提供的有趣链接,我在寻找Mupad相关信息时遇到了些困难。 - Robert Seifert
1
它运行得很好。我想再保持一段时间,这样你详细的回答就能得到更多的关注?由于你似乎是一个Mupad专家,也许你有兴趣帮助我解决我的后续问题(https://dev59.com/6o3da4cB1Zd3GeqP3K_-)。 - Robert Seifert
实际上,您的第一个解决方案不起作用(请参见我的编辑),但第二个可以。我不明白为什么第一个在您的情况下能够工作而在我的情况下不能。 - Robert Seifert
@thewaywewalk: 这是因为我在第一个版本中有一个错误。现在已经修复了。第二个版本肯定更简单易懂 - 我会使用那个版本。感谢你发现了这个问题。 - horchler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接