为了展示如何创建并入文档中心的文档,我们将创建一个包含非常简单的函数及其文档的包。让我们打电话给我们的包裹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->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.nb 和DotTwo_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.nb、DotTwo.nb 和SOPackage.nb。这些文件无法修改。您还将看到一个名为Index 的文件夹。这是包含文档中心信息的所有二进制数据。如果您对文档进行了修改,您应该运行MakeDoc.nb 以使更改生效。这是我们现在拥有的文档树。
在此之后,我们应该重新启动 Mathematica 并带上我们的文档。
当您查找“SOPackage”时会发生这种情况。
我们来看看AddTwo的用法
请注意,带有指向文档页面链接的箭头是自动添加的。
不幸的是,如果我们在文档中心搜索AddTwo,我们会得到:
我们怎样才能使函数的摘要不被格式化?
请随时从here 下载我的代码来修改我的代码。
感谢您的阅读。
曼努埃尔