Autor Thema: Seitenzahlen immer an der gleichen Position trotz unterschiedlicher Zeilenbreite  (Gelesen 445 mal)

Manuela

  • Sr. Member
  • ****
  • Beiträge: 320
    • Mein Wiki zum Thema Lilypond
Ich hänge mehrere Scores hintereinander, bei manchen brauche ich aus Layoutgründen eine etwas größere Zeilenbreite.

Wie kann ich erreichen, dass die Seitennummern trotz unterschiedlicher Zeilenbreite immer an der gleichen Stelle stehen?

\version "2.19.80"

mus = \relative c'' { \repeat unfold 16 c4 }

\paper {
  line-width = 125\mm
  print-first-page-number = ##t
}

\bookpart {
  \paper {
    line-width = 175\mm
  }
  \mus
}

\bookpart {
  \mus
}
« Letzte Änderung: Freitag, 11. Januar 2019, 11:44 von Manuela »
Danke für eure Hilfe
viele Grüße
-- Manuela

harm6

  • Hero Member
  • *****
  • Beiträge: 544
Hallo Manuela,

ich denke es ist eigentlich nicht vorgesehen in ein und dem selben book je nach bookpart verschiedene Angaben zur line-width im jeweiligen \paper zu treffen, denn sonst wäre es einfacher zu einem konstanten Verhalten zu kommen (mehr weiter unten).

Der normale Weg wäre im jeweiligen score-layout die line-width festzulegen und dann per indent und short-indent den score auszurichten.
Dann blieben even/oddHeaderMarkup (mit den Seitenzahlen) auch unbeeinflußt.
Denn diese verwenden \fill-line um sich auszudehnen. Dieses markup-command schaut aber auf die aktuelle line-width des gerade  aktiven \paper (genauso wie der \score).

Aber gehen tuts schon ;)
Dazu muß man in einem markup-command erstmal den default für line-width und margins allein auf Grundlage der aktuellen paper-size berechnen bzw auslesen.
Sodann die im aktuellen paper gesetzte line-width durch den default ersetzen, sowie das ganze verschieben, sodaß wieder der default margin erreicht wird.

Führt zu:

\version "2.19.82"

#(define-markup-command (insist-on-paper-width layout props arg)(markup?)
"Returns a markup with line-width scaled according to the original paper-width,
i.e. ignoring later paper-settings for line-width. The final stencil is moved to
match the original left-margin.

(1) Calculates the defaults for scaled line-width and left-margin, according to
    the used paper-size (default: a4)
(2) Reads current line-width and left-margin
(3) Replaces current line-width with scaled line-width
(4) Moves the final stencil to the left, using the difference of
    current left-margin and scaled left-margin

