ПРЕДУПРЕЖДЕНИЕ: Недавно я узнал, что создание индекса для новой документации может иметь нежелательные последствия для компьютера с Windows. Пожалуйста, прочитайте комментарии Алексея для более подробной информации. Насколько я могу судить, в 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 X, я получаю:
/Users/jmlopez/Library/Mathematica
Узнайте, что у вас. В этом каталоге вы должны увидеть папку Applications
. Внутри Applications
создайте папку, в которую вы будете помещать документацию MMA5. Я назвал свою папку MMA5
, потому что она короткая, но вы можете дать ей любое имя, какое хотите, в случае Алексея мы можем назвать ее 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 doc center . Здесь вы найдете больше информации, которая позволит вам понять, как работают функции, которые я здесь предоставил.
В качестве заключительного замечания я хотел бы добавить, что я также проверил это в Windows-машине, и она работала нормально, вот причина этой строки кода:
StringReplace[FileNameJoin[{appName, str}], "\\" -> "/"]
EDIT:
Я изменил функцию, чтобы она могла корректно работать в MMA7. Оказывается, что файл pacletInfo.m
должен иметь строку MathematicaVersion -> 7+
, чтобы он мог работать в MMA7 и MMA8.
РЕДАКТИРОВАТЬ 2:
Я сделал ошибку при копировании и вставке функции. Это должно быть исправлено сейчас. Если у вас есть и MMA7, и MMA8, я предлагаю запустить его только один раз в MMA7. Таким образом, документация будет доступна как для MMA7, так и для MMA8.