【问题标题】:Integrating notebooks to Mathematica's documentation center将笔记本集成到 Mathematica 的文档中心
【发布时间】:2011-09-28 07:37:09
【问题描述】:

如果您已经使用 Mathematica 一段时间,那么您可能已经对文档中心产生了浓厚的兴趣。在这些页面中总会发现一些新的东西。让它成为一个函数的选项,或者只是一些在某些时候对你没有用的例子。

您可能已经编写了包含您一直使用的专用功能的包。有时您可能会想到一个与您的函数一起使用的简洁示例,但它很可能最终被遗忘在硬盘的某个位置。如果您在想到它的那一刻就将其写入文档,那么您以后可能不会拼命寻找它。

出于这个原因,我想知道如何以编程方式将您自己的函数的文档与 Mathematica 的 文档中心集成。这个问题在这里探讨如何改编文档。如果您编写了可以帮助您执行此操作的脚本,请与社区分享。

Wolfram 的 Workbench 不是这个问题的可接受解决方案。一切都必须通过 Mathematica 的简单安装来完成。解决方案应涵盖以下几点:

  1. 为函数创建文档(最好是模板)。
  2. 创建指南和教程(如果他们认为有用)。
  3. 将笔记本链接到文档中心。
  4. 创建在不同环境中正确显示的“使用”消息。
    • 在 Mathematica 笔记本中 ?Symbol
    • 在文档中心Search: Symbol

这是一个非常广泛的话题,我有 1、2 和 3 的解决方案。我缺少第 4 点。那么请告诉我们,您如何使用文档中心记录您的函数?


更新

我添加了另一个答案。希望这个答案更能鼓励 Mathematica 的用户使用他们的包编写文档页面。我认为编写文档页面对应用程序编写者和应用程序用户都有好处。如果你下载我写的包,我建议你按照教程进行,这样你就可以看到每一步发生了什么。这将为您未来的项目提供宝贵的经验。

Github(2014 年 5 月 24 日)

自从我写了这个包以来,已经有好几个人对这个包感兴趣了。我已经将包上传到 Github:https://github.com/jmlopez-rod/ApplicationMaker。如果您想成为存储库的贡献者,请与我联系。

【问题讨论】:

  • 我建议您将其重新表述为一个问题,a.s.a.p。 SO 格式是先提出问题,然后给出一些答案。如果您以后对此事有一些想法,您可能会成为回答者之一。这是可接受格式的最新示例:stackoverflow.com/questions/6505675/…。请注意,保留您的帖子很可能会导致问题被关闭(无论当地 mma 社区成员如何看待它的价值)。
  • 但我确实有一个问题。如果我像this one 这样非常含糊地问这个问题,然后只回答一部分,这样每个人都知道发生了什么就足够了吗?我本可以将其放在最后一篇文章中,但@Szabolcs 指出这是一个不同的问题。
  • 您可以询问“如何以编程方式将文档集成到文档中心”之类的问题,然后将当前帖子的其余部分作为(其中一个)答案发布。这是一个重要的话题,因此提出这样的问题以及您作为答案之一积累的信息将对我们所有人都非常有益。
  • @Leonid,我希望这足以解决这个问题。我会写下我的答案。
  • @belisarius 和@Leonid,好吧,我吃了,我写了。我希望这是一个有效的问题。

标签: wolfram-mathematica mathematica-8


【解决方案1】:

为了展示如何创建并入文档中心的文档,我们将创建一个包含非常简单的函数及其文档的包。让我们打电话给我们的包裹SOPackage。此包将存储在同名文件夹中,该文件夹应存储在$BaseDirectory$UserBaseDirectory$ 中。 SOPakage 文件夹需要有如下的树形结构。

注意根目录是SOPackage

SOPackage

现在我们将在SOPackage 中创建一个新的笔记本文件:SOPackage.nb。这些是笔记本的内容

