Leerseite, in bookpart, in book? (noch offen)

Begonnen von ingmar, Dienstag, 13. November 2018, 16:47

« vorheriges - nächstes »

ingmar

Hallo,


folgender Code kompiliert anstandslos, und produziert zwei Seiten mit Musik und eine Leerseite dazwischen:

\version "2.19.64"

music = \relative {c'4 d e f g1 }
empty = \bookpart { \markup \null \pageBreak}

\bookpart { \score { \music }}
\empty
\bookpart { \score { \music }}


Wenn ich nun aber die bookparts in ein Buch stecke...


\version "2.19.64"
music = \relative {c'4 d e f g1 }
empty = \bookpart { \markup \null \pageBreak}

\book {
\bookpart { \score { \music }}
\empty
\bookpart { \score { \music }}
}

... kriege ich eine seltsame Fehlermeldung: "Fehler: syntax error, unexpected BOOK_IDENTIFIER"

Das ist seltsam, weil es ohne Verwendung der Variable empty eben doch gehen würde:

version "2.19.64"

music = \relative {c'4 d e f g1 }

\book {
\bookpart { \score { \music }}
\bookpart { \markup \null \pageBreak}
\bookpart { \score { \music }}
}


Ich frage mich nun natürlich:
* Was bedeutet diese Fehlermeldung? Welches Problem hat LilyPond hier?
* Wie kann ich eine Variable definieren, die, zwischen Scores gesteckt, oder jedenfalls zwischen Bookparts, sicher eine Leerseite erzeugt?


Danke, Gruß,
--ingmar

harm6

Hallo Ingmar,

die Art und Weise wie book und bookpart verarbeitet werden ist ernsthaft buggy. So sehr, daß man manchmal den Unterschied gar nicht zu fassen bekommt, um nur ein Symptom zu nennen.
Manchmal fuktioniert ein \paper { } in den bookpart zu setzen. Hier aber nicht.
Ich bin selbst schon drüber gefallen und hab ergebnislos nachgeforscht, gibt auch diverse threads in den Archiven dazu.

Mit anderen Worten, mir fällt kein Weg ein Dein Vorhaben wie geplant umzusetzen.

Aber Du kannst natürlich ganz frech daher kommen und folgendes machen:

\version "2.19.64"

music = \relative {c'4 d e f g1 }
empty = \markup \null

\book {
\bookpart { \score { \music } }
\empty
\bookpart { \score { \music } }
}


Wenn Du jetzt allerdings das book in eine Variable packst, um es später aufzurufen, passiert derselbe Sch... wieder.

Inwieweit es möglich wäre ein book _mit_ bookparts gänzlich in scheme zu schaffen weiß ich nicht, habs nie probiert.
Ob dann das Problem wirklich vermieden werden kann weiß ich somit auch nicht.

Ich könnte es natürlich probieren, allerdings gabs schon mal den Fall, daß ich eine wunderbar automatisierte Lösung für einen user gefunden hatte, der diese dann aber verwarf, da der Code für ihn nicht durchschaubar und somit für ihn auch nicht manipulierbar war.
Schade um meine Zeit :(
Doch falls Du bereit bist Dich mit einem möglicherweise komplexen und komplizierten Code auseinanderzusetzen, versuch ichs.
Aber wie gesagt, es gibt keine Garantie, daß ich etwas funktionierendes zu finden in der Lage bin.


Hoffentlich hilft es trotzdem ein bißchen,
  Harm



ingmar

Vielen Dank, Harm, für dieses klaren Worte!

Es ist aber nicht nötig, dass du dich ausgerechnet hier verkämpfst. Natürlich ist es aber schon desillusionierend zu lesen, dass unser schönes LilyPond mit Problemen an derart grundlegender Stelle zu kämpfen hat.

Dass eine Scheme-Funktion zwar einen Score, aber offenbar keinen Bookpart zurückgeben kann, war ja schonmal in irgendeiner Diskussion aufgetaucht; ich ahnte daher schon, dass es vielleicht keine richtige Lösung gibt. Natürlich sollten Bookparts und Books eigentlich, genau wie Scores, in Variablen gehalten werden können.

Ich denke, ich kann das Problem umgehen; wie du zeigst, genügt es für meinen, eng definierten, Zweck ja schon, auf den \pageBreak zu verzichten (der ja eh überflüssig war), oder ich spar mir eben die Variable.


Nochmal danke!
--ingmar

harm6

Zitat
Dass eine Scheme-Funktion zwar einen Score, aber offenbar keinen Bookpart zurückgeben kann, war ja schonmal in irgendeiner Diskussion aufgetaucht; ich ahnte daher schon, dass es vielleicht keine richtige Lösung gibt. Natürlich sollten Bookparts und Books eigentlich, genau wie Scores, in Variablen gehalten werden können.

Diese Darstellung ist so nicht richtig.
var = \bookpart { \score { \music } } funktioniert. Ein bookpart kann also sehr wohl in einer Variablen gehalten werden.
Der toplevel-Aufruf
\var
ist ebenfalls problemlos. Genauso wie
\book { \var }
Eine Funktion die diesen bookpart zurückgibt funktioniert auch (hier nicht dargestellt.

Aber
\book { \var \var } geht schief, aus mir unklaren Gründen.


ZitatEs ist aber nicht nötig, dass du dich ausgerechnet hier verkämpfst.

War einfacher als vermutet:

\version "2.19.82"

music = \relative { c'4 d e f g1 }

bkpI = \bookpart { \score { \music } }
empty = \bookpart { \markup \null }
bkpII = \bookpart { \score { \music } }

printBookFromBookparts =
#(define-void-function (book-name book-parts)(string? list?)
  (let* ((book (ly:make-book $defaultpaper $defaultheader (list))))
   (for-each
     (lambda (bk-part) (ly:book-add-bookpart! book bk-part))
     book-parts)
   (ly:book-process book $defaultpaper $defaultlayout book-name)))
   

\printBookFromBookparts
  "test-book"
  #(list
     bkpI
     empty
     bkpII)

Scheint zu klappen. Alledings mußt Du den Namen des books manuell angeben.



Gruß,
  Harm

ingmar

Danke! Ich schau mal, ob es so weiterhilft. Wie erwähnt, vielleicht brauche ich es ja gar nicht mal; muss mal sehen. Aber ist es sicher dem nächsten nützlich.

--ingmar

ingmar

#5
Eigentlich - beim wiederholten Ansehen - wird mir klar, dass ich ein wenig den Fokus verloren hatte. Mein ursprünglicher Wunsch war eigentlich ein Stück Code, das ich beispielsweise mit \empty aufrufen kann, und das immer eine leere Seite einschiebt und anschließend oben auf der folgenden Seite weitermacht. Ich möchte es im expliziten \bookpart aufrufen können, aber auch außerhalb davon. Darum hatte ich in meinem Post dieses \pageBreak in meiner Funktion; zwischen Scores ist das nötig, aber innerhalb eines \bookpart führt es dann zu dem beschriebenen Problem mit \book. Folgendes sollte also möglich sein; wahrscheinlich gibt es noch Varianten:

Zitat(1)
\music
\empty
\music

Zitat(2)
\bookpart {
   \music
   \empty
   \music
}

Zitat(3)
\book {
   \bookpart { \music }
   \bookpart { \empty } % oder auch ohne \bookpart drumherum...
   \bookpart { \music }
}

Zitat(4)
\bookpart { \music }
\bookpart { \empty \empty } % zwei Leerseiten!
\bookpart { \music }


Gruß,
--ingmar

EDIT: (4) hinzugefügt.