警告:我最近了解到为新文档构建索引可能会在 Windows 机器中产生不良影响。请阅读 Alexey 的评论以获取更多详细信息。据我所知,在 Mac OS X 中一切正常。一旦确定问题的根源,我将提供更新。
在这里,我提出了一个功能,允许任何笔记本成为Mathematica 8 中文档中心的一部分。您可以从让Mathematica评估以下内容开始:
Clear[FormatDoc, AddDocs];
FormatDoc[dir_, last_, num_, appName_, pacFile_, index_] :=
Module[{dirs, nbs, nb, str, comma = ",", title, tags},
nbs = FileNames[dir <> "/*.nb"];
dirs = FileNames[dir <> "/*"];
Do[If[last && i == Length@nbs, comma = ""];
str = FileNameDrop[nbs[[i]], {1, num}];
title = StringDrop[FileNameTake[nbs[[i]]], -3];
Print[Row[{Style["Adding: ", "MSG", Black],
Style[str, "MSG", Blue]}]];
str = StringDrop[str, -3];
WriteString[pacFile,
"\t\t\t\t\"" <> str <> "\"" <> comma <> "\n"];
nb = NotebookOpen[nbs[[i]]];
tags =
DeleteDuplicates@
Flatten@Map[#[[2]] &,
Cases[NotebookGet[
nb], (_Dummy | (CellTags -> _)), \[Infinity]]];
SetOptions[nb,
DockedCells ->
FEPrivate`FrontEndResource["FEExpressions", "HelpViewerToolbar"],
Saveable -> False,
WindowTitle ->
"Mathematica 5.2 | " <> FileNameDrop[str] <> " | " <> title,
TaggingRules -> {"ModificationHighlight" -> False,
"Metadata" -> {"context" -> appName <> "`", "keywords" -> tags,
"index" -> True,
"label" -> "Mathematica 5.2 | " <> FileNameDrop[str],
"language" -> "en", "paclet" -> appName, "status" -> "",
"summary" -> ToString@tags, "synonyms" -> {},
"title" -> title, "windowtitle" -> title, "type" -> "Doc",
"uri" ->
StringReplace[FileNameJoin[{appName, str}], "\\" -> "/"]},
"SearchTextTranslated" -> "", "LinkTrails" -> ""}];
NotebookSave[nb];
NotebookClose[nb];
DocumentationSearch`AddDocumentationNotebook[index, nbs[[i]]];, {i,
Length@nbs}];
Do[If[DirectoryQ[dirs[[i]]], str = FileNameDrop[dirs[[i]], {1, num}];
Print[
Row[{Style["Adding from: ", "MSG", Black],
Style[str, "MSG", Gray]}]];
FormatDoc[dirs[[i]], last, num, appName, pacFile, index];], {i,
Length@dirs}]]
AddDocs[appName_] :=
Module[{appDir, appDocs, dirs, pacFile, index, indexDir, str, num},
appDir = FileNameJoin[{$UserBaseDirectory, "Applications"}];
appDocs =
FileNameJoin[{appDir, appName, "Documentation", "English"}];
indexDir = FileNameJoin[{appDocs, "Index"}];
dirs = FileNames[appDocs <> "/*"];
If[Length@dirs == 0,
Print[Style["There are no documents to add... ", "MSG", Orange]];
Return[]];
Print[Row[{Style["Working in: ", "MSG", Black],
Style[appDocs, "MSG", Red]}]];
num = Length@FileNameSplit[appDocs];
index =
DocumentationSearch`NewDocumentationNotebookIndexer[indexDir];
pacFile = OpenWrite[FileNameJoin[{appDir, appName, "PacletInfo.m"}]];
WriteString[pacFile, "Paclet[
Name -> \"" <> appName <> "\",
Version -> \"5.2.0\",
MathematicaVersion -> \"7+\",
Extensions -> {
{
\"Kernel\",
\"Context\" -> {
}
},
{
\"Documentation\",
Language -> \"English\",
LinkBase -> \"" <> appName <> "\",
Resources -> {\n"];
Do[If[DirectoryQ[dirs[[i]]], str = FileNameDrop[dirs[[i]], {1, num}];
Print[
Row[{Style["Adding from: ", "MSG", Black],
Style[str, "MSG", Gray]}]];
FormatDoc[dirs[[i]], i == Length@dirs, num, appName, pacFile,
index];], {i, Length@dirs}];
WriteString[pacFile, "\t\t\t}
}
}
]\n"];
Close[pacFile];
DocumentationSearch`CloseDocumentationNotebookIndexer[index];
PacletManager`RestartPacletManager[];]
如何使用它:
在一个新文档或您评估函数的同一个文档中,首先找出这个变量是什么:
$UserBaseDirectory
就我而言,因为我使用的是 Mac OS XI,所以得到:
/Users/jmlopez/Library/Mathematica
找出你的。在此目录中,您应该看到文件夹Applications
。在里面Applications
创建您将放置 MMA5 文档的文件夹。我命名了我的文件夹MMA5
,因为它很短,但你可以给它任何你想要的名字,在 Alexey 的情况下,我们可以称之为LegacyDocumentation
. 在此文件夹中传输Documentation
在 MMA5 的安装目录中找到的文件夹的副本。
我们快完成了。现在调用函数AddDocs
。这个函数只接受一个参数:我们希望添加其文档的应用程序的名称。就我而言,由于我命名了文件夹,MMA5
因此我将其命名如下:
AddDocs["MMA5"]
接下来你应该看到的是一系列笔记本的出现和消失,以及一系列正在打印的消息。以下是该消息序列的一部分:
由于 MMA5 的文档非常广泛,因此此过程需要一段时间。我对这个功能做了一个计时,它说大约需要 40 秒(对我来说似乎要长得多)。
你完成了。MMA5 的文档现在应该可以在文档中心获得。
试驾
假设您希望查找有关DSolve
. 如果您搜索DSolve
您会看到以下内容:
要查找 MMA5 文档,我们需要单击DSolve
位于“搜索包含 DSolve 的所有页面”中的链接。现在我们得到这样的东西:
在上面的屏幕截图中,我用红色标记了允许我们访问 Mathematica 5 文档的条目。我无法为文档中的每个文件写一个很好的摘要,所以我只是让 Mathematica 写CellTags
在笔记本中。这就是您看到字符串列表的原因。
如果您单击第一个红色条目,这就是我们获得的
所以你有了它,一份在新版本的 Mathematica 上工作的遗留文档的工作副本。我没有在 MMA7 中测试过这个,但我觉得它会起作用。如果有人尝试这个,请告诉我。
笔记
如果您想将此应用于不同应用程序中的其他文档。你需要注意这一点:
WindowTitle ->
"Mathematica 5.2 | " <> FileNameDrop[str] <> " | " <> title,
TaggingRules -> {
"ModificationHighlight" -> False,
"Metadata" -> {
"context" -> appName <> "`",
"keywords" -> tags,
"index" -> True,
"label" -> "Mathematica 5.2 | " <> FileNameDrop[str],
"language" -> "en",
"paclet" -> appName,
"status" -> "",
"summary" -> ToString@tags,
"synonyms" -> {},
"title" -> title,
"windowtitle" -> title,
"type" -> "Doc",
"uri" ->
StringReplace[FileNameJoin[{appName, str}], "\\" -> "/"]
},
请注意,我在标签中硬编码了“Mathematica 5.2”。如果需要,您甚至可能希望将其更改为“LegacyDocumentation”。这只是一个标签。另一个重要的点是keywords
. 我已经设置keywords
了变量tags
。笔记本中的每个单元格都可以选择添加CellTags
. 如果你要写一些文档,你应该使用它们。我利用这一点让文档中心知道如何搜索文档。这是我最近学到的东西,我一定会在一个包中实现。
如果你想用它的文档编写一个完整的应用程序,我建议你看看我的帖子将笔记本集成到 MMA 文档中心。在这里,您将找到更多信息,让您了解我在此处提供的功能如何工作。
作为最后一点,我想补充一点,我也在 Windows 机器上进行了测试,它运行良好,这就是这行代码背后的原因:
StringReplace[FileNameJoin[{appName, str}], "\\" -> "/"]
编辑:
我更改了功能,以便它可以在 MMA7 中正常工作。事实证明,该pacletInfo.m
文件需要具有该行MathematicaVersion -> 7+
,以便它可以在 MMA7 和 MMA8 中工作。
编辑2:
我在复制和粘贴函数时犯了一个错误。现在应该修好了。如果你同时拥有 MMA7 和 MMA8,我建议只在 MMA7 中运行一次。这样,MMA7 和 MMA8 都可以使用文档。