| [ << Interfaces for programmers ] | [Top][Contents][Index] | [ LilyPond Scheme interfaces >> ] |
| [ < On properties ] | [ Up: New markup command definition ] | [ Adapting builtin commands > ] |
A complete example
The following example defines a markup command to draw a double box around a piece of text.
Firstly, we need to build an approximative result using markups.
Consulting the Text markup commands shows us the \box
command is useful:
\markup \box \box HELLO![]()
Now, we consider that more padding between the text and the boxes is
preferable. According to the \box documentation, this command
uses a box-padding property, which defaults to 0.2. The
documentation also mentions how to override it:
\markup \box \override #'(box-padding . 0.6) \box A![]()
Then, the padding between the two boxes is considered too small, so we override it too:
\markup \override #'(box-padding . 0.4) \box \override #'(box-padding . 0.6) \box A![]()
Repeating this lengthy markup would be painful. This is where a markup
command is needed. Thus, we write a double-box markup command,
taking one argument (the text). This draws the two boxes, with some
padding.
#(define-markup-command (double-box layout props text) (markup?)
"Draw a double box around text."
(interpret-markup layout props
#{\markup \override #'(box-padding . 0.4) \box
\override #'(box-padding . 0.6) \box { #text }#}))
or, equivalently
#(define-markup-command (double-box layout props text) (markup?)
"Draw a double box around text."
(interpret-markup layout props
(markup #:override '(box-padding . 0.4) #:box
#:override '(box-padding . 0.6) #:box text)))
text is the name of the command argument, and markup? its
type: it identifies it as a markup. The interpret-markup
function is used in most of markup commands: it builds a stencil, using
layout, props, and a markup. In the second case, this
markup is built using the markup Scheme macro, see Markup construction in Scheme. The transformation from \markup
expression to Scheme markup expression is straight-forward.
The new command can be used as follow:
\markup \double-box A
It would be nice to make the double-box command customizable:
here, the box-padding values are hard coded, and cannot be
changed by the user. Also, it would be better to distinguish the
padding between the two boxes, from the padding between the inner box
and the text. So we will introduce a new property,
inter-box-padding, for the padding between the two boxes. The
box-padding will be used for the inner padding. The new code is
now as follows:
#(define-markup-command (double-box layout props text) (markup?)
#:properties ((inter-box-padding 0.4)
(box-padding 0.6))
"Draw a double box around text."
(interpret-markup layout props
#{\markup \override #`(box-padding . ,inter-box-padding) \box
\override #`(box-padding . ,box-padding) \box
{ #text } #}))
Again, the equivalent version using the markup macro would be:
#(define-markup-command (double-box layout props text) (markup?)
#:properties ((inter-box-padding 0.4)
(box-padding 0.6))
"Draw a double box around text."
(interpret-markup layout props
(markup #:override `(box-padding . ,inter-box-padding) #:box
#:override `(box-padding . ,box-padding) #:box text)))
Here, the #:properties keyword is used so that the
inter-box-padding and box-padding properties are read from
the props argument, and default values are given to them if the
properties are not defined.
Then, these values are used to override the box-padding
properties used by the two \box commands. Note the backquote and
the comma in the \override argument: they allow you to introduce
a variable value into a literal expression.
Now, the command can be used in a markup, and the boxes padding be customized:
#(define-markup-command (double-box layout props text) (markup?) #:properties ((inter-box-padding 0.4) (box-padding 0.6)) "Draw a double box around text." (interpret-markup layout props #{\markup \override #`(box-padding . ,inter-box-padding) \box \override #`(box-padding . ,box-padding) \box { #text } #})) \markup \double-box A \markup \override #'(inter-box-padding . 0.8) \double-box A \markup \override #'(box-padding . 1.0) \double-box A![]()
| [ << Interfaces for programmers ] | [Top][Contents][Index] | [ LilyPond Scheme interfaces >> ] |
| [ < On properties ] | [ Up: New markup command definition ] | [ Adapting builtin commands > ] |
![[image of music]](../e6/lily-0ee6813b.png)
![[image of music]](../6b/lily-94d7eb9c.png)
![[image of music]](../52/lily-08722dff.png)
![[image of music]](../9b/lily-f0123368.png)