Autor Thema: Abstand von Lyrics und Markup ...  (Gelesen 1696 mal)

pjheinrich

  • Member
Abstand von Lyrics und Markup ...
« am: Mittwoch, 5. Oktober 2016, 16:59 »
Hallo Leute,

immer wieder stoße ich auf das Problem, dass, wenn ich eine Note mit einem ^\Markup{...} versehe, dies den Abstand allfälliger vorhandener Lyrics beeinflusst. D.h., dieser wird eigentlich immer größer, als er sein müsste. ... Selbst wenn das entsprechende Markup-Objekt mittels \once\override ... verschoben wird.

Als Beispiel habe ich hier am Beginn der Voltenklammer einen Pfeil eingefügt, der nach einer Note steht. Da er mittels ^\Markup{...} erzeugt wird und eigentlich über der entsprechenden Note erscheinen würde, habe ich ihn mit \once\override neben die Note verschoben. Das passt soweit ganz gut, allerdings ist zwischen den Noten und den Lyrics nun ein viel zu großer Abstand, der eigentlich nicht sein müsste ... - kann ich diesen "clash" irgendwie vermeiden? Oder irgendwie Lilypond dazu zwingen, den Text wieder näher an die Noten zu rücken, trotz des \Markup?

Hier das entsprechende Minimalbeispiel:

%%%%%%

\version "2.18.2"

global = {
  \autoBeamOff
  \key g \minor
  \time 3/4
}

sopranoMusic = \relative bes' {
    \clef "treble"
    c4 c c
    \repeat volta 2 {
       d  d  d
       es\(( e) des\)
       bes \breathe bes bes
    }
    \alternative {
      {
        e c bes
        d d d
        c d c
      }
      {
        a c e
        d d8 e d4
        c c2 \bar "|."
      }       
    }
}
sopranoWordsOne = \lyricmode { 
  \skip4 \skip4 \skip4
  "1. er" -- ste Stroph', die __ \skip4
  ei -- nen an -- de -- ren Text hat und so und ja ja!
 
}
sopranoWordsTwo = \lyricmode {
 Das ist die
 "2. zwei" -- te Stro -- phe __ \skip4 auch mit Text und so und ja
 und ja und so so!
}
sopranoWordsThree = \lyricmode {
 \skip4 \skip4 \skip4
 "3. drit" -- \skip4 te Stro -- \skip4 phe mit neu -- em Text und ja und so und ja nein!
 Bla bla bla bla bla
}

altoMusic = \relative bes' {
    \clef "treble"
    a4 a a
    \repeat volta 2 {
       g  g  g
       es\(( e) des\)
       g2\breathe g4
    }
    \alternative {
      {
        c a g
        bes bes bes
        a bes a
      }
      {
        \once \override TextScript #'extra-offset = #'(3 . -4)
        a^\markup {\fontsize #5 \override #'(thickness . 2) \combine \draw-line #'(0 . 4) \arrow-head #Y #DOWN ##f}  c e
        d d8 e d4
        c c2 \bar "|."
      }       
    }
}

altoWordsOne = \lyricmode { 
  \skip4 \skip4 \skip4 \skip4 \skip4 \skip4 \skip4 \skip4 \skip4 \skip4
  \skip4 \skip4 \skip4 \skip4 \skip4 \skip4 \skip4 \skip4 \skip4
  "... und" nun geht's für alle __ \skip4 hier weiter, ja!
}

\score {
  \new Staff = women <<
    \set Staff.instrumentName = \markup { \center-column { \line {"Sopran"} \line {"Alt"} } }
    \set Staff.shortInstrumentName = \markup { \center-column { \line {"S"} \line {"A"} } }
    \context Staff <<
      \context Voice = "Soprano" { \voiceOne \sopranoMusic }
        \new Lyrics \with { alignAboveContext = women} \lyricsto "Soprano" \sopranoWordsOne
        \new Lyrics \with { alignAboveContext = women} \lyricsto "Soprano" \sopranoWordsTwo
        \new Lyrics \with { alignAboveContext = women} \lyricsto "Soprano" \sopranoWordsThree
      \context Voice = "Alto" { \voiceTwo \altoMusic }
        \new Lyrics \with { alignBelowContext = women} \lyricsto "Alto" \altoWordsOne
    >>
  >>
}
%%%%%%

