Расширение определения ячейки до определения CellFrameLabels

Я нахожусь в процессе создания блокнота, который содержит стиль для написания документов. Я хотел бы, чтобы Mathematica вел себя подобно LaTeX в том смысле, что когда я пишу "Definition" клетка потом напишет "Definition [Chapter#].[Definition#]",

Чтобы понять, что я имею в виду, сделайте следующее. В пустой записной книжке создайте ячейку и измените стиль на "Chapter", Вы можете сделать это, выбрав ячейку и перейдя к Format->Style->Other, войти "Chapter",

Теперь иди в Format->Edit StyleSheet..., Войти 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",

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 часть клетки? Я хочу, чтобы на этикетке был тот же фон и чтобы он был в линии с другим текстом. Вот снимок экрана того, как я хочу, чтобы это выглядело:

Желаемый вывод

Я сделал "ярлык" жирным шрифтом и синим. Это то, что пользователь не может изменить.

1 ответ

Решение

Я не думаю, что это можно сделать так, как вы хотите. CellLabels может быть только текстом, в то время как оба 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];

затем замените любой существующий псевдоним Esc defEsc на наш новый:

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}}]]

Теперь я могу использовать псевдоним в существующей ячейке - он наследует стиль родительской ячейки (если не указано иное):

добавить определение


Другой вариант - создать палитру, соответствующую вашей таблице стилей. Это было бы полезно, так как существует только ограниченное количество значений MenuCommandKey, которые вы можете использовать для своих новых стилей (даже если перезаписать значения по умолчанию, это просто запутает людей). Посмотрите этот ответ для примера такой палитры.

Другие вопросы по тегам