Markupgröße von global-staff-size unabhängig machen, geht das, wenn ja, wie? (gelöst)

Begonnen von Manuela, Freitag, 16. Juni 2023, 17:19

« vorheriges - nächstes »

Manuela

Die Größe der Figuren ist so konzipiert, dass sie eine Zeile ausfüllen

\version "2.25.4"
#(set-global-staff-size 24)

#(define
  tri
  '(
     (moveto 0 0)
     (lineto 20 0)
     (lineto 20 20)
     (closepath)
     ))

#(define
  squa
  '(
     (moveto 0 0)
     (lineto 0 20)
     (lineto 20 20)
     (lineto 20 0)
     (closepath)
     ))

#(define-markup-command (leiste layout props)
   ()
   (interpret-markup layout props
     #{
       \markup \fill-line
       \general-align #Y #UP
       \scale #'(1.6 . 1.6)
       {
         \scale #'(-1 . -1) \override #'(filled . #t) \path #0 #tri
         \override #'(filled . #t) \path #0 #squa
         \scale #'(1 . -1) \override #'(filled . #t) \path #0 #tri
       }
     #}
     ))

\bookpart {
  \paper {
    tagline = ##f
    top-margin = #0
    bottom-margin = #5
    left-margin = #5
    right-margin = #5
    indent = #0
    oddFooterMarkup = ##f
    evenFooterMarkup = ##f
  }
  \markup \center-column {
    \leiste
    \vspace #1
    \fontsize #3 \bold "#(set-global-staff-size 24)"
  }
}

Ändere ich die global-staff-size und setze innerhalb des bookparts die staffsize, so füllen die Figuren die Zeile nicht mehr aus.
Wie muss ich die Markup-Funktion ändern, damit sie unabhängig von der staff-size die gleiche Größe hat?

\version "2.25.4"
#(set-global-staff-size 20)

#(define
  tri
  '(
     (moveto 0 0)
     (lineto 20 0)
     (lineto 20 20)
     (closepath)
     ))

#(define
  squa
  '(
     (moveto 0 0)
     (lineto 0 20)
     (lineto 20 20)
     (lineto 20 0)
     (closepath)
     ))

#(define-markup-command (leiste layout props)
   ()
   (interpret-markup layout props
     #{
       \markup \fill-line
       \general-align #Y #UP
       \scale #'(1.6 . 1.6)
       {
         \scale #'(-1 . -1) \override #'(filled . #t) \path #0 #tri
         \override #'(filled . #t) \path #0 #squa
         \scale #'(1 . -1) \override #'(filled . #t) \path #0 #tri
       }
     #}
     ))

\bookpart {
  \paper {
    tagline = ##f
    top-margin = #0
    bottom-margin = #5
    left-margin = #5
    right-margin = #5
    indent = #0
    oddFooterMarkup = ##f
    evenFooterMarkup = ##f
    #(layout-set-staff-size 24)
  }
  \markup \center-column {
    \leiste
    \vspace #1
    \fontsize #3 \bold "#(set-global-staff-size 20)"
  }
}
Danke für eure Hilfe
viele Grüße
-- Manuela

Arnold

Hallo Manuela,

mein Gedanke ist, das Markup einfach mit dem Kehrwert des Global-Staff-Size zu skalieren,
aber der Faktor läßt sich nicht so einfach ermitteln, denn ly:mm oder ly:pt liefern immer die gleichen Zahlenwerte zurück, auch wenn ich den Global-Staff-Size ändere.

Vor Jahren habe ich einmal eine alternative zu \postscript definiert, welche mit der Schriftgröße skaliert wird. Dort habe ich aber zum Skalieren dann Postscript-Befehle vorangestellt.

So hatte ich jetzt also die Idee, ein markup-command \scale-by-fontsize zu definieren, denn über \abs-fonsize kann ich eine absolute Maßeinheit festlegen.
NACHTEIL: Texte im zu skalierenden Markup müssen nochmal mit \abs-fontsize in ihrer Größe festgelegt werden!

Als Alternative, mit Details aus scm/define-markup-commands.scm kopiert, entstand dann noch \scale-absolute. Hier braucht man das \abs-fontsize also nur ein einziges Mal festzulegen.

