LilyPond snippets: Text

# Text

Text

## Adding the current date to a score

With a little Scheme code, the current date can easily be added to a score.

    % first, define a variable to hold the formatted date:
    date = #(strftime "%d-%m-%Y" (localtime (current-time)))

    % use it in the title block:
    \header {
      title = "Including the date!"
      subtitle = \date
    }

    \score {
      \relative c'' {
        c4 c c c
      }
    }
    % and use it in a \markup block:
    \markup {
      \date
    }

## Adjusting lyrics vertical spacing

This snippet shows how to bring the lyrics line closer to the staff.

    % Default layout:
    <<
      \new Staff \new Voice = melody \relative c' {
        c4 d e f
        g4 f e d
        c1
      }
      \new Lyrics \lyricsto melody { aa aa aa aa aa aa aa aa aa }

      % Reducing the minimum space below the staff and above the lyrics:
      \new Staff {
        \new Voice = melody \relative c' {
          c4 d e f
          g4 f e d
          c1
        }
      }
      \new Lyrics \with {
        \override VerticalAxisGroup #'nonstaff-relatedstaff-spacing = #'((basic-distance . 1))
      }
      \lyricsto melody { aa aa aa aa aa aa aa aa aa }
    >>

## Aligning and centering instrument names

The horizontal alignment of instrument names is tweaked by changing the `Staff.InstrumentName #'self-alignment-X` property. The `\layout` variables `indent` and `short-indent` define the space in which the instrument names are aligned before the first and the following systems, respectively.

    \paper {
      left-margin = 3\cm
    }

    \score {
      \new StaffGroup <<
        \new Staff {
          \override Staff.InstrumentName #'self-alignment-X = #LEFT
          \set Staff.instrumentName = \markup \left-column {
            "Left aligned"
            "instrument name"
          }
          \set Staff.shortInstrumentName = #"Left"
          c''1
          \break
          c''1
        }
        \new Staff {
          \override Staff.InstrumentName #'self-alignment-X = #CENTER
          \set Staff.instrumentName = \markup \center-column {
            Centered
            "instrument name"
          }
          \set Staff.shortInstrumentName = #"Centered"
          g'1
          g'1
        }
        \new Staff {
          \override Staff.InstrumentName #'self-alignment-X = #RIGHT
          \set Staff.instrumentName = \markup \right-column {
            "Right aligned"
            "instrument name"
          }
          \set Staff.shortInstrumentName = #"Right"
          e'1
          e'1
        }
      >>
      \layout {
        ragged-right = ##t
        indent = 4\cm
        short-indent = 2\cm
      }
    }

## Aligning marks with various notation objects

If specified, text marks may be aligned with notation objects other than bar lines. These objects include `ambitus`, `breathing-sign`, `clef`, `custos`, `staff-bar`, `left-edge`, `key-cancellation`, `key-signature`, and `time-signature`.

