Definition einer Variablen mit \markup-Text [GELÖST]

Begonnen von ingmar, Samstag, 11. November 2017, 20:38

« vorheriges - nächstes »

ingmar

\version "2.19.64"
\markup 1


..kompiliert anstandslos. Nicht jedoch Folgendes:

\version "2.19.64"
test = { \markup 2 }
\test


Warum ist das so? Das sind immer die Momente, wo ich nicht weiter weiß...

Danke, Gruß,
--ingmar

harm6

Hallo Ingmar,

falls Dir die error-message:
Zitat von: terminalerror: markup outside of text script or \lyricmode
test = {
         \markup 2 }
nicht weiterhilft, so laß Dir zeigen was Du geschrieben hast:

\void \displayScheme \test

->
Zitat von: terminal
(make-music
  'SequentialMusic
  'elements
  (list (make-music
          'LyricEvent
          'text
          "2"
          'duration
          (ly:make-duration 2))))

Das {}-Klammerpaar erzeugt sequentielle Musik. Ohne weitere Angabe im notemode. LilyPond erkennt zwar das ein singuläres markup im notemode Quatsch ist und nimmt an, daß Du vielleicht lyricmode meintest, aber nicht geschrieben hast, kann aber doch nichts damit anfangen...

Laß {} einfach weg.

Gruß,
  Harm

ingmar

kapiert, danke! : - )

Aber wie umrahme ich denn mehrere \markup-Statements, damit sie zur selben Variablendefinition gehören?

\version "2.19.64"

test =
\markup 3
\markup "Ende"

\test

führt ja nicht zu dem Ergebnis, was die Einrückungen gerne möchten; die Variablendefinition endet trotzdem hinter dem ersten \markup.

Gruß,
--ingmar

harm6

#3
Zitat
Aber wie umrahme ich denn mehrere \markup-Statements, damit sie zur selben Variablendefinition gehören?
Das wäre dann eine markup-list. Dafür gibts \markuplist:


test = \markuplist { 3 \with-color #red "Ende" }

\test
\markup \line { \test }
$(car test)
\markup #(car test)
$(cadr test)
\markup # (cadr test)


HTH,
  Harm

ingmar

Achja, \markuplist. Die war schon in der Vergangenheit hier vorgekommen, darauf hätte ich eigentlich kommen müssen!

Aber was ist nun, wenn ich das in eine Scheme-Funktion verpacken möchte? Ich schalte dort per #{ ... #} ja nach LilyPond um, bin in diesem Moment dort also wohl in 'serieller Musik'. Ein \markup dort erzeugt einen Fehler, allerdings einen anderen als in den bisherigen Posts - Wrong type to apply: "4".

\version "2.19.64"
test = #(define-scheme-function () ()
( #{ \markup 4 #}))
\test


Und nun will ich die Zahl als Argument übergeben, kriege aber wieder einen neuen Fehler, diesmal ist es unexpected NUMBER_IDENTIFIER:

\version "2.19.64"
test = #(define-scheme-function (i) (integer?)
( #{ \markup $i #}))
\test 5


Ja, auch hier verwirren mich die Fehlermeldungen mehr als zu helfen, und \void \displayScheme hilft auch nicht weiter... : - (

Gruß, danke,
--ingmar

harm6

#5
Hallo Ingmar,

mach Dir immer klar was Du (oder jemand anderer) geschrieben hast.
Wenn es Dir nicht klar ist versuch es Dir anzeigen zu lassen.
Ich mach das die ganze Zeit...

(1) \markup 4
Das Argument ist keine number im scheme-Sinne!
Siehe auch
\void \displayScheme \markup 4
->
"4"
Also ein string.
(Die markup-function wandelt die Nummer intern in einen string, wenn und falls das Argument direkt übergeben wird. In Deiner scheme-function mußt Du selber dafür Sorge tragen, s.u.)

Folgerichtig scheitert auch
val = 4
\markup \val

->
Zitat von: terminalerror: syntax error, unexpected NUMBER_IDENTIFIER
\markup
        \val

(2) Die (erste) scheme-function
Schau Dir den body der function an:
( #{ \markup 4 #})
Die äußeren runden Klammern lassen scheme eine procedure erwarten.
Z.B. (cons ...) oder (make-line-markup ...)
(Wobei ... für weiteren Inhalt steht.)
Stattdessen sieht scheme eingebetteten lilypond-code und kann damit nichts anfangen.
Deshalb die wirre Fehlermeldung.

Wenn Du den lilypond-code direkt ausgibts, d.h. ohne ihn in () einzuschließen klappt es:

tst =
#(define-scheme-function () ()
  #{ \markup 4 #})

\tst


(3) Die (zweite) scheme-function.
Wie oben schon gesagt mußt Du die Zahl in einen string umwandeln sowie () streichen.

test = #(define-scheme-function (i) (integer?)
     #{ \markup $(number->string i) #})
\test 5

Oder aber die scheme-function so umwandeln das sie einen string erwartet und ihr dann im Aufruf auch einen string präsentieren.


HTH,
  Harm

ingmar

Vielen Dank für die ausführliche Antwort, die viele Details erhellt!

Leider entstehen in meinen weiteren Versuchen aber doch immer wieder neue Fragen...

Gruß,
--ingmar