Deutsches Lilypond Forum (Archiv)
Allgemein => Fragen zu Funktionen => Thema gestartet von: chf am Samstag, 15. Dezember 2012, 19:33
-
Liebe Freunde,
in meinem "Würfelspiel" brauche ich Studierzeichen in folgender Form:
circle in box (im Unterschied zu den beiden einfachen)
Sicher könnt ihr mir helfen...
Gruß
chf
-
Hallo Christa,
also wie im letzten Beispiel (appoggiatura...) die umkringelte 12. und 13. - nur eben jetzt noch eine Box drumherum?
Die \box- und \circle-Befehle lassen sich doch wunderbar schachteln:
\version "2.16.0"
\relative c' {
\mark \markup \box \circle "14."
c1
}
Viele Grüße
Torsten
-
Hallo Torsten,
jaaa, das schien mir viel zu einfach, deshalb hab ich's gar nicht erst probiert. So kann's gehen! - Danke!
Nun hat sich allerdings gezeigt, dass die b o x e s mit zweistelligen Ordnungszahlen rechteckig werden. Wie das?
Ich hätte sie gern weiter quadratisch.
Gruß
Christa
-
na - zeig uns erstmal was du m e i n s t; mit c o d e!!! und output!
-
Nun hat sich allerdings gezeigt, dass die b o x e s mit zweistelligen Ordnungszahlen rechteckig werden. Wie das?
Ich hätte sie gern weiter quadratisch.
Hallo Christa,
eine \box ist einfach nur ein Rechteck, welches mit einem gewissen Abstand (padding) das nachfolgende Markup umschließt.
Daß dieses Rechteck bei einstelligen Zahlen mit Punkt dahinter zufällig (!) ziemlich quadratisch aussieht, liegt nur daran, daß eine Ziffer mit Punkt ungefähr so breit wie hoch ist.
Eigentlich hattest Du aber doch gefragt, wie man ein Quadrat um einen Kreis zeichnet: Ein \circle ist ein Kreis. Eine Box um einen Circle ist demzufolge immer quadratisch, weil der eingeschlossene Kreis definitionsgemäß so hoch wie breit ist (sonst wäre es ja kein Kreis).
Möglichkeiten für (kreislose) Quadrate:
a) Padding links, rechts, unten, oben einzeln nach Belieben einstellen: \markup \box \pad-to-box #'(0 . 3) #'(-1 . 3) "10."
b) einen unsichtbaren/weißen Kreis einpflanzen
c) überhaupt einen eigenen \square-Befehl definieren
Ich muß Eluze beipflichten: ein Beispiel täte not. Sähe es nicht komisch aus, wenn die Quadrate um Ordnungszahlen immer größer würden, wenn die Ordnungszahlen länger werden?
Viele Grüße
Torsten
-
Hallo Christa,
Eluze hat schon recht. Sonst muß man raten was Du vielleicht meinen könntest.
Insbesondere, da \box immer ein Rechteck liefert. Falls dieses Rechteck zufällig ein Quadrat sein sollte, so ist das ein Sonderfall.
Falls Du wirklich ein Quadrat haben willst, so gibt es in LilyPond keinen speziellen Befehl dafür.
Aber man kann natürlich einen schaffen:
\version "2.16.1"
#(define-public (make-square-stencil stencil thickness padding)
"Add a square box around @var{stencil}, producing a new stencil."
(let* ((x-ext (ly:stencil-extent stencil X))
(y-ext (ly:stencil-extent stencil Y))
(x-length (interval-length x-ext))
(y-length (interval-length y-ext))
(new-x-ext (interval-widen x-ext padding))
(new-y-ext (interval-widen y-ext (+ (/ (- x-length y-length) 2) padding)))
(y-rule (make-filled-box-stencil (cons 0 thickness) new-y-ext))
(x-rule (make-filled-box-stencil
(interval-widen new-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 -1 y-rule padding))
(set! stencil (ly:stencil-combine-at-edge stencil Y 1 x-rule 0.0))
(set! stencil (ly:stencil-combine-at-edge stencil Y -1 x-rule 0.0))
;; Uncomment to print x- and y-length
;; (newline)(write (interval-length (ly:stencil-extent stencil X)))
;; (newline)(write (interval-length (ly:stencil-extent stencil Y)))
stencil))
#(define-markup-command (square layout props arg)
(markup?)
#:properties ((thickness 1)
(font-size 0)
(square-padding 0.2))
"
@cindex enclosing text within a square box
Draw a square box round @var{arg}. Looks at @code{thickness},
@code{square-padding} and @code{font-size} properties to determine line
thickness and padding around the markup.
@lilypond[verbatim,quote]
\\markup {
\\override #'(square-padding . 0.5)
\\square
\\line { V. S. }
}
@end lilypond"
(let* ((th (* (ly:output-def-lookup layout 'line-thickness)
thickness))
(pad (* (magstep font-size) square-padding))
(m (interpret-markup layout props arg)))
(make-square-stencil m th pad)))
bxmrkp =
\markup \override #'(thickness . 1.5) {
\override #'(square-padding . 0.3)
\square {
\override #'(box-padding . 0.2 )
\box
"Rechteckige Box in einem Quadrat"
}
}
\relative c' {
\mark \markup \square "140."
c1_\bxmrkp
}
HTH,
Harm
-
...Dann hatte ich bis jetzt immer den Zufall zu Gast bzw. kleine Zahlen - ich wusste es nicht besser.
Danke! Mit Torstens Variante werde ich zurechtkommen.
Gute Nacht!
chf