Autor Thema: \markup-Funktion mit Argument? (GELÖST)  (Gelesen 3297 mal)

ingmar

  • Member
\markup-Funktion mit Argument? (GELÖST)
« am: Sonntag, 16. August 2015, 19:12 »
hallo,

ich möchte gerne ein \markup-Schnipsel mehrfach verwenden, also unterschiedlichen Text auf die gleiche Weise darstellen:
\version "2.18.2"

\new Staff \with { instrumentName = \markup \with-color #(x11-color 'red) {
\fontsize #4
\override #'(font-name . "Courier New" )
\bold
"Flute"
} }
\relative c' { c4 d e f g4. e8 c2 }

... wenn ich nun mehr Instrumente einführe, möchte ich nicht jedesmal den gleichen \markup-Text ausschreiben müssen. Ich möchte einmalig eine Funktion definieren, die ihr Argument zur Laufzeit auswertet.

Ich stell mir also sowas vor wie (Pseudocode):
MY-MARKUP = \markup \with-color #(x11-color 'red) {
\fontsize #4
\override #'(font-name . "Courier New" )
\bold
\MY-ARGUMENT
}
..aufrufbar durch

\new Staff \with { instrumentName = \MY-MARKUP "French Horn" }
oder so ähnlich.

Da muss man wahrscheinlich Scheme einsetzen, innerhalb dessen aber fast ausschließlich Lilypond-Code, oder mach ich nu einen Denkfehler?


Gruß, Danke,
--ingmar
« Letzte Änderung: Mittwoch, 19. August 2015, 16:23 von ingmar »

fugenkomponist

  • Member
Re: \markup-Funktion mit Argument?
« Antwort #1 am: Sonntag, 16. August 2015, 19:54 »
Hier wird die Funktion define-markup-command beschrieben samt Beispiel. Du hast recht, man braucht „außenrum“ ein bisschen Scheme und kann „innendrin“ dann ganz normale LilyPond-Syntax verwenden:
\version "2.19.25"

#(define-markup-command (bigRed layout props text) (markup?)
   (interpret-markup layout props
   #{
     \markup \with-color #(x11-color 'red) {
       \fontsize #4
       \override #'(font-name . "Courier New" )
       \bold
       #text
     }
   #}))

\new Staff \with { instrumentName = \markup \bigRed "French Horn" } {
  c'1
}

ingmar

  • Member
Re: \markup-Funktion mit Argument?
« Antwort #2 am: Sonntag, 16. August 2015, 20:00 »
Danke, das hilft. Und funktioniert. : - )

Mich irritiert allerdings, dass ich auf den String "\markup" sowohl innerhalb der scheme-Funktion, als auch außerhalb, unmittelbar vor ihrem Aufruf, stoße. Warum ist das so? Und was macht die Zeile "(interpret-markup layout props"?

Danke, Gruß,
--ingmar

fugenkomponist

  • Member
Re: \markup-Funktion mit Argument?
« Antwort #3 am: Sonntag, 16. August 2015, 20:18 »
Ich muss zugeben, ich hab keine Ahnung. Ich wusste nur, dass es in der Dokumentation eben was über define-markup-command gibt und hab dann das Beispiel angepasst. Aber ich glaube, dass layout und props Sachen aus dem \layout-Block und \overrides etc. mitnehmen (z. B. Schriftgröße). Und interpret-markup klingt so, als würde es in das reinschauen, was in dem \markup drinsteht, also muss man nachher wieder eins drumherum basteln. Ist vermutlich sinnvoll, weil man ja auch markup-Funktionen haben könnte, die nur Teil eines größeren Markups sein sollen, so nach dem Motto:
\markup { \center-column { "Heute spielt für sie:" \bigRed "der Große Rote" } }Hilfreicher ist da aber vermutlich die Dokumentation (im Zweifelsfall die englischsprachige, die ist der deutschen teilweise voraus).
« Letzte Änderung: Sonntag, 16. August 2015, 20:20 von fugenkomponist »

harm6

  • Member
Re: \markup-Funktion mit Argument?
« Antwort #4 am: Sonntag, 16. August 2015, 21:40 »
Neben der Suche in der Documentation, sowie den internal files, ist es immer hilfreich sich Inhalte anzeigen zu lassen.

