59

如果您已经使用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 。如果您想成为存储库的贡献者,请与我联系。

4

3 回答 3

48

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

在此处输入图像描述

请注意,根是目录SOPackage

SOPackage

现在我们将在里面创建一个新的笔记本文件SOPackageSOPackage.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[];

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

SOPackage

请注意,使用消息通常以特殊方式格式化参数。获得这种格式的快捷方式(@alexey-popkov 指出)是突出显示要格式化的字母,按Command+0Alt+0在 Windows 中)并输入“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/GuidesSOPackage_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->Show Expression或输入Command+Shift+E或Windows中的等效项。

在此处输入图像描述

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

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

在此处输入图像描述

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

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

在此处输入图像描述

7:修改不可修改。

在此处输入图像描述

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

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

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

小包信息.m

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

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

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

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.nb,将创建。这些文件无法修改。您还将看到一个名为. 这是包含文档中心信息的所有二进制数据。如果您对文档进行了修改,您应该运行以使更改生效。这是我们现在拥有的文档树。DotTwo.nbSOPackage.nbIndexMakeDoc.nb

在此处输入图像描述

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

这就是您查找“SOPackage”时发生的情况。

在此处输入图像描述

让我们看看AddTwo

在此处输入图像描述

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

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

在此处输入图像描述

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

随意从这里下载修改我的代码。

感谢您的阅读。

曼努埃尔

于 2011-07-04T18:26:05.683 回答
36

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

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

如果您ApplicationMaker从我的网站下载,您将找到详细的教程,向您展示如何使用其文档创建完整的应用程序。

概述

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

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

完成代码编写后,您需要调用UpdateInit. 这将更新 Mathematica 需要的 init 文件,以便您可以使用该函数Get (<<)

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

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

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

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

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

安装

您所要做的就是将文件夹ApplicationMaker放入$UserBaseDirectory/Applications/or中$BaseDirectory/Applications/

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

最后的话

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

您可以在此处下载 ApplicationMaker 。

于 2011-07-12T06:47:23.723 回答
4

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

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]]}
   ]
  ]
于 2015-02-13T09:51:38.887 回答