Этот вопрос следует из ответа Майкла Пилата в Preventing») Плюс »от перестановки . Там он определил специальную нотацию +
, используя
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
повторно оценивается. И это несмотря на то, что Интерпретация
имеет атрибут HoldAll
(который правильно работает при нормальной оценке).
Обычно при определении простых обозначений я использую низкоуровневые MakeBoxes
, например
myPlus/:MakeBoxes[myPlus[expr__],fmt_]:=With[{r=Riffle[MakeBoxes/@{expr},"+"]},
InterpretationBox[RowBox[r],myPlus[expr]]]
, который отлично работает, поэтому я раньше не сталкивался с этой проблемой рекурсии.
Итак, мой вопрос (наконец):
Что пошло не так с моей командой типа Format
и как это исправить?
Или: Как сделать высокоуровневый эквивалент моей команды типа MakeBoxes
?