[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Defining a function that passes contents between braces to a markup
From: |
David Kastrup |
Subject: |
Re: Defining a function that passes contents between braces to a markup |
Date: |
Sat, 16 Jul 2016 09:31:51 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/25.1.50 (gnu/linux) |
Mojca Miklavec <address@hidden> writes:
> Hi,
>
> I've learnt some basics of scheme and managed to write some simple
> functions, but I'm unable to figure out how to write a function that
> would take all the contents between braces as an argument and return a
> markup.
>
> I would be grateful even if I get just the simplified version working, so that
>
> \A {<foo>}
>
> would be translated into
>
> \markup { \small \override #'(direction . 1) { \dir-column { <foo> } } }
Well, first thing to note is that scheme/music functions do not switch
modes for their arguments. So you either need to write something like
\A \markup <foo>
here to get something in markup mode, or be in lyrics mode (which
interprets <foo> as lyrics), \A should be a markup command and are
already in markup mode, like \markup \A <foo> .
> I would use this markup as part of the lyrics as in
>
> \lyricsto "melody" {
> \A {foo bar}
> \A {three short lines}
> \A {one}
> }
Ah, we are in lyrics mode already. That simplifies things. Your
arguments will then be of type ly:music? and you'll pick off the
respective markup from the 'text field of the lyrics.
> In a slightly more advanced version it would be nice to be able to type
>
> \lyricsto "melody" {
> % \command { array of values }
> % each entry can have an optional "-<number>"
> \A {A1-1}
> \A {A1-1 C2-2}
> \A {A1-1 C2-2 E2-3}
> \A {C2 E2-3}
> \A {E2}
> }
Lyrics mode does not really take text scripts I think. All of A1-1 will
likely end up one lyrics syllable.
> So far I came up with a function definition
>
> M = #(define-scheme-function (parser location aFinger aButton) (markup?
> markup?)
> #{ \markup{ \small \bold \with-color #(rgb-color 0.5 0 0) #aFinger
> \small \with-color #(rgb-color 0 0 0.5) #aButton } #}
> )
> that can handle input like
> \M "1" "A1"
> and then I would enter multiple lines of lyrics, but this is tedious
> to write, even more so when the number of lines varies from one pitch
> to the other.
Strings are the most simple form of markup, but I guess that pretty much
everything else needs to be explicitly preceded by \markup. You could
work here with an optional finger argument as a number:
M =
#(define-scheme-function (parser location aFinger aButton) ((number?) markup?)
(if afinger
#{ \markup{ \small \bold \with-color #(rgb-color 0.5 0 0) #aFinger
\small \with-color #(rgb-color 0 0 0.5) #aButton } #}
;; #{ \markup whatever you want here when no finger is given #}
))
which can handle then both
\M 1 "A1"
as well as
\M "A1"
That's basically what I can think of out of the box right now.
--
David Kastrup