Deutschsprachiges LilyPond-Forum

Allgemeine Fragen und Probleme => Fragen und Probleme aller Art => Thema gestartet von: Manuela am Montag, 5. Juni 2017, 19:51

Titel: add-score - Seitenumbruch verhindern, wie?
Beitrag von: Manuela am Montag, 5. Juni 2017, 19:51
Im Anschluss an diesen Thread

scorify-music als music-function-wie? (https://lilypondforum.de/index.php/topic,50.0.html)

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.
Titel: Antw:add-score - Seitenumbruch verhindern, wie?
Beitrag von: Malte am Montag, 5. Juni 2017, 20:29
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.
Titel: Antw:add-score - Seitenumbruch verhindern, wie?
Beitrag von: Manuela am Montag, 5. Juni 2017, 21:29
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,
Titel: Antw:add-score - Seitenumbruch verhindern, wie?
Beitrag von: Malte am Montag, 5. Juni 2017, 22:15
Hmmm ... Dieser Thread (http://lists.gnu.org/archive/html/lilypond-user/2015-08/msg00073.html) 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.
Titel: Antw:add-score - Seitenumbruch verhindern, wie?
Beitrag von: harm6 am Dienstag, 6. Juni 2017, 12:54
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
Titel: Antw:add-score - Seitenumbruch verhindern, wie?
Beitrag von: Manuela am Dienstag, 6. Juni 2017, 15:25
Danke Harm, jetzt muss ich nur noch behirnen, was in deiner Lösung vor sich geht  ;)
Titel: Antw:add-score - Seitenumbruch verhindern, wie?
Beitrag von: Manuela am Dienstag, 6. Juni 2017, 22:39
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 }
Titel: Antw:add-score - Seitenumbruch verhindern, wie?
Beitrag von: Malte am Dienstag, 6. Juni 2017, 23:18
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?
Titel: Antw:add-score - Seitenumbruch verhindern, wie?
Beitrag von: harm6 am Mittwoch, 7. Juni 2017, 00:00
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

Titel: Antw:add-score - Seitenumbruch verhindern, wie?
Beitrag von: Manuela am Mittwoch, 7. Juni 2017, 10:21
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.