add-score - Seitenumbruch verhindern, wie?

Begonnen von Manuela, Montag, 5. Juni 2017, 19:51

« vorheriges - nächstes »

Manuela

Im Anschluss an diesen Thread

scorify-music als music-function-wie?

stellt sich für mich die nächste Frage. Wie kann ich den Seitenumbruch steuern?

Hier ein Codebeispiel:

\version "2.19.56"

musI = \relative c' { e4 c d c }

#(for-each
  (lambda (p)
    (add-score
     (list #{ \markup \line \bold \caps { "X-Dur" } #}))
    ;; wie kann ich an dieser Stelle einen Seitenumbruch verhindern?
    ;; geht das überhaupt?
    (add-score
     (scorify-music #{ { \transpose c $p \musI } #})))
  (event-chord-pitches #{ < c d e f g > #}))


Ich habe einen Workaround gefunden (aufteilen in mehrere for-each Blöcke), aber schöner und eleganter wäre es, wenn ich direkt im Scheme-Code den Seitenumbruch verhindern könnte.
Danke für eure Hilfe
viele Grüße
-- Manuela

Malte

Was genau meinst du? Möchtest du in einer Liste angeben können, nach welchen scores ein Seitenumbruch passieren darf? (meine Einschätzung: relativ kompliziert, aber prinzipiell ziemlich sicher möglich) Oder soll gar kein Umbruch zwischen den ganzen so generierten Scores auftreten? (meine Einschätzung: einfacher, aber müßte auch erstmal ne Weile rumprobieren) Oder soll sogar die komplette Sache (kann ja sein, daß auch noch andere Dinge außer diesen generierten Scores da sind) auf eine Seite? Letzteres ließe sich einfach mit einem
\paper {
  page-count = 1
}
lösen.

Manuela

Hallo Malte,

danke für deine Unterstützung.

Prinzipell handelt es sich um Text (eine Art Überschrift) + Score, dann kommt der nächste Text + Score.
Auf eine Seite geht es auf keinen Fall. Wenn es zu kompliziert ist, dann lebe ich mit meinem Workaround,
Danke für eure Hilfe
viele Grüße
-- Manuela

Malte

Hmmm ... Dieser Thread behandelt anscheinend das gleiche Problem, ohne eine Lösung gefunden zu haben.

Mir ist aber grad noch gekommen: Man kann ja in einem Markup auch einen \score haben, hilft dir das vielleicht?\version "2.19.56"

musI = \relative c' { e4 d c d }

#(for-each
  (lambda (p)
    (add-score
     (list #{
       \markup {
         \column {
           \line \bold \caps { "X-Dur" }
           \score { \transpose c $p \musI }
         }
       }
       #})))
  (event-chord-pitches #{ < c d e f g f e d c b a b c b g f e d > #}))

Da müßte man noch vertikales Spacing anpassen (baseline-skip im markup und markup-markup-spacing im \paper oder so ändern), aber vielleicht ist das ja schon vom Ergebnis mal ungefähr das, was dir vorschwebt.

Ansonsten müßte man halt mal schauen, was ein einzeln stehendes \noPageBreak und ein add-score intern machen und schauen, wie man mit dem einen oder anderen eine Lösung bastelt. Müßte ja eigentlich auch möglich sein. Vorteil wär da, daß du das ,,Original-Spacing" von LilyPond bekämst.

harm6

Du könntest auf die add-score-Funktionalität verzichten und stattdessen selbst einen bookpart schaffen.
Zusammen mt einem üblen hack scheints zu klappen.


\version "2.19.56"

\paper {
  markup-system-spacing.padding = #15
  score-markup-spacing.padding = #15
}

musI = \relative c' { e4 c d c }

%% The hack ...
np = \bookpart { \noPageBreak }

%% create a list containing markups and scores
#(define input
  (append-map
    (lambda (p)
      (list
        (list #{ \markup \line \bold \caps { "X-Dur" } #})
        (scorify-music #{ { \transpose c $p \musI } #})))
    (event-chord-pitches #{ < c d e f g c d e f g c d e f g c d e f g > #})))
     
%% insert #<Page_marker> from 'np' (ly:book-scores np) into any markup-list
#(define scrs
  (append-map
    (lambda (e)
      (if (markup-list? e)
          (append  (ly:book-scores np) (list e))
          (list e)))
    (reverse input)))

%% put out a bookpart
$(ly:book-process
  (ly:make-book-part scrs)
  $defaultpaper
  $defaultlayout
  (ly:parser-output-name))


Gruß,
Harm

Manuela

Danke Harm, jetzt muss ich nur noch behirnen, was in deiner Lösung vor sich geht  ;)
Danke für eure Hilfe
viele Grüße
-- Manuela

Manuela

Sobald ich einen anderen Score hinzufüge, verschwindet der Teil, der per Scheme erzeugt wird. Ist wahrscheinlich nur irgendeine Kleinigkeit, aber ich komme nicht drauf, was ich machen muss, damit ich einen vollständigen Output erhalte.

\version "2.19.56"

\paper {
  markup-system-spacing.padding = #15
  score-markup-spacing.padding = #15
}

musI = \relative c' { e4 c d c }

%% The hack ...
np = \bookpart { \noPageBreak }

%% create a list containing markups and scores
#(define input
  (append-map
    (lambda (p)
      (list
        (list #{ \markup \line \bold \caps { "X-Dur" } #})
        (scorify-music #{ { \transpose c $p \musI } #})))
    (event-chord-pitches #{ < c d e f g c d e f g c d e f g c d e f g > #})))
     
%% insert #<Page_marker> from 'np' (ly:book-scores np) into any markup-list
#(define scrs
  (append-map
    (lambda (e)
      (if (markup-list? e)
          (append  (ly:book-scores np) (list e))
          (list e)))
    (reverse input)))

%% put out a bookpart
$(ly:book-process
  (ly:make-book-part scrs)
  $defaultpaper
  $defaultlayout
  (ly:parser-output-name))

%% bewirkt, dass der mit book-process erzeugte Teil nicht mehr erscheint
%% (wird wahrscheinlich irgendwie überschrieben oder so)

\relative c' { c d e }
Danke für eure Hilfe
viele Grüße
-- Manuela

Malte

Ich habe keine Ahnung, aber es scheint so, als würde ly:boo-process ein \book erzeugen. Der letzte Score ist nicht in diesem \book enthalten, also gibts zwei Ausgabe-PDFs, oder?

harm6

Der zusätzliche score wird unter demselben Namen abgelegt wie das mit ly:book-process erzeugte book-pdf. Kann man auch im log sehen. Also überschreiben sie sich gegenseitig. Man könnte das ändern, aber offensichtlich möchtest Du ins selbe pdf-file schreiben.

Also:

\version "2.19.56"

\paper {
  markup-system-spacing.padding = #15
  score-markup-spacing.padding = #15
  indent = 0
}

musI = \relative c' { e4 c d c }

%% The hack ...
np = \bookpart { \noPageBreak }

%% create a list containing markups and scores
#(define input
  (append-map
    (lambda (p)
      (list
        (list #{ \markup \line \bold \caps { "X-Dur" } #})
        (scorify-music #{ { \transpose c $p \musI } #})))
    (event-chord-pitches #{ < c d e f g c d e f g c d e f g c d e f g > #})))
     
%% insert #<Page_marker> from 'np' (ly:book-scores np) into any markup-list
#(define scrs
  (append-map
    (lambda (e)
      (if (markup-list? e)
          (append  (ly:book-scores np) (list e))
          (list e)))
    (reverse input)))


%% don't put out a book(-part), but add the bookpart to current book
#(collect-bookpart-for-book (ly:make-book-part scrs))

\relative c' { c d e }


Allerdings muss wirklich ein bookpart verarbeitet werden, sonst funktioniert es nicht mit dem Einfügen von \noPageBreak.

Gruß,
  Harm


Manuela

Zitat von: harm6 am Mittwoch,  7. Juni 2017, 00:00
Also überschreiben sie sich gegenseitig.

Danke Harm, sowas in der Art hatte ich schon vermutet.
Danke für eure Hilfe
viele Grüße
-- Manuela