Wolfram mathematica 将单元格定义扩展到CellFrameLabels定义

Wolfram mathematica 将单元格定义扩展到CellFrameLabels定义,wolfram-mathematica,Wolfram Mathematica,我正在创建一个笔记本,其中包含一种书写文档的风格。我希望Mathematica的行为类似于LaTeX,即当我编写一个“Definition”单元时,它将编写“Definition[Chapter.#].[Definition.#]” 要了解我的意思,请执行以下操作。在空笔记本中创建一个单元格,并将样式修改为“Chapter”。您可以通过选择单元格并转到格式->样式->其他,然后输入“Chapter” 现在转到格式->编辑样式表…。在输入框中输入章节。这将生成一个标有章节的单元格。选择该单元格,然

我正在创建一个笔记本,其中包含一种书写文档的风格。我希望Mathematica的行为类似于LaTeX,即当我编写一个
“Definition”
单元时,它将编写
“Definition[Chapter.#].[Definition.#]”

要了解我的意思,请执行以下操作。在空笔记本中创建一个单元格,并将样式修改为
“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]

在上图中,我创建了几个章节单元格,并添加了文本:
“:章节标题”

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

我注意到有些书是如何在盒子里附上定义的。因此,在本例中,我想创建一个包含
定义的框。下面是我对单元格定义的拙劣尝试
“definition”

以下是它在笔记本中的外观:

问题是:有没有办法使
CellFrameLabels
成为单元格的一部分?我希望标签具有相同的背景,并与其他文本内联。以下是我希望它看起来如何的屏幕截图:


我已经把“标签”做成了粗体和蓝色。这是用户不能修改的。

我认为不可能按照您想要的方式进行修改
CellLabel
s只能是文本,而
CellDingbat
CellFrameLabels
都可以是任意单元格表达式

如果单元格只有一行长,则
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]]

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


编辑:添加创建不可删除计数器的 首先我们得到当前的输入别名

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}}]]
现在,我可以在现有单元格中使用别名-它继承父单元格的样式(除非另有指定):



另一个选择是使用样式表创建一个。这将非常有用,因为只有一组值可用于新样式(注意:覆盖默认值只会让人困惑)。请参见此类调色板的示例。

Simon,我曾想过类似的方法,制作一个不可编辑的文本单元格。问题是,正如您所提到的,除非您复制并粘贴文本,否则文本不会出现在那里。这给了我一个想法。您知道是否可以定义自己的快捷方式吗?例如,[Esc]inf[Esc]绘制无限符号。有没有可能像[Esc]Def[Esc]那样,在主单元格标记中插入带有定义标签的文本和带有背景的计数器?@jmlopez:这是完全可能的。西蒙,我不太明白如何使用
RowBox
创建快捷方式。到目前为止,我尝试的是:
SetOptions[EvaluationNotebook[],InputAliases->{“def”->RowBox[{“Definition”,CounterBox[“Chapter”],“,”,CounterBox[“Definition”}]}]
,但我似乎无法更改样式或选项以使该单元格不可编辑。有什么建议吗?谢谢你,西蒙。你的计数器显示正确吗?我注意到,当我执行[Esc]Def[Esc]时,带计数器的文本会显示出来,但它以0.0开头。但是,如果我点击任何一个文本并转到ShowExpression,然后返回,计数器将更新为正确的计数器。
CellPrint[Cell["Setting the counters", "Text", 
  CounterAssignments -> {{"Chapter", 2}, {"Definition", 3}}]]