In such cases, text marks will be horizontally centered above the object. However this can be changed, as demonstrated on the second line of this example (in a score with multiple staves, this setting should be done for all the staves).

    \relative c' {
      e1

      % the RehearsalMark will be centered above the Clef
      \override Score.RehearsalMark #'break-align-symbols = #'(clef)
      \key a \major
      \clef treble
      \mark "↓"
      e1

      % the RehearsalMark will be centered above the TimeSignature
      \override Score.RehearsalMark #'break-align-symbols = #'(time-signature)
      \key a \major
      \clef treble
      \time 3/4
      \mark \markup { \char ##x2193 }
      e2.

      % the RehearsalMark will be centered above the KeySignature
      \override Score.RehearsalMark #'break-align-symbols = #'(key-signature)
      \key a \major
      \clef treble
      \time 4/4
      \mark \markup { \char ##x2193 }
      e1

      \break
      e1

      % the RehearsalMark will be aligned with the left edge of the KeySignature
      \once \override Score.KeySignature #'break-align-anchor-alignment = #LEFT
      \mark \markup { \char ##x2193 }
      \key a \major
      e1

      % the RehearsalMark will be aligned with the right edge of the KeySignature
      \once \override Score.KeySignature #'break-align-anchor-alignment = #RIGHT
      \key a \major
      \mark \markup { \char ##x2193 }
      e1

      % the RehearsalMark will be aligned with the left edge of the KeySignature
      % and then shifted right by one unit.
      \once \override Score.KeySignature #'break-align-anchor = #1
      \key a \major
      \mark \markup { \char ##x2193 }
      e1
    }

## Aligning objects created with the \mark command

By default the `\mark` command centers objects over a bar line. This behavior can be modified to align at right or left.

    \relative c' {
      c1 \mark "(Center)"
      c1
      \once \override Score.RehearsalMark #'self-alignment-X = #LEFT
      \mark "(Left)"
      c4 c c c
      c4 c c c
      \once \override Score.RehearsalMark #'self-alignment-X = #RIGHT
      \mark "(Right)"
      c1
    }

## Blanking staff lines using the \whiteout command

The `\whiteout` command underlays a markup with a white box. Since staff lines are in a lower layer than most other grobs, this white box will not overlap any other grob.

    \layout { ragged-right = ##f }
    \relative c' {
      \override TextScript #'extra-offset = #'(2 . 4)
      c2-\markup { \whiteout \pad-markup #0.5 "middle C" } c
    }

## Center text below hairpin dynamics

This example provides a function to typeset a hairpin (de)crescendo with some additional text below it, such as “molto” or “poco”. The example also illustrates how to modify the way an object is normally printed, using some Scheme code.

    hairpinWithCenteredText =
    #(define-music-function (parser location text) (markup?)
    #{
      \override Voice.Hairpin #'stencil = #(lambda (grob)
        (ly:stencil-aligned-to
         (ly:stencil-combine-at-edge
          (ly:stencil-aligned-to (ly:hairpin::print grob) X CENTER)
          Y DOWN
          (ly:stencil-aligned-to (grob-interpret-markup grob $text) X CENTER))
         X LEFT))
    #})

    hairpinMolto = \hairpinWithCenteredText \markup { \italic molto }
    hairpinMore = \hairpinWithCenteredText \markup { \larger moltissimo }

    \layout { ragged-right = ##f }

    \relative c' {
      \hairpinMolto
      c2\< c\f
      \hairpinMore
      c2\< c\f
    }

## Centering markup on note heads automatically

For technical reasons, text scripts attached to note heads cannot easily be centered on a note head’s width, unlike articulations.

Instead of using trial-and-error offset tweaks, this snippet uses a Scheme engraver to reset the horizontal parent of each markup to a `NoteColumn`. This also allows text to follow note heads which have been shifted via `force-hshift`.

    #(define (Text_align_engraver ctx)
      (let ((scripts '())
            (note-column #f))

        `((acknowledgers
           (note-column-interface
            . ,(lambda (trans grob source)
                 ;; cache NoteColumn in this Voice context
                 (set! note-column grob)))

           (text-script-interface
            . ,(lambda (trans grob source)
                 ;; whenever a TextScript is acknowledged,
                 ;; add it to `scripts' list
                 (set! scripts (cons grob scripts)))))

          (stop-translation-timestep
           . ,(lambda (trans)
                ;; if any TextScript grobs exist,
                ;; set NoteColumn as X-parent
                (and (pair? scripts)
                     (for-each (lambda (script)
                                 (set! (ly:grob-parent script X) note-column))
                               scripts))
                ;; clear scripts ready for next timestep
                (set! scripts '()))))))

    \layout {
      \context {
        \Voice
        \consists #Text_align_engraver
        \override TextScript #'X-offset =
          #ly:self-alignment-interface::aligned-on-x-parent
        \override TextScript #'self-alignment-X = #CENTER
      }
    }

    \new Staff <<
      \relative c'' {
        \override NoteColumn #'force-hshift = #3
        c1-\markup { \arrow-head #Y #DOWN ##t }
      }
      \\
      \relative c' {
        a4 a-\markup { \huge ^ } a a
      }
    >>

## Changing the default text font family

The default font families for text can be overridden with `make-pango-font-tree`.

    \paper {
      % change for other default global staff size.
      myStaffSize = #20
      %{
         run
             lilypond -dshow-available-fonts blabla
         to show all fonts available in the process log.
      %}

      #(define fonts
        (make-pango-font-tree "Times New Roman"
                              "Nimbus Sans"
                              "Luxi Mono"
    ;;                        "Helvetica"
    ;;                        "Courier"
         (/ myStaffSize 20)))
    }

    \relative c'' {
      c4^\markup {
        roman: foo \bold bla \italic bar \italic \bold baz
      }
      c'4_\markup {
        \override #'(font-family . sans)
        {
          sans: foo \bold bla \italic bar \italic \bold baz
        }
      }
      c'2^\markup {
        \override #'(font-family . typewriter)
        {
          mono: foo \bold bla \italic bar \italic \bold baz
        }
      }
    }

## Combining dynamics with markup texts

Some dynamics may involve text indications (such as “più forte” or “piano subito”). These can be produced using a `\markup` block.

    piuF = \markup { \italic più \dynamic f }
    \layout { ragged-right = ##f }
    \relative c'' {
      c2\f c-\piuF
    }

## Combining two parts on the same staff

The part combiner tool ( `\partcombine` command ) allows the combination of several different parts on the same staff. Text directions such as “solo” or “a2” are added by default; to remove them, simply set the property `printPartCombineTexts` to `f`. For vocal scores (hymns), there is no need to add “solo/a2” texts, so they should be switched off. However, it might be better not to use it if there are any solos, as they won’t be indicated. In such cases, standard polyphonic notation may be preferable.

This snippet presents the three ways two parts can be printed on a same staff: standard polyphony, `\partcombine` without texts, and `\partcombine` with texts.

    musicUp = \relative c'' {
      \time 4/4
      a4 c4.( g8) a4 |
      g4 e' g,( a8 b) |
      c b a2.
    }

    musicDown = \relative c'' {
      g4 e4.( d8) c4 |
      r2 g'4( f8 e) |
      d2 \stemDown a
    }

    \score {
      <<
        <<
        \new Staff {
          \set Staff.instrumentName = #"Standard polyphony"
          << \musicUp \\ \musicDown >>
        }
        \new Staff \with { printPartCombineTexts = ##f } {
          \set Staff.instrumentName = #"PartCombine without texts"
          \partcombine \musicUp \musicDown
        }
        \new Staff {
          \set Staff.instrumentName = #"PartCombine with texts"
          \partcombine \musicUp \musicDown
        }
        >>
      >>
      \layout {
        indent = 6.0\cm
        \context {
          \Score
          \override SystemStartBar #'collapse-height = #30
        }
      }
    }

## Creating "real" parenthesized dynamics

Although the easiest way to add parentheses to a dynamic mark is to use a `\markup` block, this method has a downside: the created objects will behave like text markups, and not like dynamics.

However, it is possible to create a similar object using the equivalent Scheme code (as described in the Notation Reference), combined with the `make-dynamic-script` function. This way, the markup will be regarded as a dynamic, and therefore will remain compatible with commands such as `\dynamicUp` or `\dynamicDown`.

    parenF = #(make-dynamic-script (markup #:line (#:normal-text #:italic
               #:fontsize 2 "(" #:hspace -0.8 #:dynamic "f" #:normal-text
               #:italic #:fontsize 2 ")")))

    \relative c'' {
      c4\parenF c c \dynamicUp c\parenF
    }

## Creating simultaneous rehearsal marks

Unlike text scripts, rehearsal marks cannot be stacked at a particular point in a score: only one `RehearsalMark` object is created. Using an invisible measure and bar line, an extra rehearsal mark can be added, giving the appearance of two marks in the same column. This method may also prove useful for placing rehearsal marks at both the end of one system and the start of the following system.

    {
      \key a \major
      \set Score.markFormatter = #format-mark-box-letters
      \once \override Score.RehearsalMark #'outside-staff-priority = #5000
      \once \override Score.RehearsalMark #'self-alignment-X = #LEFT
      \once \override Score.RehearsalMark #'break-align-symbols = #'(key-signature)
      \mark \markup { \bold { Senza denti } }

      % the hidden measure and bar line
      % \cadenzaOn turns off automatic calculation of bar numbers
      \cadenzaOn
      \once \override Score.TimeSignature #'stencil = ##f
      \time 1/16
      s16 \bar ""
      \cadenzaOff

      \time 4/4
      \once \override Score.RehearsalMark #'self-alignment-X = #LEFT
      \mark \markup { \box \bold Intro }
      d'1
      \mark \default
      d'1
    }

## Creating text spanners

The `\startTextSpan` and `\stopTextSpan` commands allow the creation of text spanners as easily as pedal indications or octavations. Override some properties of the `TextSpanner` object to modify its output.

    \paper { ragged-right = ##f }

    \relative c'' {
      \override TextSpanner #'(bound-details left text) = #"bla"
      \override TextSpanner #'(bound-details right text) = #"blu"
      a4 \startTextSpan
      b4 c
      a4 \stopTextSpan

      \override TextSpanner #'style = #'line
      \once \override TextSpanner
        #'(bound-details left stencil-align-dir-y) = #CENTER
      a4 \startTextSpan
      b4 c
      a4 \stopTextSpan

      \override TextSpanner #'style = #'dashed-line
      \override TextSpanner #'(bound-details left text) =
        \markup { \draw-line #'(0 . 1) }
      \override TextSpanner #'(bound-details right text) =
        \markup { \draw-line #'(0 . -2) }
      \once \override TextSpanner #'(bound-details right padding) = #-2

      a4 \startTextSpan
      b4 c
      a4 \stopTextSpan

      \set Staff.middleCPosition = #-13
      \override TextSpanner #'dash-period = #10
      \override TextSpanner #'dash-fraction = #0.5
      \override TextSpanner #'thickness = #10
      a4 \startTextSpan
      b4 c
      a4 \stopTextSpan
    }

## Demonstrating all headers

All header fields with special meanings.

    \header {
      copyright = "copyright"
      title = "title"
      subtitle = "subtitle"
      composer = "composer"
      arranger = "arranger"
      instrument = "instrument"
      metre = "metre"
      opus = "opus"
      piece = "piece"
      poet = "poet"
      texidoc = "All header fields with special meanings."
      copyright = "public domain"
      enteredby = "jcn"
      source = "urtext"
    }

    \layout {
      ragged-right = ##f
    }

    \score {
      \relative c'' { c1 | c | c | c }
    }

    \score {
       \relative c'' { c1 | c | c | c }
       \header {
         title = "localtitle"
         subtitle = "localsubtitle"
         composer = "localcomposer"
         arranger = "localarranger"
         instrument = "localinstrument"
         metre = "localmetre"
         opus = "localopus"
         piece = "localpiece"
         poet = "localpoet"
         copyright = "localcopyright"
       }
    }

## Embedding native PostScript in a \markup block

PostScript code can be directly inserted inside a `\markup` block.

    % PostScript is a registered trademark of Adobe Systems Inc.

    \relative c'' {
      a4-\markup { \postscript #"3 4 moveto 5 3 rlineto stroke" }
      -\markup { \postscript #"[ 0 1 ] 0 setdash 3 5 moveto 5 -3 rlineto stroke " }

      b4-\markup { \postscript #"3 4 moveto 0 0 1 2 8 4 20 3.5 rcurveto stroke" }
      s2
      a'1
    }

## Formatting lyrics syllables

Markup mode may be used to format individual syllables in lyrics.

    mel = \relative c'' { c4 c c c }
    lyr = \lyricmode {
      Lyrics \markup { \italic can } \markup { \with-color #red contain }
      \markup { \fontsize #8 \bold Markup! }
    }

    <<
      \new Voice = melody \mel
      \new Lyrics \lyricsto melody \lyr
    >>

## How to put ties between syllables in lyrics

This can be achieved by separating those syllables by tildes.

    \lyrics {
      wa~o~a
    }

## Lyrics alignment

Horizontal alignment for lyrics cam be set by overriding the `self-alignment-X` property of the `LyricText` object. `#-1` is left, `#0` is center and `#1` is right; however, you can use `#LEFT`, `#CENTER` and `#RIGHT` as well.

    \layout { ragged-right = ##f }
    \relative c'' {
      c1
      c1
      c1
    }
    \addlyrics {
      \once \override LyricText #'self-alignment-X = #LEFT
      "This is left-aligned"
      \once \override LyricText #'self-alignment-X = #CENTER
      "This is centered"
      \once \override LyricText #'self-alignment-X = #1
      "This is right-aligned"
    }

## Markup lines

Text that can spread over pages is entered with the `\markuplines` command.

    #(set-default-paper-size "a6")

    #(define-markup-list-command (paragraph layout props args) (markup-list?)
      (interpret-markup-list layout props
       (make-justified-lines-markup-list (cons (make-hspace-markup 2) args))))

    % Candide, Voltaire
    \markuplines {
      \override-lines #'(baseline-skip . 2.5) {
        \paragraph {
          Il y avait en Westphalie, dans le château de M. le baron de
          Thunder-ten-tronckh, un jeune garçon à qui la nature avait donné
          les mœurs les plus douces.  Sa physionomie annonçait son âme.
          Il avait le jugement assez droit, avec l'esprit le plus simple ;
          c'est, je crois, pour cette raison qu'on le nommait Candide.  Les
          anciens domestiques de la maison soupçonnaient qu'il était fils
          de la sœur de monsieur le baron et d'un bon et honnête
          gentilhomme du voisinage, que cette demoiselle ne voulut jamais
          épouser parce qu'il n'avait pu prouver que soixante et onze
          quartiers, et que le reste de son arbre généalogique avait été
          perdu par l'injure du temps.
        }
        \paragraph {
          Monsieur le baron était un des plus puissants seigneurs de la
          Westphalie, car son château avait une porte et des fenêtres.  Sa
          grande salle même était ornée d'une tapisserie.  Tous les chiens
          de ses basses-cours composaient une meute dans le besoin ; ses
          palefreniers étaient ses piqueurs; le vicaire du village était
          son grand-aumônier.  Ils l'appelaient tous monseigneur, et ils
          riaient quand il faisait des contes.
        }
      }
    }

## Multi-measure rest markup

Markups attached to a multi-measure rest will be centered above or below it. Long markups attached to multi-measure rests do not cause the measure to expand. To expand a multi-measure rest to fit the markup, use a spacer rest with an attached markup before the multi-measure rest.

Note that the spacer rest causes a bar line to be inserted. Text attached to a spacer rest in this way is left-aligned to the position where the note would be placed in the measure, but if the measure length is determined by the length of the text, the text will appear to be centered.

    \relative c' {
      \compressFullBarRests
      \textLengthOn
      s1*0^\markup { [MAJOR GENERAL] }
      R1*19
      s1*0_\markup { \italic { Cue: ... it is yours } }
      s1*0^\markup { A }
      R1*30^\markup { [MABEL] }
      \textLengthOff
      c4^\markup { CHORUS } d f c
    }

## Ottava text

Internally, `\ottava` sets the properties `ottavation` (for example, to `8va` or `8vb`) and `middleCPosition`. To override the text of the bracket, set `ottavation` after invoking `\ottava`.

    {
      \ottava #1
      \set Staff.ottavation = #"8"
      c''1
      \ottava #0
      c'1
      \ottava #1
      \set Staff.ottavation = #"Text"
      c''1
    }

## Outputting the version number

By putting the output of `lilypond-version` into a lyric, it is possible to print the version number of LilyPond in a score, or in a document generated with `lilypond-book`. Another possibility is to append the version number to the doc-string, in this manner:

    \score {
      \new Lyrics {
        \override Score.RehearsalMark #'self-alignment-X = #LEFT
        \mark #(string-append "Processed with LilyPond version " (lilypond-version))
        s2
      }
    }

## Piano template with centered lyrics

Instead of having a full staff for the melody and lyrics, lyrics can be centered between the staves of a piano staff.

    upper = \relative c'' {
      \clef treble
      \key c \major
      \time 4/4

      a4 b c d
    }

    lower = \relative c {
      \clef bass
      \key c \major
      \time 4/4

      a2 c
    }

    text = \lyricmode {
      Aaa Bee Cee Dee
    }

    \score {
      \new GrandStaff <<
        \new Staff = upper { \new Voice = "singer" \upper }
        \new Lyrics \lyricsto "singer" \text
        \new Staff = lower { \lower }
      >>
      \layout {
        \context {
          \GrandStaff
          \accepts "Lyrics"
        }
        \context {
          \Lyrics
          \consists "Bar_engraver"
        }
      }
      \midi { }
    }

## Printing marks at the end of a line

Marks can be printed at the end of the current line, instead of the beginning of the following line. In such cases, it might be preferable to align the right end of the mark with the bar line.

    \relative c'' {
      g2 c
      d,2 a'
      \once \override Score.RehearsalMark #'break-visibility = #end-of-line-visible
      \once \override Score.RehearsalMark #'self-alignment-X = #RIGHT
      \mark "D.C. al Fine"
      \break
      g2 b,
      c1 \bar "||"
    }

## Printing marks on every staff

Although text marks are normally only printed above the topmost staff, they may also be printed on every staff.

    \score {
      <<
        \new Staff { c''1 \mark "molto" c'' }
        \new Staff { c'1 \mark "molto" c' }
      >>
      \layout {
        \context {
          \Score
          \remove "Mark_engraver"
          \remove "Staff_collecting_engraver"
        }
        \context {
          \Staff
          \consists "Mark_engraver"
          \consists "Staff_collecting_engraver"
        }
      }
    }

## Printing text from right to left

It is possible to print text from right to left in a markup object, as demonstrated here.

    {
      b1^\markup {
        \line { i n g i r u m i m u s n o c t e }
      }
      f'_\markup {
        \override #'(text-direction . -1)
        \line { i n g i r u m i m u s n o c t e }
      }
    }

## Putting lyrics inside the staff

Lyrics can be moved vertically to place them inside the staff. The lyrics are moved with `\override LyricText #'extra-offset = #'(0 . dy)` and there are similar commands to move the extenders and hyphens. The offset needed is established with trial and error.

    <<
      \new Staff <<
        \new Voice = "voc" \relative c' { \stemDown a bes c8 b c4 }
    >>
      \new Lyrics \with {
        \override LyricText #'extra-offset = #'(0 . 8.6)
        \override LyricExtender #'extra-offset = #'(0 . 8.6)
        \override LyricHyphen #'extra-offset = #'(0 . 8.6)
      } \lyricsto "voc" { La la -- la __ _ la }
    >>

## Stand-alone two-column markup

Stand-alone text may be arranged in several columns using `\markup` commands:

    \markup {
      \fill-line {
        \hspace #1
        \column {
          \line { O sacrum convivium }
          \line { in quo Christus sumitur, }
          \line { recolitur memoria passionis ejus, }
          \line { mens impletur gratia, }
          \line { futurae gloriae nobis pignus datur. }
          \line { Amen. }
        }
        \hspace #2
        \column {
          \line { \italic { O sacred feast } }
          \line { \italic { in which Christ is received, } }
          \line { \italic { the memory of His Passion is renewed, } }
          \line { \italic { the mind is filled with grace, } }
          \line { \italic { and a pledge of future glory is given to us. } }
          \line { \italic { Amen. } }
        }
        \hspace #1
      }
    }

## String number extender lines

Make an extender line for string number indications, showing that a series of notes is supposed to be played all on the same string.

    stringNumberSpanner =
    #(define-music-function (parser location StringNumber) (string?)
      #{
        \override TextSpanner #'style = #'solid
        \override TextSpanner #'font-size = #-5
        \override TextSpanner #'(bound-details left stencil-align-dir-y) = #CENTER
        \override TextSpanner #'(bound-details left text) = \markup { \circle \number $StringNumber }
      #})

    \relative c {
      \clef "treble_8"
      \stringNumberSpanner "5"
      \textSpannerDown
      a8\startTextSpan
      b c d e f\stopTextSpan
      \stringNumberSpanner "4"
      g\startTextSpan a
      bes4 a g2\stopTextSpan
    }

## Three-sided box

This example shows how to add a markup command to get a three sided box around some text (or other markup).

    % New command to add a three sided box, with sides north, west and south
    % Based on the box-stencil command defined in scm/stencil.scm
    % Note that ";;" is used to comment a line in Scheme
    #(define-public (NWS-box-stencil stencil thickness padding)
       "Add a box around STENCIL, producing a new stencil."
       (let* ((x-ext (interval-widen (ly:stencil-extent stencil X) padding))
              (y-ext (interval-widen (ly:stencil-extent stencil Y) padding))
              (y-rule (make-filled-box-stencil (cons 0 thickness) y-ext))
              (x-rule (make-filled-box-stencil
                       (interval-widen x-ext thickness) (cons 0 thickness))))
         ;; (set! stencil (ly:stencil-combine-at-edge stencil X 1 y-rule padding))
         (set! stencil (ly:stencil-combine-at-edge stencil X LEFT y-rule padding))
         (set! stencil (ly:stencil-combine-at-edge stencil Y UP x-rule 0.0))
         (set! stencil (ly:stencil-combine-at-edge stencil Y DOWN x-rule 0.0))
         stencil))

    % The corresponding markup command, based on the \box command defined
    % in scm/define-markup-commands.scm
    #(define-markup-command (NWS-box layout props arg) (markup?)
       "Draw a box round @var{arg}.  Looks at @code{thickness},
    @code{box-padding} and @code{font-size} properties to determine line
    thickness and padding around the markup."
       (let* ((th (chain-assoc-get 'thickness props 0.1))
              (size (chain-assoc-get 'font-size props 0))
              (pad (* (magstep size)
                      (chain-assoc-get 'box-padding props 0.2)))
              (m (interpret-markup layout props arg)))
         (NWS-box-stencil m th pad)))

    % Test it:

    \relative c' {
      c1^\markup { \NWS-box ABCD }
      c1^\markup { \NWS-box \note #"4" #1.0 }
    }

## UTF-8

Various scripts may be used for texts (like titles and lyrics) by entering them in UTF-8 encoding, and using a Pango based backend. Depending on the fonts installed, this fragment will render Bulgarian (Cyrillic), Hebrew, Japanese and Portuguese.

    % end verbatim - this comment is a hack to prevent texinfo.tex
    % from choking on non-European UTF-8 subsets

    %% Edit this file using a Unicode aware editor, such as GVIM, GEDIT, Emacs

    %{

    You may have to install additional fonts.

    Red Hat Fedora

        taipeifonts fonts-xorg-truetype ttfonts-ja fonts-arabic \
       ttfonts-zh_CN fonts-ja fonts-hebrew

    Debian GNU/Linux

       apt-get install emacs-intl-fonts xfonts-intl-.* \
      ttf-kochi-gothic ttf-kochi-mincho \
      xfonts-bolkhov-75dpi xfonts-cronyx-100dpi xfonts-cronyx-75dpi
    %}

    % Cyrillic font
    bulgarian = \lyricmode {
      Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон.
    }

    hebrew = \lyricmode {
      זה כיף סתם לשמוע איך תנצח קרפד עץ טוב בגן.
    }

    japanese = \lyricmode {
      いろはにほへど ちりぬるを
      わがよたれぞ  つねならむ
      うゐのおくや  まけふこえて
      あさきゆめみじ ゑひもせず
    }

    % "a legal song to you"
    portuguese = \lyricmode {
      à vo -- cê uma can -- ção legal
    }

    \relative c' {
      c2 d
      e2 f
      g2 f
      e1
    }
    \addlyrics { \bulgarian }
    \addlyrics { \hebrew }
    \addlyrics { \japanese }
    \addlyrics { \portuguese }

## Vocal ensemble template with lyrics aligned below and above the staves

This template is basically the same as the simple “Vocal ensemble” template, with the exception that here all the lyrics lines are placed using `alignAboveContext` and `alignBelowContext`.

    global = {
      \key c \major
      \time 4/4
    }

    sopMusic = \relative c'' {
      c4 c c8[( b)] c4
    }
    sopWords = \lyricmode {
      hi hi hi hi
    }

    altoMusic = \relative c' {
      e4 f d e
    }
    altoWords = \lyricmode {
      ha ha ha ha
    }

    tenorMusic = \relative c' {
      g4 a f g
    }
    tenorWords = \lyricmode {
      hu hu hu hu
    }

    bassMusic = \relative c {
      c4 c g c
    }
    bassWords = \lyricmode {
      ho ho ho ho
    }

    \score {
      \new ChoirStaff <<
        \new Staff = "women" <<
          \new Voice = "sopranos" { \voiceOne << \global \sopMusic >> }
          \new Voice = "altos" { \voiceTwo << \global \altoMusic >> }
        >>
        \new Lyrics \with { alignAboveContext = #"women" } \lyricsto "sopranos" \sopWords
        \new Lyrics \with { alignBelowContext = #"women" } \lyricsto "altos" \altoWords
        % we could remove the line about this with the line below, since we want
        % the alto lyrics to be below the alto Voice anyway.
        % \new Lyrics \lyricsto "altos" \altoWords

        \new Staff = "men" <<
          \clef bass
          \new Voice = "tenors" { \voiceOne << \global \tenorMusic >> }
          \new Voice = "basses" { \voiceTwo << \global \bassMusic >> }
        >>
        \new Lyrics \with { alignAboveContext = #"men" } \lyricsto "tenors" \tenorWords
        \new Lyrics \with { alignBelowContext = #"men" } \lyricsto "basses" \bassWords
        % again, we could replace the line above this with the line below.
        % \new Lyrics \lyricsto "basses" \bassWords
      >>
    }

## Volta text markup using repeatCommands

Though volte are best specified using `\repeat volta`, the context property `repeatCommands` must be used in cases where the volta text needs more advanced formatting with `\markup`.

Since `repeatCommands` takes a list, the simplest method of including markup is to use an identifier for the text and embed it in the command list using the Scheme syntax `#(list (list 'volta textIdentifier))`. Start- and end-repeat commands can be added as separate list elements:

    voltaAdLib = \markup { 1. 2. 3... \text \italic { ad lib. } }

    \relative c'' {
      c1
      \set Score.repeatCommands = #(list (list 'volta voltaAdLib) 'start-repeat)
      c4 b d e
      \set Score.repeatCommands = #'((volta #f) (volta "4.") end-repeat)
      f1
      \set Score.repeatCommands = #'((volta #f))
    }

#### LilyPond — Snippets