wolfram-mathematica - 帮助格式化我的笔记本。从 'code' 样式到输入样式

标签 wolfram-mathematica

我做了一些我认为很愚蠢的事情。

我将我的单元格样式更改为“代码”并开始更改缩进并按照我喜欢的方式移动代码(因为在“代码”单元格样式中更容易做到这一点,因为笔记本界面不会妨碍)。但是在尝试了一段时间后,我发现这种风格还有其他问题。

现在我将样式改回“输入”。但是现在所有的代码中都有所有这些额外的空格,并且代码看起来不再像原始“输入”样式那样好。

我对代码进行了太多编辑和手动格式化。

有没有办法告诉 Mathematica 将代码“自动格式化”回默认输入样式?即在需要的地方删除所有额外的空间,按照原样重新排列事物,等等......

如果我必须手动执行此操作,将永远带我。我找不到这样的选项。我在菜单上尝试了很多选项,但没有任何帮助。

附:在 Matlab 中,这很简单,只需选择所有代码,然后从菜单中选择“smart-ident”,它就会这样做。

附:我试过 emacs Mathematica 模式,它们也没有 pretty-print 。

编辑

我尝试了这些:选择单元格,然后选择单元格->转换为,并选择“InputForm”并选择“输入表单显示”。

这似乎已经删除了所有额外的空格。哪个好。现在我只需要在所有正确的地方点击返回即可将其恢复到原始形式。

至少这比手动删除空格要好得多。所以,灾难似乎暂时被遏制了。

编辑

将“代码”样式转换回“标准格式”后的屏幕截图。很难读。

enter image description here
谢谢,

编辑

为了确定问题是什么,给定一些 Mathematica 代码,它被“弄乱”了,并通过手动空格插入和手动插入返回手动格式化,现在如果我只是把它放在一个默认样式的笔记本中,我希望它智能缩进回默认设置,并拥有所有换行等......就好像它最初是以默认样式编写的一样。即如果它是使用“输入”代码样式编写的,那么它会被漂亮地打印出来。

这是我手工格式化的一个小函数作为示例。当我将其粘贴到此处时,它的格式看起来会更加糟糕。如果您将此代码复制到您的笔记本中,默认样式,那么如何将其自动格式化回默认设置而无需手动操作?

If[Abs@omega <= $MachineEpsilon,
    (
      data = {{0, 0}};
      p    = ListPlot[data, Sequence@plotOptions]
     ),
    (
      driverPeriod            = 2. Pi/Abs@omega;
      valuesOfDriverAmplitude = 
    Range[aStart, aStart + aLen, aLen/aIntervals];
      timeValues              = 
    Range[initialDriverPeriod*driverPeriod, 
     finalDriverPeriod*driverPeriod, driverPeriod ];

      data  = 
    Table[0, {Length[valuesOfDriverAmplitude]}, {Length[timeValues ]}];
      total = Length[timeValues]*Length[valuesOfDriverAmplitude];
      bifurcationProgress = 0.;
      count = 0.;

      Do[
         (
           {x1, x2, x3} = 
      solve[q, valuesOfDriverAmplitude [[i]], omega, phase, 
       initialDriverPeriod*driverPeriod,
                                (finalDriverPeriod)*driverPeriod, x10,
        x20, isDamped, 4, 4];
           currentTorqueAmplitude = valuesOfDriverAmplitude[[i]];
           Do[
              (

       data[[i, j]] = {currentTorqueAmplitude, x2[timeValues[[j]]  ]};
                count      += 1;
                bifurcationProgress = count/total;
               ),
                {j, 1, Length[timeValues]}
              ]
          ),
         {i, 1, Length[valuesOfDriverAmplitude]}
         ];

     p = ListPlot[Flatten[data, 1], Sequence@plotOptions]
     )
  ];

编辑
下午 6 点

1) 将笔记本保存为名为 aclFix.m 的 m 文件(mathematica 包)
2)然后我做了以下
str=Import["aclFix.m")

也试过
str=Get["aclFix.m"];

但在这两种情况下,我得到的只是屏幕上显示的实际操纵。下面显示的命令(StringReplace 等....)对它不起作用,因为它不是字符串。我收到很多错误,例如
    StringReplace::strse: String or list of strings expected at position 1 in 