BeginPackage["SOPackage`"];
AddTwo::usage = "AddTwo[\!\(\*StyleBox[\"a\", \"TI\"]\), \!\(\*StyleBox[\"b\", \"TI\"]\)] returns \!\(\*StyleBox[\"a\", \"TI\"]\)+\!\(\*StyleBox[\"b\", \"TI\"]\).";
DotTwo::usage = "DotTwo[\!\(\*StyleBox[\"a\", \"TI\"]\), \!\(\*StyleBox[\"b\", \"TI\"]\)] returns \!\(\*StyleBox[\"a\", \"TI\"]\)*\!\(\*StyleBox[\"b\", \"TI\"]\).";
AddTwo::argnum = "AddTwo was called with `1` arguments. It expected 2.";
DotTwo::argnum = "DotTwo was called with `1` arguments. It expected 2.";
Begin["`Private`"];
AddTwo[a_, b_] := a + b
AddTwo[args___] := (Message[AddTwo::argnum, Length[{args}]]; $Failed)
DotTwo[a_, b_] := a*b
DotTwo[args___] := (Message[DotTwo::argnum, Length[{args}]]; $Failed)
End[];
EndPackage[];

这是您应该看到的屏幕截图

请注意,使用消息通常以特殊方式格式化参数。获得这种格式的快捷方式(@alexey-popkov 指出)是突出显示要格式化的字母,按 Command+0(在 Windows 中为 Alt+0)并输入“TI”。对所有需要修改的字母重复此过程。通过Cell->CellProperties->Initialization Cell 将单元格更改为初始化单元格。现在我们将此笔记本保存为SOPackage.nb。如果 Mathematica 没有询问您是否要创建包,因为您忘记将单元格更改为初始化单元格,那么您可以转到 Format->OptionInspector。确保选择“SOPackage.nb 的选项”,否则需要设置为 true 的选项将显示为灰色。现在单击Notebook Options->FileOptions->AutoGeneratedPackage 并选择Automatic。关闭选项窗口并保存文件。每次保存SOPackage.nb 时,文件SOPackage.m 都会更新(不要乱用这个m 文件)。

Kernel 目录应该只包含一个文件:init.m。这个文件需要有下一行:

Get["SOPackage`SOPackage`"];

在此之后,我们有一个工作包。您可以尝试以下方法以确保一切正常:

<<SOPackage`
?AddTwo
?DotTwo
DotTwo[]
DotTwo[2, 3]

文档

让我们从创建指南页面开始。这将是您在文档中心输入SOPackage 时显示的页面。让我们首先创建一个笔记本并将其保存在SOPackage/Documentation/English/Guides 下为SOPackage_E.nb。我给它扩展“_E”的原因是因为这将是一个可编辑的副本。请注意,您无法在文档中心编辑任何文档。好吧,您可以,但这些更改永远不会生效。您可能希望在构建包时修改文档,因此最好有一个可以编辑的副本。对于此示例,我们可以复制 Combinatorica guide 的内容,在文档中心输入 Combinatorica/guide/CombinatoricaPackage 选择所有带有单元格的单元格,复制并粘贴到您的 SOPackage_E.nb 文件中(或者,复制文件 C:\Program Files\Wolfram Research\Mathematica\10.4\Documentation\English\Packages\Combinatorica\Documentation\English\Guides\CombinatoricaPackage.nb 或类似的其他操作系统)。进行一些更改,以便您知道它们是您正在做的。就我而言,我用 SOPackage 替换了 Combinatorica。如果您无法修改文本的某些部分,您需要这样做:

1:点击不能修改的文字。

2:转到Cell-&gt;Show Expression 或输入Command+Shift+E 或Windows 中的等效项。

3:在Cell 表达式中查找第二个参数(就在A -&gt; B 形式的任何选项之前)。这是一个样式名称。在某些情况下,您会看到“Usage”、“Notes”、“ObjectName”等。找到无法修改的单元格样式后,单击您正在编辑的笔记本并输入Command+Shift+E 以显示表达式。

4:转到Format-&gt;Edit StyleSheet...,输入您之前在Enter a style name:下看到的样式名称。

5:显示样式的单元格出现。确保选中此单元格并转到Format-&gt;Object Inspector。确保它显示Show option values Selection

6:转到Editing Options 并将Editable 设置为true。

7:修改不可修改的。

我建议您首先输入您希望能够编辑的所有样式的名称,如屏幕截图所示。到目前为止,我只更改了我在步骤 3 中提到的那些。一旦将它们放在列表中,请选择它们并立即将其设置为可编辑。另一个重要的一点是这个文件可以是一个模板。您应该将此文件保存在某处,当您需要制作文档时,只需将其打开,在正确的路径中以另一个名称保存,然后开始从现有文档笔记本中复制单元格。

如何创建本指南由您决定。现在让我们废话。你会看到我的截图。接下来的两个文件是您的函数的文档。将您的模板文件复制并粘贴到SOPackage/Documentation/English/ReferencePages/Symbols,并将文件命名为AddTwo_E.nbDotTwo_E.nb。查找您喜欢的一些文档,以Sin 为例,然后将信息复制并粘贴到这些文件中。我将更改名称只是为了展示它们的工作原理。

模板文件的创建肯定可以减少。如果有人知道如何以编程方式执行此操作,请随时在此处编辑此部分并将其替换为代码。你会帮我们大家一个大忙。

PacletInfo.m

此文件位于SOPackage 目录下,包含以下内容:

Paclet[
Name -> "SOPackage",
Version -> "0.0.1",
MathematicaVersion -> "8+",
Extensions -> {{
    "Documentation", 
    Resources -> {
        "Guides/SOPackage"
    }, 
    Language -> "English"
}}
]

在准备好文档之前,我们必须做最后一件事。我们需要使所有函数文档都不可编辑,并且我们必须赋予它与其余文档相同的格式。这次我写了一个脚本来做到这一点。我称它为 MakeDoc,因为它也会构建索引。将此文件保存在OSPackage 下。我将把这个文件分成四部分,以便你得到解释。

pname = "SOPackage";
Get[pname <> "`"];
basepath = $UserBaseDirectory<>"/Applications/"<>pname<>"/Documentation/English/ReferencePages/Symbols/";
$UserBaseDirectory <> "/Applications/" <> pname <> "/Documentation/English/ReferencePages/Symbols/";

