LilyPond snippets: Text

# Text

Text

## Adding a QR code

This snippet lets you draw a QR-code, for example to provide a link to the composer’s, or the music editor’s website. Actually encoding the URL into a QR-code is not done here (this just draws the QR-code from a grid of "black" or "white" values), but see the code for a short Python snippet you can use to avoid having to fill for each small square if it’s black or white.

    %% Original thread: https://lists.gnu.org/archive/html/lilypond-user-fr/2022-07/msg00005.html
    %% (snippet author: Jean Abou Samra <jean@abou-samra.fr>)

    \paper { tagline = ##f }

    #(define (index-map f . lsts)
    "Applies @code{f} to corresponding elements of @code{lists}, just as @code{map},
    providing an additional counter starting at zero.  @code{f} needs to have the
    counter in its arguments like @code{(index-map (lambda (i arg) <body>) lists)}"
       (let loop ((lsts lsts)
                  (acc '())
                  (i 0))
         (if (any null? lsts)
             (reverse! acc)
             (loop (map cdr lsts)
                   (cons (apply f i (map car lsts))
                         acc)
                   (1+ i)))))

    #(define-markup-command (qr-code layout props data) (string?)
       #:properties ((width 10))
       (let* (;; Return lines in reversed order, since translating in Y-axis
              ;; uses increasing values. Meaning lines will be stacked upwards.
              (lines (reverse
                       (remove
                         string-null?
                         (map string-trim-both (string-split data #\newline)))))
              (n (length lines))
              (square-width (/ width n))
              (box (make-filled-box-stencil `(0 . ,square-width)
                                            `(0 . ,square-width))))

         ;; Build the final qr-code-stencil from line-stencils list
         (apply ly:stencil-add
                ;; Get a list of line-stencils
                (index-map
                 (lambda (i line)
                   ;; Build a line-stencil from square-stencils list
                   (apply ly:stencil-add
                          ;; Get a list of (already translated) square-stencils
                          ;; per line
                          (index-map
                           (lambda (j char)
                             (ly:stencil-translate
                              (stencil-with-color
                               box
                               (case char
                                ((#\0)
                                 white)
                                ((#\1)
                                 black)
                                (else
                                 (ly:warning
                                   "unrecognized character ~a, should be 0 or 1"
                                   char)
                                 red)))
                              (cons (* j square-width)
                                    (* i square-width))))
                          (string->list line))))
                 lines))))

    %{
    A string representation of the QR code.  0 means white, 1 means black.
    You can generate this automatically using Python and the pyqrcode module
    ("pip install pyqrcode").  Use this line of code in a Python prompt:

    >>> import pyqrcode; print(pyqrcode.create("https://lilypond.org").text(quiet_zone=0))
    %}

    lilypondDotOrg =
    "11111110011100011110101111111
    10000010010000010111101000001
    10111010010110001000101011101
    10111010001010111101001011101
    10111010110100000111001011101
    10000010011100011001101000001
    11111110101010101010101111111
    00000000111000111110100000000
    00110011101100001000111010000
    10101001111000001000001111101
    00110111010100000110001011010
    01010001100110010111000110001
    01111011110010011110010100111
    01111101001101010001001101101
    01111011000001000011001111011
    11001001001011001000111011010
    11100110111011011001110111000
    00001100010001001011100100100
    10111111011001010011001000100
    00001100001000101011011011100
    01010010000011000000111111111
    00000000110011100010100011001
    11111110101001101011101010110
    10000010000110111110100010011
    10111010011010111100111111111
    10111010110001101111000011110
    10111010100101101010100101001
    10000010001001000100000010010
    11111110010100110010111100010"

    \markup \qr-code \lilypondDotOrg

    \markup \vspace #5

    \markup \override #'(width . 15) \qr-code \lilypondDotOrg

## Adding markups in a tablature

By default markups does not show in a tablature.

To make them appear, simply use the command `\revert TabStaff.TextScript.stencil`

    %% http://lsr.di.unimi.it/LSR/Item?id=919
    % by P.P.Schneider on June 2014

    high  = { r4 r8 <g c'> q r8 r4 }

    low = { c4 r4 c8 r8 g,8 b, }

    pulse = { s8^"1" s^"&" s^"2" s^"&" s^"3" s^"&" s^"4" s^"&" }

    \score {
     \new TabStaff {
       \repeat unfold 2 << \high \\ \low \\ \pulse >>
      }
      \layout {
        \context {
          \TabStaff
          \clef moderntab
          \revert TextScript.stencil
          \override TextScript.font-series = #'bold
          \override TextScript.font-size = #-2
          \override TextScript.color = #red

        }
        \context {
          \Score
          proportionalNotationDuration = #(ly:make-moment 1/8)
        }
      }
    }

## 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 }

      \new Staff {
        \new Voice = melody \relative c' {
          c4 d e f
          g4 f e d
          c1
        }
      }
      % Reducing the minimum space below the staff and above the lyrics:
      \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 \with {
          \override InstrumentName.self-alignment-X = #LEFT
          instrumentName = \markup \left-column {
            "Left aligned"
            "instrument name"
            }
            shortInstrumentName = "Left"
          }

          {  c''1 \break c''1 }

        \new Staff \with {
          \override InstrumentName.self-alignment-X = #CENTER
          instrumentName = \markup \center-column {
            Centered
            "instrument name"
            }
          shortInstrumentName = "Centered"
        }

        { g'1 g'1}

        \new Staff \with {
          \override InstrumentName.self-alignment-X = #RIGHT
          instrumentName = \markup \right-column {
            "Right aligned"
            "instrument name"
          }
          shortInstrumentName = "Right"
        }

        { e'1 e'1 }

      >>

      \layout {
        ragged-right = ##t
        indent = 4\cm
        short-indent = 2\cm
      }
    }

## Aligning syllables with melisma

By default, lyrics syllables that start a melisma are left aligned on their note. The alignment can be altered using the `lyricMelismaAlignment` property.

    \score {
      <<
        \new Staff {
          \relative c''
          \new Voice = "vocal" {
            c d~^\markup default  d e
            c d~^\markup "right aligned" d e
            c d~^\markup "center aligned" d e
            c d~^\markup "reset to default" d e
          }
        }
        \new Lyrics \lyricsto "vocal" {
          word word word
          \set lyricMelismaAlignment = #RIGHT
          word word word
          \set lyricMelismaAlignment = #CENTER
          word word word
          \unset lyricMelismaAlignment
          word word word
        }
      >>
    }

## 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 added text will change the direction according to the direction of the hairpin. The Hairpin is aligned to DynamicText.

The example also illustrates how to modify the way an object is normally printed, using some Scheme code.

    \paper { tagline = ##f }

    hairpinWithCenteredText =
    #(define-music-function (text) (markup?)
      #{
        \once \override Voice.Hairpin.after-line-breaking =
          #(lambda (grob)
            (let* ((stencil (ly:hairpin::print grob))
                   (par-y (ly:grob-parent grob Y))
                   (dir (ly:grob-property par-y 'direction))
                   (staff-line-thickness
                     (ly:output-def-lookup (ly:grob-layout grob) 'line-thickness))
                   (new-stencil (ly:stencil-aligned-to
                     (ly:stencil-combine-at-edge
                       (ly:stencil-aligned-to stencil X CENTER)
                       Y dir
                       (ly:stencil-aligned-to
                         (grob-interpret-markup
                           grob
                           (make-fontsize-markup
                             (magnification->font-size
                               (+ (ly:staff-symbol-staff-space grob)
                                  (/ staff-line-thickness 2)))
                               text)) X CENTER))
                     X LEFT))
                   (staff-space (ly:output-def-lookup
                     (ly:grob-layout grob) 'staff-space))
                   (par-x (ly:grob-parent grob X))
                   (dyn-text (grob::has-interface par-x 'dynamic-text-interface))
                   (dyn-text-stencil-x-length
                     (if dyn-text
                       (interval-length
                         (ly:stencil-extent (ly:grob-property par-x 'stencil) X))
                       0))
                   (x-shift
                     (if dyn-text
                       (-
                         (+ staff-space dyn-text-stencil-x-length)
                         (* 0.5 staff-line-thickness)) 0)))

            (ly:grob-set-property! grob 'Y-offset 0)
            (ly:grob-set-property! grob 'stencil
               (ly:stencil-translate-axis
                new-stencil
                x-shift X))))
      #})

    hairpinMolto =
    \hairpinWithCenteredText \markup { \italic molto }

    hairpinMore =
    \hairpinWithCenteredText \markup { \larger moltissimo }

    \layout { ragged-right = ##f }

    \relative c' {
      \hairpinMolto
      c2\< c\f
      \hairpinMore
      c2\ppppp\< c\f
      \break
      \hairpinMolto
      c2^\< c\f
      \hairpinMore
      c2\ppppp\< c\f
    }

## Changing 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`.

Short text is especially useful when a brief ottava is used.

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

## Changing the default text font family

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

    %{
    You may have to install additional fonts.

    Red Hat Fedora

      dejavu-fonts-all

    Debian GNU/Linux, Ubuntu

      fonts-dejavu-core
      fonts-dejavu-extra
    %}

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

      #(define fonts
        (make-pango-font-tree "DejaVu Serif"
                              "DejaVu Sans"
                              "DejaVu Sans Mono"
         (/ myStaffSize 20)))
    }

    {
      g'''4^\markup {
        DejaVu Serif: \bold bold
                      \italic italic
                      \italic \bold { bold italic }
      }
      g4_\markup {
        \override #'(font-family . sans) {
          DejaVu Sans: \bold bold
                       \italic italic
                       \italic \bold { bold italic }
        }
      }
      g''2^\markup {
        \override #'(font-family . typewriter) {
          DejaVu Sans Mono: \bold bold
                            \italic italic
                            \italic \bold { bold italic }
        }
      }
    }

## 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
    }

## Zwei Stimmen auf einem System kombinieren

Die Funktion, die Stimmen kombiniert (also der `\partCombine`-Befehl) ermöglicht die Kombination unterschiedlicher Stimmen auf einem System. Textanweisungen wie "solo" oder "a2" werden automatisch hinzugefügt. Wenn man sie entfernen will, muss man die Eigenschaft `printPartCombineTexts` auf falsch setzen. Für Klavierauszüge muss natürlich kein "solo"/"a2" usw. hinzugefügt werden, man sollte sie also ausschalten. Wenn aber Solo-Stellen in einem Klavierauszug oder einer Chorpartitur angezeigt werden, ist es besser, normale Polyphonie zu verwenden, weil so die Solostellen angezeigt werden, auch wenn der Text des Stimmenkombinierers ausgeschaltet ist.

Der Schnipsel zeigt drei Möglichkeiten, Stimmen auf einem System zu kombinieren: Standardpolyphonie, `\partCombine` ohne Text und `\partCombine` mit Text.

    %% Combining pedal notes with clef changes

    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 \with { instrumentName = "Standard polyphony" }

          << \musicUp \\ \musicDown >>

        \new Staff \with {
          instrumentName = "PartCombine without text"
          printPartCombineTexts = ##f
        }

        \partCombine \musicUp \musicDown

        \new Staff \with { instrumentName = "PartCombine with text" }
          \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`.

    paren =
    #(define-event-function (dyn) (ly:event?)
       (make-dynamic-script
        #{ \markup \concat {
             \normal-text \italic \fontsize #2 (
    	 \pad-x #0.2 #(ly:music-property dyn 'text)
    	 \normal-text \italic \fontsize #2 )
           }
        #}))

    \relative c'' {
      c4\paren\f c c \dynamicUp c\paren\p
    }

## 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"
      meter = "meter"
      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
    }

## Silben im Gesangstext formatieren

Textbeschriftungsmodus kann eingesetzt werden, um individuelle Silben im Gesangstext zu formatieren.

    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
    }

## Ausrichtung von Gesangstext

Die horizontale Ausrichtung von Gesangstext kann eingestellt werden, indem man die `self-alignment-X`-Eigenschaft des `LyricText`-Objekts verändert. `#-1` bedeutet links, `#0` bedeutet mittig und `#1` bedeutet rechts, man kann aber genauso gut auch `#LEFT`, `#CENTER` und `#RIGHT` benutzen.

    \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 list

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

    %% updated/modified by P.P.Schneider on Feb. 2014

    #(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
    \markuplist {
      \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
          \concat { simple \hspace #.3 ; }
          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.
        }
        \vspace #.3
        \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
          \concat { besoin \hspace #.3 ; }
          ses palefreniers étaient ses
          \concat { piqueurs \hspace #.3 ; }
          le vicaire du village était
          son grand-aumônier.  Ils l'appelaient tous monseigneur, et ils
          riaient quand il faisait des contes.
        }
      }
    }

## Textbeschriftung und Mehrtaktpausen

Textbeschriftungen, die an Mehrtaktpausen gehängt wird, wird über oder unter der Pause zentriert. Lange Beschriftungen lassen den Takt nicht breiter werden. Um eine Mehrtaktpause einer Beschriftung anzupassen, muss eine unsichtbare Pause mit der Beschriftung direkt vor der Mehrtaktpause eingesetzt werden.

Man sollte beachten, dass unsichtbare Pausen automatische Taktstriche nach sich ziehen. Text, der an eine unsichtbare Pause gehängt wird, ist links ausgerichtet an der Position, wo die Pause erscheinen würde. Wenn aber die Länge des Taktes durch die Länge des Textes bestimmt wird, sieht es so aus, als ob der Text zentriert gesetzt ist.

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

## Of the ubiquity of markup objects

Text objects are entered either as simple strings between double quotes or as `\markup` blocks that can accept a variety of advanced text formatting and graphical enhancements.

As such, markup blocks may be used:

- in any TextScript object (attached to notes with `-`, `^` or `_`),
- any `TextMark` introduced with the `\textMark` or `\textEndMark` command, or other similar objects such as MetronomeMark introduced with `\tempo`,
- as standalone markup blocks, entered at the top level outside of any `\score` block,
- in any definition inside the `\header` block (e.g. title, subtitle, composer) or in some variables defined inside the `\paper` block such as `evenHeaderMarkup` for page numbers.

`\markup` may additionally be used for lyrics, in chord names, and as dynamics. In fact, it is possible to use `\markup` to customize the appearance of virtually any object, as demonstrated in this example using various methods.

    %% Thanks to Aaron Hill https://lists.gnu.org/archive/html/lilypond-user/2019-01/msg00437.html

    \paper {
      paper-width = 8\cm paper-height = 8\cm
    }
    \header {
      title = \markup "Header"
      tagline = \markup "(tagline)"
    }
    \markup "Top-level markup"
    dyn = #(make-dynamic-script #{ \markup \text "DynamicText" #})
    \score {
      <<
        \new ChordNames
        \with { majorSevenSymbol = \markup "majorSevenSymbol" }
        \chordmode { c1:maj7 }
        \new Staff {
          \tempo \markup "MetronomeMark"
          \textMark "TextMark"
          \once \override TupletNumber.text = \markup "TupletNumber"
          \tuplet 3/2 {
            \once \override NoteHead.stencil = #ly:text-interface::print
            \once \override NoteHead.text = \markup \lower #0.5 "NoteHead"
            c''8^\markup "TextScript"
            \once \override Rest.stencil = #(lambda (grob)
              (grob-interpret-markup grob #{
                \markup  "Rest"
                #}))
            r4
          }
        }
        \new Lyrics \lyricmode { \markup "LyricText" 1 }
        \new Dynamics { s1\dyn }
      >>
    }

## Outputting the version number

It is possible to print the version number of LilyPond in markup.

    \markup { Processed with LilyPond version #(lilypond-version) }

## Piano template with centered lyrics

Anstatt ein eigenes System für Melodie und Text zu schreiben, können Sie den Text auch zwischen die beiden Klaviersysteme schreiben (und damit das zusätzliche System für die Gesangstimme auslassen).

    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 PianoStaff <<
        \new Staff = upper { \new Voice = "singer" \upper }
        \new Lyrics \lyricsto "singer" \text
        \new Staff = lower { \lower }
      >>
      \layout { }
      \midi { }
    }

## Printing bar numbers with changing regular intervals

Using the `set-bar-number-visibility` context function, bar number intervals can be changed.

    \relative c' {
      \override Score.BarNumber.break-visibility = #end-of-line-invisible
      \context Score \applyContext #(set-bar-number-visibility 4)
      \repeat unfold 10 c'1
      \context Score \applyContext #(set-bar-number-visibility 2)
      \repeat unfold 10 c
    }

## Zeichen über jedem System ausgeben

Normalerweise werden Textzeichen nur über dem obersten Notensystem gesetzt. Sie können aber auch über jedem System ausgegeben werden.

    \score {
      <<
        \new Staff { \mark \default c''1 \textMark "molto" c'' }
        \new Staff { \mark \default c'1 \textMark "molto" c' }
      >>
      \layout {
        \context {
          \Score
          \remove Mark_engraver
          \remove Text_mark_engraver
          \remove Staff_collecting_engraver
        }
        \context {
          \Staff
          \consists Mark_engraver
          \consists Text_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 }
    >>

## Isolierter Text in zwei Spalten

Isolierter Text kann in mehreren Spalten mit `\markup`-Befehlen angeordnet werden:

    \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 \italic {
          \line { O sacred feast }
          \line { in which Christ is received, }
          \line { the memory of His Passion is renewed, }
          \line { the mind is filled with grace, }
          \line { and a pledge of future glory is given to us. }
          \line { 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 (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?)
       #:properties ((thickness 0.1) (font-size 0) (box-padding 0.2))
       "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 ((pad (* (magstep font-size) box-padding))
             (m (interpret-markup layout props arg)))
         (NWS-box-stencil m thickness 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.

    %{
    You may have to install additional fonts.

    Red Hat Fedora

      linux-libertine-fonts (Latin, Cyrillic, Hebrew)
      google-noto-serif-jp-fonts (Japanese)

    Debian GNU/Linux, Ubuntu

      fonts-linuxlibertine (Latin, Cyrillic, Hebrew)
      fonts-noto-cjk (Japanese)
    %}

    % 'Linux Libertine' fonts also contain Cyrillic and Hebrew glyphs.
    \paper {
      #(define fonts
        (set-global-fonts
         #:roman "Linux Libertine O, Noto Serif CJK JP, Noto Serif JP"
       ))
    }

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

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

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

    % "a nice song for you"
    portuguese = \lyricmode {
      à vo -- cê uma can -- ção le -- gal
    }

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

## Vorlage für Vokalensemble mit dem Gesangstext über und unter dem System

In diesem Beispiel werden die Texte mit den Befehlen `alignAboveContext` und `alignBelowContext` über und unter dem System angeordnet.

    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 v2.24.4 (stabiler Zweig).