Этот вопрос следует из ответа Майкла Пилата в Предотвращение "Плюс" от перестановки вещей. Там он определил пользовательскую нотацию +
, используя
Format[myPlus[expr__]] := Row[Riffle[{expr}, "+"]]
Проблема с этим заключается в том, что вы не можете копировать и вставлять результат (хотя% or 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
?