Wenn ich die Hinweise richtig gelesen haben, wird die Strichstärke eines Pfades aber nicht skaliert,
d.h. diese ist (erst einmal) weiterhin von der Global-Staff-Size anhängig.
Eine Erweiterung der Routinen ist sicherlich möglich (mache ich aber nicht mehr heute).

Hier mein Testprogramm - aber ich habe es bisher nur ganz oberflächlich getestet!
\version "2.24.1"

#(set-global-staff-size 16.0)
% #(set-global-staff-size 24.0)


#(define-markup-command (scale-by-fontsize layout props arg)
                        (markup?)
                        #:properties ((font-size 0.0))
  (let ((sizemul (magstep font-size)))
  (ly:stencil-scale (interpret-markup layout props arg)
                    sizemul sizemul)))

#(define-markup-command (scale-absolute layout props factor arg)
                        (number? markup?)
  (let* ((ref-size (ly:output-def-lookup layout 'text-font-size 12))
        (sizemul (/ factor ref-size)))
  (ly:stencil-scale (interpret-markup layout props arg)
                    sizemul sizemul)))

{
  c'1_\markup { "mm =" #(ly:number->string (ly:mm 1.0)) "/ pt =" #(ly:number->string (ly:pt 1.0)) }
  \break
  c''1_\markup \abs-fontsize #10 \scale-by-fontsize \line {
      \abs-fontsize #9 "A" \hspace #100 \abs-fontsize #9 "B"
  }
  e''1_\markup \abs-fontsize #9 \scale-absolute #10 \line {
      "A" \hspace #100 "B"
  }
}

Arnold.

Arnold

Hallo Manuela,

