Wolfram mathematica 制作定制输入表单和短输入表单
我经常希望看到Mathematica图形对象的内部表示形式不是在Wolfram mathematica 制作定制输入表单和短输入表单,wolfram-mathematica,mathematica-frontend,Wolfram Mathematica,Mathematica Frontend,我经常希望看到Mathematica图形对象的内部表示形式不是在FullForm中,而是在可读性更高的InputForm中,它能够通过双击选择部分代码,并轻松地将此代码复制到新的输入单元格。但是默认的InputForm不允许这样做,因为InputForm默认显示为字符串,而不是Mathematica的代码。有没有办法将InputForm显示为Mathematica的代码 我还经常希望看到这种InputForm的缩短版本,其中所有长的坐标列表都显示为第一个坐标,后面是用Skeleton包装的跳过的
FullForm
中,而是在可读性更高的InputForm
中,它能够通过双击选择部分代码,并轻松地将此代码复制到新的输入单元格
。但是默认的InputForm
不允许这样做,因为InputForm
默认显示为字符串,而不是Mathematica的代码。有没有办法将InputForm
显示为Mathematica的代码
我还经常希望看到这种InputForm
的缩短版本,其中所有长的坐标列表都显示为第一个坐标,后面是用Skeleton
包装的跳过的坐标值的数量,所有空的列表
都被删除,并且所有数字也被缩短,以显示不超过6位数字。最好仅对坐标使用6位数字,但对颜色指令(如Hue
仅显示2位有效数字)。比如说,
Plot[{Sin[x], .5 Sin[2 x]}, {x, 0, 2 \[Pi]},
Filling -> {1 -> {2}}] // ShortInputForm
应提供:
Graphics[GraphicsComplex[{{1.28228`*^-7, 1.28228*^-7}, <<1133>>},
{{{EdgeForm[], Directive[{Opacity[0.2], Hue[0.67, 0.6, 0.6]}],
GraphicsGroup[{Polygon[{{1133, <<578>>}}]}]},
{EdgeForm[], Directive[{Opacity[0.2], Hue[0.67, 0.6, 0.6]}],
GraphicsGroup[{Polygon[{{432, <<556>>}}]}]}}, {{Hue[0.67, 0.6,
0.6], Line[{1, <<431>>}]}, {Hue[0.91, 0.6, 0.6],
Line[{432, <<701>>}]}}}], {AspectRatio -> GoldenRatio^(-1),
Axes -> True, AxesOrigin -> {0, 0},
Method -> {"AxesInFront" -> True},
PlotRange -> {{0, 2*Pi}, {-1., 1}},
PlotRangeClipping -> True,
PlotRangePadding -> {Scaled[0.02], Scaled[0.02]}}]
目前,我得出以下解决方案:
round[x_, n_] := (10^-n*Round[10^n*MantissaExponent[x]]) /.
{m_, e_} :> N[m*10^e];
ShortInputForm[expr_] := ((expr /.
{{} -> Sequence[],
lst : {x_ /; VectorQ[x, NumberQ], y__} /;
(MatrixQ[lst, NumberQ] && Length[lst] > 2) :>
{x, Skeleton[Length[{y}]]},
lst : {x_, y__} /; VectorQ[lst, NumberQ] && Length[lst] > 2 :>
{x, Skeleton[Length[{y}]]}} /.
{exp : Except[List | Point][x__] /;
VectorQ[{x}, MachineNumberQ] :>
(round[#, 2] & /@ exp),
x_Real /; MachineNumberQ[x] :> round[x, 6]})
// InputForm // StandardForm)
现在:
更新
可以找到shortInputForm
函数的最新版本
原职
下面是另一个更好的解决方案(与Mathematica 5兼容):
工作原理
这个解决方案基于一个简单的想法:我们需要阻止诸如图形
、点
等内容的转换,以便以内部形式显示它们(作为适合输入的表达式)。幸运的是,如果我们这样做,结果的StandardForm
输出被发现只是原始表达式的格式化(二维)InputForm
。这正是我们所需要的
但如何做到这一点呢?
首先,为符号
定义,如图形
,点
等。通过评估以下内容,可以获得此类符号
的完整列表:
list = Symbol /@
Select[DeleteCases[Names["*"], "I" | "Infinity"],
ToExpression[#, InputForm,
Function[symbol, Length[FormatValues@symbol] > 0, HoldAll]] &]
我的第一个想法就是Block
所有这些Symbol
s(它可以工作!):
但此方法导致对所有这些Symbol
s进行求值,并对$ContextPath
中所有Symbol
的所有格式值进行求值。我认为应该避免
阻止这些格式值的另一种方法就是从$ContextPath
中删除上下文“系统”
。但只有当这些符号
尚未解析为系统`
上下文时,它才起作用。因此,我们首先需要将表达式转换为字符串
,然后从$ContextPath
中删除系统`
上下文,最后将字符串向后转换为原始表达式。然后,所有新的符号
都将与当前的$Context
(以及图形
,点
等关联,因为它们不在$ContextPath
中)。为了防止上下文隐藏冲突和乱扔“全局”
上下文,我将$context
切换到“myTemp”
,必要时可以轻松清除
这就是myInputForm
的工作原理
现在关于shortInputForm
。其思想不仅是显示myInputForm
的缩短版本,还保留了选择并将部分缩短代码复制到新输入单元格中的功能,并使用此代码,因为它将是没有缩写的完整代码。在版本6和更高版本中,可以通过解释实现后者。为了与Mathematica
的6个之前版本兼容,我添加了一段代码,如果$VersionNumber
小于6,则会删除此功能
使用解释
时,我面临的唯一问题是它没有SequenceHold
属性,因此我们不能简单地将序列
指定为解释
的第二个参数。但是,通过将序列包装在列表中,然后对其应用ing序列,可以很容易地避免此问题:
System`Sequence @@ # &
请注意,我需要为我使用的所有内置符号指定确切的上下文,因为在调用它们时,“系统”
上下文不在$ContextPath
中
这就结束了我在开发这些功能时做出的非标准决策。欢迎提出建议和意见
你能解释一下“Mathematica代码”是什么意思吗?最基本的表示形式是FullForm,您已经说过FullForm不是您想要的。@DeepYellow如果您计算Table[a,{100}]//InputForm
,您将得到outputCell
,您不能通过双击它来选择整个表达式。按Ctrl+Shift+E显示单元格
表达式的形式为:单元格[“\”,“输出”]
。但是如果您计算表[a,{100}]
您将得到另一个单元格
表达式:单元格[BoxData[RowBox[{{],RowBox[{a],“,”,…,“a”}],“}”,“Output”]
。据我所知,在第一种情况下,单元格
只包含一个字符串
,但在第二种情况下,它包含Mathematica的代码(前端“理解”为代码)。如果您还不知道,我想提请您注意Short
。但这并不能真正解决你的问题Plot[{Sin[x],.5sin[2x]},{x,0,2\[Pi]},Filling->{1->{2}]//(InputForm//(Short[#,10]&)
Alexey,我对这个问题和这个问题都投了赞成票,但我认为你应该对它的作用和作用方式进行解释。
list = Symbol /@
Select[DeleteCases[Names["*"], "I" | "Infinity"],
ToExpression[#, InputForm,
Function[symbol, Length[FormatValues@symbol] > 0, HoldAll]] &]
myInputForm[expr_] :=
With[{list = list}, Block[list, RawBoxes@MakeBoxes@expr]]
System`Sequence @@ # &