Wolfram mathematica 解释输入单元格框表达式时遇到的问题

Wolfram mathematica 解释输入单元格框表达式时遇到的问题,wolfram-mathematica,Wolfram Mathematica,如何将从单元格表达式提取的任意框规范转换为输入表达式 这是我在回答问题时遇到的一个问题。在这种情况下,模式匹配被用来从使用Import读取的笔记本表达式中提取盒子规格 我认为ToExpression或MakeExpression可以完成框解释的工作,但在某些情况下,它们不能 考虑包含以下表达式的输入单元格: StringForm["a = ``", 1] Cell[BoxData[ RowBox[{"StringForm", "[", RowBox[{"\"\<\!\(\* St

如何将从单元格表达式提取的任意框规范转换为输入表达式

这是我在回答问题时遇到的一个问题。在这种情况下,模式匹配被用来从使用
Import
读取的笔记本表达式中提取盒子规格

我认为
ToExpression
MakeExpression
可以完成框解释的工作,但在某些情况下,它们不能

考虑包含以下表达式的输入单元格:

StringForm["a = ``", 1]
Cell[BoxData[
 RowBox[{"StringForm", "[", 
  RowBox[{"\"\<\!\(\*
StyleBox[\"a\",
FontSlant->\"Italic\"]\) = ``\>\"", ",", " ", "1"}], "]"}]], "Input"]
此类单元格的单元格表达式如下所示:

Cell[BoxData[
 RowBox[{"StringForm", "[", 
  RowBox[{"\"\<a = ``\>\"", ",", " ", "1"}], "]"}]], "Input"]

但是现在考虑下面的输入表达式:

StringForm["a = ``", 1]
Cell[BoxData[
 RowBox[{"StringForm", "[", 
  RowBox[{"\"\<\!\(\*
StyleBox[\"a\",
FontSlant->\"Italic\"]\) = ``\>\"", ",", " ", "1"}], "]"}]], "Input"]
StringForm[“a=``',1]

你必须仔细观察才能看到区别:
a
是斜体。以下是相应的单元格表达式:

StringForm["a = ``", 1]
Cell[BoxData[
 RowBox[{"StringForm", "[", 
  RowBox[{"\"\<\!\(\*
StyleBox[\"a\",
FontSlant->\"Italic\"]\) = ``\>\"", ",", " ", "1"}], "]"}]], "Input"]
出现以下错误:

StringForm::string : String expected at position 1 in StringForm[]\) = '',
FontSlant->"\~\(\*\nStyleBox["a Italic, 1].
许多(如果不是全部的话)内联字符串框转义序列也会发生同样的错误。我已经尝试显式地将表单指定为
ToExpression
MakeExpression
,但是我得到了相同的错误。这就引出了我的问题


要模拟Mathematica从输入单元格表达式解释方框的方式,我必须做些什么?

老实说,我不知道您想做什么,但我怀疑您需要使用前端本身进行处理。以下是一个通用示例:

FrontEndExecute@FrontEnd`CellPrint[
  BoxData[RowBox[{"StringForm", "[", RowBox[{"\"\<\!\(\*
         StyleBox[\"a\",
         FontSlant->\"Italic\"]\) = ``\>\"", ",", " ", "1"}], "]"}]]
]
FrontEndExecute@FrontEnd`手机打印[
BoxData[RowBox[{“StringForm”,“[”,RowBox[{“\”\“Italic\”]\)=````\>\”,“,”,“,”,“,”,“1”},“]]]
]

但是,我不知道您实际想要什么格式。

我认为这是一个bug。以下是我测试的几个示例的解决方法:

Clear[toExpression];
toExpression[bd_BoxData] :=
   ToExpression[bd /.
      s_String :>
         StringReplace[
            StringReplace[s, "\n" :> ""],
            ShortestMatch[(start : "\(\*") ~~ body__ ~~ (end : "\)")] :> 
                   StringJoin[start, StringReplace[body, "\"" :> "\\\""], end]
         ]
   ];
例如,我们从您的案例开始:

In[747]:= 
 BoxData["\"\<\!\(\*
    StyleBox[\"a\",
       FontSlant->\"Italic\"]\) = ``\>\""]//toExpression

Out[747]= a = ``
[747]中的
:=
BoxData[“\”\“Italic\”]\)=```\>\”“]///toExpression
Out[747]=a=``
如果我们现在检查单元格,它是:

BoxData["\<\"\\!\\(\\*StyleBox[\\\"a\\\",FontSlant->\\\"Italic\\\"]\\)\ = ``\"\>"]
BoxData[“\”]
而不是

BoxData["\"\<\!\(\*StyleBox[\"a\",FontSlant->\"Italic\"]\) = ``\>\""]
BoxData[“\\”Italic\“]\)=```\>\\\\\\\']
(这是删除了换行符的初始值)。我认为,从一开始就应该如此。现在:

In[746]:= ToExpression@
   BoxData["\<\"\\!\\(\\*StyleBox[\\\"a\\\",FontSlant->\\\"Italic\\\"]\\) = ``\"\>"]

Out[746]= a = ``
[746]中的
:=ToExpression@
BoxData[“\”]
Out[746]=a=``
所以这已经很好了


我不知道这有多普遍,但它似乎对我尝试过的例子有效。主要的问题是,当“字符串化”像
a
Italic
这样的东西时,它应该是
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
而不是
\\\\\\\\\\\\\'
-转义本身的转义丢失了。

@请注意,我最初的解决方案并不完全正确-正如我刚刚发现的,它在更复杂的表达式上失败了。我对它做了一点修改-现在它似乎工作正常。你的更新版本处理了我遇到的所有冲突。我会再推迟一段时间,以防有其他想法。我倾向于同意这里有一个bug,但我无法动摇我正在丢失一些基本的东西的感觉。。。或者可能只是徒劳地希望解析器没有使用我们无法使用的隐藏函数。@我认为这与以下简单示例中发生的信息丢失类型相同:
ToExpression[ToString[“a”]]//Head
(返回
Symbol
ToExpression
降低了字符串的“字符串化”(不知道如何更好地表达)级别。因此,要在
之后有一个字符串来表示
,我们应该在这里使用
“\'a\”
。手头的情况本质上是一样的,但我们谈论的是更深一层的:“2级”严格化,其中的错误似乎是只使用了“1级”。@顺便说一句,祝贺10K!在原始链接问题的上下文中,目标是从使用
Import
NotebookGet
获得的单元格表示中重构输入表达式。我很惊讶地发现
ToExpression
不足以完成这项任务。