我正在创建一个包含用于编写文档样式的笔记本。我希望Mathematica的行为类似于LaTeX,即当我编写"Definition"单元格时它将编写"Definition [Chapter#].[Definition#]"

要了解我的意思,请执行以下操作。在空笔记本中创建一个单元格,然后将样式修改为"Chapter"。您可以通过选择单元格并转到Format->Style->Other,然后输入"Chapter"来执行此操作。

现在转到Format->Edit StyleSheet...。在输入框中输入Chapter。这将生成一个标记为Chapter的单元格。选择该单元格,然后单击Cell->Show Expression。此时,请选择您在该处看到的所有文本,并将其替换为以下内容:

Cell[StyleData["Chapter"],
 CellFrame->{{0, 0}, {0, 0}},
 ShowCellBracket->Automatic,
 CellMargins->{{42, 27}, {10, 30}},
 CounterIncrements->"Chapter",
 CounterAssignments->{{"Section", 0}, {"Definition", 0}},
 FontFamily->"Verdana",
 FontSize->24,
 FontWeight->"Bold",
 CellFrameLabels->{{
    Cell[
     TextData[{
       "Chapter ",
       CounterBox["Chapter"]
       }], "ChapterLabel", CellBaseline -> Baseline], Inherited}, {
   Inherited, Inherited}},
 FontColor->RGBColor[0.641154, 0.223011, 0.0623026]]

这将改变章节单元格的显示方式。我更改了颜色和字体。对我来说最重要的是CellFrameLabels。注意,我已经做到了,因此每次创建章节单元时,它都会显示:Chapter [Chapter Number]

在上图中,我创建了几个章节单元格,并添加了文本:": Title of Chapter #"

这很简单,我们可以创建任何单元格,应用定义并采用计数器的优势来标记单元格。

我注意到有些书的定义是放在框中的。因此,在这种情况下,我想创建一个包含Definition的框。这是我对单元格"Definition"的定义的la脚尝试。
Cell[StyleData["Definition"],
 CellFrame->{{0, 0}, {0, 2}},
 ShowCellBracket->Automatic,
 CellMargins->{{27, 27}, {0, 8}},
 PageBreakWithin->False,
 CellFrameMargins->16,
 CellFrameColor->RGBColor[0.641154, 0.223011, 0.0623026],
 Background->RGBColor[0.963821, 0.927581, 0.844465],
 FontFamily->"Verdana",
 CounterIncrements->"Definition",
 FontSize->12,
 CellFrameLabels->{{
    Cell[
     TextData[{
       "Definition ",
       CounterBox["Chapter"], ".",
       CounterBox["Definition"]
       }], "DefinitionLabel", CellBaseline -> Baseline], Inherited}, {
   Inherited, Inherited}},
 ]

这是它在笔记本中的外观:

这里的问题是:有没有办法使CellFrameLabels成为单元的一部分?我希望标签具有相同的背景并与其他文本对齐。这是我希望它的外观的屏幕截图:

我将“标签”的字体设为粗体和蓝色。这是用户不应修改的内容。

最佳答案

我认为不可能以您想要的方式来做。 CellLabel只能是文本,而CellDingbatCellFrameLabels都可以是任意单元格表达式。

如果单元格只有一行,则CellDingbat -> ...CellFrameLabels -> {{...,None},{None,None}}都可以工作。但是不要为多个行单元格自动调整大小(至少据我所知)。例如:

Cell["Abcdefg", "Text",
 CellFrame->{{0, 1}, {0, 2}},
 CellMargins->{{30, 24}, {6, 6}},
 CellFrameMargins->0,
 CellFrameColor->RGBColor[0, 0, 1],
 CellFrameLabels->{{Cell[" Definition 1.1  ", "Text",
   CellFrame -> {{2, 0}, {0, 2}}, CellFrameMargins -> 0], None}, {None, None}},
 CellFrameLabelMargins->0,
 Background->RGBColor[0, 1, 1]]

将CellFrameLabel放在顶部不会出现此问题,但是我不知道如何将其向左对齐...
Cell["Abcde", "Text",
 CellFrame->{{1, 1}, {0, 2}},
 CellMargins->{{30, 24}, {6, 6}},
 CellFrameMargins->0,
 CellFrameColor->RGBColor[0, 0, 1],
 CellFrameLabels->{{None, None}, {None,
    Cell[" Definition 1.1 ", "Text",
     CellFrame -> {{2, 2}, {0, 2}}, CellFrameMargins -> 0]}},
 CellFrameLabelMargins->0,
 Background->RGBColor[0, 1, 1]]

我认为也许最好看的解决方案是在单元格内容中包含“Definition ch.def:”。
Cell[TextData[{
 Cell["Definition 1.1:   ", Editable->False, Selectable->False, Deletable->False],
 "Abcdefg"}], "Text",
 CellFrame->{{1, 1}, {0, 2}},
 CellMargins->{{30, 24}, {6, 6}},
 CellFrameColor->RGBColor[0, 0, 1],
 Background->RGBColor[0, 1, 1]]

使其无法被普通用户删除,并且它的质量可能几乎与cell(frame)标签一样好。它可以包括计数器,以便自动显示正确的编号。唯一的问题是它不会自动显示,但是如果您仅复制一个预先存在的单元格,那么这并不是什么大问题。

编辑:添加一个input alias创建不可删除的计数器

首先,我们获得当前的输入别名,
oldAliases = InputAliases /. Options[EvaluationNotebook[], InputAliases];

然后将任何现有的别名EscdefEsc替换为我们的新别名:
newAliases =
  Append[DeleteCases[oldAliases, "def" -> _],
   "def" -> Cell[TextData[
     RowBox[StyleBox[#, FontWeight->"Bold", FontColor->Blue]&/@{"Definition ",
      CounterBox["Chapter"], ".", CounterBox["Definition"], ":   "}]],(*"Text",*)
     Editable -> False, Selectable -> False, Deletable -> False]];
SetOptions[EvaluationNotebook[], InputAliases -> newAliases]

由于我没有您的样式表,因此需要设置两个计数器:
CellPrint[Cell["Setting the counters", "Text",
  CounterAssignments -> {{"Chapter", 2}, {"Definition", 3}}]]

现在,我可以在现有单元格中使用别名-它将继承父单元格的样式(除非另有说明):



另一种选择是将palette与样式表一起使用。这将很有用,因为只有limited number值的MenuCommandKey可用于新样式(注:覆盖默认值只会使人们感到困惑)。有关此类调色板的示例,请参见this answer

10-04 16:47
查看更多