MathGroup Archive 2007

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Version 6 "Mathematica Book" - updated and expanded

  • To: mathgroup at smc.vnet.net
  • Subject: [mg79992] Re: Version 6 "Mathematica Book" - updated and expanded
  • From: David Bailey <dave at Remove_Thisdbailey.co.uk>
  • Date: Fri, 10 Aug 2007 01:49:40 -0400 (EDT)
  • Organization: Posted via Supernews, http://www.supernews.com
  • References: <f9emqd$lrk$1@smc.vnet.net>

thomas wrote:
> Hello,
> 
> thank you for the nice feedback on my code for generating a virtual
> "Mathematica Book" for version 6. I am sorry that the initial code was
> not platform independent, that occurred to me a bit late, and other
> have posted corrections for that in the meantime.
> 
> I have kept working on the code, and have incorporated some of the
> changes suggested by others. Below you find an updated and expanded
> version. The changes are:
> 
> - correct hyperlinks, even to the "New" tutorial topics (the structure
> of the "New" files is slightly more sophisticated than the older ones,
> the hyperlinks were not reproduced correctly)
> 
> - links to ALL tutorial files in the documentation, not only the ones
> that are reached by links in "The Mathematica book" (which includes
> files that were previously found in the "Getting started" section of
> the v5.2 help system, and in the "Reference guide" of the Mathematica
> book, and various other files). I have tried to put this files into
> reasonable order, and may or may not have succeeded.
> 
> - links to all tutorials and guides of the packages.
> 
> I hope that the code does work on non-Windows platforms, I have no way
> of testing this by myself.
> 
> Best, Thomas
> 
> Code follows:
> 
> (* -==- Make "The Mathematica Book" based on "...Overview.nb" files \
> in the tutorials directory -==- *)
> 
> fn = FileNames["*Overview.nb",
>    ToFileName[{$InstallationDirectory, "Documentation", "English",
>      "System", "Tutorials"}]];
> (*Find "Overview.nb" files in the tutorials-directory*)
> 
> nameList = {StringTake[#, {StringPosition[#, $PathnameSeparator][[-1,
>          1]] + 1, -12}],
>      "paclet:tutorial/" <>
>       StringTake[#, {StringPosition[#, $PathnameSeparator][[-1, 1]] +
>          1, -4}], #} & /@ fn;
> (*create a list of strings needed for future code*)
> 
> Do[nameList[[i, 1]] =
>    "New: " <> nameList[[i, 1]], {i, {3, 6, 7, 8, 18, 28, 29, 40, 41,
>     46, 48}}];
> (*mark the chapter not present in v5.2 with "New: "*)
> 
> orderOfChapters = {{36, 3, 8, 31, 4, 47, 1, 39, 32, 14, 20, 16, 18,
>     17, 11, 43}, {10, 13, 35, 48, 22, 45, 9, 27, 38, 42, 44, 23, 12,
>     26, 15, 40, 41}, {30, 25, 2, 21, 5, 7, 37, 19, 33, 34, 28, 29, 6,
>     46, 24}};
> (*The file list is alphabetical-this is the order in which the \
> chapters should appear*)
> 
> structure = Table[nameList[[i]], {k, 3}, {i, orderOfChapters[[k]]}];
> (*needed for the code further down-represents the structure of the \
> Mathematica book*)
> 
> mainChapters = {"Getting Started",
>    "A Practical Introduction to Mathematica",
>    "Principles of Mathematica", "Advanced Mathematics in Mathematica",
>     "Reference Guide", "Further Tutorials", "Packages"};
> (*The three main headings*)
> 
> beautify[ugly_] :=
>   StringReplace[
>    StringReplace[
>     ugly, {l1_?LowerCaseQ ~~ l2_?UpperCaseQ :>
>       l1 <> " " <> l2}], {" And " -> " and ", " Of " -> " of ",
>     " In " -> " in ", " The " -> " the ", " For " -> " for "}];
> (* based on code by Selwyn Hollis - Thanks! *)
> 
> d[x_, style_: "Section", margin_: {{36, 0}, {5, 5}}] :=
>  Module[{sectitle = beautify[x[[1]]]},
>   Cell[BoxData[
>     ButtonBox[
>      PaneSelectorBox[{False -> sectitle,
>        True -> StyleBox[sectitle, "HyperlinkActive"]},
>       Dynamic[CurrentValue["MouseOver"]]],
>      BaseStyle -> {"Link", style}, ButtonData -> x[[2]],
>      ButtonNote -> x[[2]]]], style, CellDingbat -> None,
>    ShowGroupOpener -> True, CellMargins -> margin]]
> (* Cell representing a hyperlink to a file *)
> 
> nb = NotebookPut[]; SetOptions[nb,
>  StyleDefinitions -> ToFileName["Wolfram", "Reference.nb"]];
> (*Open new Notebook*)
> 
> NotebookWrite[
>   nb, {Cell[
>     Row[{ToBoxes[
>        Import[ToFileName["ExampleData", "spikey.tiff"], "Graphics",
>         ImageSize -> 70]],
>       Cell["The Virtual Mathematica Book (v6)", "Title",
>        TextAlignment -> Center]}], "Title", TextAlignment -> Center],
>    Cell["A collection of links to the tutorials present in the \
> Mathematica 6.0 Documentation Center, arranged in the order of \
> chapters in \"The Mathematica Book\".", "Text",
>     TextAlignment -> Center]}];
> (* Print the titel *)
> 
> Do[NotebookWrite[nb,
>    Cell[StringJoin[Table["xxxxxxxxxx", {k}]], "Text"]];
>   If[2 <= k <= 4,
>    Do[NotebookWrite[nb, d[i]];
>     With[{nb1 = NotebookOpen[i[[3]], Visible -> False]},
>      SelectionMove[nb1, All, Notebook];
>      NotebookWrite[nb, NotebookRead[nb1] //.
>        {"TOCChapter" ->
>          Sequence @@ {"Subsection", CellDingbat -> None,
>            ShowGroupOpener -> True,
>            CellMargins -> {{48, 0}, Inherited}},
>         "TOCSection" ->
>          Sequence @@ {"Subsubsection", CellDingbat -> None,
>            ShowGroupOpener -> True,
>            CellMargins -> {{58, 0}, Inherited}},
>         "TOCSubsection" ->
>          Sequence @@ {"Subsubsubsection", CellDingbat -> None,
>            ShowGroupOpener -> True,
>            CellMargins -> {{68, 0}, Inherited}},
>         "TOCSubsubsection" ->
>          Sequence @@ {"Text", CellDingbat -> None,
>            ShowGroupOpener -> True,
>            CellMargins -> {{78, 0}, Inherited}},
>         ShowCellBracket -> True}];
>      NotebookClose[nb1]],
>     {i, structure[[k - 1]]}]
>    ],
>   {k, Length[mainChapters]}];
> (*write all the links to the main chapters, as well as to \
> sub-chapters*)
> 
> Do[NotebookFind[nb, cellsToDelete, All, CellStyle];
>   NotebookDelete[
>    nb], {cellsToDelete, {"SymbolColorBar", "AnchorBarGrid",
>     "FooterCell", "TOCDocumentTitle"}}];
> (* Delete unnecessary styling cells that are part of the tutorial \
> notebooks *)
> 
> SetOptions[nb,
>   StyleDefinitions -> ToFileName["Book", "Textbook.nb"]];
> Do[NotebookFind[nb, StringJoin[Table["xxxxxxxxxx", {k}]], All];
>   SelectionMove[nb, All, Cell];
>   NotebookWrite[nb,
>    Cell[mainChapters[[k]], "Subtitle", ShowGroupOpener -> True,
>     CellMargins -> {{10, 0}, {5, 10}},
>     CellTags -> "Section" <> ToString[k],
>     CellFrame ->
>      If[MemberQ[{1, 6, 7}, k], {{0, 0}, {0, 2}}, False]]], {k,
>    Length[mainChapters], 1, -1}];
> (* Finishing touches *)
> 
> (* -==- Add links to tutorials that are not linked yet -==- *)
> 
> SelectionMove[nb, All, Notebook];
> links = StringCases[ToString[NotebookRead[nb], InputForm],
>    Shortest[("\"paclet:tutorial/" ~~ y__ ~~ "\"")] :> y];
> (* Extract all links to tutorials present in "The Book"... *)
> 
> linkedFiles =
>   Union[Flatten[
>     If[StringFreeQ[#, "#" ~~ DigitCharacter ...], # <> ".nb",
>        StringCases[#, (y__ ~~ "#" ~~ DigitCharacter ...) :>
>          y <> ".nb"]] & /@ links]];
> (* ... and their filenames *)
> 
> allTutorials =
>   Flatten[StringTake[#, {StringPosition[#, $PathnameSeparator][[-1,
>          1]] + 1, -1}] & /@
>     FileNames["*.nb",
>      ToFileName[{$InstallationDirectory, "Documentation", "English",
>        "System", "Tutorials"}]]];
> (* all tutorials in the tutorial directory *)
> 
> notUsed = Complement[allTutorials, linkedFiles];
> (* all tutorials not linked to in "The Book" so far (in alphabetical \
> order); these are 76 tutorial notebooks *)
> 
> nameList = {StringTake[#, {1, -4}],
>      "paclet:tutorial/" <> StringTake[#, {1, -4}],
>      ToFileName[{$InstallationDirectory, "Documentation", "English",
>         "System", "Tutorials"}] <> #} & /@ notUsed;
> (*create a list of strings needed for future code*)
> 
> GettingStarted = {21, 18, 75}; GraphPlotting = {27, 28, 36,
>   71}; MathematicaReferenceGuide = {7, 31, 64, 19, 57, 20, 37, 33,
>   30}; MatrixAndVectorOperations = {10, 26, 6, 3, 73, 16, 42, 45, 62,
>   52, 65, 69}; Statistics = {11, 15, 13, 58}; DynamicFeatures = {35,
>   2, 34, 1}; SystemSpecificTopics = {17, 32, 60, 50, 51, 53, 41, 44,
>   38, 39, 40}; FurtherNDSolveTutorials = {46, 47, 48,
>   49}; FrontendAndFormattingTopics = {5, 22, 24, 25, 29, 67, 70, 74};
> topics = {GettingStarted, MathematicaReferenceGuide, GraphPlotting,
>    MatrixAndVectorOperations, Statistics, DynamicFeatures,
>    SystemSpecificTopics, FurtherNDSolveTutorials,
>    FrontendAndFormattingTopics};
> FurtherTopics = Complement[Range[Length[notUsed]], Flatten[topics]];
> topics = Join[topics, {FurtherTopics}];
> (* trying to get some order into these tutorials *)
> 
> topicNames = {"Getting Started", "Mathematica Reference Guide",
>    "Graph Plotting", "Matrix And Vector Operations", "Statistics",
>    "Dynamic Features", "System Specific Topics",
>    "Further NDSolve Tutorials", "FrontEnd and Formatting Topics",
>    "Others"};
> 
> NotebookFind[nb, "Section1", After, CellTags]; SelectionMove[nb, \
> After, Cell];
> Do[NotebookWrite[nb,
>    d[nameList[[i]], "Subsection", {{48, 0}, Inherited}]], {i,
>    GettingStarted}];
> (* Add links to "getting Started" topics *)
> 
> NotebookFind[nb, "Section5", After, CellTags]; SelectionMove[nb, \
> After, Cell];
> Do[NotebookWrite[nb,
>    d[nameList[[i]], "Subsection", {{48, 0}, Inherited}]], {i,
>    MathematicaReferenceGuide}];
> (* Add links to "Refrence Guides" topics *)
> 
> NotebookFind[nb, "Section6", After, CellTags]; SelectionMove[nb, \
> After, Cell];
> Do[NotebookWrite[nb,
>    Cell[topicNames[[i]], "Section", CellDingbat -> None,
>     ShowGroupOpener -> True, CellMargins -> {{36, 0}, {5, 5}}]];
>   Do[NotebookWrite[nb,
>     d[nameList[[k]], "Subsection", {{48, 0}, Inherited}]],
>    {k, topics[[i]]}],
>   {i, 3, Length[topics]}];
> (* Add links to all other topics *)
> 
> (* -==- Add links to Packages -==- *)
> 
> fnpdir = FileNames["*",
>    ToFileName[{$InstallationDirectory, "Documentation", "English",
>      "Packages"}]];
> (* Directory names of the Packages *)
> 
> fnptut = FileNames["*.nb",
>      ToFileName[{#, "Documentation", "English", "Tutorials"}],
>      Infinity] & /@ fnpdir;
> (* tutorial notebooks of the Packages *)
> 
> fnpguid =
>   FileNames["*.nb",
>      ToFileName[{#, "Documentation", "English", "Guides"}],
>      Infinity] & /@ fnpdir;
> (* guide notebooks of the Packages *)
> 
> NotebookFind[nb, "Section7", After, CellTags]; SelectionMove[nb, \
> After, Cell];
> Do[
>   With[
>    {packageName =
>      StringTake[#, {StringPosition[#, $PathnameSeparator][[-1, 1]] +
>           1, -1}] &@fnpdir[[package]]},
>    NotebookWrite[nb,
>     Cell[beautify@packageName, "Section", CellDingbat -> None,
>      ShowGroupOpener -> True, CellMargins -> {{36, 0}, {5, 5}}]];
>    If[Length[fnptut[[package]]] > 0,
>     level =
>      If[StringTake[
>          fnptut[[package]], {1, -1} + (Take[#[[1]], {-2, -1}] &@
>                Transpose[StringPosition[#, $PathnameSeparator]] & /@
>              fnptut[[package]])[[1]]][[1]] == "Tutorials", 1, 2];
>     nameList = {"Tutorial: " <>
>          StringTake[#, {StringPosition[#, $PathnameSeparator][[-level,
>               1]] + 1, -4}],
>         "paclet:" <> packageName <> "/tutorial/" <>
>          StringReplace[
>           StringTake[#, {StringPosition[#, \
> $PathnameSeparator][[-level, 1]] + 1, -4}], "\\" -> "/"]} & /@
>       fnptut[[package]];
>     Do[NotebookWrite[nb,
>       d[nameList[[k]], "Subsection", {{48, 0}, Inherited}]],
>      {k, Length[fnptut[[package]]]}]
>     ];
>    If[Length[fnpguid[[package]]] > 0,
>     level =
>      If[StringTake[
>          fnpguid[[
>           package]], {1, -1} + (Take[#[[1]], {-2, -1}] &@
>                Transpose[StringPosition[#, $PathnameSeparator]] & /@
>              fnpguid[[package]])[[1]]][[1]] == "Guides", 1, 2];
>     nameList = {"Guide: " <>
>          StringTake[#, {StringPosition[#, $PathnameSeparator][[-1,
>              1]] + 1, -4}],
>         "paclet:" <> packageName <> "/guide/" <>
>          StringReplace[
>           StringTake[#, {StringPosition[#, \
> $PathnameSeparator][[-level, 1]] + 1, -4}], "\\" -> "/"]} & /@
>       fnpguid[[package]];
>     Do[NotebookWrite[nb,
>       d[nameList[[k]], "Subsection", {{48, 0}, Inherited}]],
>      {k, Length[fnpguid[[package]]]}]
>     ]
>    ], {package, Length[fnpdir]}];
> (* Add links to package tutorials and guides *)
> 
> SelectionMove[nb, All, Notebook]; FrontEndExecute[
>  FrontEndToken["SelectionCloseAllGroups"]];
> FrontEndExecute[FrontEndToken["OpenCloseGroup"]];
> 
> 
Thanks for your continuing work - I am amazed that WRI have not offered 
to place your notebook on their website and add it to 6.02!

In a way, it is frightening - it reminds me of how much I don't know.....

David Bailey
http://www.dbaileyconsultancy.co.uk



  • Prev by Date: Re: Version 6 "Mathematica Book" - updated and expanded
  • Next by Date: Re: Two different packages can not Need[] the same utility
  • Previous by thread: listplot and legend (again)
  • Next by thread: Re: Version 6 "Mathematica Book" - updated and expanded