这个问题是迈克尔皮拉特在Preventing “Plus” from rearranging things给出的答案。在那里,他使用
定义了自定义+
符号
Format[myPlus[expr__]] := Row[Riffle[{expr}, "+"]]
这个问题是你不能复制和粘贴输出(尽管%或Out []仍然有效)。为了解决这个问题,你应该使用Interpretation
类型工具,它允许表达式显示为一个东西,但在作为输入提供时被解释为另一个。我对迈克尔答案的修改是
Format[myPlus[expr__]] := Interpretation[Row[{expr}, "+"], myPlus[expr]]
可以成功复制和粘贴。问题在于修改复制的表达式。您可以使用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]]]
完美无缺,所以我之前没有遇到过这种递归问题。
所以我的问题(最后)是:
我的Format
类型命令出了什么问题,如何解决?
或者:如何使我的MakeBoxes
类型命令高级等效?
答案 0 :(得分:11)
我向同事咨询了这个问题,他的建议基本上就是当您希望事物与输出紧密集成时,在MakeBoxes
上展示价值定义比使用Format
更好回到输入。 Format
并非真正用于生成可以重新用作输入的输出,而只是用于格式化输出,因此在转换为Interpretation
时,StandardForm
会发生意外的递归,等等。 / p>
您可能会发现函数ToBoxes
是MakeBoxes
的有用补充。
最后,here's a tutorial关于盒子结构。
HTH!