Deutsches Lilypond Forum (Archiv)
Allgemein => Fragen zu Funktionen => Thema gestartet von: MH am Montag, 11. Februar 2013, 15:56
-
Hallo,
ist es möglich ein Markup rechts und nicht links am Notenkopf auszurichten? Ich benutze Lilypond für Schlagzeug Notation und benutze unterschiedlich große Notenköpfe und Handsätze sehen dann immer sehr "krumm" aus.
Danke
-
schau mal in http://lsr.dsi.unimi.it/LSR/Item?id=637
dort wäre dann
\override TextScript #'self-alignment-X = #CENTER
in #LEFT zu ändern.
Eluze
-
Hallo,
das grundsätzliche Problem liegt in der Tatsache begründet, daß die NoteColumn und ihre NoteHeads nicht das "Eltern"-Objekt für TextScript sind.
Folgender Code liest die "Eltern" aus:
\version "2.16.1"
writeParents =
\override TextScript #'after-line-breaking =
#(lambda (grob)
(let* ((X-parent (ly:grob-parent grob X))
(Y-parent (ly:grob-parent grob Y)))
(display "\n\nX-parent ")(write X-parent)
(display "\nY-parent ")(write Y-parent)
(newline)))
{ \writeParents c''1-"abc" }
Im Terminal kann man dann:
X-parent #<Grob PaperColumn >
Y-parent #<Grob VerticalAxisGroup >
lesen.
Das kann man allerdings mithilfe des von Eluze schon erwähnten LSR-Snippets ändern .
Ich meine allerdings, daß man
\override TextScript #'self-alignment-X = #RIGHTschreiben muß, falls ich Dein Anliegen richtig verstanden habe [1].
Darüberhinaus muß man in \layout \Voice durch \DrumVoice ersetzen oder Modifikationen für \DrumVoice hinzufügen (so hab ich es gemacht):
\version "2.16.1"
% LSR-snippet 637
% http://lsr.dsi.unimi.it/LSR/Item?id=637
#(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 = #RIGHT
}
\context {
\DrumVoice
\consists #Text_align_engraver
\override TextScript #'X-offset =
#ly:self-alignment-interface::aligned-on-x-parent
\override TextScript #'self-alignment-X = #RIGHT
}
}
\new Staff
\relative c'' {
<c d e>1^"XYxyxyxyxyxyxy"
}
\new DrumVoice
\drummode {
hh4^"xyxyxyxyxyxyxy"
}
Gruß,
Harm
[1] Bitte poste immer ein kurzes, kompilierbares Beispiel mit Versionsangabe.
-
hey leute, danke für die schnellen antworten.
das mit den Eltern Objekten hab ich noch nicht so ganz verstanden. Heißt dass, das Lilypond dann der verkleinerten Notenkopf so behandelt als wäre er groß?
-
danke Harm für deine ausführliche analyse!
natürlich hast du recht mit \override TextScript #'self-alignment-X = #RIGHT (ich muss immer überlegen ob es nun rechts anliegen muss oder ob es rechtsbündig sein muss… - und das gelingt in der eile nicht immer, sorry)
Eluze