我们应该确保在执行此操作之前重新启动 Mathematica。首先,我们将加载包并设置所有函数文档的根目录。在下一步中,我们将基本上复制粘贴代码,我们将为每个函数执行以下操作。

snname := "AddTwo";
nb = NotebookOpen[basepath <> snname <> "_E.nb"];
NotebookSave[nb, basepath <> snname <> ".nb"];
SetOptions[nb,
  TaggingRules -> {
    "ModificationHighlight" -> False,
    "Metadata" -> {
      "context" -> pname <> "`",
      "keywords" -> {},
      "index" -> True,
      "label" -> "OSPackage Package Paclet Symbol",
      "language" -> "en",
      "paclet" -> "OSPackage Package",
      "status" -> "",
      "summary" -> AddTwo::usage,
      "synonyms" -> {},
      "title" -> "AddTwo",
      "type" -> "Symbol",
      "uri" -> pname <> "/ref/AddTwo"},
    "SearchTextTranslated" -> ""
    }
  ];
SetOptions[nb, Saveable -> False];
SetOptions[nb, 
  StyleDefinitions -> 
   FrontEnd`FileName[{"Wolfram"}, "Reference.nb"]];
NotebookSave[nb];

此代码块打开可编辑的函数文档。它以正确的名称保存它。然后它会更改其属性,使其不可编辑,并使其具有与其余文档相同的外观。我们对每个函数都做同样的事情。请注意,“summary”设置为函数的usage 消息。这是我们在搜索函数时会看到的。

snname := "DotTwo";
nb = NotebookOpen[basepath <> snname <> "_E.nb"];
NotebookSave[nb, basepath <> snname <> ".nb"];
SetOptions[nb,
  TaggingRules -> {
    "ModificationHighlight" -> False,
    "Metadata" -> {
      "context" -> pname <> "`",
      "keywords" -> {},
      "index" -> True,
      "label" -> "OSPackage Package Paclet Symbol",
      "language" -> "en",
      "paclet" -> "OSPackage Package",
      "status" -> "",
      "summary" -> DotTwo::usage,
      "synonyms" -> {},
      "title" -> "DotTwo",
      "type" -> "Symbol",
      "uri" -> pname <> "/ref/DotTwo"},
    "SearchTextTranslated" -> ""
    }
  ];
