On Thu, 23 Jan 2020 22:53:42 +0100
"Thomas A. Schmitz"
On 23. Jan 2020, at 22:32, Wolfgang Schuster
wrote: Bonus question: Why is it necessary to put \definelinenumbering before \framed?
Wolfgang
I would be grateful for an answer because I have no clue ;-) In my real life case, I fetch the content of the frame from an xml file. Since not every frame has line numbering, I am already inside the frame when I have to define and set up the line numbering environment. I can probably code around it, but it makes my life definitely more difficult…
Before I give the answer to the question we have to go back to a few TeX/ConTeXt basics. # Grouping When you create a new command it is normally local to the current group level and after you end the group the command no longer exists. In the following example I redefine the value for the color red in a group, when the group ends the new value is forgotten and the previous one is used. When you now create a new command or environment in the group and try to use it after its end you will get a error message (something I tried to avoid with the example) about an undefined command. %%%% begin example \starttext \color[red]{Red} \start \definecolor[red][b=1] \color[red]{Red} \stop \color[red]{Red} \stoptext %%%% end example # Inheritance When you create a new command or environment with \define... the new instance inherits most of its values from a parent instance. You can overwrite individual values for your new instance but all other values are taken from the parent. %%%% begin example \setupframed[foregroundstyle=bold] \defineframed[customframe][framecolor=red] \starttext \framed{Framed text!} \placeframed[customframe]{Framed text!} \stoptext %%%% end example When you can combine this with the previous section which explained grouping and overwrite values within the group. After the group has ended the new values are forgotten and the instance uses what was set before the group. %%%% begin example \defineframed[customframe][framecolor=red] \starttext \placeframed[customframe]{Framed text!} \start \setupframed[customframe][foregroundstyle=bold] \placeframed[customframe]{Framed text!} \stop \placeframed[customframe]{Framed text!} \stoptext %%%% end example # Line numbering Line numbering in MkIV happens at a different point as it did in MkII. When you use line numbers for \framed (or \startframedtext) ConTeXt adds the numbers to the frame after the framed box is completed. When the framed content is put in the box you're always within a group which means the numbers are added after the group has ended and as explained in the two sections above settings within a group normally are forgotten afterwards. The first and bigger problem is that you try to create a new line numbering instance in each frame which no longer exists when the numbers are added and when ConTeXt tries to access values of this no longer existing instance in fails to get them which results in the error message. %%%% begin example \starttext \startframedtext \definelinenumbering[example] \startlinenumbering[example] \samplefile{klein} \stoplinenumbering \stopframedtext \stoptext %%%% end example The minor problem is that you local changes for each instance (e.g. the color for the numbers) are also forgotten because you set them within the group. Only a limited numbers of values can be set in a group (e.g. the starting number) and they have to bet set with \startlinenumbering, this is possible because they are passed to Lua which ignores TeX groups. While new linenumbering instances outside of frames are save in most cases you should try to avoid this and do it at the begin of the document because even here you can run into problems. Below is a example where I show that you can get the same error as in your example with line numbers for the whole page. %%%% begin example \setupsectionblock[bodypart][page=no] \starttext \startbodymatter \definelinenumbering[example] \startlinenumbering[example] \samplefile{klein} \stoplinenumbering \stopbodymatter \stoptext %%%% end example Wolfgang