Благодаря ссылкам Mr.Wizard, я нашел единственный пример в документации о том, как разобрать новых операторов (пример gplus в низкоуровневом вводе ). Согласно этому примеру, вот моя версия для нового оператора PerArrow
. Пожалуйста, комментируйте / критикуйте код ниже:
In[1]:= PerArrow /: MakeBoxes[PerArrow[x_, y_], StandardForm] :=
RowBox[{MakeBoxes[x, StandardForm],
RowBox[{AdjustmentBox["/", BoxMargins -> -.2],
AdjustmentBox["\[DoubleLongRightArrow]", BoxMargins -> -.1]}],
MakeBoxes[y, StandardForm]}];
MakeExpression[
RowBox[{x_, "/", RowBox[{"\[DoubleLongRightArrow]", y_}]}],
StandardForm] :=
MakeExpression[RowBox[{"PerArrow", "[", x, ",", y, "]"}],
StandardForm];
In[3]:= PerArrow[x, y]
Out[3]= x /\[DoubleLongRightArrow] y
In[4]:= x /\[DoubleLongRightArrow]y
Out[4]= x /\[DoubleLongRightArrow] y
In[5]:= FullForm[x /\[DoubleLongRightArrow]y]
Out[5]//FullForm= \!\(\*
TagBox[
StyleBox[
RowBox[{"PerArrow", "[",
RowBox[{"x", ",", "y"}], "]"}],
ShowSpecialCharacters->False,
ShowStringCharacters->True,
NumberMarks->True],
FullForm]\)
Для ясности, вот скриншот:
Поскольку оператор не полностью интегрирован, дальнейшие проблемы:
- оператор выбирается странно при нажатии (
DoubleLongRightArrow
с y вместо /).
- соответственно, для синтаксического анализа требуется, чтобы
DoubleLongRightArrow
был RowBox
-ed с y , в противном случае выдается синтаксическая ошибка
- окраска синтаксиса (при
In[4]
и In[5]
)
- печатается странно, если вводится напрямую (обратите внимание на большие пробелы в
In[4]
и In[5]
)
Теперь я могу жить с этим, хотя было бы неплохо иметь некоторые средства, чтобы сгладить все мелкие проблемы. Я предполагаю, что все это сводится к некоторому даже низкоуровневому синтаксическому обработчику, который не делает сейчас, как группировать новый оператор. Любая идея о том, как справиться с этим? Я понимаю, что у Cell
есть множество опций, которые могут пригодиться (например, CellEvaluationFunction
, ShowAutoStyles
и InputAutoReplacements
), хотя я снова здесь не понимаю.