Wolfram mathematica 制作定制输入表单和短输入表单

Wolfram mathematica 制作定制输入表单和短输入表单,wolfram-mathematica,mathematica-frontend,Wolfram Mathematica,Mathematica Frontend,我经常希望看到Mathematica图形对象的内部表示形式不是在FullForm中,而是在可读性更高的InputForm中,它能够通过双击选择部分代码,并轻松地将此代码复制到新的输入单元格。但是默认的InputForm不允许这样做,因为InputForm默认显示为字符串,而不是Mathematica的代码。有没有办法将InputForm显示为Mathematica的代码 我还经常希望看到这种InputForm的缩短版本,其中所有长的坐标列表都显示为第一个坐标,后面是用Skeleton包装的跳过的

我经常希望看到Mathematica图形对象的内部表示形式不是在
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
,您将得到output
Cell
,您不能通过双击它来选择整个表达式。按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 @@ # &