Alec Bartsch <[email protected]> writes:
> I'm attempting to write a markup command that, in addition to other
> formatting, strips a trailing # or b character off the end of the text
> argument and replaces it with the appropriate accidental markup. I think
> I'm super-close but stuck on the proper syntax for passing a markup list to
> the concat. Here's what I've got so far:
>
> #(define-markup-command (page-header layout props text) (markup?)
> "Page header style including optional trailing accidental"
> (let* (
> (last-char (string-ref text (1- (string-length text))))
> (prefix (substring text 0 (1- (string-length text))))
> )
> (interpret-markup layout props
> (markup #:override '(font-name . "Avenir Heavy") #:fontsize 5
> (make-concat-markup (cond
> ((char=? last-char #\#) (list prefix #:hspace 0.2
> #:fontsize -2.5 #:raise 0.6 #:sharp))
> ((char=? last-char #\b) (list prefix #:hspace 0.2
> #:fontsize -2.5 #:raise 0.6 #:flat))
> (else (list text))
> ))
> )
> )
> )
> )
>
> \markup \page-header "Key of Bb"
The markup macro is something that works so-soish. As a macro, it
doesn't wait for its arguments to be evaluated but looks at them before
they are being evaluated. It (hopefully) won't look inside a function
call like make-concat-markup. #{ \markup ... #} tends to behave more
predictable if slower. Fixing this up for your use case you'd write
something akin to
#(define-markup-command (page-header layout props text) (markup?)
"Page header style including optional trailing accidental"
(let* (
(last-char (string-ref text (1- (string-length text))))
(prefix (substring text 0 (1- (string-length text))))
)
(interpret-markup layout props
(markup #:override '(font-name . "Avenir Heavy") #:fontsize 5
(make-concat-markup (cond
((char=? last-char #\#) (list prefix (markup #:hspace 0.2
#:fontsize -2.5 #:raise 0.6 #:sharp)))
((char=? last-char #\b) (list prefix (markup #:hspace 0.2
#:fontsize -2.5 #:raise 0.6 #:flat)))
(else (list text))
))
)
)
)
)
\markup \page-header "Key of Bb"
--
David Kastrup