Ответ 1
Я хотел бы поделиться приятным взломом, предложенным Тоддом Гейли (Wolfram Research) в связи с данным вопросом. Возможно, для кого-то это будет полезно, как и для меня. Этот хак решает эту проблему довольно элегантным способом.
Один из способов - оставить FormatType в OutputForm для вычислений, но переопределить обработка сообщения временно переключитесь на StandardForm, так что только Выход сообщения возвращается StandardForm:
LinkWrite[link,
Unevaluated[EnterExpressionPacket[
Unprotect[Message];
Message[args___]:=
Block[{$inMsg = True, result},
SetOptions[$Output, FormatType->StandardForm];
result = Message[args];
SetOptions[$Output, FormatType->OutputForm];
result
] /; !TrueQ[$inMsg]
]
]]
Вы получите экземпляр ExpressionPacket для содержимого сообщение. Чтобы напечатать это как ячейку Message в ноутбук:
cell = Cell[<the ExpressionPacket>, "Message", "MSG"] CellPrint[cell]
Расширенный подход: все напечатано в StandardForm
Для получения всего, кроме вывода, возвращаемого в StandardForm
, мы могли бы переопределить переменные $Pre
и $Post
в ядре подчиненного класса особым образом (следующий код должен быть оценен в ядре подчиненного):
SetOptions[$Output, {PageWidth -> 72, FormatType -> StandardForm}];
(*$inPost is needed for tracing mode compatibility
(could be switched on by evaluating On[] in the slave kernel)
in which Messages are printed during evaluation of $Post.*)
$inPost = False; Protect[$inPost];
$Pre := Function[inputexpr,
SetOptions[$Output, FormatType -> StandardForm];
Unevaluated[inputexpr], HoldAllComplete];
$Post := Function[outputexpr,
Block[{$inPost = True},
SetOptions[$Output, FormatType -> OutputForm];
Unevaluated[outputexpr]], HoldAllComplete];
Protect[$Pre]; Protect[$Post];
$inMsg = False; Protect[$inMsg];
Unprotect[Message];
Message[args___] /; $inPost := Block[{$inMsg = True},
SetOptions[$Output, FormatType -> StandardForm];
Message[args];
SetOptions[$Output, FormatType -> OutputForm]] /; ! $inMsg;
Protect[Message];