Limitations: Does not work for different values of left/right-margin."
  (let* (
      ;; defaults
         (default-paper-width
           (ly:output-def-lookup layout 'paper-width))
         (default-left-margin
            (ly:output-def-lookup layout 'left-margin-default))
         (output-scale
           (ly:output-def-lookup layout 'output-scale))
         (scaled-default-left-margin
           (/ default-left-margin output-scale))
         (scaled-default-line-width
           (- default-paper-width (* 2 scaled-default-left-margin)))
      ;; current
         ;; not really needed, for completeness:
         (current-line-width (ly:output-def-lookup layout 'line-width))
         ;; same as (/ (- default-paper-width current-line-width) 2):
         (current-left-margin (ly:output-def-lookup layout 'left-margin))
         (current-right-margin (ly:output-def-lookup layout 'right-margin)))
         
    ;; Print some info, if wished
    ;(pretty-print
    ;  (list
    ;    (cons 'default-paper-width default-paper-width)
    ;    (cons 'default-left-margin default-left-margin)
    ;    (cons 'output-scale output-scale)
    ;    (cons 'scaled-default-left-margin scaled-default-left-margin)
    ;    (cons 'scaled-default-line-width scaled-default-line-width)
    ;    (cons 'current-line-width current-line-width)
    ;    (cons 'current-left-margin current-left-margin)
    ;    ))
 
    (if (eqv? current-left-margin current-right-margin)
        (ly:stencil-translate-axis
          (interpret-markup
            layout
            (prepend-alist-chain 'line-width scaled-default-line-width props)
            arg)
          (- (- current-left-margin scaled-default-left-margin))
          X)
        (begin
          (ly:warning
"Not smart enough to deal with different left/right margins, ignoring.")
          (interpret-markup layout props arg)))))

%% for testing only
#(set! paper-alist
      (cons '("my size" . (cons (* 210 mm) (* 22 mm))) paper-alist))

\paper {
  %% next three lines for testing only
  #(set-paper-size "my size")
  ragged-right = ##f
  tagline = ##f
 
  indent = 0
  line-width = 125\mm
  print-first-page-number = ##t
  evenHeaderMarkup = \markup \box \insist-on-paper-width  \evenHeaderMarkup
  oddHeaderMarkup = \markup \box \insist-on-paper-width  \oddHeaderMarkup
}

%mus = \relative c'' { \repeat unfold 16 c4 \break \repeat unfold 16 c4 }
mus = \relative c'' { \repeat unfold 16 c4 }
\bookpart {
  \paper { line-width = 175\mm }
  \mus
}

\bookpart {
  \mus
}

\bookpart {
  \paper { line-width = 110\mm }
  \mus
}

\bookpart {
  \paper { line-width = 120\mm }
  \mus
}

\bookpart {
  \paper { line-width = 200\mm }
  \mus
}

Ich hab' die default-paper-size verändert, aber nur zu Testzwecken.

Eine Einschränkung:
Das ganze funktioniert nicht, wenn left und right-margin unterschiedlich sind.
Das kann man auch hinkriegen, hab ich mir aber gespart. Es würde die Komplexität weiter erhöhen. Falls Du das brauchtst und Dich wirklich, wirklich nicht für die oben beschriebenen Alternative erwärmen kannst, dann setz' ich mich noch mal dran - aber wirklich nur dann ...


HTH,
  Harm

Manuela

  • Sr. Member
  • ****
  • Beiträge: 320
    • Mein Wiki zum Thema Lilypond
Harm, danke für deine Mühe.

Das ist beinahe das, was ich wollte. Die Position der Seitenzahlen orientiert sich jetzt an der längsten Zeilenlänge, ich hätte sie gerne auf der Zeilenbreite stehen, die in der \paper-Definition festgelegt wird.

Für meine Zwecke reicht die Lösung mit der Zeilenlängendefinition im Layout-Block des Scores. Mir hat allerdings die Variable short-indent gefehlt.
Danke für eure Hilfe
viele Grüße
-- Manuela

harm6

  • Hero Member
  • *****
  • Beiträge: 544
Zitat
Die Position der Seitenzahlen orientiert sich jetzt an der längsten Zeilenlänge,

Neh, mit meinem Code orintieren sich die Seitenzahlen immer am default für die aktuelle paper-size (hier "a4"). Probier eine Reihe von kurzen line-widths um das besser zu sehen.

Zitat
ich hätte sie [die Seitenzahlen] gerne auf der Zeilenbreite stehen, die in der \paper-Definition festgelegt wird

Zu diesem Zweck habe ich ein überschreibbares property eingefügt 'default-line-width' per default auf #t gesetzt.
Damit kommt das übliche "a4"-Verhalten zum tragen, andere line-width-Setzungen werden ignoriert (außer man fügt noch einen \override ein, aber das wäre ziemlich widersinnig).
Falls Du 'default-line-width' auf #f setzt wird die line-width aus dem aktiven generellen book-paper genommen:

\version "2.19.82"

#(define-markup-command (insist-on-paper-width layout props arg)(markup?)
#:properties ((default-line-width #t))
"If @code{default-line-width} is #t (the default) a markup is returned with
line-width scaled according to the original paper-width,
i.e. ignoring later paper-settings for line-width.
If @code{default-line-width} is #f the line-width from the active general
book-paper is taken.
The final stencil is moved to match the original left-margin or for
@code{default-line-width} #f the margin from the general book-paper.

(1) Calculates the defaults for scaled line-width and left-margin, according to
    the used paper-size (default: a4)
(2) Reads current line-width and left-margin
(3) Replaces current line-width with scaled line-width
(4) Moves the final stencil to the left, using the difference of
    current left-margin and scaled left-margin

Limitations: Does not work for different values of left/right-margin."
  (let* (
      ;; defaults
         (default-paper-width
           (ly:output-def-lookup layout 'paper-width))
         (default-left-margin
            (ly:output-def-lookup layout 'left-margin-default))
         (output-scale
           (ly:output-def-lookup layout 'output-scale))
         (scaled-default-left-margin
           (/ default-left-margin output-scale))
         (scaled-default-line-width
           (- default-paper-width (* 2 scaled-default-left-margin)))
      ;; general paper
         (general-paper-line-width
           (ly:output-def-lookup $defaultpaper 'line-width))
         (scaled-general-paper-line-width
           (/ general-paper-line-width output-scale))
         (scaled-general-paper-margin
           (/ (- default-paper-width scaled-general-paper-line-width) 2))
      ;; current
         ;; not really needed, for completeness:
         (current-line-width (ly:output-def-lookup layout 'line-width))
         ;; same as (/ (- default-paper-width current-line-width) 2):
         (current-left-margin (ly:output-def-lookup layout 'left-margin))
         (current-right-margin (ly:output-def-lookup layout 'right-margin))
      ;; final values
         (line-width-to-use
           (if default-line-width
               scaled-default-line-width
               scaled-general-paper-line-width))
         (adjust-margin-value
           (- (- current-left-margin
                 (if default-line-width
                     scaled-default-left-margin
                     scaled-general-paper-margin)))))
         
    ;; Print some info, if wished
    ;(pretty-print
    ;  (list
    ;    (cons 'default-paper-width default-paper-width)
    ;    (cons 'default-left-margin default-left-margin)
    ;    (cons 'output-scale output-scale)
    ;    (cons 'scaled-default-left-margin scaled-default-left-margin)
    ;    (cons 'scaled-default-line-width scaled-default-line-width)
    ;    (cons 'general-paper-line-width general-paper-line-width)
    ;    (cons 'scaled-general-paper-line-width scaled-general-paper-line-width)
    ;    (cons 'current-line-width current-line-width)
    ;    (cons 'current-left-margin current-left-margin)
    ;    ))
 
    (if (eqv? current-left-margin current-right-margin)
        (ly:stencil-translate-axis
          (interpret-markup
            layout
            (prepend-alist-chain 'line-width line-width-to-use props)
            arg)
          adjust-margin-value
          X)
        (begin
          (ly:warning
"Not smart enough to deal with different left/right margins, ignoring.")
          (interpret-markup layout props arg)))))

%% for testing only
#(set! paper-alist
      (cons '("my size" . (cons (* 210 mm) (* 22 mm))) paper-alist))

#(set-default-paper-size "a4landscape") 
\paper {
  %% next three lines for testing only
  #(set-paper-size "my size")
  ragged-right = ##f
  tagline = ##f
 
  indent = 0
  line-width = 125\mm
  print-first-page-number = ##t
  evenHeaderMarkup =
    \markup
      \box
      \override #'(default-line-width . #f)
      \insist-on-paper-width 
      \evenHeaderMarkup
  oddHeaderMarkup =
    \markup
      \box 
      \override #'(default-line-width . #f)
      \insist-on-paper-width 
      \oddHeaderMarkup
}


mus = \relative c'' { \repeat unfold 16 c4 }
\bookpart {
  \paper { line-width = 175\mm }
  \mus
}

\bookpart {
  \mus
}

\bookpart {
  \paper { line-width = 110\mm }
  \mus
}

\bookpart {
  \paper { line-width = 120\mm }
  \mus
}

\bookpart {
  \paper { line-width = 200\mm }
  \mus
}

HTH,
  Harm

Manuela

  • Sr. Member
  • ****
  • Beiträge: 320
    • Mein Wiki zum Thema Lilypond
Danke Harm, das ist echt super!
Danke für eure Hilfe
viele Grüße
-- Manuela