Vielen Dank im Voraus für eure Hilfe!

LG,
  pjheinrich

fugenkomponist

  • Member
Re: Abstand von Lyrics und Markup ...
« Antwort #1 am: Mittwoch, 5. Oktober 2016, 17:54 »
Hier das entsprechende Minimalbeispiel:
Nein. Das ist alles andere als minimal, das sind 92 Zeilen Code! Man muss nicht alles unbedingt auf 5 Zeilen Code zusammenstampfen, aber < 20 wären schon gut:\version "2.18.2"

<<
  \lyrics { oben }
  \new Staff {
    \once \override TextScript #'extra-offset = #'(3 . -4)
    a'^\markup {\fontsize #5 \override #'(thickness . 2) \combine \draw-line #'(0 . 4) \arrow-head #Y #DOWN ##f}
  }
  \lyrics { unten }
>>
Das sind 10 Zeilen Code, die dein Beispiel genauso gut darstellen. Außerdem wärs schön, wenn du längeren Code in Code-Tags* packen könntest, dadurch wird er 1. besser abgehoben und es klar, wo Anfang und Ende sind 2. lange Codes erhalten einen Scrollbalken und brauchen nicht viel Platz und 3. kann man dann einfach auswählen und kopieren ;)

So, zu deinem eigentlichen Problem: extra-offset verändert nur den sichtbaren Output, d. h. LilyPond richtet erstmal alles so aus, wie es das halt tut und zum Schluß werden Objekte noch um ihren extra-offset verschoben, ohne dabei aber die Positionen anderer Objekte zu beeinflussen (dadurch sind z. B. Überlagerungen von Dingen möglich). Es gibt nun zwei Möglichkeiten, das anders anzugehen:

1. Verwende X-offset und Y-offset. Die verschieben ein Objekt tatsächlich auch was das Spacing angeht, d. h. andere Objekte nehmen Rücksicht auf die Verschiebung. Allerdings brauchst du dann noch das Ausschalten von outside-staff-priority, weil das TextScript sich sonst weigert, innerhalb des Systems zu stehen:\version "2.18.2"

<<
  \lyrics { oben }
  \new Staff {
    \once \override TextScript.X-offset = 3
    \once \override TextScript.Y-offset = -1.5
    \once \override TextScript.outside-staff-priority = ##f
    a'^\markup {\fontsize #5 \override #'(thickness . 2) \combine \draw-line #'(0 . 4) \arrow-head #Y #DOWN ##f}
  }
  \lyrics { unten }
>>

2. Verwende doch extra-offset, aber tu so, als würde das \markup keinen Platz brauchen; dafür gibts den Befehl \with-dimensions, den ich auch schon in der Antwort auf deine Frage im Nachbarthread verwendet habe:
\version "2.18.2"

<<
  \lyrics { oben }
  \new Staff {
    \once \override TextScript.extra-offset = #'(3 . -4)
    a'^\markup \with-dimensions #'(0 . 0) #'(0 . 0) {\fontsize #5 \override #'(thickness . 2) \combine \draw-line #'(0 . 4) \arrow-head #Y #DOWN ##f}
  }
  \lyrics { unten }
>>

*Edit: Code-Tags sind [co de] und [/co de] ohne die Leerzeichen, es gibt dafür auch beim Post-Erstellen überm Textfeld einen Knopf mit ner Raute (#), der den markierten Text in solche Tags packt.
« Letzte Änderung: Mittwoch, 5. Oktober 2016, 17:57 von fugenkomponist »