SetOptions[nb, Saveable -> False];
SetOptions[nb, 
  StyleDefinitions -> 
   FrontEnd`FileName[{"Wolfram"}, "Reference.nb"]];
NotebookSave[nb];

非常重要,我们没有修改指南,仅此而已:

snname := "SOPackage";
nb = NotebookOpen[guidepath <> snname <> "_E.nb"];
NotebookSave[nb, guidepath <> snname <> ".nb"];
SetOptions[nb, Saveable -> False];
SetOptions[nb, StyleDefinitions -> FrontEnd`FileName[{"Wolfram"}, "Reference.nb"]];
NotebookSave[nb];

最后,我们像这样创建索引:

indir = $UserBaseDirectory<>"/Applications/"<>pname<>"/Documentation/English/Index";
If[FileNames[indir] != {}, DeleteDirectory[indir, DeleteContents -> True]];
ind = DocumentationSearch`NewDocumentationNotebookIndexer[indir];
DocumentationSearch`AddDocumentationNotebook[ind, basepath <> "AddTwo.nb"];
DocumentationSearch`AddDocumentationNotebook[ind, basepath <> "DotTwo.nb"];
DocumentationSearch`CloseDocumentationNotebookIndexer[ind];

请注意,我们需要为每个函数添加一行AddDocumenationNotebook。运行MakeDoc.nb 后,将创建文件AddTwo.nbDotTwo.nbSOPackage.nb。这些文件无法修改。您还将看到一个名为Index 的文件夹。这是包含文档中心信息的所有二进制数据。如果您对文档进行了修改,您应该运行MakeDoc.nb 以使更改生效。这是我们现在拥有的文档树。

在此之后,我们应该重新启动 Mathematica 并带上我们的文档。

当您查找“SOPackage”时会发生这种情况。

我们来看看AddTwo的用法

请注意,带有指向文档页面链接的箭头是自动添加的。

不幸的是,如果我们在文档中心搜索AddTwo,我们会得到:

我们怎样才能使函数的摘要不被格式化?

请随时从here 下载我的代码来修改我的代码。

感谢您的阅读。

曼努埃尔

【讨论】:

  • 这需要 mma 的工作台还是只需要普通安装?
  • @d00b,这适用于 Mathematica 8 的简单安装。我不太喜欢使用像 WorkBench 这样的工具。我更喜欢找出它们之间的相互作用。
  • +1 不错的教程。不过看起来工作量很大。不是鼓励一个人编写自己的文档。我想这应该是世界资源研究所的工作,让这个有点用户友好。就像现在一样,您必须跳过很多圈。您使用 Workbench 生成文档的体验如何?
  • @jmlopez:非常酷...据我所知this question,您需要工作台来整齐地格式化内容,但也许不需要...
  • @Sjoerd,谢谢,是的,在我看到我写的东西之后,我觉得工作量很大。我已经在考虑编写脚本,一旦我有一个较短的版本,我会更新我的帖子。我只使用 Workbench 来查看它是如何组织文件的,但从那以后我就再也没有尝试过。
【解决方案2】:

我花了一些时间,但我终于完成了编写一个文档化的 Mathematica 应用程序,以帮助 Mathematica 用户编写文档包。

此应用程序名为ApplicationMaker。它包含三个具有各种功能的包,可帮助您创建应用程序。通过使用这些功能,您可以跳过我在之前的回答中描述的所有混乱。

如果你从我的网站下载ApplicationMaker,你会发现一个详细的教程,向你展示如何创建一个完整的应用程序及其文档。

概述

要创建一个新应用程序,您首先调用NewApplication。这将创建我在上一个答案中提到的目录树。要了解有关 Mathematica 文件组织的更多信息,请单击here

下一步是创建包。为此,您致电NewPackage。此函数创建一个模板,您可以在其中编写代码。

完成代码编写后,您需要致电UpdateInit。这将更新 Mathematica 需要的 init 文件,以便您可以使用函数 Get (&lt;&lt;)

