3.2.2 Custom titles headers and footers


Custom text formatting for titles

Standard \markup commands can be used to customize any header, footer and title text within the \header block.

\score {
  \header {
    piece = \markup { \fontsize #4 \bold "PRAELUDIUM I" }
    opus = \markup { \italic "BWV 846" }
  }
  { s1 }
}

[image of music]

See also

Notation Reference: Formatting text.


Custom layout for titles

\markup commands in the \header block are useful for simple text formatting, but they do not allow precise control over the placement of titles. To customize the placement of the text fields, change either or both of the following \paper variables:

The placement of titles when using the default values of these \markup variables is shown in the examples in Default layout of bookpart and score titles.

The default settings for scoreTitleMarkup as defined in ‘ly/titling-init.ly’ are:

scoreTitleMarkup = \markup { \column {
  \if \should-print-all-headers { \bookTitleMarkup \hspace #1 }
  \fill-line {
    \fromproperty #'header:piece
    \fromproperty #'header:opus
  }
}
}

This places the piece and opus text fields at opposite ends of the same line:

\score {
  \header {
    piece = "PRAELUDIUM I"
    opus = "BWV 846"
  }
  { s1 }
}

[image of music]

This example redefines scoreTitleMarkup so that the piece text field is centered and in a large, bold font.

\book {
  \paper {
    indent = 0\mm
    scoreTitleMarkup = \markup {
      \fill-line {
        \null
        \fontsize #4 \bold \fromproperty #'header:piece
        \fromproperty #'header:opus
      }
    }
  }
  \header { tagline = ##f }
  \score {
    \header {
      piece = "PRAELUDIUM I"
      opus = "BWV 846"
    }
    { s1 }
  }
}

[image of music]

Text fields not normally effective in score \header blocks can be printed in the Score Title area if print-all-headers is placed inside the \paper block. A disadvantage of using this method is that text fields that are intended specifically for the Bookpart Title area need to be manually suppressed in every \score block. See Titles explained.

To avoid this, add the desired text field to the scoreTitleMarkup definition. In the following example, the composer text field (normally associated with bookTitleMarkup) is added to scoreTitleMarkup, allowing each score to list a different composer:

\book {
  \paper {
    indent = 0\mm
    scoreTitleMarkup = \markup {
      \fill-line {
        \null
        \fontsize #4 \bold \fromproperty #'header:piece
        \fromproperty #'header:composer
      }
    }
  }
  \header { tagline = ##f }
  \score {
    \header {
      piece = "MENUET"
      composer = "Christian Petzold"
    }
    { s1 }
  }
  \score {
    \header {
      piece = "RONDEAU"
      composer = "François Couperin"
    }
    { s1 }
  }
}

[image of music]

It is also possible to create your own custom text fields, and refer to them in the markup definition.

\book {
  \paper {
    indent = 0\mm
    scoreTitleMarkup = \markup {
      \fill-line {
        \null
        \override #`(direction . ,UP)
        \dir-column {
          \center-align \fontsize #-1 \bold
            \fromproperty #'header:mycustomtext %% User-defined field
          \center-align \fontsize #4 \bold
            \fromproperty #'header:piece
        }
        \fromproperty #'header:opus
      }
    }
  }
  \header { tagline = ##f }
  \score {
    \header {
      piece = "FUGA I"
      mycustomtext = "A 4 VOCI" %% User-defined field
      opus = "BWV 846"
    }
    { s1 }
  }
}

[image of music]

See also

Notation Reference: Titles explained.


Custom layout for headers and footers

\markup commands in the \header block are useful for simple text formatting, but they do not allow precise control over the placement of headers and footers. To customize the placement of the text fields, use either or both of the following \paper variables:

The \markup command \if can be used to add markup conditionally to header and footer text defined within the \paper block, using the following syntax within \markup:

\if condition argument

The condition is tested each time the markup is interpreted. The resulting markup is argument if the condition is true, but empty if false. Typical conditions include tests for page numbers (first page, last page, specific page, …). To test for the condition being false, replace \if with \unless.

The following example centers page numbers at the bottom of every page. First, the default settings for oddHeaderMarkup and evenHeaderMarkup are removed by defining each as a null markup. Then, oddFooterMarkup is redefined with the page number centered. Finally, evenFooterMarkup is given the same layout by defining it as \oddFooterMarkup:

\book {
  \paper {
    print-page-number = ##t
    print-first-page-number = ##t
    oddHeaderMarkup = \markup \null
    evenHeaderMarkup = \markup \null
    oddFooterMarkup = \markup {
      \fill-line {
        \if \should-print-page-number
        \fromproperty #'page:page-number-string
      }
    }
    evenFooterMarkup = \oddFooterMarkup
  }
  \score {
    \new Staff { s1 \break s1 \break s1 }
  }
}

[image of music]

Here is a list of all predefined procedures available for use with \if and \unless.

Syntax

Condition tested

\on-first-page

First page in the book?

\on-last-page

Last page in the book?

\on-first-page-of-part

First page in the book part?

\on-last-page-of-part

Last page in the book part?

\on-page n

On page number n?

\single-page

Does the book fit on just one page?

\should-print-page-numbers-global

Print page numbers in the book? 1

\should-print-page-number

Print the number of the current page?

\should-print-all-headers

Is print-all-headers true?

See also

Notation Reference: Titles explained, Default layout of bookpart and score titles, Conditionals.

Installed Files: ‘../ly/titling-init.ly’.


Footnotes

[1] \should-print-page-numbers-global can differ from \should-print-page-number for the first page in the book, depending on the print-first-page-number setting of the \paper block.


LilyPond — Notation Reference v2.23.5 (development-branch).