User interface 如何创建选项卡式Mathematica笔记本

User interface 如何创建选项卡式Mathematica笔记本,user-interface,wolfram-mathematica,mathematica-frontend,User Interface,Wolfram Mathematica,Mathematica Frontend,有没有办法在选项卡式界面中创建和编辑笔记本(单元格序列)?是否可以使用TabView或其他工具创建这样的界面?如果我从头开始制作前端,我认为这是可能的,但是在标准Wolfram前端中有什么方法吗 有两件事促使我问这个问题。首先,我想用Mathematica笔记本替换Microsoft Office OneNote。第二,当我在Mathematica工作时,我发现自己在想,选项卡式界面是否比打开多个单独的窗口更好。虽然Mathematica不直接支持选项卡式笔记本窗口,但使用DockedCell

有没有办法在选项卡式界面中创建和编辑笔记本(单元格序列)?是否可以使用
TabView
或其他工具创建这样的界面?如果我从头开始制作前端,我认为这是可能的,但是在标准Wolfram前端中有什么方法吗



有两件事促使我问这个问题。首先,我想用Mathematica笔记本替换Microsoft Office OneNote。第二,当我在Mathematica工作时,我发现自己在想,选项卡式界面是否比打开多个单独的窗口更好。

虽然Mathematica不直接支持选项卡式笔记本窗口,但使用
DockedCells
可以重现某种效果。虚拟图书/功能导航器界面(从“帮助”菜单中)可以做到这一点……它本质上是一个幻灯片放映,包含两个幻灯片,一个包含VB,另一个包含FN,带有
DockedCells
导航界面,由
NotebookFind
驱动,看起来有点像选项卡

以下是你如何着手自己制作这样一个笔记本的要点。抱歉,这里有一些高级概念…如果您想了解此解决方案的任何部分,也许您可以衍生出更多问题

(* make a single page of the notebook *)
page[tag_String] := 
  Cell@CellGroupData[{Cell["", "SlideShowNavigationBar", 
      CellTags -> {tag}], Cell[tag, "Title"]}];
(* make a single tab-like button which selects the page *)
button[tag_String] := 
  Button[Dynamic[
    Setter[Dynamic[
      CurrentValue[EvaluationNotebook[], {TaggingRules, "page"}, 
       tag]], tag]], 
   CurrentValue[EvaluationNotebook[], {TaggingRules, "page"}] = tag; 
   NotebookLocate[tag], 
   Appearance -> None];
(* make a notebook based upon a list of strings which are names of tabs *)
makeTabbedNotebook[nameList_List] :=
  NotebookPut@Notebook[page /@ nameList,
    DockedCells -> 
     ToBoxes[ExpressionCell[Row[button /@ nameList], 
        "DockedCell"]][[1]], 
    ScreenStyleEnvironment -> "SlideShow"];

makeTabbedNotebook[{"First", "Second", "Third"}]

编辑:将
notebook查找[ButtonNotebook[],tag,All,CellTags]
更改为
notebook查找[tag]
,这似乎并不总是正确滚动幻灯片。见评论中的讨论。理论上,这两位代码应该是等效的,但Mathematica 8中的一个错误有时会使它们表现出不同的行为。

Mathematica支持为演示文稿对笔记本进行分页,并且还支持“固定单元格”(始终显示在顶部)。您可以将两者结合起来,在停靠的单元格中创建一个用户界面,用于在页面之间切换。这只是一个起点。Mathematica前端用户界面中没有内置(本机)选项卡式界面(但这是一个很好的报告建议)support@wolfram.com). 在前端用户界面中,我能想到的最接近的东西是幻灯片放映环境(打开
调色板
菜单并选择
幻灯片放映
)。@Mike这里是一个起点,但我希望这会变得非常混乱<代码>PaletteNotebook@DynamicModule[{nb},Dynamic[nb=SelectedNotebook[];SetterBar[Dynamic[nb,(SetSelectedNotebook[#])&],SortBy[Thread[Notebook[]->NotebookTools`Notebook name/@Notebook[]],Last]]].@Mike我不记得了。。。也许是我做了
?*`Notebook*
之类的事。大部分内容与(文档化的)
AuthorTools
软件包相同,请参见@Reb.cab无需加载任何内容,符号已经存在。您只需要使用
NotebookTools`NotebookName[]
而不是
NotebookName[]
。你可以阅读上下文。当然,如果您愿意,您可以将
NotebookTools`
添加到
$ContextPath
。但是请记住,所有这些都是未记录的功能,因此无法预测下一个版本中会发生什么,或者即使它在当前版本中工作时没有弄乱任何东西(我之前用其他功能烧坏了自己…)John,我在V8.04上运行上述功能时注意到,现在设置为“第一个”,然后我点击“第二”,然后按钮显示它现在在“第二”,但页面显示“第一”。但当我在“第三个”上点击“第二个”时,它确实改变了。我确信这很容易修复,但您的代码太高级,我现在无法理解:)。我可以添加屏幕截图,但不知道如何在评论中添加。将行
notebook find[ButtonNotebook[],tag,All,CellTags]
替换为
notebook locate[tag]
似乎可以纠正@Nasser评论中的问题。另外,在
Setter[Dynamic[CurrentValue[…]内部还有一个额外的术语
tag
需要删除。@kguler澄清一下,在我之前的评论中,我的意思是,红色的
标签是正确工作所必需的。没有它,在创建笔记本时,任何setter都不会在开始时被按下。它不应该被删除。@Nasser,似乎是FE中的一个bug。我已经确认
NotebookFind
Is找到了正确的单元格,但在本例中FE没有正确滚动。我会仔细查看。同时,我会将上面的答案改为使用NotebookLocate,这很有好处,因为它更简单。@Szabolcs,第三个(未记录)如果值不存在,CurrentValue的参数将创建并设置该值。这是一种非常方便的方法,可以建立CurrentValue选择器的默认值(标记规则文档中记录的排序),而无需编写大量杂乱的代码。