### 11.3 Block Attributes ¶

Blocks support a number of attributes governing their visual appearance. Any of the below attributes can be made part of styles (even `label`).

`label`

  Blocks may have a label, that can be specified using the colon syntax as described in Labels. They can contain formatting escapes, see Text Formatting. Specific to Block Diagrams is the `\*` escape, which is replaced to the name of the block (if any).

`text.*`

  Text formatting attributes are described in Text Formatting Attributes. Word wrapping is also available via `text.wrap`, see Word Wrapping for Block Diagrams.

`number`

  Numbering is used similar to Signalling Charts, see Numbering.

`line.*`
`fill.*`
`shadow.*`

  These attributes apply fully to blocks. Boxes, in particular also honour `line.corner` and `line.radius`. See Common Attributes for more.

`margin.top`
`margin.bottom`
`margin.left`
`margin.right`

  These can be used to set the margin around the block. Any nonnegative number will do. Using the `margin` attribute sets all four of the above to the same value. Alternatively, you can specify four comma separated values, to set all four margins, like `margin=10,10,5,5`. The order is top, bottom, left and right.

`imargin.top`
`imargin.bottom`
`imargin.left`
`imargin.right`

  These can be used to set the margin inside the block. This value is used only when the block contains other blocks or a label. Any nonnegative number will do. Using the `imargin` attribute sets all four of the above (plus also `imargin.label`, see below) to the same value. Alternatively, you can specify four comma separated values, to set all four margins, like `imargin=10,10,5,5`. The order is top, bottom, left and right. The default is 10 pixels for boxes (via the default style ‘`container`’) and 0 pixels for shapes (via the default style ‘`container_shape`’). For boxes and shapes with no content (but perhaps a label) all values default to 0 (via the default style ‘`block`’).

`imargin.label`

  Use this attribute to set the distance between the label and the content of the block in pixels. Any nonnegative number will do. Only applicable if the block has both a label and content. Note that setting the `imargin` attribute to a single number will also set this attribute. See above. Also, the default value for this attribute is the same as for the other `imargin.*` attributes above.

`content_margin`

  If the block has content (or is `around` some other blocks), setting this to false (which is the default) will ignore the margins of the contained blocks, when deteriming the size of this (the containing) block. The margins of the contained blocks will still be applied, when determining their position in relation to one another. For example, setting this to false and all `imargin` values to zero results in the contained blocks actually touch the container. As a shorthand, you can also set this attribute to a number, which is equivalent to setting it `false` and applying the number to `imargin`. Similar to `imargin` you can set all four internal margins using four comma separated values.

`width`
`height`
`size`

  These set the size of the block. `size` is a shorthand for setting both `width` and `height` to the same value. Alternatively, you can specify two numbers separated by a comma to set both height and width, such as `box [size=10,20];`. If the block contains other blocks, this is a minimum size - the block can be larger if needed. Otherwise Msc-generator attempts to make the block exactly this big. If the block has a label larger than this size, it may be increased to make room for the label depending on the value of the `label.mode` attribute (defaults to `enlarge`). You can also specify the name of another block. In this case the two blocks will have the same height and/or width. You can even specify a list of other blocks separated by plus signs (`+`). In this case the size of the block having this attribute will be equal to the space occupied by the blocks listed (and not the sum of their size). Thus if blocks `A` and `B` are far from each other, setting the width of a block `C` to `width=A+B` will include the distance between `A` and `B`.

`aspect_ratio`

  Enforces a certain X/Y ratio for the block. Cannot be used if both the width and height are set. The value is a floating point number, such as `aspect_ratio=1.5` or a ratio (width divided by height), such as `aspect_ratio="3:2"`.)

`label.pos`

  Used to set the position of the label inside the block. Five values are valid: `above` (above the content and top aligned), `below` (below the content and bottom aligned), `left` and `right` (left or right of the content and left/right aligned. For blocks without content it can also be `center` in which case the label is centered both horizontally and vertically.

`label.align`

  If `label.pos` is `above` or `below`, this can be `left`, `right` or `center`. If `label.pos` is `left` or `right`, this can be `top`, `bottom` or `middle`. It is used to specify the label’s alignment in the direction not set by `label.pos`. You can also use a percentage number for finer control. Value `0` means `left` or `top`; value `100` means `right` or `bottom`; while value `50` means center or middle. You can use any value between 0 and 100, but not outside.

`label.orient`

  Governs the orientation of the label. It can take four values, `normal`, `upside_down`, `left` or `right`. The default is the first one, which is normal, left-to-right reading.

`label.mode`

  It dictates what to do when both a label and the size of a block is set. The default value `enlarge` will result in scaling the block to accommodate the label. Using `scale` will scale down the text to fit the label. Especially useful for shapes. Finally, `scale_2d` will also scale the text, but differently in the two dimensions.

`allow_arrows`

  If set to yes, arrows do not go around this block, but can cross it. Note that for individual arrows, you can allow crossing of a block via the `cross` and `cross_all` arrow attributes, see Arrows in Block Diagrams.

`multi_offset`
`multi_offset.x`
`multi_offset.y`

  These govern how many pixels subsequent instances in a multiblock series are shifted compared to the previous one. If both are set to a positive number the next element will come left and up by the number of pixels specified. Specifying a negative number will reverse the given direction. Setting `multi_offset` is equivalent to setting the x and y direction to the same value.

`draw_before`
`draw_after`

  You can specify one or more blocks (separated by plus signs or via repeating the attribute) the block shall be drawn before or after. You can use only one of the two attributes for any diagram elements. Setting one will automatically clear the other.

`collapsed`
`indicator`

  Setting this attribute on a visible block (`box`, `boxcol` or `shape`) that contains other blocks will skip drawing the visible block. Instead a small indicator is drawn to show that there are hidden elements. You can disable the indicator using the `use indicator=no` command or via the `indicator` block attribute.

  Note that if you disable the indicator for a collapsed block, its base style will become `block` and not `container` or `container_shape` (see below), as is the case for blocks with content.

Block also rely on a few built-in styles. The attributes of each block default to the style `block` if they are empty and to the style `container` or `container_shape` (for boxes and shapes, respectively) if they contain other blocks.69 Then a style for each shape is applied (if found) that has the name `shape_<shapename>`, that is `shape_box` for boxes or `shape_oval` for the shape `oval`. These apply to the specific shape irrespective of whether that is a container or a blocks. They can be used to set shape specific margin, for example. The shapes `around`, `join`, `indicator` and `text` serve as basic styles for the respective block types, while `invis` is used for invisible blocks such as `row`, `col`, `cell`, `break` or `space`. Finally, the special styles `col` and `row` are used to set default alignment for blocks in a column or row, respectively. See Default alignment below.

There are two more special styles, called the running styles. They are applied to every block and arrow (respectively) created and can be modified via the `use`, `arrows use` and `blocks use` commands, with the first one having an effect on the running styles for both arrows and blocks. These commands enable quickly setting the attributes of all following blocks and/or arrows. Note that similar to all other style modifications, any change made to the running styles is in effect only till the end of the scope, see Scoping. Thus on the example below, the red line color only applies to block `B` and the arrow between `A` and `B`, but the margin is also applied to block `C`.

#### Footnotes

##### (69)

Thus now we have 3 basic default style for blocks. `block` is for boxes and shapes that have no content, just maybe a label. `container` is for boxes having content, while `container_shape` is for shapes having content. The reason for all these is to allow different internal margins by default. Of these three only `container` has a nonzero default imargin, specifically 10. The other two has `imargin=0`.