我有一个函数返回我想要打印的等号, 例如,x == y,或2x + 5 == 10。 这些通常对mathematica没有意义,它不能简化它。
然而,有时双方都是平等的,但我希望能够以未评估的形式打印相等:也就是说,我希望Mathematica打印x == x,而不是True。
一个非常简单的例子:
Print[printableEqual[x,y]]
应该打印x == y,而
Print[printableEqual[x,x]]
应该打印x == x
编辑: 原因是我在图表之间有关系。我想返回像
这样的内容G1 == t*G2 + s*G3
其中t,s是整数,Gi是Mathematica中的Graphics对象。 只是返回这个很好,(因为Mathematica不能简化这些事情)除了G1 == G1这将是真的。
麻烦在于使用Defer或HoldForm提供
Private`lhs$714 == Private`rhs$714
作为输出,也就是说,我的包中的私有变量不被评估为我的图形。
答案 0 :(得分:4)
您可以使用Defer
执行此操作:
In[5]:= printableEqual[x_, y_] := Defer[x == y];
In[6]:= printableEqual[1, 2]
Out[6]= 1 == 2
答案 1 :(得分:3)
另一个技巧是使用Unevaluated
:
In[1] := Print[Unevaluated[1 == 1]]
1==1
答案 2 :(得分:2)
通常会使用HoldForm
来做这类事情。 HoldForm
是一个与Hold
类似的头,因为它不会评估其内容,但是当它作为输出打印时它不会显示,如下所示:
In[1]:= HoldForm[x == 3]
Out[1]= x == 3
In[2]:= HoldForm[x == x]
Out[2]= x == x
与Hold
一样,您可以使用HoldForm
或函数参数替换将内容插入With
,如下所示:
In[3]:= PrintableEqual[x_, y_] := HoldForm[x == y]
In[4]:= PrintableEqual[x, x]
Out[4]= x == x
但是,这意味着在替换之前评估参数,如下所示:
In[5]:= PrintableEqual[x + x, 2 x]
Out[5]= 2 x == 2x
如果您不希望发生这种情况,可以使用SetAttributes
和HoldAll
:
In[6]:= SetAttributes[PrintableEqual, {HoldAll}]
In[7]:= PrintableEqual[x + x, 2 x]
Out[7]= x + x == 2 x
请注意,HoldForm
始终存在,它不会以输出形式显示:
In[8]:= PrintableEqual[x, x] // InputForm
Out[8]= HoldForm[x == x]
如果您想评估内容,请使用ReleaseHold
:
In[9]:= ReleaseHold@PrintableEqual[x, x]
Out[9]= True
答案 3 :(得分:0)
你可以做的另一件事是使用Grid[]
来统一你的所有平等 - 增加的优势是因为你实际上并没有使用Equal[]
创建表达式,所以你不必阻止他们的评价。
In[1]:= Grid[Table[{LHS[i],"\[LongEqual]",RHS[i]},{i,2}],
Alignment -> {Right,Center,Left}]
Out[1]= LHS[1] == RHS[1]
LHS[2] == RHS[2]
在类似情况下,您可以使用
手动排版printableEqual[LHS_, RHS_] := Row[{LHS, " \[LongEqual] ", RHS}]
或更一般地
printableEqual[LHS_, mid___, RHS_] := Row[Riffle[{LHS, mid, RHS}, " \[LongEqual] "]]
顺便说一句,上面定义的printableEqual[]
的输出可以使用ToExpression[ToString[#]]&
或类似的东西转换回真实的表达式
toRealEqual[Row[lst_List]] := Equal@@lst[[1;;-1;;2]] /; OddQ[Length[lst]] && Union[lst[[2;;-2;;2]]] == {" \[LongEqual] "}