Markup command mit quasi optionalem Parameter

Begonnen von Manuela, Freitag, 18. Juni 2021, 14:55

« vorheriges - nächstes »

Manuela

Hi,
mein Scheme ist wieder einmal komplett eingerostet. Ich möchte eine Markup-Funktion erzeugen, die unterscheidet, ob ein bestimmter Parameter leer ist oder nicht.

Ich habe ein funktionierendes Minimalbeispiel erarbeitet, meine Frage lautet, wie man das eleganter (und evtl. universeller) lösen könnte

Hier das Beispiel

\version "2.22.0"

#(define-markup-command (kurzbeispiel layout props t1 t2)
   (string? string? )
   (interpret-markup layout props
     #{
       \markup
       \column
       {
         "dieser teil kommt immer"
         $t1
         #(if (= 0 (string-length t2))
              #{
                ""
              #}
              #{
               \markup \fontsize #-1 \concat { "2. Parameter: " $t2 }
              #}
              )
       }
     #}
     ))

\markup \kurzbeispiel "erster Aufruf mit 2. Teil" "Parameter 2 ist vorhanden"
\markup \kurzbeispiel "zweiter Aufruf Parameter zwei leer" ""
Danke für eure Hilfe
viele Grüße
-- Manuela

Rudi Guggt

Hallo

Scheme kann ich leider nicht wirklich, aber vielleicht kann man, statt 1 oder 2 Parameter zu übergeben, 1 Liste übergeben und dann auf deren Länge prüfen?

Gruß
Rudi



harm6

Wie wärs mit folgendem?


#(define-markup-command (how-about layout props args)(markup-list?)
  #:properties ((my-list (circular-list "One" "Two" "Three" "four" "five"))
                (my-format-procs
                  (circular-list
                    (lambda (arg-1) (make-line-markup arg-1))
                    (lambda (arg-2)
                      (make-fontsize-markup -4
                        (make-concat-markup arg-2)))
                    (lambda (arg-3)
                      (make-with-color-markup red
                        (make-line-markup arg-3)))
                    (lambda (arg-4)
                      (make-rotate-markup 180
                        (make-line-markup arg-4)))
                    (lambda (arg-5)
                      (make-left-align-markup
                        (make-scale-markup '(-1 . 1)
                          (make-line-markup arg-5))))
                        )))
  (let* ((pairs (map list my-format-procs my-list args)))
    (interpret-markup layout props
      (make-column-markup (map (lambda (x) ((car x) (cdr x))) pairs)))))
       
   
\markup \how-about { foo bar buzz daisy duck dagobert donald }

\markup
  \line \box {
    \how-about { foo bar buzz daisy duck dagobert donald }
    \how-about { foo bar buzz daisy duck dagobert }
    \how-about { foo bar buzz daisy duck }
    \how-about { foo bar buzz daisy }
    \how-about { foo bar buzz }
    \how-about { foo bar }
    \how-about { foo }
  }


Gruß,
  Harm

Manuela

Danke für eure Bemühungen.

Es geht um die Variable bookTitleMarkup wo gewisse Teile immer vorkommen, nur die Variable $alt vorkommen kann oder nicht (wenn es das Lied im alten Kanon nicht gegeben hat)

Hier ein "nicht"-Minimalbeispiel
\paper {
  #(include-special-characters)
}

#(define-markup-command (mybooktitle layout props titel neu alt ton comp poet)
   (string? string? string? string? string? string?)
   (interpret-markup layout props
     #{
       \markup
       {
         \column {
           \override #'(baseline-skip . 2)
           \column
           {
             \fill-line \override #'(baseline-skip . 2.5) {
               \huge \larger \larger \bold
               \center-column
               {
                 $titel
                 \fontsize #-3 \line {
                   "GL № " $neu
                   #(if (= 0 (string-length alt))
                        #{
                          ""
                        #}
                        #{
                          \markup \fontsize #-1 \concat { " (bis 2013 № " $alt ) }
                        #}
                        )
                 }
                 " "
               }
             }
             \column
             \fontsize #-1.5
             {
               \fill-line {
                 $poet $comp
               }
               \fill-line {
                 "Notensatz: ..." \concat { "Originaltonart: " $ton "-Dur" }
               }
             }
           }
         }
       }
     #}
     )
   )

