开发者

How to diff 2 notebooks at the source level?

Any one knows a tool to find difference between 2 notebooks at the source level?

The compare notebooks tool in workbench 2 seems to work at the internal data structure level which is not useful for me. I am looking for tool that looks at differences at the source level (what one sees when looking at a notebook, i.e. not the FullForm).

I am using V8 of Mathematica on windows.

EDIT1:

How I display the output/report from Note开发者_开发知识库bookDiff in a more readable form?

How to diff 2 notebooks at the source level?


This answer is based on discussion in the comments to other parts of this question. It also could (and should) be automated if it's going to be used with any regularity. This could be done by tagging the cells you want compared and using NotebookFind to find the cells for extraction and comparison.


A solution for comparing just a single large cell of code (as sometimes occurs when makeing demonstrations) is to copy the code in InputForm from both notebooks

How to diff 2 notebooks at the source level?

and paste it into a simple diff tool such as Quick Diff Online which will then display the standard diff for you:

How to diff 2 notebooks at the source level?

The above code was taken from one of Nasser's demonstrations.


Another option is to use CellDiff from the AuthorTools package.

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

How to diff 2 notebooks at the source level?

To use on your demonstrations you can copy the cell expressions from the two versions by right clicking on the cell brackets:

How to diff 2 notebooks at the source level?


There is an undocumented package in the built-in add-ons (in $InstallationDirectory/AddOns/Applications) called AuthorTools. Once loaded, it exposes a NotebookDiff function which provides some basic diff features:

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]

As this package is undocumented, please realize it is potentially buggy and is not considered a supported feature, but hopefully you still find it useful.

Note that you can also get handles to notebooks with e.g.:

nb1 = NotebookOpen["path/to/a/notebook.nb"]

and a list of notebooks currently open in the front end

Notebooks[]


If you must work with notebooks then NotebookDiff in AuthorTools is probably your best bet. If this is an important part of your workflow (due to version control or some other constraint) and you have some flexibility you may want to consider moving the code from the existing notebook (.nb) into a package file (.m), which will be saved as plain text. You can still open and edit package files in the Mathematica notebook front end, but you get the added benefit of being able to diff them using existing text diffing tools.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