@Section @Title { Labels } @Tag { pie_labe } @Begin @PP labels. @RawIndex { labels } labels.in.pie @SubIndex { in pie graphs } piegraphs. @RawIndex { pie graphs } piegraphs.labels @SubIndex { labels } Labels are short messages printed inside the slices, identifying them. We've already seen the @Code label option, in which we place the label, which can be an arbitrary Lout object. In this section we'll show how to change the format and position of these labels. @PP For changing the format of a label there are four options: @ID -1px @Break @OneRow @Code @Verbatim { @Slice labelfont { -2p } labelbreak { clines } labelmargin { 0.2f } labelformat { @Body } } This shows the default values of these options. @PP The @Code labelfont option determines the font in which the labelfont. @RawIndex { @Code "labelfont" options } labelfont.in.pie @SubIndex { in pie graphs } piegraphs. @RawIndex { pie graphs } piegraphs.labelfont @SubIndex { @Code "labelfont" option } label will be printed. The default value shown above calls for the current font to be used, two points smaller than it otherwise would have been. Any value acceptable to the @Code "@Font" symbol from Section {@NumberOf fonts} is acceptable here, including changing the family and face. @PP The @Code labelbreak option determines how paragraph breaking labelbreak. @RawIndex { @Code "labelbreak" options } labelbreak.in.pie @SubIndex { in pie graphs } piegraphs. @RawIndex { pie graphs } piegraphs.labelbreak @SubIndex { @Code "labelbreak" option } within the label will be carried out. Any value acceptable to the @Code "@Break" symbol from Section {@NumberOf paras} is acceptable here. The default value shown above causes each line of the label to be one line of the result, with each line centred with respect to the longest line. @PP The @Code labelmargin option places a margin around the labelmargin. @RawIndex { @Code "labelmargin" options } labelmargin.in.pie @SubIndex { in pie graphs } piegraphs. @RawIndex { pie graphs } piegraphs.labelmargin @SubIndex { @Code "labelmargin" option } label. The default value shown makes a margin of width 0.2 times the current font size. This margin has no effect on the appearance or position of the label (in particular, it is drawn outside @Code "labelformat" below, not inside). It is only needed for adjusting the appearance of fingers, as described as the end of this section. @PP The @Code labelformat option allows more radical changes labelformat. @RawIndex { @Code "labelformat" options } labelformat.in.pie @SubIndex { in pie graphs } piegraphs. @RawIndex { pie graphs } piegraphs.labelformat @SubIndex { @Code "labelformat" option } to the label format. Its value may be an arbitrary object. Within it, the symbol @Code "@Body" stands for the value of the @Code "label" option: @ID -1px @Break @OneRow @Code @Verbatim { @Slice labelformat { @ShadowBox @Body } } will cause the text of the label to appear within a shadow box. Of course, we could get this effect by placing these symbols in the label itself, like this: @ID -1px @Break @OneRow @Code @Verbatim { @Slice label { @ShadowBox { Admin (20%) } } } However, like all @Code "@Slice" options, @Code labelformat may be given to @Code "@Pie" as well, like this: @ID -1px @Break @OneRow @Code @Verbatim { @Pie labelformat { @ShadowBox @Body } } and there it affects every label in the pie graph: @CD @Pie labelformat { @ShadowBox @Body } { @Slice weight { 20 } label { Admin (20%) } @Slice weight { 40 } label { Research (40%) } @Slice weight { 40 } label { Teaching (40%) } } When the labels all have the same format, this is much faster and less error-prone than formatting each label independently, especially when experimenting with different formats. @PP Two options are available for changing the positions of labels: @ID -1px @Break @OneRow @Code @Verbatim { @Slice labelradius { internal } labeladjust { 0c 0c } } Each label occupies a rectangular area, and these options determine the position of the centre of the rectangle. @PP The @Code labelradius option determines how far the labelradius.pie @Index { @Code "labelradius" option (pie graphs) } piegraphs. @RawIndex { pie graphs } piegraphs.labelradius @SubIndex { @Code "labelradius" option } centre of the label is from the point of the slice (usually the same as the centre of the pie graph, but not when the slice is detached). The default value of {@Code labelradius} shown above, {@Code internal}, is a synonym for 0.6, so it causes the centre of the label to appear 60% of the way from the point of the slice to its outside boundary. The angular position of the label centre will be halfway around the arc of the slice. No attempt is made to fit the label into the interior of the slice; it lands where these rules say irrespective of what might be overstruck when it does. It is printed after its slice's outline and paint, so it can't be hidden by them; but if it strays into the next slice it will be buried under any paint in that slice. @PP For fine adjustments, the @Code labeladjust option labeladjust. @RawIndex { @Code "labeladjust" options } labeladjust.in.pie @SubIndex { in pie graphs } piegraphs. @RawIndex { pie graphs } piegraphs.labeladjust @SubIndex { @Code "labeladjust" option } may be used to move the label centre any distance in the x and y directions. For example, @ID -1px @Break @OneRow @Code @Verbatim { @Slice labeladjust { 0.2c -0.1c } } will move the label centre 0.2 centimetres further to the right and 0.1 centimetres down from where it would otherwise have appeared. @PP The recommended procedure for getting internal labels to look good is to first try them without any adjustment. Next, consider rearranging the label layout. Our running example has poorly positioned labels, but they can be improved just by breaking each label over two lines: @CD @Pie # abovecaption { Ideal breakdown of academic workload } aboveextra { 1f } { @Slice detach { yes } weight { 20 } label { Admin @LLP (20%) } @Slice weight { 40 } paint { green } label { Research @LLP (40%) } @Slice weight { 40 } paint { lightred } label { Teaching @LLP (40%) } } Finally, the @Code labeladjust option is there as a last resort. @PP To get a label outside its slice, use externallabels.pie @Index { external labels in pie graphs } piegraphs. @RawIndex { pie graphs } piegraphs.externallabels @SubIndex { external labels } @ID -1px @Break @OneRow @Code @Verbatim { @Slice labelradius { external } } Again, @Code external is just a synonym for the number 1.4, meaning that the label centre is to be placed 140% of the pie chart's radius away from the point of the slice. It can be replaced by any number. @PP Two issues arise when labels are placed externally. The first issue is that Lout does not know where these labels are being printed and so cannot leave space for them. Section {@NumberOf pie_over} has already explained how to handle this problem using the {@Code leftextra}, {@Code rightextra}, {@Code aboveextra}, and {@Code belowextra} options of {@Code "@Pie"}. Our running example, converted to external labels, might be entered like this: @ID -1px @Break @OneRow @Code @Verbatim { @Pie abovecaption { Ideal breakdown of academic workload } labelradius { external } aboveextra { 0.7c } belowextra { 1.3c } { @Slice detach { yes } weight { 20 } label { Admin @LLP (20%) } @Slice weight { 40 } paint { green } label { Research @LLP (40%) } @Slice weight { 40 } paint { lightred } label { Teaching @LLP (40%) } } } which produces this: @CD @Pie abovecaption { Ideal breakdown of academic workload } labelradius { external } aboveextra { 0.7c } belowextra { 1.3c } { @Slice detach { yes } weight { 20 } label { Admin @LLP (20%) } @Slice weight { 40 } paint { green } label { Research @LLP (40%) } @Slice weight { 40 } paint { lightred } label { Teaching @LLP (40%) } } The amount of extra space to add has to be worked out by experiment. It can help to temporarily remove all captions and enclose the @Code "@Pie" symbol in a box with zero margin: @ID -1px @Break @Code @Verbatim { @Box margin { 0i } @Pie ... } to show clearly how much space the @Code extra options are covering. @PP The second issue raised by external labels is how to visually connect each label with its slice, when this fingers.pie @Index { fingers in pie graphs } piegraphs. @RawIndex { pie graphs } piegraphs.fingers @SubIndex { fingers } seems necessary. @Code "@Pie" can do this with short line segments that we will call {@I fingers}: @CD @Pie abovecaption { Ideal breakdown of academic workload } labelradius { external } aboveextra { 1.3f } belowextra { 3f } finger { yes } { @Slice detach { yes } weight { 20 } label { Admin @LLP (20%) } @Slice weight { 40 } paint { green } label { Research @LLP (40%) } @Slice weight { 40 } paint { lightred } label { Teaching @LLP (40%) } } These were made by adding @Code "finger { yes }" as another option to the @Code "@Pie" symbol. @PP Each slice has several options which control the appearance of its own finger. Here is the full set, showing their default values: @ID -1px @Break @OneRow @Code @Verbatim { @Slice finger { no } fingerstyle { solid } fingerdashlength { 0.2f } fingerwidth { thin } fingerradius { 0.7 } fingeradjust { 0c 0c } } The @Code "finger" option may be @Code "no" or @Code "yes" finger.pie @Index { @Code "finger" option (pie graphs) } piegraphs. @RawIndex { pie graphs } piegraphs.finger @SubIndex { @Code "finger" option } and determines whether a finger will be drawn or not. @PP The {@Code fingerstyle}, {@Code fingerdashlength}, and {@Code fingerwidth} options are exactly analogous to fingerstyle.pie @Index { @Code "fingerstyle" option (pie graphs) } piegraphs. @RawIndex { pie graphs } piegraphs.fingerstyle @SubIndex { @Code "fingerstyle" option } fingerdashlength.pie @Index { @Code "fingerdashlength" option (pie graphs) } piegraphs. @RawIndex { pie graphs } piegraphs.fingerdashlength @SubIndex { @Code "fingerdashlength" option } fingerwidth.pie @Index { @Code "fingerwidth" option (pie graphs) } piegraphs. @RawIndex { pie graphs } piegraphs.fingerwidth @SubIndex { @Code "fingerwidth" option } the {@Code outlinestyle}, {@Code outlinedashlength}, and {@Code outlinewidth} options. They take the same range of values, and determine the style of the line segment drawn to make the finger (solid, dashed, etc.). @PP The {@Code fingerradius} and {@Code fingeradjust} options are exactly analogous to the {@Code labelradius} and {@Code labeladjust} options, except that instead of determining the position of the centre of the label they determine the position of the inner endpoint of the finger. The default values place it 70% of the way from the point of the slice to its outer edge. The @I outer endpoint of the finger always terminates on the bounding box of the label, with the line pointing through the centre of the label, and this cannot be changed, although the @Code labelmargin option (see the start of this section) may be used to decrease or increase the margin around the label, thus causing the finger to terminate closer to the label or further away. @PP Fingers may have arrowheads on their inner ends: @ID @OneRow @Code @Verbatim { @Pie labelradius { 1.6 } aboveextra { 2f } belowextra { 4f } finger { yes } fingerarrow { yes } fingerradius { 1 } { @Slice detach { yes } weight { 20 } label { Admin @LLP (20%) } @Slice weight { 40 } paint { green } label { Research @LLP (40%) } @Slice weight { 40 } paint { lightred } label { Teaching @LLP (40%) } } } produces @CD @Pie labelradius { 1.6 } aboveextra { 2f } belowextra { 4f } finger { yes } fingerarrow { yes } fingerradius { 1 } { @Slice detach { yes } weight { 20 } label { Admin @LLP (20%) } @Slice weight { 40 } paint { green } label { Research @LLP (40%) } @Slice weight { 40 } paint { lightred } label { Teaching @LLP (40%) } } The point of the arrowhead coincides with the inner endpoint of the finger, so @Code "fingerradius" would usually be set to @Code 1 when arrowheads are used. @PP Although @Code "@Pie" does not offer the elegant selection of arrowhead styles of {@Code "@Diag"}, it is possible to change the length and width of the arrowheads with these options: @ID @OneRow @Code @Verbatim { @Slice fingerarrowlength { 0.6f } fingerarrowwidth { 0.45f } } This example shows the default values of these options. These options may of course be given to @Code "@Pie" and also in the setup file as usual. @End @Section