\markup \mybooktitle "Was Gott tut" "416" "294" "Es" "M: Severus Gastorius" "T: Samuel Rodigast [1674/75] 1675"


Wahrscheinlich denke ich bloß zu kompliziert. Mit Harms reiner Scheme-Variante komme ich sehr schwer zurecht, sollte ich mich doch einmal näher damit befassen.
Danke für eure Hilfe
viele Grüße
-- Manuela

Rudi Guggt

Hallo

sehe ich das richtig, dass es nicht nur um $alt geht, sondern eventuell auch $ton fehlen könnte? Dann wirds schwierig, da die Funktion nicht wissen kann, was fehlt.

@Harm: Kann man Parametern einen Default-Wert zuweisen? Vielleicht kann man dadurch etwas vereinfachen?

Gruß
Rudi

harm6

#5
Zitat von: Rudi@Harm: Kann man Parametern einen Default-Wert zuweisen?
Nicht in den Argumenten eines markup-commands, das geht dort nur in den properties (siehe meinen vorherigen post).

Zitat von: ManuelaEs geht um die Variable bookTitleMarkup wo gewisse Teile immer vorkommen, nur die Variable $alt vorkommen kann oder nicht (wenn es das Lied im alten Kanon nicht gegeben hat)
Dann würde ich ein neues bookTitleMarkup definieren. Oder wahrscheinlich besser: bookTitleMarkup auf ##f und ein neues scoreTitleMarkup, falls ich Deine geplante Anwendung richtig verstehe.
Allerdings willst Du ja gewisse Textteile vordefinieren, die aber nur bei Bedarf erscheinen sollen. Deshalb habe ich \fromproperty zu \text-fromproperty erweitert, um die Möglichkeit zu erhalten vordefinierte Textteile (davor und danach) mit ein- bzw auszublenden:


\version "2.22.0"

#(define-markup-command (text-fromproperty layout props text-1 symbol text-2)
  (markup? symbol? markup?)
  #:category other
  (let ((m (chain-assoc-get symbol props)))
    (if (markup? m)
        ;; prevent infinite loops by clearing the interpreted property:
        (interpret-markup
          layout
          (cons (list (cons symbol `(,property-recursive-markup ,symbol))) props)
          (make-concat-markup (list text-1 m text-2)))
        empty-stencil)))
       
       
\paper {
  #(include-special-characters)
  bookTitleMarkup = ##f
  scoreTitleMarkup =
   \markup {
     \override #'(baseline-skip . 2)
     \column {
       \fill-line \override #'(baseline-skip . 2.5) {
         \huge \larger \larger \bold
         \center-column {
           \fromproperty #'header:title
             \fontsize #-3 \line {
             \text-fromproperty "GL № " #'header:new-number ""
           \fontsize #-1
             \text-fromproperty " (bis 2013 № " #'header:old-number ")"
           }
         }
       }
       \fontsize #-1.5 {
         \fill-line {
           \fromproperty #'header:poet \fromproperty #'header:composer
         }
         \fill-line {
           \text-fromproperty "Notensatz: " #'header:typesetter ""
           \text-fromproperty "Originaltonart: " #'header:key "-Dur"
         }
       }
     }
   }
}

\score {
  b1
  \header {
  title = "Was Gott tut"
  new-number = "416"
  old-number = "294"
  key = "Es"
  poet = "T: Samuel Rodigast [1674/75] 1675"
  composer = "M: Severus Gastorius"
  typesetter = "me"
  }
}

\score {
  c'1
  \header {
  title = "Nächstes Lied"
  new-number = "417"
  old-number = ##f
  key = "F"
  poet = "T: NN"
  composer = "M: NN"
  typesetter = "me"
  }
}


HTH,
  Harm


Manuela

Danke Harm. Das ist wahrscheinlich die eleganteste und übersichtlichste Lösung
Danke für eure Hilfe
viele Grüße
-- Manuela