Расширение определения ячейки до определения CellFrameLabels - PullRequest
6 голосов
/ 29 августа 2011

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

Chapter

На картинке выше я создал несколько ячеек глав и добавил текст: ": 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}},
 ]

Вот как это выглядит в блокноте:

Notebook

Вот вопрос: есть ли способ сделать CellFrameLabels частью ячейки? Я хочу, чтобы на этикетке был такой же фон и чтобы он был в линии с другим текстом. Вот скриншот того, как я хочу, чтобы он выглядел:

Desired Output

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

1 Ответ

6 голосов
/ 30 августа 2011

Я не думаю, что это можно сделать так, как вы хотите.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 on left

Помещение метки 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]]

cellframelabel at top

Я думаю, что, возможно, лучшим решением было бы включение «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]]

from above

Сделайте так, чтобы обычные пользователи не могли их удалить и, вероятно, почти так же хорошо, как метка ячейки (фрейма).Он может включать счетчики, чтобы автоматически отображать правильную нумерацию.Единственная проблема заключается в том, что он не появляется автоматически, но если вы просто скопируете ранее существующую ячейку, это не является большой проблемой.


Редактирование: добавление входного псевдонима , который создает не удаляемый счетчик

Сначала мы получаем текущие псевдонимы ввода

oldAliases = InputAliases /. Options[EvaluationNotebook[], InputAliases];

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

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

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

add defn


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...