gpt4 book ai didi

wolfram-mathematica - 制作自定义输入表单和短输入表单

转载 作者:行者123 更新时间:2023-12-05 00:03:58 27 4
gpt4 key购买 nike

我经常希望看到不在 FullForm 中的 Mathematica 图形对象的内部表示。但更具可读性 InputForm能够通过双击选择部分代码,并轻松将此代码复制到新输入 Cell .但默认InputForm不允许这样做,因为 InputForm默认显示为 String ,而不是 Mathematica 的代码。有没有办法拥有InputForm显示为 Mathematica 的代码?

我也经常希望看到这样的缩短版本 InputForm其中所有长坐标列表都显示为第一个坐标,后跟用 Skeleton 包裹的跳过坐标值的数量。 , 全部为空 Lists删除,所有数字也被缩短显示不超过 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]}}]

(请注意, -0.9999998592131705 被转换为 -1.1.2822827157509358*^-7 被转换为 1.28228*^-7Hue[0.9060679774997897, 0.6, 0.6] 被转换为 Hue[0.91, 0.6, 0.6] )。

这样,我希望得到 InputForm 的输出作为 Mathematica 的代码,还有一个 ShortInputForm函数将给出此代码的缩短版本。有谁能够帮助我?

至于问题的第一部分,我找到了一种方法来实现我想要的:
Plot[{Sin[x], .5 Sin[2 x]}, {x, 0, 2 \[Pi]}, Filling -> {1 -> {2}}] //
InputForm // StandardForm

最佳答案

更新
shortInputForm的最新版本功能可以找到here .

原帖

这是另一个更好的解决方案(与 Mathematica 5 兼容):

myInputForm[expr_] := 
Block[{oldContexts, output, interpretation, skeleton},
output = ToString[expr, InputForm];
oldContexts = {$Context, $ContextPath};
$Context = "myTemp`"; $ContextPath = {$Context};
output = DisplayForm@ToBoxes[ToExpression[output] /.
{myTemp`interpretation -> If[$VersionNumber >= 6,
System`Interpretation, System`First@{#} &],
myTemp`Row -> System`Row,
myTemp`skeleton -> System`Skeleton,
myTemp`sequence :> (System`Sequence @@ # &)}, StandardForm];
{$Context, $ContextPath} = oldContexts; output]
shortInputForm[expr_] := myInputForm[expr /. {{} -> Sequence[],
lst : {x_ /; VectorQ[x, NumberQ], y__} /;
(MatrixQ[lst, NumberQ] && Length[lst] > 3) :>
{x /. v : {a_, b__} /; Length[v] > 3 :>
{a, interpretation[skeleton[Length[{b}]], sequence@{b}]},
interpretation[skeleton[Length[{y}]], sequence@{y}]},
lst : {x_, y__} /; VectorQ[lst, NumberQ] && Length[lst] > 3 :>
{x, interpretation[skeleton[Length[{y}]], sequence@{y}]}}]

这个怎么运作

这个解决方案基于一个简单的想法:我们需要阻止诸如 Graphics 之类的东西的转换。 , Point及其他 to typeset expressions为了让它们以内部形式显示(作为适合输入的表达式)。令人高兴的是,如果我们这样做,结果 StandardForm发现输出刚刚格式化(二维) InputForm的原始表达。这正是所需要的!

但是如何做到这一点呢?
首先, this conversion is made by FormatValues 定义为 Symbol喜欢 Graphics , Point等等。可以得到这样的完整列表 Symbol s 通过评估以下内容:
list = Symbol /@ 
Select[DeleteCases[Names["*"], "I" | "Infinity"],
ToExpression[#, InputForm,
Function[symbol, Length[FormatValues@symbol] > 0, HoldAll]] &]

我的第一个想法就是 Block所有这些 Symbol s(它有效!):
myInputForm[expr_] := 
With[{list = list}, Block[list, RawBoxes@MakeBoxes@expr]]

但是这种方法导致了所有这些 Symbol的评价s 并且还评估所有 FormatValues所有 Symbol s 在 $ContextPath .我认为应该避免。

阻止这些的其他方法 FormatValues只是为了删除上下文 "System`"来自 $ContextPath .但它只有在这些 Symbol 时才有效s 尚未解析到 "System`"语境。所以我们首先需要将我们的表达式转换为 String ,然后删除 "System`"来自 $ContextPath 的上下文最后将字符串向后转换为原始表达式。那么全新 Symbol s 将与当前 $Context 相关联(和 GraphicsPoint 等 - 同样,因为它们不在 $ContextPath 中)。用于防止上下文阴影冲突和乱扔垃圾 "Global`"上下文我切换 $Context"myTemp`"如有必要,可以轻松清除。

就是这样 myInputForm作品。

现在关于 shortInputForm .这个想法不仅仅是显示 myInputForm 的缩短版本但也保留了选择和复制部分缩短代码到新输入单元格的能力,并使用此代码,因为它是没有缩写的完整代码。在版本 6 及更高版本中,可以使用 Interpretation 实现后者。 .与 Mathematica 的 pre-6 版本兼容我添加了一段代码,如果 $VersionNumber 删除此功能小于 6。

我在使用 Interpretation 时遇到的唯一问题是它没有 SequenceHold属性,所以我们不能简单地指定 Sequence作为 Interpretation 的第二个参数.但是这个问题可以很容易地通过在 List 中包装序列来避免。然后 Apply ing Sequence给它:
System`Sequence @@ # &

请注意,我需要为所有内置 Symbol 指定确切的上下文。我使用是因为在调用它们时 "System`"上下文不在 $ContextPath 中.

这结束了我在开发这些功能时做出的非标准决定。欢迎提出建议和意见!

enter image description here

关于wolfram-mathematica - 制作自定义输入表单和短输入表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6224185/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com