7

I'm in the process of creating a notebook that contains a style to write documents. I would like Mathematica to behave similar to LaTeX in the sense that when I write a "Definition" cell then it will write "Definition [Chapter#].[Definition#]".

To see what I mean do the following. In an empty notebook create a cell and modify the style to "Chapter". You can do this by selecting the cell and the going to Format->Style->Other, enter "Chapter".

Now go to Format->Edit StyleSheet.... Enter Chapter in the input box. This will generate a cell labeled Chapter. Select that cell, and click on Cell->Show Expression. At this point select all that text that you see there and replace it with the following:

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

This will change the style of how a chapter cell is displayed. I changed the color and font. The most important thing to me is the CellFrameLabels. Noticed that I have made it so that every time you create a chapter cell it will display: Chapter [Chapter Number].

Chapter

In the picture above I have created several chapter cells and I have added the text: ": Title of Chapter #".

This is simple enough, we can create any cell, apply a definition and take advantange of counters to label the cells.

I have noticed how some books have definitions enclosed in box. So in this case I would like to create a box that contains Definition. Here is my lame attempt with the definition of the cell "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}},
 ]

Here is how it looks in the notebook:

Notebook

Here is the question: Is there a way to make the CellFrameLabels part of the cell? I want the label to have the same background and to be inline with the other text. Here is a screen shot of how I want it to look:

Desired Output

I have made the "label" bold font and blue. This is something that the user should not be able to modify.

jmlopez
  • 4,853
  • 4
  • 40
  • 74

1 Answers1

7

I don't think that it's possible to do in the way you want. CellLabels can only be text, while both CellDingbat and CellFrameLabels can be arbitrary cell expressions.

Both CellDingbat -> ... and CellFrameLabels -> {{...,None},{None,None}} work if the cell is only a single line long. But do not automatically resize for multiple line cells (at least as far as I could tell). For example:

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

Putting a CellFrameLabel on the top does not have this problem, but I don't know how to align it to the left...

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

I think that maybe the best looking solution would be to include the "Definition ch.def:" in the cell contents.

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

Make it so that it's not deletable by the average user and it is probably almost as good as a cell(frame)label. It can include counters so that it automatically shows the correct numbering. The only problem is that it does not appear automatically, but if you just copy a pre-existing cell, then that's not too much of a problem.


Edit: Adding an input alias that creates the non-deletable counter

First we get the current input aliases,

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

then replace any existing alias EscdefEsc with our new one:

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]

Since I don't have your style sheet, I need to set a couple of counters:

CellPrint[Cell["Setting the counters", "Text", 
  CounterAssignments -> {{"Chapter", 2}, {"Definition", 3}}]]

Now I can use the alias in an existing cell - it inherits the styling of the parent cell (unless otherwise specified):

add defn


Another option is to make a palette to go with your stylesheet. This would be useful since there's only a limited number of MenuCommandKey values that you can use for your new styles (n.b. overwriting the default ones will just confuse people). See this answer for an example of such a palette.

Community
  • 1
  • 1
Simon
  • 14,631
  • 4
  • 41
  • 101
  • Simon, I was thinking of something like that, making a text cell that is not editable. The problem was as you mentioned that the text doesn't appear there unless you copy and paste it. This is giving me an idea. Do you know if it's possible to define your own shortcuts? For example, [Esc]inf[Esc] draws the infinity symbol. Would it be possible to do something like [Esc]Def[Esc] So that it inserts the text with the definition label and the counter within the main Cell Tag with the background? – jmlopez Aug 30 '11 at 01:40
  • @jmlopez: That's completely possible. See [InputAliases](http://reference.wolfram.com/mathematica/ref/InputAliases.html) – Simon Aug 30 '11 at 01:42
  • Simon, I don't think I quite understand how to use `RowBox` to create my shortcut. So far what I'm trying is: `SetOptions[EvaluationNotebook[], InputAliases -> {"def" -> RowBox[{"Definition ", CounterBox["Chapter"], ".", CounterBox["Definition"]}]}]` But I can't seem to get the change the style or the options to make that cell non editable. Any suggestions? – jmlopez Aug 30 '11 at 03:59
  • Thank you Simon. Does your counter show up correctly? I've noticed that when I do [Esc]Def[Esc] the text with the counter show up but it starts with 0.0. But, if I click on any of the text and I go to Show Expression and then reverted back the counter gets updated to the correct one. – jmlopez Aug 30 '11 at 11:24