Этот вопрос следует из ответа, данного Майклом Пилатом в Предотвращение «Плюс» переставлять вещи .Там он определил пользовательскую нотацию +
, используя
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
?