ich habe eine etwas schlechte Nachricht für dich (zumindest Version 2.24.1):

  • Man kann die Notenzeilengröße global [#(set-global-staff-size ...)] oder lokal für ein Score [#(layout-set-staff-size ...)] setzen. Änderungen nur für eine Notenzeile lasse ich außen vor.
  • Mit der Methode aus \abs-fontsize kann ich die Staffgröße ermittlen - also für layout (Score), falls nicht definiert global (Dateiebene), ansonsten die 20 Punkt Defaultgröße
  • Der \path-Befehl ist aber immer bezüglich der globalen Staff-Größe gezeichnet, ignoriert also Größenfestlegungen im Layout

Das bedeutet:
Solange ich keine Methode finde, wie global-staff-size ausgelesen werden kann, würde jeder Skalierungsversuch in einem Score-Block mit layout-set-staff-size daneben gehen.

Arnold

Arnold

So, Manuela, jetzt bin ich fündig geworden.

Anbei zwei neue absolute Markup-Funktionen, abs-path und abs-translate:
\version "2.24.1"
#(define-markup-command (abs-translate layout props offset arg)
  (number-pair? markup?)
  #:category align
  "
same as @code{translate} except it is scale absolutely, i.e.
the result is independent to your global-staff-size setting.
  "
 (let* ((ref-size (ly:output-def-lookup (ly:parser-lookup '$defaultpaper) 'text-font-size 11))
        (size-factor (/ 11 ref-size))
        (scaled-offset (cons (* size-factor (car offset))
                            (* size-factor (cdr offset)))))
  (ly:stencil-translate (interpret-markup layout props arg)
                        scaled-offset)))
                   
#(define-markup-command (abs-path layout props thickness commands)
                        (number? list?)
  #:category graphic
  #:properties ((line-cap-style 'round)
                (line-join-style 'round)
                (filled #f))
  "
same as @code{path} except it is scaled absolutely, i.e.
the result is independent to your global-staff-size setting.
  "
 (let* ((ref-size (ly:output-def-lookup (ly:parser-lookup '$defaultpaper) 'text-font-size 11))
        (size-factor (/ 11 ref-size))
        (my-thickness (* thickness size-factor))
        (scaled-cmds (map (lambda (cmd)
          (if (null? cmd) cmd
            (map (lambda (w)
              (if (number? w) (* size-factor w) w)) cmd))) commands)))
  (make-path-stencil (apply append scaled-cmds)
                    my-thickness
                    1
                    1
                    filled
                    #:line-cap-style line-cap-style
                    #:line-join-style line-join-style)))
Zusammen mit \overlay (hat nur den relativen Abstand 0.0, und der bleibt bei jeder Skalierung auf 0.0) und \abs-fontsize (sollte tun, was der Name verspricht; ich hab nicht versucht, alle Möglichkeiten zu finden und zu überprüfen) ergibt das einen Basissatz an Markup-Funktionen um z. Bsp. eine gemeinsame Titelseite für mehrere Stimmen-PDFs in unterschiedlichen Notenzeilengrößen festzulegen.

Jedes weitere Markup-Kommando muß man einzeln betrachten um dann gegebenenfalls eine abs-Variante abzuleiten. Häufig führen Property-Values wie z. Bsp. padding oder gar die line-thickness im Layout zu Unterschieden.

Arnold.

Manuela

Danke Arnold. Die Titelseite ist genau die Anwendung für mein Problem.
Danke für eure Hilfe
viele Grüße
-- Manuela

Manuela

Irgendwas mache ich falsch, ich kann keine Unterschied zwischen den beiden Varianten entdecken.
Hier nochmal mein Code
\version "2.25.4"
#(set-global-staff-size 20)

#(define-markup-command (abs-translate layout props offset arg)
   (number-pair? markup?)
   #:category align
   "
same as @code{translate} except it is scale absolutely, i.e.
the result is independent to your global-staff-size setting.
  "
   (let* ((ref-size (ly:output-def-lookup (ly:parser-lookup '$defaultpaper) 'text-font-size 11))
          (size-factor (/ 11 ref-size))
          (scaled-offset (cons (* size-factor (car offset))
                           (* size-factor (cdr offset)))))
     (ly:stencil-translate (interpret-markup layout props arg)
       scaled-offset)))

#(define-markup-command (abs-path layout props thickness commands)
   (number? list?)
   #:category graphic
   #:properties ((line-cap-style 'round)
                 (line-join-style 'round)
                 (filled #t))
   "
same as @code{path} except it is scaled absolutely, i.e.
the result is independent to your global-staff-size setting.
  "
   (let* ((ref-size (ly:output-def-lookup (ly:parser-lookup '$defaultpaper) 'text-font-size 11))
          (size-factor (/ 11 ref-size))
          (my-thickness (* thickness size-factor))
          (scaled-cmds (map (lambda (cmd)
                              (if (null? cmd) cmd
                                  (map (lambda (w)
                                         (if (number? w) (* size-factor w) w)) cmd))) commands)))
     (make-path-stencil (apply append scaled-cmds)
       my-thickness
       1
       1
       filled
       #:line-cap-style line-cap-style
       #:line-join-style line-join-style)))

#(define
  tri
  '(
     (moveto 0 0)
     (lineto 20 0)
     (lineto 20 20)
     (closepath)
     ))

#(define
  squa
  '(
     (moveto 0 0)
     (lineto 0 20)
     (lineto 20 20)
     (lineto 20 0)
     (closepath)
     ))

#(define-markup-command (leiste layout props)
   ()
   (interpret-markup layout props
     #{
       \markup \fill-line
       \general-align #Y #UP
       \scale #'(1.6 . 1.6)
       {
         \scale #'(-1 . -1) \override #'(filled . #t)
         \abs-path #0 #tri
         \override #'(filled . #t)
         \abs-path #0 #squa
         \scale #'(1 . -1) \override #'(filled . #t)
         \abs-path #0 #tri
       }
     #}
     ))

#(define-markup-command (leisteold layout props)
   ()
   (interpret-markup layout props
     #{
       \markup \fill-line
       \general-align #Y #UP
       \scale #'(1.6 . 1.6)
       {
         \scale #'(-1 . -1) \override #'(filled . #t) \path #0 #tri
         \override #'(filled . #t) \path #0 #squa
         \scale #'(1 . -1) \override #'(filled . #t) \path #0 #tri
       }
     #}
     ))

\bookpart {
  \paper {
    tagline = ##f
    indent = #0
    left-margin = #0
    right-margin = #0
    top-margin = #0
  }
  \markup \center-column {
    \leiste
    \vspace #1
    \fontsize #3 \bold "\abs-path Kommando"
    \vspace #3
    \leisteold
    \vspace #1
    \fontsize #3 \bold "\path Kommando"
  }
}

Update: einen Unterschied sieht man erst, wenn man die Größe auf 24 setzt. Anscheined ist das Markup auf Staffgröße 20 skaliert.
Danke für eure Hilfe
viele Grüße
-- Manuela

Jean Abou Samra

Hallo,

\version "2.25.4"

#(set-global-staff-size 24)

#(define
  tri
  '(
     (moveto 0 0)
     (lineto 20 0)
     (lineto 20 20)
     (closepath)
     ))

#(define
  squa
  '(
     (moveto 0 0)
     (lineto 0 20)
     (lineto 20 20)
     (lineto 20 0)
     (closepath)
     ))

#(define-markup-command (absolute-scale layout props arg) (markup?)
   (let ((scale (/ (* 20 1/4 (ly:pt 1))
                   (ly:output-def-lookup layout 'output-scale))))
     (ly:stencil-scale (interpret-markup layout props arg)
                       scale scale)))

leiste =
\markup \fill-line
\general-align #Y #UP
\scale #'(1.6 . 1.6)
{
 \absolute-scale \scale #'(-1 . -1) \override #'(filled . #t) \path #0 #tri
 \absolute-scale \override #'(filled . #t) \path #0 #squa
 \absolute-scale \scale #'(1 . -1) \override #'(filled . #t) \path #0 #tri
}

\bookpart {
  \paper {
    tagline = ##f
    top-margin = #0
    bottom-margin = #5
    left-margin = #5
    right-margin = #5
    indent = #0
    oddFooterMarkup = ##f
    evenFooterMarkup = ##f
  }
  \markup \center-column {
    \leiste
  }
}

?

Manuela

Danke für den Hinweis. Wie bist du auf den Umrechnungsfaktor gekommen?
Danke für eure Hilfe
viele Grüße
-- Manuela

Jean Abou Samra

In scm/paper.scm gibt es

(define-public (layout-set-absolute-staff-size-in-module module staff-height)
  (let*
      ((pt (eval 'pt module))
       (ss (/ staff-height 4))
       (factor (/ staff-height (* 20 pt)))
       (setm! (lambda (sym val)
                (module-define! module sym val))))

    ;; Synchronized with the `text-font-size'
    ;; binding in add-pango-fonts (see font.scm).
    (setm! 'text-font-size (* 11 factor))

    (setm! 'output-scale ss)
    (setm! 'staff-height staff-height)
    (setm! 'staff-space ss)

    (setm! 'line-thickness (calc-line-thickness ss pt))

    ;;  sync with feta
    (setm! 'ledger-line-thickness (+ (* 0.5 pt) (/ ss 10)))

    ;;  sync with feta
    (setm! 'blot-diameter (* 0.4 pt))
    ))

(define-public (layout-set-absolute-staff-size sz)
  "Set the absolute staff size inside of a @code{\\layout@{@}} block.
@var{sz} is in points."
  (layout-set-absolute-staff-size-in-module (current-module) sz))

(define-public (layout-set-staff-size sz)
  "Set the staff size inside of a @code{\\layout@{@}} block.
@var{sz} is in points."

  (layout-set-absolute-staff-size (* (eval 'pt (current-module)) sz)))

(define-public (set-global-staff-size sz)
  "Set the default staff size, where @var{sz} is thought to be in points."
  (let* ((current-mod (current-module))
         (pap (ly:parser-lookup '$defaultpaper))
         (in-output-def? (module-defined? current-mod 'output-def-kind))

         ;; maybe not necessary.
         ;; but let's be paranoid. Maybe someone still refers to the
         ;; old one.
         (new-paper (ly:output-def-clone pap))

         (new-scope (ly:output-def-scope new-paper)))

    (if in-output-def?
        (ly:warning (G_ "set-global-staff-size: not in toplevel scope")))

    (ly:reset-all-fonts)
    (layout-set-absolute-staff-size-in-module new-scope
                                              (* sz (eval 'pt new-scope)))
    (module-define! current-mod '$defaultpaper new-paper)))

Das heiẞt, output-scale ist 1/4 * Notensystemgröẞe * 1pt. Die Standardnotensystemgröẞe ist 20.

-----

Ich bin kein Muttersprachler.

Manuela

Danke für eure Hilfe
viele Grüße
-- Manuela