如何在源级别区分2个笔记本?

时间:2011-06-30 00:29:13

标签: wolfram-mathematica

任何人都知道在源级别找到两个笔记本之间差异的工具吗?

工作台2中的比较笔记本工具似乎在内部数据结构级别工作,这对我没用。我正在寻找能够查看源级差异的工具(在查看笔记本时看到的内容,即不是FullForm)。

我在Windows上使用Mathematica的V8。

EDIT1:

如何以更易读的形式显示NotebookDiff的输出/报告?

enter image description here

3 个答案:

答案 0 :(得分:10)

这个答案是基于对该问题其他部分的评论中的讨论。 它也可以(并且应该)自动化,如果它将被用于任何规律性。 这可以通过标记您想要比较的单元格并使用NotebookFind来查找要提取和比较的单元格来完成。


仅比较单个大型代码单元的解决方案(有时在制作demonstrations时会发生)是从两个笔记本复制InputForm中的代码

enter image description here

并将其粘贴到一个简单的差异工具中,例如Quick Diff Online 然后会为您显示标准差异:

enter image description here

上述代码取自one of Nasser's demonstrations


另一种选择是使用CellDiff包中的AuthorTools

Needs["AuthorTools`"];
CellDiff[Cell["Some text.", "Text"], 
         Cell["Some different text.", "Text"]]

CellDiff

要在演示中使用,您可以通过右键单击单元格括号来复制两个版本中的单元格表达式:

enter image description here

答案 1 :(得分:9)

内置附加组件($InstallationDirectory/AddOns/Applications)中有一个名为AuthorTools的未记录的软件包。加载后,它会公开NotebookDiff函数,该函数提供一些基本的差异功能:

Needs["AuthorTools`"];

nb1 = NotebookPut[
  Notebook[{Cell["Subsection heading", "Subsection"], 
    Cell["Some text.", "Text"]}]];

nb2 = NotebookPut[
  Notebook[{Cell["Edited Subsection heading", "Subsection"], 
    Cell["Some different text.", "Text"]}]];

NotebookPut@NotebookDiff[nb1, nb2]

由于此软件包未记录,请注意它可能存在错误并且不被视为受支持的功能,但希望您仍然觉得它很有用。

请注意,您还可以使用例如:

获取笔记本电脑的句柄
nb1 = NotebookOpen["path/to/a/notebook.nb"]

以及当前在前端打开的笔记本列表

Notebooks[]

答案 2 :(得分:2)

如果您必须使用笔记本电脑,那么AuthorTools中的NotebookDiff可能是您最好的选择。如果这是您的工作流程的重要部分(由于版本控制或其他一些约束)并且您有一些灵活性,您可能需要考虑将代码从现有笔记本(.nb)移动到包文件(.m)中,将保存为纯文本。您仍然可以在Mathematica笔记本前端打开和编辑包文件,但是您还可以使用现有的文本差异工具来区分它们。