此时您已准备好创建文档。只需调用CreateReferencePages,这将创建一个基本文档,您可以对其进行编辑以记录应用程序中每个符号的参考页面。

如果您想为您的应用程序创建指南或教程,您可以致电NewGuideNewTutorial

完成编辑后,您需要构建应用程序,以便 Mathematica 可以将其调整到其文档中心。你可以通过调用BuildApplication来做到这一点。

至此,您就完成了。如果您在包裹的任何符号上使用 Information,您应该会看到一个附加的箭头,引导您进入该符号的参考页面。

如果您希望共享此应用程序,您应该首先部署它。当前应用程序包含与文档中心一起使用的参考页面以及您编辑的参考页面。通过部署它,您将获得一个目录,其中仅包含应用程序运行所需的文件。

安装

您只需将文件夹ApplicationMaker 放入$UserBaseDirectory/Applications/$BaseDirectory/Applications/

要开始使用,请打开文档中心并查找“ApplicationMaker”。这应该向您展示显示包包含的所有功能的指南。在最底部,您应该会看到教程的链接。

结束语

这是我为 Mathematica 构建的第一个应用程序。我将尝试不断更新软件包,因为我会发现新事物以使软件包变得更好。目前,我希望 ApplicationMaker 的第一个版本对任何试图记录他们的 Mathematica 应用程序的人有用。

您可以下载ApplicationMaker here

【讨论】:

  • 我忘了说这个包是用 Mathematica 8 写的,之前的版本没有测试过。
  • 这太棒了,你太棒了!谢谢!
  • 一些小修复:1) 在UpdateInit 函数中将“Init.m”重命名为“init.m”,以便应用程序在区分大小写的文件系统上工作。 2) 在CreateReferencePages 中修复StyleDefinitions-&gt;...,使其指向存在的样式表。 3) WholeCellGroupOpener 应该是 System&lt;BACKTICK&gt;WholeCellGroupOpener 用于“基本示例”等通过直接单击它们来展开/折叠,而不仅仅是灰色三角形。但这使得更改“(#)”变得困难。再次感谢,良好的文档和易于理解的代码
  • 我会将以下内容更正为 FileNameJoin[{$UserBaseDirectory, "Applications"}]FileNameJoin[{$UserBaseDirectory, "Applications"}],以便它们可以复制和粘贴。
【解决方案3】:

我已经下载了您的 ApplicationMaker,并正在 Windows 7 64 位上使用 Mathematica 10 对其进行测试。伟大的工作,有据可查!在使用NewApplication 创建新应用程序时,我发现了一个需要修复设置的小错误。看来函数MakeDirectory 中的变量root 不能是长度为零的字符串(导致创建目录时出错)。我通过在您的原始代码中包含一个测试来解决此问题:

MakeDirectory[root_, start_, main_, sub_] := Module[
  {nm, ns, tmp},
  nm = Position[main, start];
  If[Length@nm != 0, nm = nm[[1, 1]]];
  If[Length@sub[[nm]] != 0,
   Do[
    tmp = 
     If[StringLength[root] != 0, 
      FileNameJoin[{root, start, sub[[nm, i]]}], 
      FileNameJoin[{start, sub[[nm, i]]}]];
    If[DirectoryQ[tmp], 
     Print[Style["Existing Directory : ", "MSG", Gray], 
      Style[tmp, "MSG", Bold]], 
     CreateDirectory[tmp];
     Print[Style["Directory Created  : ", "MSG", Blue], 
      Style[tmp, "MSG", Bold]]
     ];
    , {i, Length@sub[[nm]]}]
   ];
  Do[
   MakeDirectory[
    If[StringLength[root] != 0, FileNameJoin[{root, start}], start], 
    sub[[nm, i]], main, sub],
   {i, Length@sub[[nm]]}
   ]
  ]

【讨论】:

  • 您应该在包的 github 存储库中发出拉取请求。 :)
猜你喜欢
  • 2011-02-18
  • 2011-06-21
  • 2021-05-23
  • 1970-01-01
  • 2023-04-05
  • 2011-12-23
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
相关资源
最近更新 更多