LilyPond Notation Reference: 3.3.2 Different editions from one source

### 3.3.2 Different editions from one source

Several methods can be used to generate different versions of a score from the same music source. Variables are perhaps the most useful for combining lengthy sections of music and/or annotation. Tags are more useful for selecting one section from several alternative shorter sections of music, and can also be used for splicing pieces of music together at different points.

Whichever method is used, separating the notation from the structure of the score will make it easier to change the structure while leaving the notation untouched.

#### Using variables

If sections of the music are defined in variables they can be reused in different parts of the score, see pieces with variables Organizing pieces with variables. For example, an a cappella vocal score frequently includes a piano reduction of the parts for rehearsal purposes which is identical to the vocal music, so the music need be entered only once. Music from two variables may be combined on one staff, see Automatic part combining. Here is an example:

>     sopranoMusic = \relative { a'4 b c b8( a) }
>     altoMusic = \relative { e'4 e e f }
>     tenorMusic = \relative { c'4 b e d8( c) }
>     bassMusic = \relative { a4 gis a d, }
>     allLyrics = \lyricmode { King of glo -- ry }
>     <<
>       \new Staff = "Soprano" \sopranoMusic
>       \new Lyrics \allLyrics
>       \new Staff = "Alto" \altoMusic
>       \new Lyrics \allLyrics
>       \new Staff = "Tenor" {
>         \clef "treble_8"
>         \tenorMusic
>       }
>       \new Lyrics \allLyrics
>       \new Staff = "Bass" {
>         \clef "bass"
>         \bassMusic
>       }
>       \new Lyrics \allLyrics
>       \new PianoStaff <<
>         \new Staff = "RH" {
>           \partCombine \sopranoMusic \altoMusic
>         }
>         \new Staff = "LH" {
>           \clef "bass"
>           \partCombine \tenorMusic \bassMusic
>         }
>       >>
>     >>

Separate scores showing just the vocal parts or just the piano part can be produced by changing just the structural statements, leaving the musical notation unchanged.

For lengthy scores, the variable definitions may be placed in separate files which are then included, see Including LilyPond files.

#### Using tags

The `\tag #'partA` command marks a music expression with the name partA. Expressions tagged in this way can be selected or filtered out by name later, using either `\keepWithTag #'name` or `\removeWithTag #'name`. The result of applying these filters to tagged music is as follows:

Filter | Result
--- | ---
Tagged music preceded by `\keepWithTag #'name` or `\keepWithTag #'(name1 name2…)` | Untagged music and music tagged with any of the given tag names is included; music tagged with any other tag name is excluded.
Tagged music preceded by `\removeWithTag #'name` or `\removeWithTag #'(name1 name2…)` | Untagged music and music not tagged with any of the given tag names is included; music tagged with any of the given tag names is excluded.
Tagged music not preceded by either `\keepWithTag` or `\removeWithTag` | All tagged and untagged music is included.

The arguments of the `\tag`, `\keepWithTag` and `\removeWithTag` commands should be a symbol or list of symbols (such as `#'score` or `#'(violinI violinII`), followed by a music expression. If and only if the symbols are valid LilyPond identifiers (alphabetic characters only, no numbers, underscores, or dashes) which cannot be confused with notes, the `#'` may be omitted and, as a shorthand, a list of symbols can use the dot separator: i.e., `\tag #'(violinI violinII)` can be written `\tag violinI.violinII`. The same applies to `\keepWithTag` and `\removeWithTag`. Tagging commands are music functions, thus they cannot be used to filter items that are not music expressions, such as `\book` or `\score` blocks.

In the following example, we see two versions of a piece of music, one showing trills with the usual notation, and one with trills explicitly expanded:

>     music = \relative {
>       g'8. c32 d
>       \tag #'trills { d8.\trill }
>       \tag #'expand { \repeat unfold 3 { e32 d } }
>       c32 d
>      }

>     \score {
>       \keepWithTag #'trills \music
>     }
>     \score {
>       \keepWithTag #'expand \music
>     }

Alternatively, it is sometimes easier to exclude sections of music:

>     music = \relative {
>       g'8. c32 d
>       \tag #'trills { d8.\trill }
>       \tag #'expand {\repeat unfold 3 { e32 d } }
>       c32 d
>      }

>     \score {
>       \removeWithTag #'expand
>       \music
>     }
>     \score {
>       \removeWithTag #'trills
>       \music
>     }

Tagged filtering can be applied to articulations, texts, etc., by prepending

>     -\tag #'your-tag

to an articulation. For example, this would define a note with a conditional fingering indication and a note with a conditional annotation:

>     c1-\tag #'finger ^4
>     c1-\tag #'warn ^"Watch!"

Multiple tags may be placed on expressions with multiple `\tag` entries, or by combining multiple tags into one symbol list:

>     music = \relative c'' {
>       \tag #'a \tag #'both { a4 a a a }
>       \tag #'(b both) { b4 b b b }
>     }
>     <<
>     \keepWithTag #'a \music
>     \keepWithTag #'b \music
>     \keepWithTag #'both \music
>     >>

Multiple `\removeWithTag` filters may be applied to a single music expression to remove several differently named tagged sections. Alternatively, you can use a single `\removeWithTag` with a list of tags.

>     music = \relative c'' {
>       \tag #'A { a4 a a a }
>       \tag #'B { b4 b b b }
>       \tag #'C { c4 c c c }
>       \tag #'D { d4 d d d }
>     }
>     \new Voice {
>       \removeWithTag #'B
>       \removeWithTag #'C
>       \music
>       \removeWithTag #'(B C)
>       \music
>     }

Using two or more `\keepWithTag` filters on a single music expression will cause all of the tagged sections to be removed. The first filter will remove all except the one named and any subsequent filters will remove the rest. Using one `\keepWithTag` command with a list of multiple tags will only remove tagged sections that are not specified in that list.

>     music = \relative c'' {
>       \tag #'violinI { a4 a a a }
>       \tag #'violinII { b4 b b b }
>       \tag #'viola { c4 c c c }
>       \tag #'cello { d4 d d d }
>     }

>     \new Staff {
>       \keepWithTag #'(violinI violinII)
>       \music
>     }

will print `\tag`s violinI and violinII but not viola or cello.

While `\keepWithTag` is convenient when dealing with one set of alternatives, the removal of music tagged with unrelated tags is problematic when using them for more than one purpose. In that case ‘groups’ of tags can be declared:

>     \tagGroup #'(violinI violinII viola cello)

Now all the different tags belong to a single ‘tag group’. Note that individual tags cannot be members of more than one tag group.

>     \keepWithTag #'violinI …

will now only show music tagged from `violinI`’s tag group and any music tagged with one of the other tags will removed.

>     music = \relative {
>       \tagGroup #'(violinI violinII viola cello)
>       \tag #'violinI { c''4^"violinI" c c c }
>       \tag #'violinII { a2 a }
>       \tag #'viola { e8 e e2. }
>       \tag #'cello { d'2 d4 d }
>       R1^"untagged"
>     }

>     \new Voice {
>       \keepWithTag #'violinI
>       \music
>     }

When using the `\keepWithTag` command, only tags from the tag groups of the tags given in the command are visible.

Sometimes you want to splice some music at a particular place in an existing music expression. You can use `\pushToTag` and `\appendToTag` for adding material at the front or end of the `elements` of an existing music construct. Not every music construct has `elements`, but sequential and simultaneous music are safe bets:

>     music = { \tag #'here { \tag #'here <<c''>> } }

>     {
>       \pushToTag #'here c'
>       \pushToTag #'here e'
>       \pushToTag #'here g' \music
>       \appendToTag #'here c'
>       \appendToTag #'here e'
>       \appendToTag #'here g' \music
>     }

Both commands get a tag, the material to splice in at every occurence of the tag, and the tagged expression.

#### See also

Learning Manual: Organizing pieces with variables.

Notation Reference: Automatic part combining, Including LilyPond files.

#### Known issues and warnings

Calling `\relative` on a music expression obtained by filtering music through `\keepWithTag` or `\removeWithTag` might cause the octave relations to change, as only the pitches actually remaining in the filtered expression will be considered. Applying `\relative` first, before `\keepWithTag` or `\removeWithTag`, avoids this danger as `\relative` then acts on all the pitches as-input.

#### Using global settings

Global settings can be included from a separate file:

>     lilypond -dinclude-settings=MY_SETTINGS.ly MY_SCORE.ly

Groups of settings such as page size, font or type face can be stored in separate files. This allows different editions from the same score as well as standard settings to be applied to many scores, simply by specifying the proper settings file.

This technique also works well with the use of style sheets, as discussed in Style sheets.

#### See also

Learning Manual: Organizing pieces with variables, Style sheets.

Notation Reference: Including LilyPond files.

#### LilyPond — Notation Reference v2.22.2 (stable-branch).