Sim*_*mon 10 wolfram-mathematica
这个问题是迈克尔·皮拉特在预防"加号"中重新安排事情所给出的答案.他在那里定义了一个自定义+符号
Format[myPlus[expr__]] := Row[Riffle[{expr}, "+"]]
Run Code Online (Sandbox Code Playgroud)
这个问题是你不能复制和粘贴输出(虽然%或Out []仍然有效).为了解决这个问题,你应该使用Interpretation类型工具,它允许表达式显示为一个东西,但在作为输入提供时被解释为另一个.我对迈克尔答案的修改是
Format[myPlus[expr__]] := Interpretation[Row[{expr}, "+"], myPlus[expr]]
Run Code Online (Sandbox Code Playgroud)
这可以成功复制和粘贴.问题在于修改复制的表达式.您可以将复制的表达式转换回InputForm使用Ctrl-Shift-I然后更改所需的任何内容并使用InputForm任何表达式.但是如果你试图将它改回StandardForm使用,Ctrl-Shift-N那么你输入一个递归,其中Interpretation重复的第二个参数被评估.这是尽管Interpretation具有属性HoldAll(在正常评估期间正常工作).
通常,在定义简单符号时,我使用低级MakeBoxes,例如
myPlus/:MakeBoxes[myPlus[expr__],fmt_]:=With[{r=Riffle[MakeBoxes/@{expr},"+"]},
InterpretationBox[RowBox[r],myPlus[expr]]]
Run Code Online (Sandbox Code Playgroud)
哪个工作完美,所以我之前没有遇到过这个递归问题.
所以我的问题(最后)是:我的Format类型命令出了什么问题,它怎么能修复?或者:你如何使我的MakeBoxes类型命令高级等效?