StringReplace[Manipulate[<<1>>,
{{aStart,0.9,},0,2,0.01,ImageSize->Tiny,ImagePadding->0,ControlPlacement->1},
{{aLen,0.2,},0.01,2,0.01,ImageSize->Tiny,ImagePadding->0,ControlPlacement->2},
<<45>>,SynchronousUpdating->False,ContinuousAction->False,<<6>>],
{(x_/;x==FromCharacterCode[32])..->,(x_/;x==<<17>>[9])..->}]. >>

可能是我误解了解决方案..

编辑
凌晨 1 点

我将笔记本导出为“m”文件,将其导入为
str = Import["aclFix.m", "Text"];

然后
code=StringReplace[str, {(x_ /; x == FromCharacterCode[32]) .. -> 
   "", (x_ /; x == FromCharacterCode[9]) .. -> ""}]

然后
Export["fix.m", code]

但它仍然是一个字符串。当我将它导入回来时,它仍然是一个字符串。我试过
ToExpression[code] 但它什么也没做。如何将其转换为实际代码?这是使用文本编辑器查看 .m 的示例。我使用上面的代码对其进行了测试。也许我们正在接近这里?

会多看的。
(* Created by Wolfram Mathematica 8.0 for Students - Personal Use Only : www.wolfram.com *)

"If[Abs@omega<=$MachineEpsilon,\n(\ndata={{0,0}};\np=ListPlot[data,Sequence@p\

lotOptions]\n),\n(\ndriverPeriod=2.Pi/Abs@omega;\nvaluesOfDriverAmplitude=\nR\

ange[aStart,aStart+aLen,aLen/aIntervals];\ntimeValues=\nRange[initialDriverPe\

riod*driverPeriod,\nfinalDriverPeriod*driverPeriod,driverPeriod];\n\ndata=\nT\

able[0,{Length[valuesOfDriverAmplitude]},{Length[timeValues]}];\ntotal=Length\

[timeValues]*Length[valuesOfDriverAmplitude];\nbifurcationProgress=0.;\ncount\

=0.;\n\nDo[\n(\n{x1,x2,x3}=\nsolve[q,valuesOfDriverAmplitude[[i]],omega,phase\

,\ninitialDriverPeriod*driverPeriod,\n(finalDriverPeriod)*driverPeriod,x10,\n\

x20,isDamped,4,4];\ncurrentTorqueAmplitude=valuesOfDriverAmplitude[[i]];\nDo[\

\n(\n\ndata[[i,j]]={currentTorqueAmplitude,x2[timeValues[[j]]]};\ncount+=1;\n\

bifurcationProgress=count/total;\n),\n{j,1,Length[timeValues]}\n]\n),\n{i,1,L\

ength[valuesOfDriverAmplitude]}\n];\n\np=ListPlot[Flatten[data,1],Sequence@pl\

otOptions]\n)\n];"

最佳答案

有一个代码示例(不仅仅是视觉)会很有用。与此同时,也许这会奏效:

将您的代码保存在一个 m 文件中。然后将其导入变量str ,然后运行这个

StringReplace[str,
 {
  (x_ /; x == FromCharacterCode[32]) .. -> "",
  (x_ /; x == FromCharacterCode[9]) .. -> ""
  }
 ]

并将结果保存到另一个 m 文件中。这样做是删除所有系列的一个或多个空格或制表符。因此,如果例如
str =
 "f[
    g[
        u   ]]"

(其中包含空格和制表符)然后运行我给出的代码
f[
g[
u]]

您可以将其保存回一个 m 文件。

如果这不能满足您的要求,那么如果您提供一段格式错误的代码可能会有所帮助。

(或者您可以尝试使用 emacs 中的交互式正则表达式构建器: m-x re-builder ,但如果您不熟悉正则表达式,则可能不值得)

关于wolfram-mathematica - 帮助格式化我的笔记本。从 'code' 样式到输入样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7369276/

相关文章:

wolfram-mathematica - 如何在 BodePlot 上设置刻度?

wolfram-mathematica - Mathematica、Arg 和简化

image-processing - Mathematica 的 TextRecognize 达不到标准

wolfram-mathematica - 从嵌套列表中快速提取元素

wolfram-mathematica - 数学 : ListLinePlot & RegionFunction - a bug or a documentation issue?

wolfram-mathematica - 何时在 Mathematica 中使用 Hold/ReleaseHold?

javascript - 使用 Canvas 和 javascript 的核心数学和 3d 形状

matrix - 线性求解数学

wolfram-mathematica - 操纵不处理大量数字

wolfram-mathematica - 如何在不评估符号的情况下阻止符号?