Ich habe mal ein demo-markup geschrieben welches props, layout und die docu für interpret-markup ausgeben kann.
Im Moment ist nur props einkommentiert.
Wenn Du layout einkommentierst erscheint eine (sehr) lange Liste.
Die Docu für interpret-markup ist dieselbe wie für `ly:text-interface::interpret-markup' in der IR. Ich finde sie nicht so besonders hilfreich, aber schau selbst.

Viel Spaß beim Studium ;)


\version "2.19.25"

#(define-markup-command (demo layout props) ()

(newline)
;;;; view props
(display-scheme-music props)

;;;; view layout (it's a long list)
;(display-scheme-music (ly:module->alist (ly:output-def-scope layout)))

;;;; view documentation for interpret-markup
;; which is the same as `ly:text-interface::interpret-markup', see IR
;(display-scheme-music
;  (assoc-get 'documentation
;    (procedure-properties interpret-markup)))
   
   
   (interpret-markup layout props ""))

\markup \demo


Gruß,
  Harm

ingmar

  • Member
re: \markup-Funktion mit Argument? (GELÖST)
« Antwort #5 am: Dienstag, 8. September 2015, 21:07 »
Also, wie gesagt, grundsätzlich funktioniert es. Es ist nur unschön.

In einer Sammlung von unterschiedlichen Werken desselben Komponisten setze ich am Anfang die Variablen myTitle und myComposer. Darunter binde ich eine Art Stylesheet ein, das daraus die \markup-Sequenzen \M-TITLE und \M-COMPOSER herstellt; diese kann ich anschließend verwenden. Dies geht aber nicht mit den Einzeltiteln, da sie innerhalb meines Hefts wechseln. Ich schreibe also über jedes Einzelstück (d.h. in jeden \bookpart) sowas wie myPiece = "XYZ" und muss nun den Header folgendermaßen schreiben:

\header {
title = \M-TITLE
piece = \markup { \M-PIECE \myPiece }
composer = \M-COMPOSER
tagline = \M-TAGLINE
}

Weiß nicht, ob das klar genug ist...: Während ich den restlichen Header aus dem Kopf hinschreiben kann, muss ich bei piece immer nachkucken. Auch beim Lesen fragt man sich, ob piece irgendwas anderes ist als title oder composer. Es würde sich für mich eleganter anfühlen, wenn ich hier kein anderes Format verwenden müsste, wenn die Zeile möglichst ähnlich den umgebenden wäre.. Gibts da ne simple Lösung?

Gruß, danke,
--ingmar

harm6

  • Member
Re: \markup-Funktion mit Argument? (GELÖST)
« Antwort #6 am: Mittwoch, 9. September 2015, 02:33 »
Anstatt des markup-commands von fugenkomponist kannst Du auch eine scheme-function benutzen:

\version "2.18.2"

\paper { indent = 40 }
   
MY-MARKUP =
#(define-scheme-function (parser location arg)(markup?)
#{
  \markup \with-color #(x11-color 'red) {
    \fontsize #4
    \override #'(font-name . "Courier New" )
    \bold
    #arg
  }
#})

\new Staff \with { instrumentName = \MY-MARKUP "French Horn" }
{ c''1 }

Aber bei Deinem letzen post weiß ich nicht was Du meinst.

Zitat
Während ich den restlichen Header aus dem Kopf hinschreiben kann, muss ich bei piece immer nachkucken. Auch beim Lesen fragt man sich, ob piece irgendwas anderes ist als title oder composer.

"piece" ist etwas anderes als title oder composer!

Völlig unverständlich für mich ist:
Zitat
Es würde sich für mich eleganter anfühlen, wenn ich hier kein anderes Format verwenden müsste, wenn die Zeile möglichst ähnlich den umgebenden wäre.

Welches "Format", was für eine "Zeile" meinst Du? Was sind die "umgebenden"?


Gruß,
  Harm

ingmar

  • Member
Re: \markup-Funktion mit Argument? (GELÖST)
« Antwort #7 am: Mittwoch, 9. September 2015, 21:40 »
ja, war wirklich nicht sehr klar ausgedrückt. Egal, lassen wir es auf sich beruhen! Danke nochmal, --ingmar.