Autor Thema: Markup-Code an eigene Funktion übergeben  (Gelesen 1643 mal)

l3u

  • Member
Markup-Code an eigene Funktion übergeben
« am: Montag, 16. Januar 2012, 20:11 »
Hallo!

Ich taste mich gerade an eigene Funktionen heran, habe aber diesbezüglich noch keine große Erfahrung – also sorry, falls das eine blöde Frage sein sollte …

Ich habe folgende Funktion definiert, um in Medleys Zwischentitel anzugeben:
songTitle = #(define-music-function (parser location text) (string?)
#{
\once \override TextScript #'outside-staff-padding = #1
\grace s128 ^\markup { \larger \bold $text }
#})

Funktioniert so weit auch, ich kann die Funktion aber nur mit einem String aufrufen, etwa so:
\songTitle #"1. Lied"
In manchen Fällen wäre es aber wünschenswert, der Funktion ein komplettes Markup übergeben zu können, etwa einen mehrspaltigen Text o. Ä. – wie kann man das anstellen?

Vielen Dank schonmal für die Hilfe :-)

harm6

  • Member
Re: Markup-Code an eigene Funktion übergeben
« Antwort #1 am: Montag, 16. Januar 2012, 23:09 »
Hallo,

wenn Du string? in songTitle = #(define-music-function (parser location text) (string?) durch  markup? ersetzt, klappt es.

Beispiel:

\version "2.14.2"

songTitle = #(define-music-function (parser location text) (markup?)
#{
        \once \override TextScript #'outside-staff-padding = #1
        \grace s128 ^\markup { $text }
#})

\relative c' {
       
        \songTitle \markup \with-dimensions #'(0 . 0.1) #'(-6 . 1) {
        \center-column {
                "Alle meine Entchen,"
                "schwimmen auf dem See"
                "..."
        }
        }
        c4 d e f g2 g a4 a a a g1 a4 a a a g1 f4 f f f e2 e g4 f e d c1 \bar "||"
       
        \songTitle \markup \column { \null \with-color #red "Falscher Text:" \null
        \override #'(line-width . 40) \wordwrap \italic {
    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed
    do eiusmod tempor incididunt ut labore et dolore magna aliqua.
    Ut enim ad minim veniam, quis nostrud exercitation ullamco
    laboris nisi ut aliquip ex ea commodo consequat. }
}
        g'4 e e2 f4 d d2 c4 d e f g g g2  \bar "||"
}

Gruß,
  Harm

l3u

  • Member
Re: Markup-Code an eigene Funktion übergeben
« Antwort #2 am: Dienstag, 17. Januar 2012, 12:41 »
Danke für die Hilfe! War ja gar nicht schwer :-) Ich habe jetzt folgende zwei Funktionen geschrieben, eine für den „Standard“-Titel und eine anpassbare:

customSongTitle = #(define-music-function (parser location text) (markup?)
#{
\once \override TextScript #'outside-staff-padding = #1
\grace s128 ^$text
#})

songTitle = #(define-music-function (parser location text) (string?)
#{
\customSongTitle \markup { \large \bold $text }
#})

Aufzurufen mittels

\songTitle #"Standardtitel"
\customSongTitle \markup { "Angepasster Titel" }

Jetzt wäre es aber super, wenn ein Formatierungbefehl zur Verfügung stehen würde, der das Format (also beispielsweise "\large \bold") setzt, damit das auch für die anpassbaren Variante abstrahiert verwendbar ist und zentral geändert werden kann. Also etwa so – funktioniert aber leider nicht:

songTitleFormat = { \large \bold }

customSongTitle = #(define-music-function (parser location text) (markup?)
#{
\once \override TextScript #'outside-staff-padding = #1
\grace s128 ^$text
#})

songTitle = #(define-music-function (parser location text) (string?)
#{
\customSongTitle \markup { \songTitleFormat $text }
#})

Geht das auch irgendwie?
« Letzte Änderung: Dienstag, 17. Januar 2012, 12:54 von l3u »

harm6

  • Member
Re: Markup-Code an eigene Funktion übergeben
« Antwort #3 am: Dienstag, 17. Januar 2012, 22:21 »
Hallo,

ich sehe nicht so ganz wieso Du eigentlich zwei Funktionen dafür brauchst.

Aber wenn Du wirklich willst:

Damit \songTitleFormat in

Zitat
songTitle = #(define-music-function (parser location text) (string?)
#{
\customSongTitle \markup { \songTitleFormat $text }
#})

funktioniert, muß es ein markup-command sein. Du könntest folgendes versuchen:

\version "2.14.2"

#(define-markup-command (customFormat layout props arg)(markup?)
  (interpret-markup layout props
    ;(markup #:with-color red #:rotate 180 arg)
    ;(markup #:italic arg)
    (markup #:large #:bold arg)
    ; mit "2.15.24" ist auch folgende Syntax möglich:
    ;#{ \markup \large \bold $arg #}
   ))

   
customSongTitle = #(define-music-function (parser location text) (markup?)
#{
\once \override TextScript #'outside-staff-padding = #1
\grace s128 ^$text
#})
   
songTitle = #(define-music-function (parser location text) (string?)
#{
\customSongTitle \markup { \customFormat $text }
#})
   
{
        \songTitle "blablub"
        c'1
}

Um dann mit geringem Aufwand flexibel zu bleiben, kannst Du die unterschiedlichen Befehle als jeweils eigene Zeile in customFormat schreiben und nur die jeweils gewünschte Version einkommentieren. Ein paar Beispiele habe ich schon eingefügt.

Das ist zumindest das einzige was mir dazu im Moment einfällt.

HTH,
  Harm

l3u

  • Member
Re: Markup-Code an eigene Funktion übergeben
« Antwort #4 am: Mittwoch, 18. Januar 2012, 14:52 »
Danke für die Hilfe :-)

Mit
customSongTitle = #(define-music-function (parser location text) (markup?)
#{
\once \override TextScript #'outside-staff-padding = #1
\grace s128 ^$text
#})

#(define-markup-command (formatTitle layout props arg) (markup?)
(interpret-markup layout props
(markup #:large #:bold arg)
))

songTitle = #(define-music-function (parser location text) (string?)
#{
\customSongTitle \markup { \formatTitle $text }
#})

Geht sowohl
\songTitle '"Titel"also die einfache Variante, als auch
\customSongTitle \markup { \formatTitle \left-column { "1. Zeile" "2. Zeile" } }
Das ist genau das, was ich gesucht habe :-)