;;;;
;;;; source file of the GNU LilyPond music typesetter
;;;;
-;;;; (c) 2000--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+;;;; (c) 2000--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
;;;; Jan Nieuwenhuizen <janneke@gnu.org>
;;; markup commands
-;;; TODO:
;;; * each markup function should have a doc string with
;; syntax, description and example.
(def-markup-command (postscript layout props str) (string?)
-
"This inserts @var{str} directly into the output as a PostScript
command string. Due to technicalities of the output backends,
different scales should be used for the @TeX{} and PostScript backend,
@end verbatim
"
;; FIXME
-
(ly:make-stencil
(list 'embedded-ps str)
'(0 . 0) '(0 . 0)))
The markups are spaced/flushed to fill the entire line.
If there are no arguments, return an empty stencil.
"
-
(let* ((orig-stencils
(map (lambda (x) (interpret-markup layout props x))
markups))
determines the space between each markup in @var{args}."
(stack-stencil-line
(chain-assoc-get 'word-space props)
- (map (lambda (m) (interpret-markup layout props m)) args)))
+ (remove ly:stencil-empty?
+ (map (lambda (m) (interpret-markup layout props m)) args))))
(def-markup-command (fromproperty layout props symbol) (symbol?)
- "Read the @var{symbol} from property settings, and produce a stencil from the markup contained within. If @var{symbol} is not defined, it returns an empty markup"
+ "Read the @var{symbol} from property settings, and produce a stencil
+ from the markup contained within. If @var{symbol} is not defined, it
+ returns an empty markup"
(let* ((m (chain-assoc-get symbol props)))
-
(if (markup? m)
(interpret-markup layout props m)
(ly:make-stencil '() '(1 . -1) '(1 . -1)))))
"Apply the @var{procedure} markup command to
@var{arg}. @var{procedure} should take a single argument."
(let* ((anonymous-with-signature (lambda (layout props arg) (procedure layout props arg))))
-
(set-object-property! anonymous-with-signature
'markup-signature
(list markup?))
-
(interpret-markup layout props (list anonymous-with-signature arg))))
"Print two markups on top of each other."
(let* ((s1 (interpret-markup layout props m1))
(s2 (interpret-markup layout props m2)))
-
(ly:stencil-add s1 s2)))
(def-markup-command (finger layout props arg) (markup?)
Note: magnification only works if a font-name is explicitly selected.
Use @code{\\fontsize} otherwise."
-
(interpret-markup
layout
(prepend-alist-chain 'font-magnification sz props)
"Set @code{font-shape} to @code{caps}."
(interpret-markup layout (prepend-alist-chain 'font-shape 'caps props) arg))
- ;(def-markup-command (latin-i layout props arg) (markup?)
- ; "TEST latin1 encoding."
- ; (interpret-markup layout (prepend-alist-chain 'font-shape 'latin1 props) arg))
+;(def-markup-command (latin-i layout props arg) (markup?)
+; "TEST latin1 encoding."
+; (interpret-markup layout (prepend-alist-chain 'font-shape 'latin1 props) arg))
(def-markup-command (dynamic layout props arg) (markup?)
"Use the dynamic font. This font only contains @b{s}, @b{f}, @b{m},
(def-markup-command (sharp layout props) ()
"Draw a sharp symbol."
(interpret-markup layout props (markup #:musicglyph "accidentals.2")))
+
(def-markup-command (semisharp layout props) ()
"Draw a semi sharp symbol."
(interpret-markup layout props (markup #:musicglyph "accidentals.1")))
+
(def-markup-command (natural layout props) ()
"Draw a natural symbol."
-
(interpret-markup layout props (markup #:musicglyph "accidentals.0")))
+
(def-markup-command (semiflat layout props) ()
"Draw a semiflat."
(interpret-markup layout props (markup #:musicglyph "accidentals.M1")))
+
(def-markup-command (flat layout props) ()
"Draw a flat symbol."
-
(interpret-markup layout props (markup #:musicglyph "accidentals.M2")))
+
(def-markup-command (sesquiflat layout props) ()
"Draw a 3/2 flat symbol."
-
(interpret-markup layout props (markup #:musicglyph "accidentals.M3")))
+
(def-markup-command (doubleflat layout props) ()
"Draw a double flat symbol."
-
(interpret-markup layout props (markup #:musicglyph "accidentals.M4")))
-
(def-markup-command (column layout props args) (markup-list?)
"Stack the markups in @var{args} vertically. The property
@code{baseline-skip} determines the space between each markup in @var{args}."
(stack-lines -1 0.0 (chain-assoc-get 'baseline-skip props) cmols)))
(def-markup-command (vcenter layout props arg) (markup?)
- "Align @code{arg} to its center. "
+ "Align @code{arg} to its Y center. "
(let* ((mol (interpret-markup layout props arg)))
(ly:stencil-align-to! mol Y CENTER)
mol))
+(def-markup-command (hcenter layout props arg) (markup?)
+ "Align @code{arg} to its X center. "
+ (let* ((mol (interpret-markup layout props arg)))
+ (ly:stencil-align-to! mol X CENTER)
+ mol))
+
(def-markup-command (right-align layout props arg) (markup?)
+ "Align @var{arg} on its right edge. "
(let* ((m (interpret-markup layout props arg)))
(ly:stencil-align-to! m X RIGHT)
m))
(def-markup-command (left-align layout props arg) (markup?)
"Align @var{arg} on its left edge. "
-
(let* ((m (interpret-markup layout props arg)))
(ly:stencil-align-to! m X LEFT)
m))
(def-markup-command (general-align layout props axis dir arg) (integer? number? markup?)
"Align @var{arg} in @var{axis} direction to the @var{dir} side."
(let* ((m (interpret-markup layout props arg)))
-
(ly:stencil-align-to! m axis dir)
m))
"Set horizontal alignment. If @var{dir} is @code{-1}, then it is
left-aligned, while @code{+1} is right. Values in between interpolate
alignment accordingly."
-
-
(let* ((m (interpret-markup layout props arg)))
(ly:stencil-align-to! m X dir)
m))
(def-markup-command (musicglyph layout props glyph-name) (string?)
"This is converted to a musical symbol, e.g. @code{\\musicglyph
-#\"accidentals-0\"} will select the natural sign from the music font.
-See @usermanref{The Feta font} for a complete listing of the possible glyphs.
-"
+#\"accidentals.0\"} will select the natural sign from the music font.
+See @usermanref{The Feta font} for a complete listing of the possible glyphs."
(ly:font-get-glyph
(ly:paper-get-font layout (cons '((font-encoding . fetaMusic))
props))
glyph-name))
-
(def-markup-command (lookup layout props glyph-name) (string?)
"Lookup a glyph by name."
(ly:font-get-glyph (ly:paper-get-font layout props)
positions it next to the staff cancels any shift made with
@code{\\raise}. For vertical positioning, use the @code{padding}
and/or @code{extra-offset} properties. "
-
-
(ly:stencil-translate-axis (interpret-markup layout props arg)
amount Y))
(def-markup-command (fraction layout props arg1 arg2) (markup? markup?)
"Make a fraction of two markups."
-
(let* ((m1 (interpret-markup layout props arg1))
(m2 (interpret-markup layout props arg2)))
(ly:stencil-align-to! m1 X CENTER)
(def-markup-command (note-by-number layout props log dot-count dir) (number? number? number?)
"Construct a note symbol, with stem. By using fractional values for
@var{dir}, you can obtain longer or shorter stems."
-
(let* ((font (ly:paper-get-font layout (cons '((font-encoding . fetaMusic)) props)))
(size (chain-assoc-get 'font-size props 0))
(stem-length (* (magstep size) (max 3 (- log 1))))
the @var{duration} for the note head type and augmentation dots. For
example, @code{\\note #\"4.\" #-0.75} creates a dotted quarter note, with
a shortened down stem."
-
(let ((parsed (parse-simple-duration duration)))
(note-by-number-markup layout props (car parsed) (cadr parsed) dir)))
(def-markup-command (normal-size-super layout props arg) (markup?)
"Set @var{arg} in superscript with a normal font size."
-
(ly:stencil-translate-axis (interpret-markup
layout
props arg)
@end lilypond
"
-
(ly:stencil-translate-axis
(interpret-markup
layout
that.
"
-
(ly:stencil-translate (interpret-markup layout props arg)
offset))
(def-markup-command (sub layout props arg) (markup?)
"Set @var{arg} in subscript."
-
(ly:stencil-translate-axis
(interpret-markup
layout
(* -0.5 (chain-assoc-get 'baseline-skip props))
Y))
+(def-markup-command (beam layout props width slope thickness) (number? number? number?)
+ "Create a beam with the specified parameters."
+
+ (let*
+ ((y (* slope width))
+ (yext (cons (min 0 y) (max 0 y)))
+ (half (/ thickness 2)))
+
+ (ly:make-stencil
+ (list 'beam width
+ slope
+ thickness
+ (ly:output-def-lookup layout 'blotdiameter))
+ (cons 0 width)
+ (cons (+ (- half) (car yext))
+ (+ half (cdr yext))))
+
+ ))
+
+
(def-markup-command (normal-size-sub layout props arg) (markup?)
"Set @var{arg} in subscript, in a normal font size."
-
(ly:stencil-translate-axis
(interpret-markup layout props arg)
(* -0.5 (chain-assoc-get 'baseline-skip props))
(entry (cons 'font-size (- fs 1))))
(interpret-markup layout (cons (list entry) props) arg)))
-
(def-markup-command (bigger layout props arg) (markup?)
"Increase the font size relative to current setting"
(let* ((fs (chain-assoc-get 'font-size props 0))
(entry (cons 'font-size (+ fs 1))))
(interpret-markup layout (cons (list entry) props) arg)))
-(def-markup-command larger (markup?)
- bigger-markup)
+(def-markup-command larger (markup?) bigger-markup)
(def-markup-command (box layout props arg) (markup?)
- "Draw a box round @var{arg}. Looks at @code{thickness} and
-@code{box-padding} properties to determine line thickness and padding
-around the markup."
- (let ((th (chain-assoc-get 'thickness props 0.1))
- (pad (chain-assoc-get 'box-padding props 0.2))
- (m (interpret-markup layout props arg)))
+ "Draw a box round @var{arg}. Looks at @code{thickness},
+@code{box-padding} and @code{font-size} properties to determine line
+thickness and padding around the markup."
+ (let* ((th (chain-assoc-get 'thickness props 0.1))
+ (size (chain-assoc-get 'font-size props 0))
+ (pad
+ (* (magstep size)
+ (chain-assoc-get 'box-padding props 0.2)))
+ (m (interpret-markup layout props arg)))
(box-stencil m th pad)))
;;FIXME: is this working?
(def-markup-command (strut layout props) ()
-
"Create a box of the same height as the space in the current font."
-
(let ((m (Text_interface::interpret_markup layout props " ")))
(ly:stencil-set-extent! m X '(1000 . -1000))
m))
(vector-set! number->mark-letter-vector j
(integer->char (+ i (char->integer #\A)))))
-(define (number->markletter-string n)
+(define number->mark-alphabet-vector (list->vector
+ (map (lambda (i) (integer->char (+ i (char->integer #\A)))) (iota 26))))
+
+(define (number->markletter-string vec n)
"Double letters for big marks."
- (let* ((lst (vector-length number->mark-letter-vector)))
+ (let* ((lst (vector-length vec)))
(if (>= n lst)
- (string-append (number->markletter-string (1- (quotient n lst)))
- (number->markletter-string (remainder n lst)))
- (make-string 1 (vector-ref number->mark-letter-vector n)))))
-
+ (string-append (number->markletter-string vec (1- (quotient n lst)))
+ (number->markletter-string vec (remainder n lst)))
+ (make-string 1 (vector-ref vec n)))))
(def-markup-command (markletter layout props num) (integer?)
"Make a markup letter for @var{num}. The letters start with A to Z
(skipping I), and continues with double letters."
-
- (Text_interface::interpret_markup layout props (number->markletter-string num)))
+ (Text_interface::interpret_markup layout props
+ (number->markletter-string number->mark-letter-vector num)))
+(def-markup-command (markalphabet layout props num) (integer?)
+ "Make a markup letter for @var{num}. The letters start with A to Z
+ and continues with double letters."
+ (Text_interface::interpret_markup layout props
+ (number->markletter-string number->mark-alphabet-vector num)))
(def-markup-command (bracketed-y-column layout props indices args)
(list? markup-list?)
"Make a column of the markups in @var{args}, putting brackets around
the elements marked in @var{indices}, which is a list of numbers."
-
(define (sublist lst start stop)
(take (drop lst start) (- (1+ stop) start)))
(define (stack-stencils stencils bskip last-stencil)
(cond
((null? stencils) '())
- ((not last-stencil)
+ ((not (ly:stencil? last-stencil))
(cons (car stencils)
(stack-stencils (cdr stencils) bskip (car stencils))))
(else
x)) args))
(leading
(chain-assoc-get 'baseline-skip props))
- (stacked (stack-stencils stencils 1.25 #f))
+ (stacked (stack-stencils
+ (remove ly:stencil-empty? stencils) 1.25 #f))
(brackets (make-brackets stacked indices '())))
(apply ly:stencil-add